diff --git a/.eslintignore b/.eslintignore index a261f2917..e32c46eb3 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,3 @@ dist/* +projects/cps-ui-kit/src/lib/primeng-temp/* +projects/cps-ui-kit/src/lib/primeuix-temp/* diff --git a/.eslintrc.js b/.eslintrc.js index 02af0bbef..84ba0b718 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -18,6 +18,14 @@ module.exports = { varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_' } + ], + '@typescript-eslint/no-unused-expressions': [ + 'error', + { + allowShortCircuit: true, + allowTernary: true, + allowTaggedTemplates: true + } ] }, env: { diff --git a/.github/workflows/check_pr_title_cc.yml b/.github/workflows/check_pr_title_cc.yml index 7a5fdb73f..65c25beb3 100644 --- a/.github/workflows/check_pr_title_cc.yml +++ b/.github/workflows/check_pr_title_cc.yml @@ -3,7 +3,7 @@ name: Check PR Title (Conventional Commits) on: pull_request: types: [opened, synchronize, reopened, edited, labeled, unlabeled] - branches: [master] + branches: [master, next-major] jobs: check-pr-title: diff --git a/.github/workflows/cps-shared-ui-checkers.yml b/.github/workflows/cps-shared-ui-checkers.yml index 499c9dcee..22158a6f2 100644 --- a/.github/workflows/cps-shared-ui-checkers.yml +++ b/.github/workflows/cps-shared-ui-checkers.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [20.x, 22.x, 24.x] + node-version: [22.x, 24.x] steps: - name: Checkout code uses: actions/checkout@v4 @@ -192,9 +192,9 @@ jobs: id: generate-api run: | npm run generate-json-api - if [[ -n "$(git status --porcelain projects/composition/src/assets/api-data/)" ]]; then + if [[ -n "$(git status --porcelain projects/composition/src/app/api-data/)" ]]; then echo "API data has changed. Please commit the updated API data."; - git --no-pager diff projects/composition/src/assets/api-data/ + git --no-pager diff projects/composition/src/app/api-data/ exit 1; else echo "No changes in API data."; diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..e32c46eb3 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +dist/* +projects/cps-ui-kit/src/lib/primeng-temp/* +projects/cps-ui-kit/src/lib/primeuix-temp/* diff --git a/NOTICE b/NOTICE new file mode 100644 index 000000000..900f58efa --- /dev/null +++ b/NOTICE @@ -0,0 +1,15 @@ +This project includes vendored source code from PrimeNG +(https://github.com/primefaces/primeng), version 21.1.9, licensed under the +MIT License, Copyright (c) 2016-2026 PrimeTek. + +See projects/cps-ui-kit/src/lib/primeng-temp/NOTICE.md for the full license +text, the list of modifications made to the vendored code, and per-file +provenance. + +This project also includes vendored source code from primeuix +(https://github.com/primefaces/primeuix), licensed under the MIT License, +Copyright (c) 2025 PrimeTek. + +See projects/cps-ui-kit/src/lib/primeuix-temp/NOTICE.md for the full license +text, the list of modifications made to the vendored code, and per-file +provenance. diff --git a/README.md b/README.md index 732655b30..8a21ce49b 100644 --- a/README.md +++ b/README.md @@ -190,3 +190,7 @@ The summary variants display: - Top 10 components with the most issues Both `test:pa11y` and `test:pa11y:ci` fail (non-zero exit code) if any accessibility error is found on any page. + +#### Third-party notices + +`cps-ui-kit` vendors source code from [PrimeNG](https://github.com/primefaces/primeng) and [primeuix](https://github.com/primefaces/primeuix) (both MIT License) rather than depending on them as npm packages. See [NOTICE](./NOTICE) for details. diff --git a/api-generator/api-generator.js b/api-generator/api-generator.js index 0c5b19a14..246331977 100644 --- a/api-generator/api-generator.js +++ b/api-generator/api-generator.js @@ -7,6 +7,31 @@ const outputPath = path.resolve( 'projects/composition/src/app/api-data/' ); +// Services aren't always documented on their own dedicated page — some are +// only ever embedded into a different component's page via the `[services]` +// input (e.g. CpsCronValidationService is only ever shown on /scheduler/api). +// Linking to `//api` in that case would 404, so only treat a +// service name as linkable if a matching top-level route actually exists. +const getKnownRoutes = () => { + const routingFile = path.resolve( + rootDir, + 'projects/composition/src/app/app-routing.module.ts' + ); + try { + const content = fs.readFileSync(routingFile, 'utf8'); + const matcherRoutes = [ + ...content.matchAll(/pathMatcher\(\s*'([^']+)'\s*\)/g) + ].map((m) => m[1]); + const plainRoutes = [...content.matchAll(/path:\s*'([^']+)'/g)] + .map((m) => m[1]) + .filter((p) => p !== '**'); + return new Set([...matcherRoutes, ...plainRoutes]); + } catch (_) { + return new Set(); + } +}; +const knownRoutes = getKnownRoutes(); + const staticMessages = { methods: "Defines methods that can be accessed by the component's reference.", emits: @@ -18,7 +43,8 @@ const staticMessages = { props: 'Defines the input properties of the component.', service: 'Defines the service used by the component.', enums: 'Defines enums used by the component or service.', - classes: 'Defines classes exposed by the component or service.' + classes: 'Defines classes exposed by the component or service.', + tokens: 'Injection tokens exposed by the component or service.' }; async function main() { @@ -191,6 +217,7 @@ async function main() { comment && comment.summary.map((s) => s.text || '').join(' ') }; + typesMap[componentName] = name.replace('cps-', ''); const component_props_group = component.groups.find( (g) => g.title === 'Props' @@ -469,6 +496,10 @@ async function main() { service.comment && service.comment.summary.map((s) => s.text || '').join(' ') }; + const serviceSlug = name.replace('cps-', ''); + if (knownRoutes.has(serviceSlug)) { + typesMap[service.name] = serviceSlug; + } const service_methods_group = service.groups.find( (g) => g.title === 'Method' ); @@ -510,7 +541,7 @@ async function main() { if (isProcessable(module_tokens_group)) { const tokens = { - description: 'Injection tokens exposed by the service.', + description: staticMessages.tokens, values: [] }; @@ -857,40 +888,61 @@ const allowed = (name) => { ); }; +// Handle `typeof SomeArray[number]` — parse the source file and expand string literals to a union. +// Returns null if `t` isn't that shape, or the source array couldn't be resolved. +const expandIndexedAccessArray = (t, project) => { + if ( + t?.type !== 'indexedAccess' || + t.objectType?.type !== 'query' || + t.indexType?.type !== 'intrinsic' || + t.indexType?.name !== 'number' + ) { + return null; + } + + const refName = t.objectType.queryType?.name; + const variable = refName + ? project + ?.getReflectionsByKind(TypeDoc.ReflectionKind.Variable) + ?.find((r) => r.name === refName) + : null; + const sourceFile = variable?.sources?.[0]?.fullFileName; + if (!sourceFile) return null; + + try { + const src = fs.readFileSync(sourceFile, 'utf-8'); + const arrayMatch = src.match( + new RegExp( + `(?:export\\s+)?const\\s+${refName}\\s*=\\s*\\[([\\s\\S]*?)\\]`, + 'm' + ) + ); + if (arrayMatch) { + const items = [...arrayMatch[1].matchAll(/'([^']+)'/g)].map( + (m) => `'${m[1]}'` + ); + if (items.length) return items.join(' | '); + } + } catch (_) {} + + return null; +}; + const getTypesValue = (typeobj, project) => { const { type, children, indexSignature } = typeobj ?? {}; - // 1) Handle `typeof SomeArray[number]` — parse the source file and expand string literals to a union. - if ( - type?.type === 'indexedAccess' && - type.objectType?.type === 'query' && - type.indexType?.type === 'intrinsic' && - type.indexType?.name === 'number' + // 1) Handle `typeof SomeArray[number]`, whether it's the whole type or a member of a + // top-level union (e.g. `typeof SomeArray[number] | ''`) — expand just that member. + if (type?.type === 'indexedAccess') { + const expanded = expandIndexedAccessArray(type, project); + if (expanded) return expanded; + } else if ( + type?.type === 'union' && + type.types?.some((member) => member.type === 'indexedAccess') ) { - const refName = type.objectType.queryType?.name; - const variable = refName - ? project - ?.getReflectionsByKind(TypeDoc.ReflectionKind.Variable) - ?.find((r) => r.name === refName) - : null; - const sourceFile = variable?.sources?.[0]?.fullFileName; - if (sourceFile) { - try { - const src = fs.readFileSync(sourceFile, 'utf-8'); - const arrayMatch = src.match( - new RegExp( - `(?:export\\s+)?const\\s+${refName}\\s*=\\s*\\[([\\s\\S]*?)\\]`, - 'm' - ) - ); - if (arrayMatch) { - const items = [...arrayMatch[1].matchAll(/'([^']+)'/g)].map( - (m) => `'${m[1]}'` - ); - if (items.length) return items.join(' | '); - } - } catch (_) {} - } + return type.types + .map((member) => expandIndexedAccessArray(member, project) ?? `${member}`) + .join(' | '); } // 2) Handle index signatures (e.g., { [key: string]: number }) diff --git a/jest.config.js b/jest.config.js index 6ec111b43..7a9cb9d14 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,7 +6,9 @@ const collectCoverageFrom = '!projects/**/*.spec.ts', '!projects/**/testing/**', '!projects/**/public-api.ts', - '!projects/cps-ui-kit/src/lib/components/cps-scheduler/cps-scheduler.utils.ts' + '!projects/cps-ui-kit/src/lib/components/cps-scheduler/cps-scheduler.utils.ts', + '!projects/cps-ui-kit/src/lib/primeng-temp/**', + '!projects/cps-ui-kit/src/lib/primeuix-temp/**' ] : [ 'projects/cps-ui-kit/src/**/*.ts', @@ -14,7 +16,9 @@ const collectCoverageFrom = '!projects/**/node_modules/**', '!projects/**/*.spec.ts', '!projects/**/testing/**', - '!projects/**/public-api.ts' + '!projects/**/public-api.ts', + '!projects/cps-ui-kit/src/lib/primeng-temp/**', + '!projects/cps-ui-kit/src/lib/primeuix-temp/**' ]; const coverageThreshold = @@ -44,6 +48,7 @@ const coverageThreshold = module.exports = { roots: ['/projects'], + coverageDirectory: '/coverage', preset: 'jest-preset-angular', moduleNameMapper: { '^lodash-es$': 'lodash', diff --git a/package-lock.json b/package-lock.json index 31c41e6ba..77d33ae17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,42 +8,36 @@ "name": "cps-shared-ui", "version": "0.0.0", "dependencies": { - "@angular/animations": "^21.2.6", - "@angular/common": "^21.2.6", - "@angular/compiler": "^21.2.6", - "@angular/core": "^21.2.6", - "@angular/forms": "^21.2.6", - "@angular/platform-browser": "^21.2.6", - "@angular/platform-browser-dynamic": "^21.2.6", - "@angular/platform-server": "^21.2.6", - "@angular/router": "^21.2.6", + "@angular/animations": "^22.1.3", + "@angular/common": "^22.1.3", + "@angular/compiler": "^22.1.3", + "@angular/core": "^22.1.3", + "@angular/forms": "^22.1.3", + "@angular/platform-browser": "^22.1.3", + "@angular/platform-browser-dynamic": "^22.1.3", + "@angular/platform-server": "^22.1.3", + "@angular/router": "^22.1.3", "@e965/xlsx": "^0.20.3", - "@primeuix/styled": "^0.7.4", - "@primeuix/utils": "^0.7.1", "@types/lodash-es": "^4.17.12", - "highlight.js": "^11.11.1", + "highlight.js": "^11.12.0", "lodash-es": "^4.17.21", - "primeicons": "^7.0.0", - "primeng": "^21.1.3", "rxjs": "~7.8.2", "tslib": "^2.8.1", "zone.js": "~0.16.1" }, "devDependencies": { - "@angular-builders/jest": "^21.0.3", - "@angular/build": "^21.2.5", - "@angular/cli": "~21.2.5", - "@angular/compiler-cli": "^21.2.6", - "@axe-core/playwright": "^4.11.1", + "@angular-builders/jest": "^22.0.1", + "@angular/build": "^22.1.5", + "@angular/cli": "~22.1.5", + "@angular/compiler-cli": "^22.1.3", + "@axe-core/playwright": "^4.13.0", "@playwright/test": "^1.58.2", - "@types/express": "^4.17.25", "@types/jest": "^30.0.0", "@types/node": "^22.10.10", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", - "browser-sync": "^3.0.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.2", + "eslint-config-prettier": "^10.1.8", "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-node": "^11.1.0", @@ -52,210 +46,15 @@ "eslint-plugin-standard": "^5.0.0", "jest": "^30.3.0", "jest-environment-jsdom": "^30.3.0", - "jest-preset-angular": "^16.1.2", - "ng-packagr": "^21.2.2", + "jest-preset-angular": "^17.0.0", + "ng-packagr": "^22.1.1", "pa11y-ci": "^4.0.1", "prettier": "^3.4.2", "typedoc": "^0.28.14", - "typescript": "~5.9.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@algolia/abtesting": { - "version": "1.14.1", - "integrity": "sha512-Dkj0BgPiLAaim9sbQ97UKDFHJE/880wgStAM18U++NaJ/2Cws34J5731ovJifr6E3Pv4T2CqvMXf8qLCC417Ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.48.1", - "integrity": "sha512-LV5qCJdj+/m9I+Aj91o+glYszrzd7CX6NgKaYdTOj4+tUYfbS62pwYgUfZprYNayhkQpVFcrW8x8ZlIHpS23Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.48.1", - "integrity": "sha512-/AVoMqHhPm14CcHq7mwB+bUJbfCv+jrxlNvRjXAuO+TQa+V37N8k1b0ijaRBPdmSjULMd8KtJbQyUyabXOu6Kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.48.1", - "integrity": "sha512-VXO+qu2Ep6ota28ktvBm3sG53wUHS2n7bgLWmce5jTskdlCD0/JrV4tnBm1l7qpla1CeoQb8D7ShFhad+UoSOw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.48.1", - "integrity": "sha512-zl+Qyb0nLg+Y5YvKp1Ij+u9OaPaKg2/EPzTwKNiVyOHnQJlFxmXyUZL1EInczAZsEY8hVpPCLtNfhMhfxluXKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.48.1", - "integrity": "sha512-r89Qf9Oo9mKWQXumRu/1LtvVJAmEDpn8mHZMc485pRfQUMAwSSrsnaw1tQ3sszqzEgAr1c7rw6fjBI+zrAXTOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.48.1", - "integrity": "sha512-TPKNPKfghKG/bMSc7mQYD9HxHRUkBZA4q1PEmHgICaSeHQscGqL4wBrKkhfPlDV1uYBKW02pbFMUhsOt7p4ZpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.48.1", - "integrity": "sha512-4Fu7dnzQyQmMFknYwTiN/HxPbH4DyxvQ1m+IxpPp5oslOgz8m6PG5qhiGbqJzH4HiT1I58ecDiCAC716UyVA8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/ingestion": { - "version": "1.48.1", - "integrity": "sha512-/RFq3TqtXDUUawwic/A9xylA2P3LDMO8dNhphHAUOU51b1ZLHrmZ6YYJm3df1APz7xLY1aht6okCQf+/vmrV9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" + "typescript": "~6.0.3" }, "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/monitoring": { - "version": "1.48.1", - "integrity": "sha512-Of0jTeAZRyRhC7XzDSjJef0aBkgRcvRAaw0ooYRlOw57APii7lZdq+layuNdeL72BRq1snaJhoMMwkmLIpJScw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.48.1", - "integrity": "sha512-bE7JcpFXzxF5zHwj/vkl2eiCBvyR1zQ7aoUdO+GDXxGp0DGw7nI0p8Xj6u8VmRQ+RDuPcICFQcCwRIJT5tDJFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.48.1", - "integrity": "sha512-MK3wZ2koLDnvH/AmqIF1EKbJlhRS5j74OZGkLpxI4rYvNi9Jn/C7vb5DytBnQ4KUWts7QsmbdwHkxY5txQHXVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.48.1", - "integrity": "sha512-2oDT43Y5HWRSIQMPQI4tA/W+TN/N2tjggZCUsqQV440kxzzoPGsvv9QP1GhQ4CoDa+yn6ygUsGp6Dr+a9sPPSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.48.1", - "integrity": "sha512-xcaCqbhupVWhuBP1nwbk1XNvwrGljozutEiLx06mvqDf3o8cHyEgQSHS4fKJM+UAggaWVnnFW+Nne5aQ8SUJXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" + "node": ">=22.0.0" } }, "node_modules/@ampproject/remapping": { @@ -272,148 +71,148 @@ } }, "node_modules/@angular-builders/common": { - "version": "5.0.4", - "integrity": "sha512-eJPmi2YbEmICDndj9/7G+FxZPiYcZtqybgTZypcI3uEsZ+dBH7GHyPFjbpFqMHu7I6CxcERtbQGMw3Fmbh54gQ==", + "version": "6.0.1", + "integrity": "sha512-7qZDXSS3CmN4W7z/p+VwH38id4Tq++pjl0GqH6XVp7Jj7RZGH+d4vPfsqF/ePG4N1XEJjL9ieG0vP6MNtf9UMQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "^21.0.0", - "ts-node": "^10.0.0", - "tsconfig-paths": "^4.2.0" + "@angular-devkit/core": "^22.0.0", + "@angular-devkit/schematics": "^22.0.0", + "@schematics/angular": "^22.0.0", + "get-tsconfig": "^4.10.0", + "jiti": "^2.7.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@angular-builders/jest": { - "version": "21.0.4", - "integrity": "sha512-4VcdUansaKq2EMyuN7GvcRqrVzi9KfqyJ/2smA8R6gXp1gX4h5PJQqlMyh64J09fZPWFgmquZlwVO8qmu8H3wQ==", + "version": "22.0.1", + "integrity": "sha512-bSsV1a8A7KJs1RwsmKH5C9/K3j9GqRYQKiXPgrKOLUJ7dzsAvvlF58n5NX0Pn975ZCrGa1wY3tx8iwQpo+aj3g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-builders/common": "5.0.4", - "@angular-devkit/architect": ">=0.2100.0 < 0.2200.0", - "@angular-devkit/core": "^21.0.0", - "jest-preset-angular": "^16.0.0", + "@angular-builders/common": "6.0.1", + "@angular-devkit/architect": ">=0.2200.0 < 0.2300.0", + "@angular-devkit/core": "^22.0.0", + "@angular-devkit/schematics": "^22.0.0", + "@schematics/angular": "^22.0.0", + "jest-preset-angular": "^17.0.0", "lodash": "^4.17.15" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular-devkit/build-angular": "^21.0.0", - "@angular/compiler-cli": "^21.0.0", - "@angular/core": "^21.0.0", - "@angular/platform-browser-dynamic": "^21.0.0", + "@angular-devkit/build-angular": "^22.0.0", + "@angular/compiler-cli": "^22.0.0", + "@angular/core": "^22.0.0", + "@angular/platform-browser-dynamic": "^22.0.0", "jest": "^30.0.0", "rxjs": ">=7.0.0" } }, "node_modules/@angular-devkit/architect": { - "version": "0.2102.19", - "integrity": "sha512-cj4tzUMiloLTg5rNf17E8MsvIxCWYoBiBsaj7ns6dgXqT9XCeG+J0TA2t1M+N9uuqfeLd22U/rYoCkADmcircQ==", + "version": "0.2201.5", + "integrity": "sha512-DAticcJ2tw3M+D1CH4HhlCgMK5tAb0CwSsnczNMJB9QgQsBC/JhOozQTvgnyCvagitX9u+408YcwEW/Wo2pnzA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.19", + "@angular-devkit/core": "22.1.5", "rxjs": "7.8.2" }, "bin": { "architect": "bin/cli.js" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/build-angular": { - "version": "21.2.19", - "integrity": "sha512-AlPZT9E7+1gp4TJ4CK8Kefsyo2dx8riREjDTyAYe4++BeWRIjxsaypgHgTZER3CtkugLXr0wknvsCw4i+A3qSg==", + "version": "22.1.5", + "integrity": "sha512-uvLI1ixpgVUpsOqvwkTNqkC/nJvqzfBUE4F64D3JvRn3B9CsSGIV9xqjptfjnAtFoq22VI9QO66Hdlu+7OgcqA==", + "deprecated": "Angular's Webpack support is deprecated. Use the esbuild and Vite-based \"@angular/build\" package instead.", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.19", - "@angular-devkit/build-webpack": "0.2102.19", - "@angular-devkit/core": "21.2.19", - "@angular/build": "21.2.19", - "@babel/core": "7.29.7", - "@babel/generator": "7.29.1", - "@babel/helper-annotate-as-pure": "7.27.3", + "@angular-devkit/architect": "0.2201.5", + "@angular-devkit/build-webpack": "0.2201.5", + "@angular-devkit/core": "22.1.5", + "@angular/build": "22.1.5", + "@babel/core": "8.0.1", + "@babel/generator": "8.0.0", + "@babel/helper-annotate-as-pure": "8.0.0", "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-transform-async-generator-functions": "7.29.0", - "@babel/plugin-transform-async-to-generator": "7.28.6", - "@babel/plugin-transform-runtime": "7.29.0", - "@babel/preset-env": "7.29.2", - "@babel/runtime": "7.29.2", - "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "21.2.19", + "@babel/plugin-transform-async-generator-functions": "8.0.1", + "@babel/plugin-transform-async-to-generator": "8.0.1", + "@babel/plugin-transform-runtime": "8.0.1", + "@babel/preset-env": "8.0.2", + "@babel/runtime": "8.0.0", + "@discoveryjs/json-ext": "1.1.0", + "@ngtools/webpack": "22.1.5", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.27", - "babel-loader": "10.0.0", + "autoprefixer": "10.5.4", + "babel-loader": "10.1.1", "browserslist": "^4.26.0", "copy-webpack-plugin": "14.0.0", - "css-loader": "7.1.3", - "esbuild-wasm": "0.28.1", - "http-proxy-middleware": "3.0.7", + "css-loader": "7.1.4", + "esbuild-wasm": "0.28.2", + "http-proxy-middleware": "4.2.0", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.4.2", - "less-loader": "12.3.1", + "less": "4.6.7", + "less-loader": "13.0.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", - "mini-css-extract-plugin": "2.10.0", + "mini-css-extract-plugin": "2.10.2", "open": "11.0.0", - "ora": "9.3.0", - "picomatch": "4.0.4", + "ora": "9.4.1", + "picomatch": "4.0.5", "piscina": "5.2.0", - "postcss": "8.5.12", - "postcss-loader": "8.2.0", + "postcss": "8.5.25", + "postcss-loader": "8.2.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", - "sass": "1.97.3", - "sass-loader": "16.0.7", - "semver": "7.7.4", + "sass": "1.101.0", + "sass-loader": "17.0.0", + "semver": "7.8.5", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.46.0", - "tinyglobby": "0.2.15", - "tree-kill": "1.2.2", + "terser": "5.49.0", + "tinyglobby": "0.2.17", "tslib": "2.8.1", - "webpack": "5.105.2", - "webpack-dev-middleware": "7.4.5", - "webpack-dev-server": "5.2.5", + "webpack": "5.109.2", + "webpack-dev-middleware": "8.0.3", + "webpack-dev-server": "5.2.6", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.28.1" + "esbuild": "0.28.2" }, "peerDependencies": { - "@angular/compiler-cli": "^21.0.0", - "@angular/core": "^21.0.0", - "@angular/localize": "^21.0.0", - "@angular/platform-browser": "^21.0.0", - "@angular/platform-server": "^21.0.0", - "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.2.19", - "@web/test-runner": "^0.20.0", + "@angular/compiler-cli": "^22.0.0", + "@angular/core": "^22.0.0", + "@angular/localize": "^22.0.0", + "@angular/platform-browser": "^22.0.0", + "@angular/platform-server": "^22.0.0", + "@angular/service-worker": "^22.0.0", + "@angular/ssr": "^22.1.5", "browser-sync": "^3.0.2", - "jest": "^30.2.0", - "jest-environment-jsdom": "^30.2.0", "karma": "^6.3.0", - "ng-packagr": "^21.0.0", - "protractor": "^7.0.0", + "ng-packagr": "^22.0.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "typescript": ">=5.9 <6.0" + "typescript": ">=6.0 <6.1" }, "peerDependenciesMeta": { "@angular/core": { @@ -434,44 +233,32 @@ "@angular/ssr": { "optional": true }, - "@web/test-runner": { - "optional": true - }, "browser-sync": { "optional": true }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { - "optional": true - }, "karma": { "optional": true }, "ng-packagr": { "optional": true }, - "protractor": { - "optional": true - }, "tailwindcss": { "optional": true } } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.2102.19", - "integrity": "sha512-T8omQt2QSbNOCTPvOJkt7zg9EtaFt1x6ZiJaqZrq/GK729dD/RGYF0hZqi2AeAE7OMyutFhrDREr2WrNqv1nWg==", + "version": "0.2201.5", + "integrity": "sha512-6SiJ7RgsP0eAQes5KXJy+70X1l+r52oUcX1GxFYIP2pW9bRgPKIs6Lq0VXk1LTWFKPOxzaWocmOab8claClpaw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@angular-devkit/architect": "0.2102.19", + "@angular-devkit/architect": "0.2201.5", "rxjs": "7.8.2" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -481,20 +268,20 @@ } }, "node_modules/@angular-devkit/core": { - "version": "21.2.19", - "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", + "version": "22.1.5", + "integrity": "sha512-HiY6d5dkIdJs5grP9OHvgkf14QOcDIo+hbuT7YKuLItQ++ZxCwUabJMLCCJ5R0KrstE5NqED0dNcyk5WD01t5Q==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "8.18.0", + "ajv": "8.20.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", - "picomatch": "4.0.4", + "picomatch": "4.0.5", "rxjs": "7.8.2", "source-map": "0.7.6" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -508,96 +295,97 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "21.2.19", - "integrity": "sha512-AG3Fzh9wJCmKBfxUQOUWaEHMj5Gq2O+Msf1z52aDSxbVhs5/iSQcXGPv/DLdAXu7d4xmQhLouNe9Glaq2omDyw==", + "version": "22.1.5", + "integrity": "sha512-HTmo9y8wjXKtJGVTYomTjZsjWzhirpu1pPRAzsVob3eiYOuxv1qDRAgWiHXNGp5CpnbHunZweXY/WffNGOFRyA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.19", + "@angular-devkit/core": "22.1.5", "jsonc-parser": "3.3.1", - "magic-string": "0.30.21", - "ora": "9.3.0", + "magic-string": "1.0.0", + "ora": "9.4.1", "rxjs": "7.8.2" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular/animations": { - "version": "21.2.19", - "integrity": "sha512-qC0mviselvpKq2ID9bT+USnCsHKfwZAifkUr5A4h/WCzXvUvpVNWp/RPhGcKeOR+seg3EO5GtIZyblwiRlhzrA==", + "version": "22.1.3", + "integrity": "sha512-EgL1BrPcn3yaRamr/R9NlYlV6hZzzKRGxVp/cnfkYzzWKG4Wcno7lkGEo6eA2Vry66AJuXUu4M1BMyhHJ96zzg==", "deprecated": "@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/core": "21.2.19" + "@angular/core": "22.1.3" } }, "node_modules/@angular/build": { - "version": "21.2.19", - "integrity": "sha512-emy9mqrTXAwhZzcvx8MaHyz+cUR06PVGxnqy91+bpDxPP9S5x67sPoOkY9y/ETFFhRpB5ULlUxyq0eN/pi6QOg==", + "version": "22.1.5", + "integrity": "sha512-YqsbHZK3/HFmLLhwxa5SpN+3ABoVo5GFLV0fiEXCQg2KC7gw2pL15x692jxrq8gEGzT7O27bnjWkvFZ0bBHCnw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.19", - "@babel/core": "7.29.7", - "@babel/helper-annotate-as-pure": "7.27.3", + "@angular-devkit/architect": "0.2201.5", + "@babel/core": "8.0.1", + "@babel/helper-annotate-as-pure": "8.0.0", "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.21", - "@vitejs/plugin-basic-ssl": "2.1.4", - "beasties": "0.4.1", + "@inquirer/confirm": "6.1.1", + "@vitejs/plugin-basic-ssl": "2.3.0", + "beasties": "0.4.3", "browserslist": "^4.26.0", - "esbuild": "0.28.1", - "https-proxy-agent": "7.0.6", - "istanbul-lib-instrument": "6.0.3", + "esbuild": "0.28.2", + "https-proxy-agent": "9.1.0", "jsonc-parser": "3.3.1", - "listr2": "9.0.5", - "magic-string": "0.30.21", + "listr2": "11.0.0", + "magic-string": "1.0.0", "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "8.0.0", - "picomatch": "4.0.4", + "oxc-parser": "0.142.0", + "parse5-html-rewriting-stream": "8.0.1", + "picomatch": "4.0.5", "piscina": "5.2.0", - "rolldown": "1.0.0-rc.4", - "sass": "1.97.3", - "semver": "7.7.4", + "rolldown": "1.2.0", + "sass": "1.101.0", + "semver": "7.8.5", "source-map-support": "0.5.21", - "tinyglobby": "0.2.15", - "undici": "7.28.0", - "vite": "7.3.6", - "watchpack": "2.5.1" + "tinyglobby": "0.2.17", + "vite": "8.1.5", + "watchpack": "2.5.2" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.5.1" + "lmdb": "3.5.6" }, "peerDependencies": { - "@angular/compiler": "^21.0.0", - "@angular/compiler-cli": "^21.0.0", - "@angular/core": "^21.0.0", - "@angular/localize": "^21.0.0", - "@angular/platform-browser": "^21.0.0", - "@angular/platform-server": "^21.0.0", - "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.2.19", + "@angular/compiler": "^22.0.0", + "@angular/compiler-cli": "^22.0.0", + "@angular/core": "^22.0.0", + "@angular/localize": "^22.0.0", + "@angular/platform-browser": "^22.0.0", + "@angular/platform-server": "^22.0.0", + "@angular/service-worker": "^22.0.0", + "@angular/ssr": "^22.1.5", + "istanbul-lib-instrument": "^6.0.0", "karma": "^6.4.0", "less": "^4.2.0", - "ng-packagr": "^21.0.0", + "ng-packagr": "^22.0.0", "postcss": "^8.4.0", + "rollup": "^4.0.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.9 <6.0", + "typescript": ">=6.0 <6.1", "vitest": "^4.0.8" }, "peerDependenciesMeta": { @@ -619,6 +407,9 @@ "@angular/ssr": { "optional": true }, + "istanbul-lib-instrument": { + "optional": true + }, "karma": { "optional": true }, @@ -631,6 +422,9 @@ "postcss": { "optional": true }, + "rollup": { + "optional": true + }, "tailwindcss": { "optional": true }, @@ -639,89 +433,69 @@ } } }, - "node_modules/@angular/cdk": { - "version": "21.2.14", - "integrity": "sha512-806REq/CLf37nEhmmd8Q+ILN8z/RVG2vk2n8YZ/4TdHpcBCi5ux4AxLbpMmduLwGPOzPagJ6ggRzE5fnX0rmcQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "parse5": "^8.0.0", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": "^21.0.0 || ^22.0.0", - "@angular/core": "^21.0.0 || ^22.0.0", - "@angular/platform-browser": "^21.0.0 || ^22.0.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, "node_modules/@angular/cli": { - "version": "21.2.19", - "integrity": "sha512-i78NzvoNonAY17QgzSmqrYnXHmEfraLv4wZ/o/m3efxuz61ZJ+5X/PsCeAhbwBvQfRrPRQaJV2tK9vGjHa+U6w==", + "version": "22.1.5", + "integrity": "sha512-YZkhI64INQHJkZ13h2n0/0PBrQ5ZZvFGiprrDiCOLAD0y1fehguL0PGp9HxF3ZWf+xWRyP//tIte2gmyAaiWLw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2102.19", - "@angular-devkit/core": "21.2.19", - "@angular-devkit/schematics": "21.2.19", - "@inquirer/prompts": "7.10.1", - "@listr2/prompt-adapter-inquirer": "3.0.5", - "@modelcontextprotocol/sdk": "1.26.0", - "@schematics/angular": "21.2.19", - "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.48.1", - "ini": "6.0.0", + "@angular-devkit/architect": "0.2201.5", + "@angular-devkit/core": "22.1.5", + "@angular-devkit/schematics": "22.1.5", + "@inquirer/prompts": "8.5.2", + "@listr2/prompt-adapter-inquirer": "4.2.5", + "@modelcontextprotocol/sdk": "1.30.0", + "@schematics/angular": "22.1.5", "jsonc-parser": "3.3.1", - "listr2": "9.0.5", - "npm-package-arg": "13.0.2", - "pacote": "21.5.1", - "parse5-html-rewriting-stream": "8.0.0", - "semver": "7.7.4", - "yargs": "18.0.0", - "zod": "4.3.6" + "listr2": "11.0.0", + "npm-package-arg": "14.0.0", + "parse5-html-rewriting-stream": "8.0.1", + "semver": "7.8.5", + "yargs": "18.1.0", + "zod": "4.4.3" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular/common": { - "version": "21.2.19", - "integrity": "sha512-Rvo/VXI0kUmfQT7+OeAjv526OJlf/WrLnJq1Tz84Jkyv9bs9SOMTCT6m4+boo8gxVNdrcxvGU3Q0o2jZzKceSg==", + "version": "22.1.3", + "integrity": "sha512-QtMkjhiRd0EnmKR50bw3WbCWYTi6CmA72nnSz1BLQPpaLSi2goloCrPPniHz8fP+w2ESrmmlOWxs1Da3COgnQg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/core": "21.2.19", + "@angular/core": "22.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "21.2.19", - "integrity": "sha512-vuF5i1t14ftJiHXVVLgDYLWkT99QuajphcUHy1VZaMX3FiqSGXRV62g+R2RMxL0OJ5C1ai8xTHKPx9n1lQFyFg==", + "version": "22.1.3", + "integrity": "sha512-L8Mw2r7bGG/obqgQC+RU3mdFJ3NtLgO5gWhEC1ylcHpLCMPIAXYsMKJIL8dnS78S1wXo/omXwmJ4FiIlCwWahg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" } }, "node_modules/@angular/compiler-cli": { - "version": "21.2.19", - "integrity": "sha512-QxWqUvhTWgyYPPkfpupOUIEa3Y5cbzMilaFgRNpkvFy6teARw5Izsd7RxUbj3Tp3xJOi1MtumNmkxLxmv3iv7A==", + "version": "22.1.3", + "integrity": "sha512-37lLaDp0RHWZ/lmJqCmIEr0HOM2D5ulHy61gqTBm7KRj3Y6ZaxR8B/JqZmeIpPzKFILVsga+NQ4A8apBUkmezw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "7.29.7", + "@babel/core": "8.0.1", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^5.0.0", "convert-source-map": "^1.5.1", @@ -735,11 +509,11 @@ "ngc": "bundles/src/bin/ngc.js" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.19", - "typescript": ">=5.9 <6.1" + "@angular/compiler": "22.1.3", + "typescript": ">=6.0 <6.1" }, "peerDependenciesMeta": { "typescript": { @@ -748,17 +522,17 @@ } }, "node_modules/@angular/core": { - "version": "21.2.19", - "integrity": "sha512-PVoXD1kBexOJLkFzKx2zBY/0oZJXGru0eGn2hu0q5n3vkZlYsR1yRolfGenK1gZE48Qibiw/ttg/X/pAIPEZGg==", + "version": "22.1.3", + "integrity": "sha512-313+Xkf970AmStJE0E/zNJW/9xvDExQG+6TNltBBl+KJsW0q5dffK2w2PQfV4mtTquBqYoeHSRsms4WgjBKL8g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.19", + "@angular/compiler": "22.1.3", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, @@ -772,37 +546,38 @@ } }, "node_modules/@angular/forms": { - "version": "21.2.19", - "integrity": "sha512-tEw8cz2UU6VSB+ReJN86k87nRdLRXGi+8SZhoRl2dFu2iReIO3S6kJAVTH7Y9kdrokqTPhWG+KNEzWgqhdjXOg==", + "version": "22.1.3", + "integrity": "sha512-b4ual9pgfNqcnEHord50w960DDFIytG3Qb3bu2aCgzmagvRlg9wrtwQNqY+oqY2FVq7c9McNUN7MZRcWl9HNdQ==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", - "tslib": "^2.3.0" + "tslib": "^2.3.0", + "zod": "^4.0.10" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/common": "21.2.19", - "@angular/core": "21.2.19", - "@angular/platform-browser": "21.2.19", + "@angular/common": "22.1.3", + "@angular/core": "22.1.3", + "@angular/platform-browser": "22.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "21.2.19", - "integrity": "sha512-YMguYVhdkV8tr9MvbN+VpMjbdmsYq6g12M9WPvAYM51BkL2iREbWeoXDGmfCw9G0it6+0pMdgrSPFFUFuOqpAQ==", + "version": "22.1.3", + "integrity": "sha512-A8McE6AclwZa2ese4jMfZZu+qZfBFQ4Hl6CaMpzJ1C6Vv6+sXkLu9pouTosJEsUE+etVdepDsqau90lhzgw3Eg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/animations": "21.2.19", - "@angular/common": "21.2.19", - "@angular/core": "21.2.19" + "@angular/animations": "22.1.3", + "@angular/common": "22.1.3", + "@angular/core": "22.1.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -811,68 +586,68 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "21.2.19", - "integrity": "sha512-Ns+0D4S8A6Bypxgeba0QSDdIIVosOUfSfxDxiC0oN/VrgMBiLAbOROTnoNfOaFRgkV2gUzPNPFdHD2Ciflq+bQ==", + "version": "22.1.3", + "integrity": "sha512-dXI8U7C4QZOvWIA2VWPFjGQjJ6ceHlYRkShdvaluKmml6CxxPPvirjwQGj+G/syfAaArSzLijK4hM9xDuMo41w==", "deprecated": "@angular/platform-browser-dynamic is deprecated. Use `@angular/platform-browser` instead.", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/common": "21.2.19", - "@angular/compiler": "21.2.19", - "@angular/core": "21.2.19", - "@angular/platform-browser": "21.2.19" + "@angular/common": "22.1.3", + "@angular/compiler": "22.1.3", + "@angular/core": "22.1.3", + "@angular/platform-browser": "22.1.3" } }, "node_modules/@angular/platform-server": { - "version": "21.2.19", - "integrity": "sha512-UVyUIj04LRBoi4KfvxeZYPohzh80nSqamxpb8uzsYFKVSYdZSHDiFaE6OOzj0YST1rs2/LC92cPE2TY7IQIdew==", + "version": "22.1.3", + "integrity": "sha512-tzbMQSwHx2oIIjWQAgRunNNz3FW+AMYiUwVtdkKBXvPSp2d/ry+/6XO6fZ0BIi3ejhwtfIJL3GlOtmPMCHTkyw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0", "xhr2": "^0.2.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/common": "21.2.19", - "@angular/compiler": "21.2.19", - "@angular/core": "21.2.19", - "@angular/platform-browser": "21.2.19", + "@angular/common": "22.1.3", + "@angular/compiler": "22.1.3", + "@angular/core": "22.1.3", + "@angular/platform-browser": "22.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/router": { - "version": "21.2.19", - "integrity": "sha512-cKO/aq1xEMvgS29jFUc/Y3KsgEzHnwOw6sEL+UQZkZTmGD5YrYv8Yvj05GDMEUYbvDxBd5DixVVEbH38lyQKqA==", + "version": "22.1.3", + "integrity": "sha512-23owvZKCpdL7Yh3EzBj4OLf3x0z+jT9b57Qk96wdwI8Lsyf9L78/RJPYCutJ5r+zq3pFM/BHVKyd+2hkfH7N6Q==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "peerDependencies": { - "@angular/common": "21.2.19", - "@angular/core": "21.2.19", - "@angular/platform-browser": "21.2.19", + "@angular/common": "22.1.3", + "@angular/core": "22.1.3", + "@angular/platform-browser": "22.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@asamuzakjp/css-color": { - "version": "6.0.5", - "integrity": "sha512-mbhpPMmnw/kwW19aRNmSUl1QzLbdGo1SCuE49BT98MNwqF6zaHb3o2owssFc/PEO/4t2UjqtCNwocuDtJornzA==", + "version": "6.0.7", + "integrity": "sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@csstools/css-calc": "^3.2.1", - "@csstools/css-color-parser": "^4.1.9", + "@csstools/css-calc": "^3.3.0", + "@csstools/css-color-parser": "^4.1.10", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", "lru-cache": "^11.5.2" @@ -881,16 +656,6 @@ "node": "^22.13.0 || >=24.0.0" } }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "11.5.2", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@asamuzakjp/dom-selector": { "version": "8.3.2", "integrity": "sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==", @@ -907,404 +672,309 @@ "node": "^22.13.0 || >=24.0.0" } }, - "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { - "version": "11.5.2", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, - "license": "BlueOak-1.0.0", - "peer": true, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@axe-core/playwright": { - "version": "4.12.1", - "integrity": "sha512-rMd7xriptqKpP+w5265i4Hdkv2X5kbu6uiBi/B2I7uf3hieRBM3qDCfaKPtxfiYb2mKXfF+yLODJwIx+Jv1GDw==", + "version": "4.13.0", + "integrity": "sha512-6YLx+kxXu5GJceG4ozFg+33a2EMTdjYwWGloJ3sb9Kta5pp+ZNS53uxGVog5JetIY8s++P5UrtX+cri+u0VAVg==", "dev": true, "license": "MPL-2.0", "dependencies": { - "axe-core": "~4.12.1" + "axe-core": "~4.13.0" }, "peerDependencies": { "playwright-core": ">= 1.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.29.7", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "version": "8.0.0", + "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/helper-validator-identifier": "^8.0.0", + "js-tokens": "^10.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/compat-data": { - "version": "7.29.7", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "version": "8.0.0", + "integrity": "sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/core": { - "version": "7.29.7", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "version": "8.0.1", + "integrity": "sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==", "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", + "@babel/code-frame": "^8.0.0", + "@babel/generator": "^8.0.0", + "@babel/helper-compilation-targets": "^8.0.0", + "@babel/helpers": "^8.0.0", + "@babel/parser": "^8.0.0", + "@babel/template": "^8.0.0", + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0", + "@types/gensync": "^1.0.5", "convert-source-map": "^2.0.0", - "debug": "^4.1.0", + "empathic": "^2.0.1", "gensync": "^1.0.0-beta.2", + "import-meta-resolve": "^4.2.0", "json5": "^2.2.3", - "semver": "^6.3.1" + "obug": "^2.1.1", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.29.8", - "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/core/node_modules/convert-source-map": { "version": "2.0.0", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.29.1", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "8.0.0", + "integrity": "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^8.0.0", + "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "version": "8.0.0", + "integrity": "sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "version": "8.0.0", + "integrity": "sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", + "@babel/compat-data": "^8.0.0", + "@babel/helper-validator-option": "^8.0.0", "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "lru-cache": "^11.0.0", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.29.7", - "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "version": "8.0.1", + "integrity": "sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/helper-replace-supers": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/traverse": "^7.29.7", - "semver": "^6.3.1" + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-member-expression-to-functions": "^8.0.0", + "@babel/helper-optimise-call-expression": "^8.0.0", + "@babel/helper-replace-supers": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0", + "@babel/traverse": "^8.0.0", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.29.7", - "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "8.0.1", + "integrity": "sha512-PydTbcVTiIfVweHMeY1u3MslaD/ZzvnaTNhJp+7ghofelLWshF66Ckc/ZsjStfvRQIKQ4uVG0yEJucyDtyrWgw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.29.7" + "@babel/helper-annotate-as-pure": "^8.0.0", + "regexpu-core": "^6.3.1", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.29.7", - "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "1.0.0", + "integrity": "sha512-9jzVaTeZyXRDKTgUnNzcPQMO8y0ga3o+Z4fKjNet9Fcx7slgKa83qRbz0EwROSd6qO6CoEe/HQszqSPKb5lhkw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" + "@babel/helper-compilation-targets": "^8.0.0", + "@babel/helper-plugin-utils": "^8.0.0", + "lodash.debounce": "^4.0.8" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.29.7", - "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.8", - "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.4.0 || ^8.0.0" } }, "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "version": "8.0.0", + "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.29.7", - "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "version": "8.0.0", + "integrity": "sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "version": "8.0.0", + "integrity": "sha512-NZ7mSS93o4ndX4KrbD7W8Sf3QT8Qe24PrnFyUcuOPDzK6faqDFKjY9RG7he7+I7FdiQ4llpnosFqzrXa+Vy3Ew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "version": "8.0.1", + "integrity": "sha512-UgAhl1kqiW5ciE0yCXqqvnb4H2n3IELJ7lIIQRezwDPilPEZX5i+Rvbja9MFTkwUn2biEiSMeV31aUzR4Lwakw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-module-imports": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.0", + "@babel/traverse": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.29.7", - "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "version": "8.0.0", + "integrity": "sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.29.7", - "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "version": "8.0.1", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-wrap-function": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.29.7", - "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "8.0.1", + "integrity": "sha512-baAKuLEMmu6BCSY3tuiU7qglM1qOZt6F1SrFScA241oNqksxkxfEZEKztlGRmoVns9AQ5UgArH7RsUEjxWnzgQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.29.7" + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-wrap-function": "^8.0.0", + "@babel/traverse": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.29.7", - "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "version": "8.0.1", + "integrity": "sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-member-expression-to-functions": "^8.0.0", + "@babel/helper-optimise-call-expression": "^8.0.0", + "@babel/traverse": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.29.7", - "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "version": "8.0.0", + "integrity": "sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-split-export-declaration": { @@ -1319,7 +989,7 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/helper-string-parser": { "version": "7.29.7", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, @@ -1328,7 +998,7 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/helper-validator-identifier": { "version": "7.29.7", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, @@ -1337,1904 +1007,1566 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { + "version": "7.29.8", + "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/@babel/helper-string-parser": { + "version": "8.0.0", + "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "8.0.4", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "8.0.0", + "integrity": "sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, "node_modules/@babel/helper-wrap-function": { - "version": "7.29.7", - "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", + "version": "8.0.0", + "integrity": "sha512-Qpm8+wi5xfDkBfollanwriCcKniFfBmMmaKB01GVM6VGzKXo1fdxosZp04qEr5HM+LKhwr3hG1yRy8+ORsficA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/template": "^8.0.0", + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helpers": { - "version": "7.29.7", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "version": "8.0.0", + "integrity": "sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/template": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/parser": { - "version": "7.29.8", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "8.0.4", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.8" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.0.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.29.7", - "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "version": "8.0.1", + "integrity": "sha512-Ytgjjne4RnG3Oig7ik+NfY4ebRY30BPptVkkyu1f72eINJXRM3/bkU++tIc5aPvyLmo4KH20avq0xJ2o+9aEnw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.29.7", - "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "version": "8.0.1", + "integrity": "sha512-X7pAMBhuKluA7UfwZNvKN0XVVu/AGeo84Z75eJl85rcb8J2aBzLK92btahM1X5h0oi0QIrbe0qIMA/0+4Buk7w==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.29.7", - "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "version": "8.0.1", + "integrity": "sha512-DJviKTxYfH0hFwnMiW4dnPyMGzS3Hrr4zUfXl1zwQ0QiGlGlNYklLoPSYEQr8S7nau0/K7NdQjTh0qbYuyFjCA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.29.7", - "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "8.0.1", + "integrity": "sha512-DmR/N+B9+4PbURFj4+zdnWj49/PFAnK2bn8+E4ZAmwn3J5QCxnbG7Ep6aRfz9M8Aw+rBro0kIJQycvzFpl4buQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/plugin-transform-optional-chaining": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.13.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.29.7", - "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "8.0.1", + "integrity": "sha512-x8bi0LFVD2xkULjfNn+hCMg16yAFHAM9fS/ThSFeYBi+0MP9K6qcY2BZb4urUwC7PYtEy5wPe6TKjOEjXrCGFA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0", + "@babel/plugin-transform-optional-chaining": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "8.0.1", + "integrity": "sha512-P8+RN2n7ts2s1vnE+lXdHYf+dhnmcGSen/kWzBsVluT9Sey5AqmcRXYWlHqgQxaNlKTD5YMa1tf5z4d1v8W88w==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^8.0.1" + }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "8.0.1", + "integrity": "sha512-o/gr7kRlq3PKLLuYth4udOsrC7geBerti+QtwPeyxMOsEQO1d8kDHqk9r2PtMx2y9i8FG7tzyTerfv1yMLSMsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "8.0.1", + "integrity": "sha512-kqnSMF1YHBzuiQrl68675i5Ma1oljvo+SJsNEZFZVBu5BUrVIZm9KId3ui2PdtLK2sv2zM8sJnjPDfgLxQlEqQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-remap-async-to-generator": "^8.0.1", + "@babel/traverse": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "8.0.1", + "integrity": "sha512-e1jmmEU4p2Lx64sA1+EF8e8/RxPuegzbXcEbmFp5alDyLE+f2ViUpZ77bRWMXzihTwgVVmn/TOpqDbAuS5g1Ew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-module-imports": "^8.0.0", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-remap-async-to-generator": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "8.0.1", + "integrity": "sha512-0V97/gcf7LIgPieEiK1YT0eXa18XJFSLOTZjzEZhA9SJIqZhD/IwGUrCitBzXSmnGCP7hchwC6svHtJ/Eidcpg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.29.7", - "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "8.0.1", + "integrity": "sha512-HxiQvKsSCs2jOmMhjDrooHaZYOy6W8bqwXp/zjdgPjsNrda6tK9/CH3a/cVIeg6ge3hSS02ALqvqgIo4rTsuSg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.29.7", - "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "8.0.1", + "integrity": "sha512-tORnYiVhIHnKj90TgbSZXrO24f9oEpA6MgFxpIDSKKlHv7AzBIRhkMlYevanueLNYaQXqZWarfCgXM4bWTfNiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-create-class-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "8.0.1", + "integrity": "sha512-NEVK+L0Le8h8tJ+IK0CGS5y9Yi1ZHxLj6M5PeanhMFuq9aSo0XI+Wtmbuyop6fTNukOm7ORNntf/kwid891vqQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-transform-classes": { + "version": "8.0.1", + "integrity": "sha512-phwyCES8kIMAdVOFw25ztmgAvkl2G+TvUv7azUYyrlR1Qoo3eLJC/MU3MGUKFZ4BWtsJ1NTJM1lKRLzKbswg7w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-compilation-targets": "^8.0.0", + "@babel/helper-globals": "^8.0.0", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-replace-supers": "^8.0.1", + "@babel/traverse": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.29.7", - "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "8.0.1", + "integrity": "sha512-i4l3OGLO8DUDcwdnyraOvILbhqdUf4QgfzhVxSOSzRy49XKXrY7pwaSg9gDSKmhZfNPrEMciBSJSciQh/CjB1A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "8.0.1", + "integrity": "sha512-RtR8uLDl0QcCmqMNIkM8gmDeYZ3rS0ZH+sa+I6sfc09yFoqfp9AEPgBstq9KyfVb0lFCVSRFfJXCI70FIl5ccw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^8.0.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "8.0.1", + "integrity": "sha512-czOUoSaZljJ92yu+bYlXqb/UBN8K9daNCob/B6/7nthSvfGP6YhCnfqD64XWfyb2dN4ypxALNplApoJrsMd4fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "8.0.1", + "integrity": "sha512-kNnVLkxFUEcTtCyB5PFVQ5Xoy88Bk1lU/ZgDu97CW8eNhRH2Wsiy8Sq5l5dFnwtIUYjzsXHU77jUy1W5AtGSIw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "8.0.1", + "integrity": "sha512-Tv43P47o6fuHgBL7HLHQg3WKXohW9CEUGjLtnCDW27yJLK0zKUdTTqREbZbycNHA83hewMjde5tF6ekrHu9bAA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "8.0.1", + "integrity": "sha512-AS9GlgKc43tJNRu7yOvLaTko4qmdOb+8M69uNS8i421WLO20eVez7LdG5khKdi8E0LIQpYzzzdGIrdXWnO753g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "8.0.1", + "integrity": "sha512-VzDIYwBlLCpV6mJfloRdJm8HmYnMqs7O+bGha8yfg2kP7jAdxeCw6yZBVBeaKKQUThtSU52iy+3lB7DhYsbOBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/plugin-transform-destructuring": "^8.0.1" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "8.0.1", + "integrity": "sha512-DsZvUUklUmDQ7d2vp+VjqgUWD51mGxhZZ1FPdPP9Hcj0vsgGUKX+zEBGp/vzB1O5PZUxWT/Euq5fu39M9dm9wg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "8.0.1", + "integrity": "sha512-bFzznm46bvWGaTYKle3iolbBJ+oPBfUjwCPesxlFE3SQ7DaY9EHf/8Y5ZzrodKJi8JDdcAyaVWaDUSVyhULh0g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.29.7", - "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "8.0.1", + "integrity": "sha512-rpeXtgELjpIBQH/+YmyFlD9timPEVCyqY+TNednzoeoTYvXSBEeUvYnYE+BK8rB8m6hHiNK7aL9QWKhGifEJCw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "8.0.1", + "integrity": "sha512-H1L/JfPf3CqmubuaiZaquXKQ8MRs4YWSsgRllkTviM8TafcCNnlvc4/fJZ3rXP8HmFM+/Bg+TlsPehUI9BtDFA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^8.0.0", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.29.7", - "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "8.0.1", + "integrity": "sha512-Mowp8X0J6p7ZehLU82B5e65te2uuSeDHyxrEROwEAS2VKXNXssfw5ZMqhY7k9iXTsOv1Xs/49G3lDCj9Vvw8qQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.29.0", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "node_modules/@babel/plugin-transform-literals": { + "version": "8.0.1", + "integrity": "sha512-ai7kfPRcfyUV1EszXoF1PvL3IuJoCuH08WSEPoRcJTWfZZ55VL/rcfvbVY16QLA3jjbzzSneQSoCtD3L6OyUjw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.29.0" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "8.0.1", + "integrity": "sha512-Emvtr5zkEGyCNAmt+qKD5EUh8G0RbxV9EZWrDdX0LuVy5tBq1B3fOIslvVF9aCJmpnwS/AvAT53b9LxAZyXlng==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.29.7", - "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "8.0.1", + "integrity": "sha512-3Axi9abnyGsm/hh6DsKPZ1Cr9fTtKqS7w0Ig5g12mU269YclpH8pV3xMln2vPLexXgUp6S6L+I06d9/YOLfRKA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.29.7", - "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "8.0.1", + "integrity": "sha512-FDdhET8y1YFDNRuoynqSf23WTzbBBpbIB2oRrlFX7YYm9uWtFvJDSD1r/epBSjfPkOjeaaLgRW9xNnt3JGx46A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-module-transforms": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.29.7", - "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "8.0.1", + "integrity": "sha512-PMuzulWrrzFNmY3lXSk/tV9NRb7y0eZZLJY4UEo2TKszroxvUZHAPPi+T9FDyrQhod+TQA+t+8/QYaaMpiEuhA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-module-transforms": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.29.7", - "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "8.0.1", + "integrity": "sha512-0NEHanXmnFEnfT2dLKTXnu7m8GXFsnxRgteBC2aH21hYMBwAgxu5dcTdi/Eg+ToI1HbZe0CHwz4XRLgRNQhYoQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-module-transforms": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-validator-identifier": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.29.7", - "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "8.0.1", + "integrity": "sha512-XKTa2J2MdkmbVEeChq9f7Or0VYcsF0NyVBgytRyeN9F+J+ETAB2SHhfkG4toz/ssuU0i+h/QgJ6ddo5YakSQcA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-replace-supers": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-module-transforms": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.29.7", - "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "8.0.1", + "integrity": "sha512-zCHu+Jr2gTdJE48lN9SV/kXueCW2M79mKtKJc/ttfzzr/jvgdQdCd17RADMqFRQc/25MLxdtjTmlD0HSAMOlIQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.29.7" + "@babel/helper-create-regexp-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.29.7", - "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "8.0.1", + "integrity": "sha512-QSQxVg1x4PuOuhWUs4Y9u+x9Y+ER8z6G3tC+bDLBzvoOrNLJrEBQLRnwrTP8e5klihAw6Z+e9X5RjdAKcAGapA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/template": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.29.7", - "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "8.0.1", + "integrity": "sha512-AgCJAmQLF7+PtsK79wJqr4xJ2StHCXlz7JL5CVFP4HejJx25Tk6yl1ZrXvi0cKh3VGDVnfVxefxnrpsBirgpyQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.29.7", - "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "8.0.1", + "integrity": "sha512-it2DmUyLIA1GQUXlFDEnI+/G89mTgxndnAiZYpW8xYR6LboblfirMqiWJeTna5uypQJg7viTT4D1iEURRtFcfw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.29.7", - "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "8.0.1", + "integrity": "sha512-VmxkDu6bBdbxRzqn6E93hYucug4OVa6svSO19W//vVzNUGAmQzk3QRyHyyEtfcjSLR3NWfRsWwVM9zExLmd+2w==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-compilation-targets": "^8.0.0", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/plugin-transform-destructuring": "^8.0.1", + "@babel/plugin-transform-parameters": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.7", - "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "8.0.1", + "integrity": "sha512-fDkPXRTRKGm25bAq01q82UM4ypPqdVXCwphUUm4t1dL01fGIG0v8KRvT+4BjhMAtRxtPuI34t5Vs7yjRgs3ZgQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-replace-supers": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.29.7", - "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "8.0.1", + "integrity": "sha512-b2OQ74uGliyATcasTjxGy2O/86UI/n+EN4juB4EMfEwTi9j9uq70PuP0L8fW77vfRY66gO/YoTo/WbIdQ/Si1g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.29.7", - "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "8.0.1", + "integrity": "sha512-WtRS1c94lZGpGHxYLXMEWeoMVcuv8nkiyr8BTs6OYZv7N3Y9xVE8nbdFIl4lDJH6aH8/pLhqAQOL69d/WI9WdA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/plugin-transform-destructuring": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.29.7", - "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "8.0.1", + "integrity": "sha512-IIwRqroW0CYQwR6+3pnmu27z+H98poScWdnov8z6osumMeEsFxAFBBsDS2CFk2jFpPlGqVr89jK/HXO6i5DzxQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.29.7", - "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "8.0.1", + "integrity": "sha512-TrFCGcXaVDh6S5IRhmLSRTY9H80VTCMQWnZtzBRg4RWg3KCLmdmsmj4M15kZAPZfoPkWL/SJb4em3Py/vOiX8g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-create-class-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.29.7", - "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "8.0.1", + "integrity": "sha512-e+yfOqSYBZaf3PARpiQkjZrpWYgmcFLhK+1tevh2CpHR1O9/36IdyPnAZusESX5nzVV/XZTDAtQBRLa8HPT5Dw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-create-class-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.29.7", - "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "8.0.1", + "integrity": "sha512-Z/qx4cxUtYR1nt7XWRutObPxDks98fEYsjWbVeKEqZH6y3AGknmgzCqmHf2FHWZCl1DfoPeuJY+3hZ+35D+2tg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.29.7", - "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "8.0.2", + "integrity": "sha512-aFfsjCRYducRV4dPnpsBbdRkLjboca9FVDg6HZCgy0Ahvk2ZQ/2exmCRC5qS9P6rsWwrmIheNaIM6A1j2F8KMA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.29.7", - "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "8.0.1", + "integrity": "sha512-02ITRDBesPdTYU0oShAzERwEPzozOUQSXlz3qrt8JGuhalBJQv9z5NjgHJPC9sS3Fsam8gDtfAEpBnqZwUIdjQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-create-regexp-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.29.7", - "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "8.0.1", + "integrity": "sha512-+aykZi7ZP3U84veqfJXm3HhPZGddWFi64g7jr0ni6tb1zel+1ey+SL+IRKPoZXFyFqvYEsoqrmx4PyEJRlHl/Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.29.7", - "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "8.0.1", + "integrity": "sha512-MPDpKBrxn+thQay3eJmUiSeHswiT7MkINb48hHkX6OzodB149PKq1kred+lpMebrDzHA+G1ekCQnlYSkyEqAOw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-module-imports": "^8.0.0", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.29.7", - "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "8.0.1", + "integrity": "sha512-JddANd9yPVH8dYgVoNkqAH5BftnsDxFpG51Zas7sc6F3poz5QWcejHNGO8a/57IX5ByjGSzEmYk9Z7ZMa5MWaw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.29.7", - "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "node_modules/@babel/plugin-transform-spread": { + "version": "8.0.1", + "integrity": "sha512-O9Bw9FyxlSw1SlMg3S82/GKNZ0x77RPbHezotEy1JTlIM/vk6WO8jW1iF+iTiKLOXNvi+b+LZ9t77Gi+Q0FhGg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.8", - "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "8.0.1", + "integrity": "sha512-IsVP6WrZZQdaG2zLmeKwWiI+ua2NB5L1+f77C2/8z2NCDz7uxlIA/lnwocYOJk9PXcOC2sZgRls3LN4XpNduzQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.8" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.29.7", - "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "8.0.1", + "integrity": "sha512-JXvtj5+BJA9Qv3prDzW2z2DkGTJNmG0BObTdUD03STiu1Jr4fNQkQy3hYZgPL46a2RjcuhwBMYf49BOuJ98gnA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.7", - "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "8.0.1", + "integrity": "sha512-+wJoxgxP2gtey0UMUOMhzMMji2XHO/Uu6MXUh/r5Yhc2jngKzK/wFxY2WNe4UCaRcMvCb4gcnB8wIgFXJsocXg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.29.7", - "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "8.0.1", + "integrity": "sha512-TAXJepIJ6vZphytTwcf+LuXi2M2ZWI43VCqNw+1ZZLPP/38Z1A8j4Mahvg8kqDgMOSM/cakk+hedTJCiw3jQuQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.29.7", - "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "8.0.1", + "integrity": "sha512-zjBN9tSMSuomNDfurL69Gf7+v4D2t5uI1mSZaYJDo88SKpbduhCXqtxH7Tx66iCF6caWYwnBzSM0tnCozmQq5Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-create-regexp-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.29.7", - "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "8.0.1", + "integrity": "sha512-v0oO83cvT5lwbcIVRShpx4vaHD8AvM9IBowsQuTeP+kGmhh3recJQs33Bl6dlo3/2g9amlznLbFGn4VJbPCJqA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-create-regexp-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.29.7", - "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "8.0.1", + "integrity": "sha512-MlQeyS0K7gh0XNeLBMS/3Z07HjDOKhA7xm2L18GyxOXyiFHI9E+ZuQ4mFYmcLjluXsE/Wf6dABIqZvKpKw0Z3w==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/plugin-transform-destructuring": "^7.29.7", - "@babel/plugin-transform-parameters": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-create-regexp-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.29.7", - "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-replace-supers": "^7.29.7" + "node_modules/@babel/preset-env": { + "version": "8.0.2", + "integrity": "sha512-CUGLn9hNBCF/eXnwdFAWERbniCcXCRvnKwLV9fegeUEIqv7YlU2MepsWMMM54GcILx5XYMnRh+JAL+K5G+mK6g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/compat-data": "^8.0.0", + "@babel/helper-compilation-targets": "^8.0.0", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-validator-option": "^8.0.0", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^8.0.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^8.0.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^8.0.1", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^8.0.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^8.0.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^8.0.1", + "@babel/plugin-transform-arrow-functions": "^8.0.1", + "@babel/plugin-transform-async-generator-functions": "^8.0.1", + "@babel/plugin-transform-async-to-generator": "^8.0.1", + "@babel/plugin-transform-block-scoped-functions": "^8.0.1", + "@babel/plugin-transform-block-scoping": "^8.0.1", + "@babel/plugin-transform-class-properties": "^8.0.1", + "@babel/plugin-transform-class-static-block": "^8.0.1", + "@babel/plugin-transform-classes": "^8.0.1", + "@babel/plugin-transform-computed-properties": "^8.0.1", + "@babel/plugin-transform-destructuring": "^8.0.1", + "@babel/plugin-transform-dotall-regex": "^8.0.1", + "@babel/plugin-transform-duplicate-keys": "^8.0.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^8.0.1", + "@babel/plugin-transform-dynamic-import": "^8.0.1", + "@babel/plugin-transform-explicit-resource-management": "^8.0.1", + "@babel/plugin-transform-exponentiation-operator": "^8.0.1", + "@babel/plugin-transform-export-namespace-from": "^8.0.1", + "@babel/plugin-transform-for-of": "^8.0.1", + "@babel/plugin-transform-function-name": "^8.0.1", + "@babel/plugin-transform-json-strings": "^8.0.1", + "@babel/plugin-transform-literals": "^8.0.1", + "@babel/plugin-transform-logical-assignment-operators": "^8.0.1", + "@babel/plugin-transform-member-expression-literals": "^8.0.1", + "@babel/plugin-transform-modules-amd": "^8.0.1", + "@babel/plugin-transform-modules-commonjs": "^8.0.1", + "@babel/plugin-transform-modules-systemjs": "^8.0.1", + "@babel/plugin-transform-modules-umd": "^8.0.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^8.0.1", + "@babel/plugin-transform-new-target": "^8.0.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^8.0.1", + "@babel/plugin-transform-numeric-separator": "^8.0.1", + "@babel/plugin-transform-object-rest-spread": "^8.0.1", + "@babel/plugin-transform-object-super": "^8.0.1", + "@babel/plugin-transform-optional-catch-binding": "^8.0.1", + "@babel/plugin-transform-optional-chaining": "^8.0.1", + "@babel/plugin-transform-parameters": "^8.0.1", + "@babel/plugin-transform-private-methods": "^8.0.1", + "@babel/plugin-transform-private-property-in-object": "^8.0.1", + "@babel/plugin-transform-property-literals": "^8.0.1", + "@babel/plugin-transform-regenerator": "^8.0.2", + "@babel/plugin-transform-regexp-modifiers": "^8.0.1", + "@babel/plugin-transform-reserved-words": "^8.0.1", + "@babel/plugin-transform-shorthand-properties": "^8.0.1", + "@babel/plugin-transform-spread": "^8.0.1", + "@babel/plugin-transform-sticky-regex": "^8.0.1", + "@babel/plugin-transform-template-literals": "^8.0.1", + "@babel/plugin-transform-typeof-symbol": "^8.0.1", + "@babel/plugin-transform-unicode-escapes": "^8.0.1", + "@babel/plugin-transform-unicode-property-regex": "^8.0.1", + "@babel/plugin-transform-unicode-regex": "^8.0.1", + "@babel/plugin-transform-unicode-sets-regex": "^8.0.1", + "@babel/preset-modules": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^1.0.0", + "core-js-compat": "^3.48.0", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.29.7", - "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "node_modules/@babel/preset-modules": { + "version": "0.2.0", + "integrity": "sha512-yz0RBN2fx4fjCeFcTWsWgL7PxSRltvTa0Qg14HkWCU3qS8MO7ZSJlBVbGceynd5C9NsJwwUHNQD3dc6tYO+jqQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/plugin-transform-dotall-regex": "^8.0.1", + "@babel/plugin-transform-unicode-property-regex": "^8.0.1", + "@babel/types": "^8.0.0", + "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.29.7", - "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "node_modules/@babel/runtime": { + "version": "8.0.0", + "integrity": "sha512-sL6cvO2IfkSu/iU+zs2S/w01B7A8V7suXSIKEN4hPFFdZoiPGxrj5pAG0lCaqLWiEIrjKzdznIWuaLcxPR53qw==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "peer": true }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.29.7", - "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "node_modules/@babel/template": { + "version": "8.0.0", + "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/code-frame": "^8.0.0", + "@babel/parser": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.29.7", - "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "node_modules/@babel/traverse": { + "version": "8.0.4", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/code-frame": "^8.0.0", + "@babel/generator": "^8.0.0", + "@babel/helper-globals": "^8.0.0", + "@babel/parser": "^8.0.4", + "@babel/template": "^8.0.0", + "@babel/types": "^8.0.4", + "obug": "^2.1.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.29.7", - "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", + "node_modules/@babel/types": { + "version": "8.0.4", + "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-string-parser": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.29.7", - "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.29.7", - "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" + "css-tree": "^3.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "specificity": "bin/cli.js" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.8", - "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==", + "node_modules/@csstools/color-helpers": { + "version": "6.1.1", + "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20.19.0" } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.29.7", - "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", + "node_modules/@csstools/css-calc": { + "version": "3.3.0", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" + "node": ">=20.19.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.29.7", - "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", + "node_modules/@csstools/css-color-parser": { + "version": "4.2.0", + "integrity": "sha512-5+5LEmFuY1AjXdYhmgjTJogtQnP1evJ1zrBZGUNZ0thkpwnnmKxcHdAMn/OtFjAb25zA+jKDVYVRl+5G7rjv1A==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@csstools/color-helpers": "^6.1.1", + "@csstools/css-calc": "^3.3.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=20.19.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.29.0", - "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=20.19.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.8", + "integrity": "sha512-CpMLjAvwQg3BL5S0IeqsZNMH7EQrEWi0kLKOC13ZBF0ZwERiLWlibNPJr8G1kdU3Ms/r2KiNrF81pUh2HwAHdg==", "dev": true, - "license": "ISC", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "peer": true, - "bin": { - "semver": "bin/semver.js" + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.29.7", - "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20.19.0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.29.8", - "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==", + "node_modules/@discoveryjs/json-ext": { + "version": "1.1.0", + "integrity": "sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.17.0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.29.7", - "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "node_modules/@e965/xlsx": { + "version": "0.20.3", + "integrity": "sha512-703RN/3OdsRD5mtse2HBX7Um7xwaP9tlswEG6svOtjqokXoX7rJdQj7DyabD2I+xk22RgaIIU+R6BHgkpZGB/w==", + "license": "Apache-2.0", + "bin": { + "xlsx": "bin/xlsx.njs" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.8" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.29.7", - "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", + "node_modules/@emnapi/core": { + "version": "1.11.2", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", "dev": true, "license": "MIT", - "peer": true, + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.29.7", - "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", + "node_modules/@emnapi/runtime": { + "version": "1.11.2", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", "dev": true, "license": "MIT", - "peer": true, + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "^2.4.0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.29.7", - "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, "license": "MIT", - "peer": true, + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "^2.4.0" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.29.7", - "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.29.7", - "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.29.7", - "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/preset-env": { - "version": "7.29.2", - "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.29.0", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.29.0", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.29.0", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.15", - "babel-plugin-polyfill-corejs3": "^0.14.0", - "babel-plugin-polyfill-regenerator": "^0.6.6", - "core-js-compat": "^3.48.0", - "semver": "^6.3.1" - }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.2", - "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8", - "core-js-compat": "^3.48.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/runtime": { - "version": "7.29.2", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/template": { - "version": "7.29.7", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "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/traverse/node_modules/@babel/generator": { - "version": "7.29.8", - "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/types": { - "version": "7.29.8", - "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/@bcoe/v8-coverage": { - "version": "0.2.3", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "6.1.0", - "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peer": true, - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.3.0", - "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.1.10", - "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@csstools/color-helpers": "^6.1.0", - "@csstools/css-calc": "^3.3.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.7", - "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peer": true, - "peerDependencies": { - "css-tree": "^3.2.1" - }, - "peerDependenciesMeta": { - "css-tree": { - "optional": true - } - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.6.3", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14.17.0" - } - }, - "node_modules/@e965/xlsx": { - "version": "0.20.3", - "integrity": "sha512-703RN/3OdsRD5mtse2HBX7Um7xwaP9tlswEG6svOtjqokXoX7rJdQj7DyabD2I+xk22RgaIIU+R6BHgkpZGB/w==", - "license": "Apache-2.0", - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/@emnapi/core": { - "version": "1.11.3", - "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.11.3", - "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.3", - "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, @@ -3246,8 +2578,8 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "version": "0.28.2", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -3262,8 +2594,8 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "version": "0.28.2", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -3278,8 +2610,8 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "version": "0.28.2", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -3294,8 +2626,8 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "version": "0.28.2", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -3310,8 +2642,8 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "version": "0.28.2", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -3326,8 +2658,8 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "version": "0.28.2", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -3342,8 +2674,8 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "version": "0.28.2", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -3358,8 +2690,8 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "version": "0.28.2", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], @@ -3374,8 +2706,8 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "version": "0.28.2", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -3390,8 +2722,8 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "version": "0.28.2", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], @@ -3406,8 +2738,8 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "version": "0.28.2", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -3422,8 +2754,8 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "version": "0.28.2", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" ], @@ -3438,8 +2770,8 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "version": "0.28.2", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -3454,8 +2786,8 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "version": "0.28.2", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -3470,8 +2802,8 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "version": "0.28.2", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -3486,8 +2818,8 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "version": "0.28.2", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -3567,6 +2899,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.18", "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", @@ -3577,6 +2915,15 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", @@ -3622,15 +2969,6 @@ } } }, - "node_modules/@gar/promise-retry": { - "version": "1.0.3", - "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/@gerrit0/mini-shiki": { "version": "3.23.0", "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", @@ -3652,12 +2990,12 @@ "optional": true }, "node_modules/@hono/node-server": { - "version": "1.19.17", - "integrity": "sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ==", + "version": "2.1.1", + "integrity": "sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.14.1" + "node": ">=20" }, "peerDependencies": { "hono": "^4" @@ -3678,6 +3016,12 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.18", "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", @@ -3721,28 +3065,53 @@ "license": "BSD-3-Clause" }, "node_modules/@inquirer/ansi": { - "version": "1.0.2", - "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "version": "2.0.7", + "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, "node_modules/@inquirer/checkbox": { - "version": "4.3.2", - "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "version": "5.2.2", + "integrity": "sha512-Y5/bAScMy5Y+9isCx0SKbyJebMCaXXX5em0kxkj115eZNscgV9srOHrgyfS0e5xAVymIfOh9piYBKDILktsMMg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^12.0.0", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/checkbox/node_modules/@inquirer/core": { + "version": "12.0.0", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3754,16 +3123,16 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.21", - "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "version": "6.1.1", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3775,22 +3144,21 @@ } }, "node_modules/@inquirer/core": { - "version": "10.3.2", - "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "version": "11.2.1", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.3" + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3802,17 +3170,43 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.23", - "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "version": "5.3.0", + "integrity": "sha512-nnsP/IdJ8s83q7ZuObmgn12QM+uLCkab9E0Oordojbn62WUg1c+v9Ou/F/057pgh0ppX0W+Hj5bO/Dp5hsxQtA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/external-editor": "^1.0.3", - "@inquirer/type": "^3.0.10" + "@inquirer/core": "^12.0.0", + "@inquirer/external-editor": "^3.0.4", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor/node_modules/@inquirer/core": { + "version": "12.0.0", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3824,17 +3218,42 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.23", - "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "version": "5.1.2", + "integrity": "sha512-OWIH1IyyWqEKIyqC9Xy+Bnga7NkGMovFdo4atYZMUOTRqf6rO2WCv9E/1MyzvOErDBCxs+9UFliRUDc50xs/jw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" + "@inquirer/core": "^12.0.0", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand/node_modules/@inquirer/core": { + "version": "12.0.0", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3846,16 +3265,167 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "1.0.3", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "version": "3.0.4", + "integrity": "sha512-tZbbaK2ovq6vlrRBNQvjrypmrED/p5x2ncIHQ79cD55tei3dD96v5glMMA+6tiq7K104i/25DVYKWVPJuV6ptA==", "dev": true, "license": "MIT", "dependencies": { "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" + "iconv-lite": "^0.7.2" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "2.0.8", + "integrity": "sha512-tApbon79GM9ry56ja/Ud3SY2CL4TQsao9fIwDQbgTeNY55025GdMzQ2+UdegV/lx51VNGUB59M0v0nMpybYY4Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/input": { + "version": "5.1.3", + "integrity": "sha512-F/BZHtyEzP+HO+IGVd4AjBRgvX/ywm42bx8S0+dENk2YclzE9tJ3X/15THwtT6ehApmKvdYDMsVTuyyDod0gOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^12.0.0", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/input/node_modules/@inquirer/core": { + "version": "12.0.0", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "4.2.0", + "integrity": "sha512-ew+fSDijsQ/WhD4TV3XLb+if400cDuzTzHfGR8sTNBXkK9CYDWoGE8fhaO8GbT312pNv1AJEOsDxy/z/HVettA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^12.0.0", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number/node_modules/@inquirer/core": { + "version": "12.0.0", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "5.1.2", + "integrity": "sha512-nSdufycW8xynEVssFkNQEYIzTySilog0UlfOVRwh3pXzPSk4frXUT2jZWjHnKae6RU9PaoF9wfy1pGwewQuqGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^12.0.0", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password/node_modules/@inquirer/core": { + "version": "12.0.0", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3866,26 +3436,25 @@ } } }, - "node_modules/@inquirer/figures": { - "version": "1.0.15", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.3.1", - "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "node_modules/@inquirer/prompts": { + "version": "8.5.2", + "integrity": "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" + "@inquirer/checkbox": "^5.2.1", + "@inquirer/confirm": "^6.1.1", + "@inquirer/editor": "^5.2.2", + "@inquirer/expand": "^5.1.1", + "@inquirer/input": "^5.1.2", + "@inquirer/number": "^4.1.1", + "@inquirer/password": "^5.1.1", + "@inquirer/rawlist": "^5.3.1", + "@inquirer/search": "^4.2.1", + "@inquirer/select": "^5.2.1" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3896,17 +3465,17 @@ } } }, - "node_modules/@inquirer/number": { - "version": "3.0.23", - "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "node_modules/@inquirer/rawlist": { + "version": "5.3.2", + "integrity": "sha512-oPSKrYK1X1bMkjXDzIKHUkJp195LFSfgbnVtXnjSKGFjrCbS6I+wyvfAZTwKE9BSt3HwWgfD7JfsXALBgCogzQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" + "@inquirer/core": "^12.0.0", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3917,18 +3486,22 @@ } } }, - "node_modules/@inquirer/password": { - "version": "4.0.23", - "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "node_modules/@inquirer/rawlist/node_modules/@inquirer/core": { + "version": "12.0.0", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3939,25 +3512,18 @@ } } }, - "node_modules/@inquirer/prompts": { - "version": "7.10.1", - "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "node_modules/@inquirer/search": { + "version": "4.3.0", + "integrity": "sha512-HFxXE5w727ctSUcAwrDquftJGjMgu36OeV5SHEXMlr2j/ahzmRX9xSEeVolV8tzYnTf45cg6vGkdMMRdm3RPhQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.3.2", - "@inquirer/confirm": "^5.1.21", - "@inquirer/editor": "^4.2.23", - "@inquirer/expand": "^4.0.23", - "@inquirer/input": "^4.3.1", - "@inquirer/number": "^3.0.23", - "@inquirer/password": "^4.0.23", - "@inquirer/rawlist": "^4.1.11", - "@inquirer/search": "^3.2.2", - "@inquirer/select": "^4.4.2" + "@inquirer/core": "^12.0.0", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3968,18 +3534,22 @@ } } }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.11", - "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "node_modules/@inquirer/search/node_modules/@inquirer/core": { + "version": "12.0.0", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -3990,19 +3560,19 @@ } } }, - "node_modules/@inquirer/search": { - "version": "3.2.2", - "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "node_modules/@inquirer/select": { + "version": "5.2.2", + "integrity": "sha512-RkI8dRHWt+bh04oLixvF1kFzKC7e5rqJoHKkzcqSHATebBXFC6GmrT8ddbVkgSzLV0HnHs2cPFuBINr8otij8Q==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^12.0.0", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -4013,20 +3583,22 @@ } } }, - "node_modules/@inquirer/select": { - "version": "4.4.2", - "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "node_modules/@inquirer/select/node_modules/@inquirer/core": { + "version": "12.0.0", + "integrity": "sha512-+nnvFEXIB08CZNVXpvW3B+zHW96QXvGUjNKJ8NJIPqAZi5Kd4WhYt2S3C234ReepG1qw2HOlEUbjYVHBowXObA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -4038,12 +3610,12 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.10", - "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "version": "4.0.7", + "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -4072,8 +3644,8 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.3.0", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -4083,18 +3655,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.2.0", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", @@ -4110,35 +3670,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", @@ -4244,60 +3775,232 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.4.1", + "integrity": "sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.4.2", + "integrity": "sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.4.1", + "@jest/pattern": "30.4.0", + "@jest/reporters": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.4.1", + "jest-config": "30.4.2", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-resolve-dependencies": "30.4.2", + "jest-runner": "30.4.2", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "jest-watcher": "30.4.1", + "pretty-format": "30.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.4.0", + "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.4.1", + "integrity": "sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-mock": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract": { + "version": "30.4.1", + "integrity": "sha512-dSlKrqug3siYNHVnjwIldShY12wAH3spwRltO/+8VOjg0X+xEq7vOs3DbBs4LRKsu7OH+NUb9kuZUNBF9Ho3TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", + "@types/jsdom": "^21.1.7", + "@types/node": "*", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/@jest/expect": { + "version": "30.4.1", + "integrity": "sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.4.1", + "jest-snapshot": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.4.1", + "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.4.1", + "integrity": "sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@sinonjs/fake-timers": "^15.4.0", + "@types/node": "*", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.4.1", + "integrity": "sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/types": "30.4.1", + "jest-mock": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/console": { - "version": "30.4.1", - "integrity": "sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==", + "node_modules/@jest/pattern": { + "version": "30.4.0", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.4.1", - "jest-util": "30.4.1", - "slash": "^3.0.0" + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/core": { - "version": "30.4.2", - "integrity": "sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==", + "node_modules/@jest/reporters": { + "version": "30.4.1", + "integrity": "sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==", "dev": true, "license": "MIT", "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "30.4.1", - "@jest/pattern": "30.4.0", - "@jest/reporters": "30.4.1", "@jest/test-result": "30.4.1", "@jest/transform": "30.4.1", "@jest/types": "30.4.1", + "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", - "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", - "ci-info": "^4.2.0", + "collect-v8-coverage": "^1.0.2", "exit-x": "^0.2.2", - "fast-json-stable-stringify": "^2.1.0", + "glob": "^10.5.0", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.4.1", - "jest-config": "30.4.2", - "jest-haste-map": "30.4.1", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", "jest-message-util": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-resolve": "30.4.1", - "jest-resolve-dependencies": "30.4.2", - "jest-runner": "30.4.2", - "jest-runtime": "30.4.2", - "jest-snapshot": "30.4.1", "jest-util": "30.4.1", - "jest-validate": "30.4.1", - "jest-watcher": "30.4.1", - "pretty-format": "30.4.1", - "slash": "^3.0.0" + "jest-worker": "30.4.1", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -4311,272 +4014,324 @@ } } }, - "node_modules/@jest/diff-sequences": { - "version": "30.4.0", - "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", + "node_modules/@jest/schemas": { + "version": "30.4.1", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment": { + "node_modules/@jest/snapshot-utils": { "version": "30.4.1", - "integrity": "sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==", + "integrity": "sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.4.1", "@jest/types": "30.4.1", - "@types/node": "*", - "jest-mock": "30.4.1" + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment-jsdom-abstract": { - "version": "30.4.1", - "integrity": "sha512-dSlKrqug3siYNHVnjwIldShY12wAH3spwRltO/+8VOjg0X+xEq7vOs3DbBs4LRKsu7OH+NUb9kuZUNBF9Ho3TA==", + "node_modules/@jest/source-map": { + "version": "30.0.1", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.4.1", - "@jest/fake-timers": "30.4.1", - "@jest/types": "30.4.1", - "@types/jsdom": "^21.1.7", - "@types/node": "*", - "jest-mock": "30.4.1", - "jest-util": "30.4.1" + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "canvas": "^3.0.0", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } } }, - "node_modules/@jest/expect": { + "node_modules/@jest/test-result": { "version": "30.4.1", - "integrity": "sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==", + "integrity": "sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.4.1", - "jest-snapshot": "30.4.1" + "@jest/console": "30.4.1", + "@jest/types": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/expect-utils": { + "node_modules/@jest/test-sequencer": { "version": "30.4.1", - "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", + "integrity": "sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0" + "@jest/test-result": "30.4.1", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "slash": "^3.0.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/fake-timers": { + "node_modules/@jest/transform": { "version": "30.4.1", - "integrity": "sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==", + "integrity": "sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==", "dev": true, "license": "MIT", "dependencies": { + "@babel/core": "^7.27.4", "@jest/types": "30.4.1", - "@sinonjs/fake-timers": "^15.4.0", - "@types/node": "*", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-util": "30.4.1" + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "node_modules/@jest/transform/node_modules/@babel/code-frame": { + "version": "7.29.7", + "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/globals": { - "version": "30.4.1", - "integrity": "sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==", + "node_modules/@jest/transform/node_modules/@babel/compat-data": { + "version": "7.29.7", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jest/transform/node_modules/@babel/core": { + "version": "7.29.7", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.4.1", - "@jest/expect": "30.4.1", - "@jest/types": "30.4.1", - "jest-mock": "30.4.1" + "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@jest/pattern": { - "version": "30.4.0", - "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "node_modules/@jest/transform/node_modules/@babel/generator": { + "version": "7.29.8", + "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/@jest/transform/node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "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/@jest/transform/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jest/transform/node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "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/@jest/transform/node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "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/@jest/transform/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.4.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/reporters": { - "version": "30.4.1", - "integrity": "sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==", + "node_modules/@jest/transform/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.4.1", - "jest-util": "30.4.1", - "jest-worker": "30.4.1", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@jest/schemas": { - "version": "30.4.1", - "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "node_modules/@jest/transform/node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/snapshot-utils": { - "version": "30.4.1", - "integrity": "sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==", + "node_modules/@jest/transform/node_modules/@babel/helpers": { + "version": "7.29.7", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.4.1", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "node_modules/@jest/transform/node_modules/@babel/parser": { + "version": "7.29.8", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.0.0" } }, - "node_modules/@jest/test-result": { - "version": "30.4.1", - "integrity": "sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==", + "node_modules/@jest/transform/node_modules/@babel/template": { + "version": "7.29.7", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.4.1", - "@jest/types": "30.4.1", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/test-sequencer": { - "version": "30.4.1", - "integrity": "sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==", + "node_modules/@jest/transform/node_modules/@babel/traverse": { + "version": "7.29.8", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.4.1", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "slash": "^3.0.0" + "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/transform": { - "version": "30.4.1", - "integrity": "sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==", + "node_modules/@jest/transform/node_modules/@babel/types": { + "version": "7.29.8", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.4.1", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-util": "30.4.1", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, "node_modules/@jest/transform/node_modules/convert-source-map": { @@ -4585,6 +4340,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@jest/transform/node_modules/js-tokens": { + "version": "4.0.0", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/lru-cache": { + "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@jest/transform/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@jest/types": { "version": "30.4.1", "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", @@ -4711,14 +4490,14 @@ } }, "node_modules/@jsonjoy.com/fs-core": { - "version": "4.64.0", - "integrity": "sha512-zs2TAq7Six5jgMuoMNjpspAvOP3mhtgq/k1UyQodEzCtQi/N83y2/y+zcvnZSGp/Rxq96DBN+bValOBQAyn/ew==", + "version": "4.68.1", + "integrity": "sha512-V5oZ4Gt9WJKyQef0n9cAd0N9qjSkIBm3E4MYsgNIWBk5aINCDPKxMPo1i29rBxqiT4Ixf1epklqV9VJMKIxwlw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", + "@jsonjoy.com/fs-node-builtins": "4.68.1", + "@jsonjoy.com/fs-node-utils": "4.68.1", "thingies": "^2.5.0" }, "engines": { @@ -4733,15 +4512,15 @@ } }, "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.64.0", - "integrity": "sha512-nMWOVbkLFyEgmXZih3wyvxA9XpgyyqyfrINMHvEFqhi7uqfRl7c9ERJt6yX7vgMPrB9Uo+OJO+Spa0cFzPD01w==", + "version": "4.68.1", + "integrity": "sha512-HCG72UioncuO7Gw09XNVG+S85e3cq2hrUC/mexBrsWsa3mI7eePkkqWie3uVYbtsb64OR9YGQs5SqaufDRYBcg==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@jsonjoy.com/fs-core": "4.64.0", - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", + "@jsonjoy.com/fs-core": "4.68.1", + "@jsonjoy.com/fs-node-builtins": "4.68.1", + "@jsonjoy.com/fs-node-utils": "4.68.1", "thingies": "^2.5.0" }, "engines": { @@ -4756,17 +4535,17 @@ } }, "node_modules/@jsonjoy.com/fs-node": { - "version": "4.64.0", - "integrity": "sha512-dO+NNkODbUli4uV42bcNrrLvq5rE7SNpdZ5TNd0dtbLsAaNK3MDiIC9lUi+brboGoIjW6vd2fB1qao60nrk5xA==", + "version": "4.68.1", + "integrity": "sha512-R5D9mWtqdURzcOWj1vdXr3APCwX0xchtFT+kmW7fXLNDifWdDrnh26jSID8pdnUfFBxTyfHtFtTL/NWKzIH7kQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@jsonjoy.com/fs-core": "4.64.0", - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", - "@jsonjoy.com/fs-print": "4.64.0", - "@jsonjoy.com/fs-snapshot": "4.64.0", + "@jsonjoy.com/fs-core": "4.68.1", + "@jsonjoy.com/fs-node-builtins": "4.68.1", + "@jsonjoy.com/fs-node-utils": "4.68.1", + "@jsonjoy.com/fs-print": "4.68.1", + "@jsonjoy.com/fs-snapshot": "4.68.1", "glob-to-regex.js": "^1.0.0", "thingies": "^2.5.0" }, @@ -4782,8 +4561,8 @@ } }, "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.64.0", - "integrity": "sha512-/o7WRFhUWaM/fOrslwLZGnzn4RmRILykn+lAL+mNObqqRNw+CQSiij6hpCeZ+C7buhdoVo7go/OYqzaSUfDYmA==", + "version": "4.68.1", + "integrity": "sha512-HK1BTksysokNZxNspqDH0yPaqN9YgR/AYIlYiIaU2Ys4BOk5CdybI7r6BgiZuiiPiV8n4sK/kZdice7Znpy2Kw==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -4799,15 +4578,15 @@ } }, "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.64.0", - "integrity": "sha512-WDD9WVs0hb7UAEKTgZW2f66WDrbj7gIIWwpP3spbLyXa0rghtUaFTB8L4gdR3ZCWwiKIsj38/CNijpVmpnuPUw==", + "version": "4.68.1", + "integrity": "sha512-lpKmU4X9e/oh8GIuAI7EXaS5QiLNM3KD15CkdhfS6PYmrGvoJqKQcyEfnLgnnaGslh/PFUMYSIZBCf2ejJGw8g==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@jsonjoy.com/fs-fsa": "4.64.0", - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0" + "@jsonjoy.com/fs-fsa": "4.68.1", + "@jsonjoy.com/fs-node-builtins": "4.68.1", + "@jsonjoy.com/fs-node-utils": "4.68.1" }, "engines": { "node": ">=10.0" @@ -4821,13 +4600,13 @@ } }, "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.64.0", - "integrity": "sha512-k5Indsx9hWW9xSF7Y6oSKKwtCUNhzZxadub3owhIlitc+iMRVlPPdX2duTKQWBL3qNWpXya8jykgaaWpheeS4w==", + "version": "4.68.1", + "integrity": "sha512-/GxfW1DWm9SCdkfbvqevLO/P5duobQfmKkHXxdMIDbcZMQeAgooAstIfZhkXpATzq9QbCQsnoWFM/dGHdZfndw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.64.0", + "@jsonjoy.com/fs-node-builtins": "4.68.1", "glob-to-regex.js": "^1.0.1" }, "engines": { @@ -4842,13 +4621,13 @@ } }, "node_modules/@jsonjoy.com/fs-print": { - "version": "4.64.0", - "integrity": "sha512-PHZFccchvkhWrwPWHjmVAhbC3vSHCtyZvlZfJJ3ho2bnzl450hXri6/8e6pbkWdH+SkmLXNml0sV8e5HDAfxKw==", + "version": "4.68.1", + "integrity": "sha512-oGeZOGPYKK9v1CgeVeEDsLomH1lCnslSpqUN5GmPzrmAVGQlsmsdcXNA2O4lV8Y4xkuSuynx2ITBkUHJVaTbow==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.64.0", + "@jsonjoy.com/fs-node-utils": "4.68.1", "tree-dump": "^1.1.0" }, "engines": { @@ -4863,14 +4642,14 @@ } }, "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.64.0", - "integrity": "sha512-oM7UDeL83q6NBzzsfKAsYKXKVXlykKFqqOLh4xZZKAzzROTlInkPbc6LTDGThEOnPiFiUzA7tYziHG9xavd76Q==", + "version": "4.68.1", + "integrity": "sha512-XZfP0FDZN32bbc4t2bZN2qRrYHg5AktJnzk22HRoKGK4BprrbNRH2k5ceSNS/kupKYcofCs+O841+xaAbjnxwQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", + "@jsonjoy.com/fs-node-utils": "4.68.1", "@jsonjoy.com/json-pack": "^17.65.0", "@jsonjoy.com/util": "^17.65.0" }, @@ -5098,24 +4877,24 @@ "peer": true }, "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "3.0.5", - "integrity": "sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==", + "version": "4.2.5", + "integrity": "sha512-pYGy9dTdTwXdasPgyohkr0HoQ4FrkAzFnsUZl/gcnadDArbpZ8e+fgr+F9WBdNEl2y00mb9bCM4WgmoBkZJ27A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/type": "^3.0.8" + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.13.0" }, "peerDependencies": { - "@inquirer/prompts": ">= 3 < 8", - "listr2": "9.0.5" + "@inquirer/prompts": ">= 3 < 9", + "listr2": "11.0.0" } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.5.1", - "integrity": "sha512-tpfN4kKrrMpQ+If1l8bhmoNkECJi0iOu6AEdrTJvWVC+32sLxTARX5Rsu579mPImRP9YFWfWgeRQ5oav7zApQQ==", + "version": "3.5.6", + "integrity": "sha512-mY5FG4TjPAkY4P0w+OhHaUka5mDh2TX2WKYIwuKzJ1zeW3VvRgxdam/lGJTquI+bthTx5CSHDW+BAQCnNAzkEA==", "cpu": [ "arm64" ], @@ -5127,8 +4906,8 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.5.1", - "integrity": "sha512-+a2tTfc3rmWhLAolFUWRgJtpSuu+Fw/yjn4rF406NMxhfjbMuiOUTDRvRlMFV+DzyjkwnokisskHbCWkS3Ly5w==", + "version": "3.5.6", + "integrity": "sha512-foa+pwitysO8k+xhs7psBFfTKnVgR69NlZRRTHaFVDqphh7AdGpLeyRzKw/ofatr/sN6TiHRRW6mmop0ZrrppQ==", "cpu": [ "x64" ], @@ -5140,8 +4919,8 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.5.1", - "integrity": "sha512-0EgcE6reYr8InjD7V37EgXcYrloqpxVPINy3ig1MwDSbl6LF/vXTYRH9OE1Ti1D8YZnB35ZH9aTcdfSb5lql2A==", + "version": "3.5.6", + "integrity": "sha512-QR4YRyR5h5Z8eGXrNQjiyo2NNDfqi3tCc9dQG5Is1blCt+qWw1ZoBWhlWAr5d+jshkifMIJjVHzHGKbkKzF8Tw==", "cpu": [ "arm" ], @@ -5153,8 +4932,8 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.5.1", - "integrity": "sha512-aoERa5B6ywXdyFeYGQ1gbQpkMkDbEo45qVoXE5QpIRavqjnyPwjOulMkmkypkmsbJ5z4Wi0TBztON8agCTG0Vg==", + "version": "3.5.6", + "integrity": "sha512-HmiyFFdJa38s1heCMSooSPaBSFTHJ3C+ERPp28xAPlDX1YiALJVOgbry065nXd8Y7KISWjnw05zpG1RX8IfftA==", "cpu": [ "arm64" ], @@ -5166,8 +4945,8 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.5.1", - "integrity": "sha512-SqNDY1+vpji7bh0sFH5wlWyFTOzjbDOl0/kB5RLLYDAFyd/uw3n7wyrmas3rYPpAW7z18lMOi1yKlTPv967E3g==", + "version": "3.5.6", + "integrity": "sha512-ADzCuCF2cTNiX9kDScqcz1fjnAkxPpQNneV3KFTdV3wWtVlI2sTGzySoMTgDpinkMMFj1NTJlxA6XR8fwc4hlA==", "cpu": [ "x64" ], @@ -5179,8 +4958,8 @@ ] }, "node_modules/@lmdb/lmdb-win32-arm64": { - "version": "3.5.1", - "integrity": "sha512-50v0O1Lt37cwrmR9vWZK5hRW0Aw+KEmxJJ75fge/zIYdvNKB/0bSMSVR5Uc2OV9JhosIUyklOmrEvavwNJ8D6w==", + "version": "3.5.6", + "integrity": "sha512-J7A9aEQsQiv0TYtBGL7NDIPp2lOS8nnl+zm4sWZm1xlsTTaQ4PgD096Adzdrk27rw3UxCkDXdCUa4ax41oztBQ==", "cpu": [ "arm64" ], @@ -5192,8 +4971,8 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.5.1", - "integrity": "sha512-qwosvPyl+zpUlp3gRb7UcJ3H8S28XHCzkv0Y0EgQToXjQP91ZD67EHSCDmaLjtKhe+GVIW5om1KUpzVLA0l6pg==", + "version": "3.5.6", + "integrity": "sha512-1g7G0knRX2iV/voDu54yxrGqw5Dk0w2oIYb7dgJq8IkOi+m7wbD8Q3QpPFjh0C01G58S88dqGn03len6UPCXsg==", "cpu": [ "x64" ], @@ -5205,12 +4984,12 @@ ] }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.26.0", - "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", + "version": "1.30.0", + "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", "dev": true, "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.9", + "@hono/node-server": "^1.19.9 || ^2.0.5", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -5329,9 +5108,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5477,9 +5253,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5496,9 +5269,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -5515,9 +5285,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5534,9 +5301,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5553,9 +5317,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5572,9 +5333,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5591,9 +5349,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -5668,8 +5423,8 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.2", - "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", + "version": "1.2.3", + "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", "dev": true, "license": "MIT", "optional": true, @@ -5684,27 +5439,42 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "node_modules/@ngtools/webpack": { - "version": "21.2.19", - "integrity": "sha512-CT7P2yCXIMgSldgA1HQoEtdyYuZ994nnDkPuXJXXry/qfwlHL6FN1se641ZSxdutLgHQL7GRrV+0vhpUieEd3Q==", + "version": "22.1.5", + "integrity": "sha512-R1ehKK+Qd7YGkxg6ezFtA+A1O+0WXE6Lfv/abUotWQFa8dEdLFLqKzc0vFj2fi7VwgtWsTBhmuf4NTNGewvjFQ==", + "deprecated": "Angular's Webpack support is deprecated. Use the esbuild and Vite-based \"@angular/build\" package instead.", "dev": true, "license": "MIT", "peer": true, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^21.0.0", - "typescript": ">=5.9 <6.0", + "@angular/compiler-cli": "^22.0.0", + "typescript": ">=6.0 <6.1", "webpack": "^5.54.0" } }, + "node_modules/@noble/hashes": { + "version": "2.3.0", + "integrity": "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", @@ -5740,280 +5510,331 @@ "node": ">= 8" } }, - "node_modules/@npmcli/agent": { - "version": "4.0.2", - "integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==", + "node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.142.0", + "integrity": "sha512-ZiRGDutGsv1G6bL/ozy/koC0Sv39T1DqyoC4KD1DOy9ZoACm1O5UWhEK2c02Qdk+4lfLVkvFa/mQ0fm/4h1BtQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^11.2.1", - "socks-proxy-agent": "^8.0.3" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "11.5.2", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.142.0", + "integrity": "sha512-WZkvGRLNQTz8lR9zP5nLjUdlroRCopBu3g9zF1p/laE6DzT1UbQo8Rdz5MWhaJUPYg/6gp+jo7HUgsyKaN1FtQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "20 || >=22" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/fs": { - "version": "5.0.0", - "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.142.0", + "integrity": "sha512-l4khS8LQOOVYsGRVARo1gSaCT/aBSceUVXgtovWc2+drnxVuDr082WA3OCHVdVzIz5JIrP/y9CWsSKxBDNmYGg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/git": { - "version": "7.0.2", - "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.142.0", + "integrity": "sha512-QBsNF3nqlXmcH2B1YOPqQYmCJoy4HuIjUxGbBO/k5JAJUl68ghU2psRY2zPk+RyBaWqKP/qfL4oaFgEMCdwskA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "ini": "^6.0.0", - "lru-cache": "^11.2.1", - "npm-pick-manifest": "^11.0.1", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "which": "^6.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "4.0.0", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.142.0", + "integrity": "sha512-b7Q7m4Cqc6XqNhri3R+QhU+GVy646Pn+bkdhrDdWym/Fdi0ZUa+d73H9dm5H91JtbtAQ/z1d8XKMW3oOV8a4tQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=20" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "11.5.2", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.142.0", + "integrity": "sha512-3riVS5IhdH3uCZj1Y9ftDQlR0dvLsIlw/edrRqk8JhgNd5K0XSs+UBtgh50N13CAlW9/TXj6sVGXaKNBocd0Yg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "20 || >=22" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "6.0.1", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.142.0", + "integrity": "sha512-NmXUOpgpTSkhl795TiXmWppTwmSJ92RC1qvD6e4XOF+slgmo3e6Ah+kEu+6AN8s7NAOEwqGmir58MgSQSWmBSA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^4.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "4.0.0", - "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.142.0", + "integrity": "sha512-gc0EXsKtXgerujmU2Bql3u1L1HsSQ2774R83idq/FoNMPVV/RY/1ErFsvnit7KoiP/sLvzQixeUo4Ut0ic0wmw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^5.0.0", - "npm-normalize-package-bin": "^5.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/node-gyp": { - "version": "5.0.0", - "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.142.0", + "integrity": "sha512-F2XvmWSE0uWpie+jHKKIFgdVOe9ypGhkEZxKx5DuW215K6cbAC274yYaPkcM7EqY4Df3Weyhpcz3lsURyH2LVg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/package-json": { - "version": "7.0.5", - "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", + "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.142.0", + "integrity": "sha512-wLMbT21U/QxknQsk+VvNF0b9D2/aGWhcaQQQ+VYlE8FwD5+GoWZIPPXNzyHmkYyhm0KB3itL+TBavjMatqNnYA==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^7.0.0", - "glob": "^13.0.0", - "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.5.3", - "spdx-expression-parse": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/package-json/node_modules/balanced-match": { - "version": "4.0.4", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.142.0", + "integrity": "sha512-+G8F/4ckwT7FCJV4H2bt09xEzJbjNCfuL4Sp1AYNaFtFMVtgIGMuJlteT82U+K0UIZ/DzAR/LDlMFnEuajG7Kw==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "18 || 20 || >=22" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "5.0.9", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.142.0", + "integrity": "sha512-hTsHtTLxMAfCo+rpF5K3qZJKW2NpPN/CHd4mYB3y7XlSdspHkd2gehDIofP64AacA9nWQw2tY3O7wR6UY8IVOA==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "20 || >=22" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "13.0.6", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.142.0", + "integrity": "sha512-6y7qYY3TCUDYjqswImdTGl92y+KA/80twALegQPN27kfY+bG7Ib1+L3jbmrCZQx6wrVnai9IPsEZp07I0hx7JQ==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/package-json/node_modules/lru-cache": { - "version": "11.5.2", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.142.0", + "integrity": "sha512-i69kAWU+2LgoH5bR+zWiiu+UzAw7Oxkwv7COeJTeY19pn4e70nKQcr9Pm6cL2Z0Z54d+gl9qADlK/0yyuCPiBA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "20 || >=22" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "10.2.6", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.142.0", + "integrity": "sha512-4SQs678MmjYVrmhAgCWD4o0vpaFszXw9xLX5p2Z9MMFcltxiLkA88wQjh80YHjPrXtpyZ2CWI5m+1yNKM0m2Pw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/package-json/node_modules/path-scurry": { - "version": "2.0.2", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.142.0", + "integrity": "sha512-YHpx9N7Ln3a++Tc8rv+H7mrK1zyJQOAwCFg8LZ3lTs1T5afGWeZrLPhPT9HLnIwSjCyJqPWVMIrMxbjcmBr2oQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/promise-spawn": { - "version": "9.0.1", - "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.142.0", + "integrity": "sha512-3pLDyY3+oogW73RM5uehNgAiR/Xfb7fvO2Q1Z1gIqZ2+50XDVQmBVlRkHXZTU4gKnQHpwETNsYQVsJ3joVB2iA==", + "cpu": [ + "wasm32" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, "dependencies": { - "which": "^6.0.0" + "@emnapi/core": "1.11.2", + "@emnapi/runtime": "1.11.2", + "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "4.0.0", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=20" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "6.0.1", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.142.0", + "integrity": "sha512-Had/VeVY28Oyb0K+Q4FV8KCzoBycIh93oDK6pCbya9lkzdq+ikMHMgBubsdqqlybjJmQRawCQRrnBRHyQwYvcQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^4.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/redact": { - "version": "4.0.0", - "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", + "node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.142.0", + "integrity": "sha512-GGi3+YphVHavvgs6gum2UXoNCqzHAmPt/nXkn8ZQZstV2Q1qZD1Mn8fz/nWrDkefHQtrG/+1/XrbMxsBTo6Svw==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@npmcli/run-script": { - "version": "10.0.4", - "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.142.0", + "integrity": "sha512-Ny/Wv4Us1LGC/ljwNTp+Hx3r/pH15EFfeDF0p+n898gt+TtRd6C9SccHcuUhDiNTb8s5tt7jdeAMDRQZ4Vq6hg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "node-gyp": "^12.1.0", - "proc-log": "^6.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-project/types": { - "version": "0.113.0", - "integrity": "sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==", + "version": "0.142.0", + "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==", "dev": true, "license": "MIT", "funding": { @@ -6151,9 +5972,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -6174,9 +5992,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -6197,9 +6012,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -6220,9 +6032,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -6243,9 +6052,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -6266,9 +6072,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -6330,106 +6133,127 @@ "optional": true }, "node_modules/@peculiar/asn1-cms": { - "version": "2.8.0", - "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==", + "version": "2.9.4", + "integrity": "sha512-cben7oxmQsUGZqotus7yt0srYdncOT6RNWcTQ77T2RFOXejYVYkXadrfePdRcrVpO9K95IRLKKglG2k38jKXuw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "@peculiar/asn1-x509-attr": "^2.8.0", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-x509-attr": "^2.9.4", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/asn1-csr": { - "version": "2.8.0", - "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==", + "version": "2.9.4", + "integrity": "sha512-xd4YN4vpRjkDAQWVfZZkeu12IEND7DOpkqaHSIHxZl1uggUNa9Ju0QxY2jHvDAS9pP0zhRBytg8ifsnGo3V0jw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/asn1-ecc": { - "version": "2.8.0", - "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==", + "version": "2.9.4", + "integrity": "sha512-JJXefFshRAuVAjWQo/39bkg1ywc1VaiO44S8RRC+Ykvf/u2KDmYffoDb0ZBPCR5uJy4AGKQhl8mX+Q8ShcWaXQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/asn1-pfx": { - "version": "2.8.0", - "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==", + "version": "2.9.4", + "integrity": "sha512-khuGzHTzNzk4GDlIBEILyIs6Lce0yn0ZBdoI9v93kmNncfZRhD+AQ5ODFqdhvoE8cMJF/JMTQ8yA+t1D14kqCw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-cms": "^2.8.0", - "@peculiar/asn1-pkcs8": "^2.8.0", - "@peculiar/asn1-rsa": "^2.8.0", - "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-cms": "^2.9.4", + "@peculiar/asn1-pkcs8": "^2.9.4", + "@peculiar/asn1-rsa": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.8.0", - "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==", + "version": "2.9.4", + "integrity": "sha512-duRdotlUx9eDZe6QrQpQKl61RbWykCHBCkKayP8V8XdEFwlKHZ8qGGDMyS6Pye7OX7nLFttTTpRkJeet78ckwQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.8.0", - "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==", + "version": "2.9.4", + "integrity": "sha512-kaL4cNxBpdQE2dKlyZBqz4ygCrwffO+8wfoxTEqM1Z8RadvCeELBRzcv0dzM8aY9azHMwODO5nxU65zXmhToOQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-cms": "^2.8.0", - "@peculiar/asn1-pfx": "^2.8.0", - "@peculiar/asn1-pkcs8": "^2.8.0", - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "@peculiar/asn1-x509-attr": "^2.8.0", + "@peculiar/asn1-cms": "^2.9.4", + "@peculiar/asn1-pfx": "^2.9.4", + "@peculiar/asn1-pkcs8": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-x509-attr": "^2.9.4", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/asn1-rsa": { - "version": "2.8.0", - "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==", + "version": "2.9.4", + "integrity": "sha512-pZ96eD1PptovcWQ/GSmuNFXd/7EQJNlKfDaNCyE2rx3W0v6QFelkzquVqRSRyyDXXCYD69ZXJDzZ8GhIiQzKoA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/asn1-schema": { - "version": "2.8.0", - "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "version": "2.9.4", + "integrity": "sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg==", "dev": true, "license": "MIT", "peer": true, @@ -6437,32 +6261,41 @@ "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/asn1-x509": { - "version": "2.8.0", - "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==", + "version": "2.9.4", + "integrity": "sha512-CxhBo/RdEbMMob7T31ZdQjGuoyRFLVwrDzTn25bihzBasRg9kRm/0IxIPvhgQtcK/9dNcO1XQL2fuPugwELL0Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-schema": "^2.9.4", "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.8.0", - "integrity": "sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==", + "version": "2.9.4", + "integrity": "sha512-ehQXbpQaQYycgu8OrvigwSPTFfVRcu0ECNYCWw+yzBp02Lw5paRqzzhUpfOgO2K38+WfFZuEz/0RPtam5g0OMg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", "asn1js": "^3.0.10", "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" } }, "node_modules/@peculiar/utils": { @@ -6535,60 +6368,6 @@ "node": ">=20" } }, - "node_modules/@primeuix/motion": { - "version": "0.0.10", - "integrity": "sha512-PsZwOPq79Scp7/ionshRcQ5xKVf9+zuLcyY5mf6onK8chHT5C9JGphmcIZ4CzcqxuGEpsm8AIbTGy+zS3RtzLA==", - "license": "MIT", - "dependencies": { - "@primeuix/utils": "^0.6.3" - }, - "engines": { - "node": ">=12.11.0" - } - }, - "node_modules/@primeuix/motion/node_modules/@primeuix/utils": { - "version": "0.6.4", - "integrity": "sha512-pZ5f+vj7wSzRhC7KoEQRU5fvYAe+RP9+m39CTscZ3UywCD1Y2o6Fe1rRgklMPSkzUcty2jzkA0zMYkiJBD1hgg==", - "license": "MIT", - "engines": { - "node": ">=12.11.0" - } - }, - "node_modules/@primeuix/styled": { - "version": "0.7.4", - "integrity": "sha512-QSO/NpOQg8e9BONWRBx9y8VGMCMYz0J/uKfNJEya/RGEu7ARx0oYW0ugI1N3/KB1AAvyGxzKBzGImbwg0KUiOQ==", - "license": "MIT", - "dependencies": { - "@primeuix/utils": "^0.6.1" - }, - "engines": { - "node": ">=12.11.0" - } - }, - "node_modules/@primeuix/styled/node_modules/@primeuix/utils": { - "version": "0.6.4", - "integrity": "sha512-pZ5f+vj7wSzRhC7KoEQRU5fvYAe+RP9+m39CTscZ3UywCD1Y2o6Fe1rRgklMPSkzUcty2jzkA0zMYkiJBD1hgg==", - "license": "MIT", - "engines": { - "node": ">=12.11.0" - } - }, - "node_modules/@primeuix/styles": { - "version": "2.0.3", - "integrity": "sha512-2ykAB6BaHzR/6TwF8ShpJTsZrid6cVIEBVlookSdvOdmlWuevGu5vWOScgIwqWwlZcvkFYAGR/SUV3OHCTBMdw==", - "license": "MIT", - "dependencies": { - "@primeuix/styled": "^0.7.4" - } - }, - "node_modules/@primeuix/utils": { - "version": "0.7.2", - "integrity": "sha512-pmEbSfP0Phf9W9RweiM66zXnkn73ZeKyYINElbX3uZ2+stzzaba2svLAl3B1pHVcRw5t43O0VciaGe4ye2EXKw==", - "license": "MIT", - "engines": { - "node": ">=12.11.0" - } - }, "node_modules/@puppeteer/browsers": { "version": "2.13.2", "integrity": "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw==", @@ -6688,9 +6467,18 @@ "node": ">=12" } }, + "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { + "version": "21.1.1", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.4", - "integrity": "sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w==", + "version": "1.2.0", + "integrity": "sha512-9yB1l95IrJuNGDFdOYe79vdApdz6WWBCObE+rQ2LUliYUlcyFwSYIb2xb5/Ifw7dAtMy2ZqNyd8QTSOc7duAKw==", "cpu": [ "arm64" ], @@ -6705,8 +6493,8 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.4", - "integrity": "sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q==", + "version": "1.2.0", + "integrity": "sha512-pexNaW9ACLUOaBITOpU6qVu4VrsOFIjTv6bzgu0YUATo4eUJx0V605PxwZfndpPOn0ilqGqvGQ0M8UW0IE24jg==", "cpu": [ "arm64" ], @@ -6721,8 +6509,8 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.4", - "integrity": "sha512-JXmaOJGsL/+rsmMfutcDjxWM2fTaVgCHGoXS7nE8Z3c9NAYjGqHvXrAhMUZvMpHS/k7Mg+X7n/MVKb7NYWKKww==", + "version": "1.2.0", + "integrity": "sha512-NqKYaq0355ZmNMG4QGpxtEDxsc7tGDhjhCm4PpE0cwnBW+5Il95LJyq414niEiaKLVjnVHBEjSo1wngKxJNiFw==", "cpu": [ "x64" ], @@ -6737,8 +6525,8 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.4", - "integrity": "sha512-ep3Catd6sPnHTM0P4hNEvIv5arnDvk01PfyJIJ+J3wVCG1eEaPo09tvFqdtcaTrkwQy0VWR24uz+cb4IsK53Qw==", + "version": "1.2.0", + "integrity": "sha512-3vPoHzh6eBTz9IbB0/qZdSr0Qeks2echn+I4cHu2joV74VriPDdldswksEDzrl1mBB+oPRi+67+3Ib59paxIPQ==", "cpu": [ "x64" ], @@ -6753,8 +6541,8 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.4", - "integrity": "sha512-LwA5ayKIpnsgXJEwWc3h8wPiS33NMIHd9BhsV92T8VetVAbGe2qXlJwNVDGHN5cOQ22R9uYvbrQir2AB+ntT2w==", + "version": "1.2.0", + "integrity": "sha512-E6NNefZ1bUVmKJq2tJkf45J4Zyczj7qm9rUT7NY+Xo2474Y13qWAwc2tvBt0BAVbmtXR1llkxXg0Ou1jbDf2SQ==", "cpu": [ "arm" ], @@ -6769,15 +6557,12 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.4", - "integrity": "sha512-AC1WsGdlV1MtGay/OQ4J9T7GRadVnpYRzTcygV1hKnypbYN20Yh4t6O1Sa2qRBMqv1etulUknqXjc3CTIsBu6A==", + "version": "1.2.0", + "integrity": "sha512-D+TgkdgM1vu+7/Fpf8+v0ARW+RXEP9Ccazgm8zQ4JFFd9Q7SrYQ2TakU5S5ihazQDgpKyAgZDOcIFsvoHmTZ8w==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -6788,15 +6573,44 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.4", - "integrity": "sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ==", + "version": "1.2.0", + "integrity": "sha512-wUqdwJBbAv0APN87GecstdMUtLjjNTs0hBALpxETD73mccFxdmt/XeizXDtN5RAlBwNKmI+Tg+blect2G+8IeQ==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.0", + "integrity": "sha512-9DtF35qR9/NrfhM4oxLplCzVVjE+KKm8Pjemi0i/sdhAWkUasjmSo8WTTubNJClhSHCfyk2yeyoXDQEDPtDAAw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.0", + "integrity": "sha512-RzuHrBh8X8Hntd2N4VR02QGEciq/9JhcZoTpR/Cee6otRrlILGCf3cg2ygHuih+ZebUnWmMrDX6ITI85btO6rQ==", + "cpu": [ + "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6807,15 +6621,12 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.4", - "integrity": "sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg==", + "version": "1.2.0", + "integrity": "sha512-MK7L0018jjh1jR3mh21G2j1zAVcpscJBlPo2z19pRjv2XOYGRhaV4LyiD8HO6nCDdZln9IFgCMIV5yt4E3klGQ==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -6826,15 +6637,12 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.4", - "integrity": "sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g==", + "version": "1.2.0", + "integrity": "sha512-gyrxLQ9NfGb/9LoVnC4kb9miUghw1mghnkfYvNHSnVIXriabnfgGPUP4RLcJm87q3KgYz4FYUG8IDiWUT+CpSw==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -6845,8 +6653,8 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.4", - "integrity": "sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ==", + "version": "1.2.0", + "integrity": "sha512-/6VFMQGRmrhP77KXDC+StIxGzcNp5JOIyYtw0CQ8gPlzhpiIRucYfoM5FaFamHd5BJYIdH86yfP46l1p3WdrFA==", "cpu": [ "arm64" ], @@ -6861,8 +6669,8 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.4", - "integrity": "sha512-wz7ohsKCAIWy91blZ/1FlpPdqrsm1xpcEOQVveWoL6+aSPKL4VUcoYmmzuLTssyZxRpEwzuIxL/GDsvpjaBtOw==", + "version": "1.2.0", + "integrity": "sha512-rwdbUL465kisF24WEJLvP3JrEG6E5GRuIHt5wpMwHGERtHe4Wm2CIvtf5gTBgr2tGOHKh5NdKEAFS2VkOPE91g==", "cpu": [ "wasm32" ], @@ -6870,15 +6678,17 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" + "@emnapi/core": "1.11.2", + "@emnapi/runtime": "1.11.2", + "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { - "node": ">=14.0.0" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.4", - "integrity": "sha512-cfiMrfuWCIgsFmcVG0IPuO6qTRHvF7NuG3wngX1RZzc6dU8FuBFb+J3MIR5WrdTNozlumfgL4cvz+R4ozBCvsQ==", + "version": "1.2.0", + "integrity": "sha512-+5suHwRiKGmhwyUaNT8a5QbrBvLFh2DbO910TEmGRH1aSxwrCezodvGQnulv4uiWEIv1Kq4ypRsJ5+O+ry1DiA==", "cpu": [ "arm64" ], @@ -6893,8 +6703,8 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.4", - "integrity": "sha512-p6UeR9y7ht82AH57qwGuFYn69S6CZ7LLKdCKy/8T3zS9VTrJei2/CGsTUV45Da4Z9Rbhc7G4gyWQ/Ioamqn09g==", + "version": "1.2.0", + "integrity": "sha512-WfFv6/qGufotqBSBzBYwgpCkJBk8Nj7697LL9vTz/XWc67e0r3oewu8iMRwQj3AUL45GVD7wVsPjCsAAtW66Wg==", "cpu": [ "x64" ], @@ -6909,8 +6719,8 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.4", - "integrity": "sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==", + "version": "1.0.1", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, @@ -7041,9 +6851,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -7057,9 +6864,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -7073,9 +6877,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -7089,9 +6890,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -7105,9 +6903,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -7121,9 +6916,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -7137,9 +6929,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -7153,9 +6942,6 @@ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -7169,9 +6955,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -7185,9 +6968,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -7201,9 +6981,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -7217,9 +6994,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -7233,9 +7007,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -7347,17 +7118,18 @@ "license": "MIT" }, "node_modules/@schematics/angular": { - "version": "21.2.19", - "integrity": "sha512-eL+UU9eizoadhDB4YEctRmmo0A5iwrSmGzeuEa6akrq8nLGVWM8zO91HTJutkPqGQjelF+UOiOShsQSZAU9SIQ==", + "version": "22.1.5", + "integrity": "sha512-3UXlO4YoGgQ6nEBbCTGRRHTfQuDcKgHbRaiivzSinHzOYigsskwvloMsa0LCBCO/3uJpDIjJIyTW0XKhDti0iA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.19", - "@angular-devkit/schematics": "21.2.19", - "jsonc-parser": "3.3.1" + "@angular-devkit/core": "22.1.5", + "@angular-devkit/schematics": "22.1.5", + "jsonc-parser": "3.3.1", + "typescript": "6.0.3" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } @@ -7406,80 +7178,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@sigstore/bundle": { - "version": "4.0.0", - "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@sigstore/core": { - "version": "3.2.1", - "integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.5.1", - "integrity": "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "4.1.1", - "integrity": "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@gar/promise-retry": "^1.0.2", - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.0", - "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.4", - "proc-log": "^6.1.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "4.0.2", - "integrity": "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.1.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@sigstore/verify": { - "version": "3.1.1", - "integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.1", - "@sigstore/protobuf-specs": "^0.5.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/@sinclair/typebox": { "version": "0.34.52", "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", @@ -7504,12 +7202,6 @@ "@sinonjs/commons": "^3.0.1" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", @@ -7521,137 +7213,209 @@ "dev": true, "license": "MIT" }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "node_modules/@types/babel__core/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "node_modules/@types/babel__core/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "node_modules/@types/babel__core/node_modules/@babel/parser": { + "version": "7.29.8", + "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/@types/babel__core/node_modules/@babel/types": { + "version": "7.29.8", + "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/@types/babel__generator": { + "version": "7.27.0", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__generator/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@types/babel__generator/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@types/babel__generator/node_modules/@babel/types": { + "version": "7.29.8", + "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": "^16.14.0 || >=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@tufjs/models": { - "version": "4.1.0", - "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^10.1.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@tufjs/models/node_modules/balanced-match": { - "version": "4.0.4", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/@types/babel__template/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">=6.9.0" } }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "5.0.9", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "node_modules/@types/babel__template/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, "engines": { - "node": "20 || >=22" + "node": ">=6.9.0" } }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "10.2.6", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "node_modules/@types/babel__template/node_modules/@babel/parser": { + "version": "7.29.8", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.8" + "@babel/types": "^7.29.8" }, - "engines": { - "node": "18 || 20 || >=22" + "bin": { + "parser": "bin/babel-parser.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "node_modules/@types/babel__template/node_modules/@babel/types": { + "version": "7.29.8", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@babel/types": "^7.28.2" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "node_modules/@types/babel__traverse/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@types/babel__traverse/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "node_modules/@types/babel__traverse/node_modules/@babel/types": { + "version": "7.29.8", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@types/body-parser": { @@ -7659,6 +7423,7 @@ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -7679,6 +7444,7 @@ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -7694,37 +7460,6 @@ "@types/node": "*" } }, - "node_modules/@types/cors": { - "version": "2.8.19", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.9", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", @@ -7736,6 +7471,7 @@ "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -7748,6 +7484,7 @@ "integrity": "sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -7755,6 +7492,12 @@ "@types/send": "*" } }, + "node_modules/@types/gensync": { + "version": "1.0.5", + "integrity": "sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/hast": { "version": "3.0.5", "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", @@ -7768,7 +7511,8 @@ "version": "2.0.5", "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/http-proxy": { "version": "1.17.17", @@ -7825,29 +7569,11 @@ "parse5": "^7.0.0" } }, - "node_modules/@types/jsdom/node_modules/entities": { - "version": "6.0.1", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@types/jsdom/node_modules/parse5": { - "version": "7.3.0", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "node_modules/@types/jsesc": { + "version": "2.5.1", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -7862,6 +7588,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/less": { + "version": "3.0.8", + "integrity": "sha512-Gjm4+H9noDJgu5EdT3rUw5MhPBag46fiOy27BefvWkNL8mlZnKnCaVVVTLKj6RYXed9b62CPKnPav9govyQDzA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/lodash": { "version": "4.17.25", "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==", @@ -7879,7 +7612,8 @@ "version": "1.3.5", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/node": { "version": "22.20.1", @@ -7894,13 +7628,15 @@ "version": "6.15.1", "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/range-parser": { "version": "1.2.7", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/retry": { "version": "0.12.2", @@ -7914,6 +7650,7 @@ "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -7933,6 +7670,7 @@ "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -7944,6 +7682,7 @@ "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -7982,6 +7721,7 @@ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -8012,117 +7752,142 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "8.67.0", + "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/type-utils": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.67.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "version": "8.67.0", + "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", + "debug": "^4.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "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.67.0", + "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.67.0", + "@typescript-eslint/types": "^8.67.0", + "debug": "^4.4.3" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "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": "7.18.0", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "version": "8.67.0", + "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.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.67.0", + "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "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": "7.18.0", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "version": "8.67.0", + "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "version": "8.67.0", + "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -8130,72 +7895,84 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "version": "8.67.0", + "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/project-service": "8.67.0", + "@typescript-eslint/tsconfig-utils": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.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.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "8.67.0", + "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "version": "8.67.0", + "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.67.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "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", + "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/@ungap/structured-clone": { "version": "1.3.3", "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", @@ -8300,9 +8077,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -8316,9 +8090,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -8332,9 +8103,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -8348,9 +8116,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -8364,9 +8129,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -8380,9 +8142,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -8396,9 +8155,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -8412,9 +8168,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -8428,9 +8181,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -8444,9 +8194,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -8555,15 +8302,15 @@ ] }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "2.1.4", - "integrity": "sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==", + "version": "2.3.0", + "integrity": "sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==", "dev": true, "license": "MIT", "engines": { "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "peerDependencies": { - "vite": "^6.0.0 || ^7.0.0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@webassemblyjs/ast": { @@ -8737,24 +8484,9 @@ "node_modules/@xtuc/long": { "version": "4.2.2", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/abbrev": { - "version": "4.0.0", - "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } + "dev": true, + "license": "Apache-2.0", + "peer": true }, "node_modules/accepts": { "version": "2.0.0", @@ -8781,19 +8513,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", @@ -8803,18 +8522,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", @@ -8845,17 +8552,17 @@ } }, "node_modules/agent-base": { - "version": "7.1.4", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "version": "9.0.0", + "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/ajv": { - "version": "8.18.0", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "8.20.0", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -8899,36 +8606,12 @@ "ajv": "^8.8.2" } }, - "node_modules/algoliasearch": { - "version": "5.48.1", - "integrity": "sha512-Rf7xmeuIo7nb6S4mp4abW2faW8DauZyE2faBIKFaUfP3wnpOvNSbiI5AwVhqBNj0jPgBWEvhyCu0sLjN2q77Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.14.1", - "@algolia/client-abtesting": "5.48.1", - "@algolia/client-analytics": "5.48.1", - "@algolia/client-common": "5.48.1", - "@algolia/client-insights": "5.48.1", - "@algolia/client-personalization": "5.48.1", - "@algolia/client-query-suggestions": "5.48.1", - "@algolia/client-search": "5.48.1", - "@algolia/ingestion": "1.48.1", - "@algolia/monitoring": "1.48.1", - "@algolia/recommend": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -9022,12 +8705,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/arg": { - "version": "4.1.3", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", @@ -9080,12 +8757,15 @@ } }, "node_modules/array-union": { - "version": "2.1.0", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "version": "1.0.2", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/array-uniq": { @@ -9208,15 +8888,6 @@ "dev": true, "license": "MIT" }, - "node_modules/async-each-series": { - "version": "0.1.1", - "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/async-function": { "version": "1.0.0", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", @@ -9227,8 +8898,8 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.27", - "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "version": "10.5.4", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", "dev": true, "funding": [ { @@ -9247,8 +8918,8 @@ "license": "MIT", "peer": true, "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001774", + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -9279,8 +8950,8 @@ } }, "node_modules/axe-core": { - "version": "4.12.1", - "integrity": "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==", + "version": "4.13.0", + "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", "dev": true, "license": "MPL-2.0", "engines": { @@ -9291,161 +8962,345 @@ "version": "1.8.1", "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/babel-jest": { + "version": "30.4.1", + "integrity": "sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.4.1", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.4.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-loader": { + "version": "10.1.1", + "integrity": "sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0 || ^8.0.0-beta.1", + "@rspack/core": "^1.0.0 || ^2.0.0-0", + "webpack": ">=5.61.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.4.0", + "integrity": "sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "1.0.0", + "integrity": "sha512-yIkslVjbmml2Xjb6XhFW7lISXHsqk6cesxTdDsXoMom4Lnb99DbD3OQbSOoM5Z+ASh8YXYaLAsRQrU2Jeh3Qig==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^1.0.0", + "core-js-compat": "^3.48.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "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-preset-current-node-syntax/node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-jest": { - "version": "30.4.1", - "integrity": "sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==", + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.4.1", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.4.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-loader": { - "version": "10.0.0", - "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": "^18.20.0 || ^20.10.0 || >=22.0.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5.61.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.1", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "license": "BSD-3-Clause", - "workspaces": [ - "test/babel-8" - ], + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.4.0", - "integrity": "sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==", + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { - "@types/babel__core": "^7.20.5" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.17", - "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.8", - "semver": "^6.3.1" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.8", - "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "node_modules/babel-preset-current-node-syntax/node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" + "@babel/core": "^7.0.0-0" } }, "node_modules/babel-preset-jest": { @@ -9465,10 +9320,13 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "4.0.4", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/bare-events": { "version": "2.9.1", @@ -9485,8 +9343,8 @@ } }, "node_modules/bare-fs": { - "version": "4.7.4", - "integrity": "sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==", + "version": "4.8.0", + "integrity": "sha512-fM+MhCvdQhZ7NV6S95a07gPSqjIYKn6mFaXfx266wN3ajZGl/+1AzH+ubkXQ0fFZvOe2nk9VHkzdYkQE5zMV3Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9497,7 +9355,7 @@ "fast-fifo": "^1.3.2" }, "engines": { - "bare": ">=1.16.0" + "bare": ">=1.28.0" }, "peerDependencies": { "bare-buffer": "*" @@ -9542,26 +9400,17 @@ } }, "node_modules/bare-url": { - "version": "2.4.6", - "integrity": "sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==", + "version": "2.5.2", + "integrity": "sha512-L13PCJzKG8RGvx8V1/DdMi12ERhC3tprr7/8a94BxpmnRsFqxh5XZNdhtMxu5HPkRshYOOWRGY8lDP7ZhpG9Cg==", "dev": true, "license": "Apache-2.0", "dependencies": { "bare-path": "^3.0.0" } }, - "node_modules/base64id": { - "version": "2.0.0", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, "node_modules/baseline-browser-mapping": { - "version": "2.11.11", - "integrity": "sha512-/yImnXwyTvgMkhgekLHok/Rx5vO6E0BmStWlSqKWMVm2a2ITuZ1Tn+9bgLS+gZRdZmWtd8nxuhHpdmCUOWsTQQ==", + "version": "2.11.15", + "integrity": "sha512-FwMjJJ7HnyZpWe+oWxegG0fezZyBZUagI5LZEoO3GCbtbKNwRfMH9Ue5d5v01PNePBy1QSfPSDTTeVL0Hb9EzA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -9584,11 +9433,12 @@ "version": "0.6.1", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/beasties": { - "version": "0.4.1", - "integrity": "sha512-2Imdcw3LznDuxAbJM26RHniOLAzE6WgrK8OuvVXCQtNBS8rsnD9zsSEa3fHl4hHpUY7BYTlrpvtPVbvu9G6neg==", + "version": "0.4.3", + "integrity": "sha512-fIIeLOcbAB/K1kb1HBVJoiq1alHL4RCYBSo5e7HzrNkkgMggXR1Vqt/Z9JWnkfe/qdCo66Ux3QRwZioAIBdWRA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9645,6 +9495,7 @@ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -9676,399 +9527,492 @@ "url": "https://opencollective.com/express" } }, - "node_modules/body-parser/node_modules/content-type": { - "version": "2.0.0", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "node_modules/body-parser/node_modules/content-type": { + "version": "2.1.0", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/bonjour-service": { + "version": "1.4.4", + "integrity": "sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "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.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": "*" } }, - "node_modules/bonjour-service": { - "version": "1.4.4", - "integrity": "sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw==", + "node_modules/buffer-from": { + "version": "1.1.2", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.1.4", - "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "node_modules/builtins": { + "version": "5.1.0", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "balanced-match": "^1.0.0" + "semver": "^7.0.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/bundle-name": { + "version": "4.1.0", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "fill-range": "^7.1.1" + "run-applescript": "^7.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync": { - "version": "3.0.4", - "integrity": "sha512-mcYOIy4BW6sWSEnTSBjQwWsnbx2btZX78ajTTjdNfyC/EqQVcIe0nQR6894RNAMtvlfAnLaH9L2ka97zpvgenA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "browser-sync-client": "^3.0.4", - "browser-sync-ui": "^3.0.4", - "bs-recipes": "1.3.4", - "chalk": "4.1.2", - "chokidar": "^3.5.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "^4.1.0", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "micromatch": "^4.0.8", - "opn": "5.3.0", - "portscanner": "2.2.0", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "^0.19.0", - "serve-index": "^1.9.1", - "serve-static": "^1.16.2", - "server-destroy": "1.0.1", - "socket.io": "^4.4.1", - "ua-parser-js": "^1.0.33", - "yargs": "^17.3.1" - }, - "bin": { - "browser-sync": "dist/bin.js" + "node": ">=18" }, - "engines": { - "node": ">= 8.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/browser-sync-client": { - "version": "3.0.4", - "integrity": "sha512-+ew5ubXzGRKVjquBL3u6najS40TG7GxCdyBll0qSRc/n+JRV9gb/yDdRL1IAgRHqjnJTdqeBKKIQabjvjRSYRQ==", + "node_modules/bytes": { + "version": "3.1.2", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "license": "ISC", - "dependencies": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3" - }, + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">= 0.8" } }, - "node_modules/browser-sync-ui": { - "version": "3.0.4", - "integrity": "sha512-5Po3YARCZ/8yQHFzvrSjn8+hBUF7ZWac39SHsy8Tls+7tE62iq6pYWxpVU6aOOMAGD21RwFQhQeqmJPf70kHEQ==", + "node_modules/bytestreamjs": { + "version": "2.0.1", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async-each-series": "0.1.1", - "chalk": "4.1.2", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^4.4.1", - "stream-throttle": "^0.1.3" + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/browser-sync/node_modules/chokidar": { - "version": "3.6.0", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/call-bind": { + "version": "1.0.9", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 0.4" }, "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/browser-sync/node_modules/cliui": { - "version": "8.0.1", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/browser-sync/node_modules/emoji-regex": { - "version": "8.0.0", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/browser-sync/node_modules/glob-parent": { - "version": "5.1.2", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/call-bound": { + "version": "1.0.4", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/browser-sync/node_modules/iconv-lite": { - "version": "0.4.24", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/callsites": { + "version": "3.1.0", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/browser-sync/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/camelcase": { + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/browser-sync/node_modules/picomatch": { - "version": "2.3.2", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "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", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/browser-sync/node_modules/raw-body": { - "version": "2.5.3", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "node_modules/char-regex": { + "version": "1.0.2", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "node_modules/browser-sync/node_modules/readdirp": { - "version": "3.6.0", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/chardet": { + "version": "2.2.0", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-types": { + "version": "11.2.3", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cheerio": { + "version": "1.0.0", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/browser-sync/node_modules/string-width": { - "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/cheerio-select": { + "version": "2.1.0", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/browser-sync/node_modules/wrap-ansi": { - "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.2.2", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/browser-sync/node_modules/yargs": { - "version": "17.7.3", - "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "node_modules/cheerio-select/node_modules/css-what": { + "version": "6.2.2", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=12" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/browserslist": { - "version": "4.28.7", - "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "9.1.0", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, + "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/fb55" } ], "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" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "node_modules/cheerio/node_modules/undici": { + "version": "6.28.0", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", "dev": true, "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, "engines": { - "node": ">= 6" + "node": ">=18.17" } }, - "node_modules/bs-recipes": { - "version": "1.3.4", - "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "node_modules/cheerio/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "node_modules/bser": { - "version": "2.1.1", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/chokidar": { + "version": "5.0.0", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "node-int64": "^0.4.0" + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": "*" + "node": ">=6.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "node_modules/chromium-bidi": { + "version": "14.0.0", + "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/chromium-bidi/node_modules/zod": { + "version": "3.25.76", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/builtins": { - "version": "5.1.0", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "node_modules/ci-info": { + "version": "4.4.0", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", - "peer": true, - "dependencies": { - "semver": "^7.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/bundle-name": { - "version": "4.1.0", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "node_modules/cjs-module-lexer": { + "version": "2.2.1", + "integrity": "sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "run-applescript": "^7.0.0" + "restore-cursor": "^5.0.0" }, "engines": { "node": ">=18" @@ -10077,1315 +10021,1451 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bytes": { - "version": "3.1.2", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/cli-spinners": { + "version": "3.4.0", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=6.0.0" + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacache": { - "version": "20.0.4", - "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==", + "node_modules/cli-truncate": { + "version": "6.1.1", + "integrity": "sha512-06p9vyLahLa4zkGcgsGxU6iEkSOiuI4fhCH6Emhe2lPAcoUv73n72DnODsnHA+5wwXGnV0n9M9/qOQJSjYhFhw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/fs": "^5.0.0", - "fs-minipass": "^3.0.0", - "glob": "^13.0.0", - "lru-cache": "^11.1.0", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^13.0.0" + "slice-ansi": "^9.0.0", + "string-width": "^8.2.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=22" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacache/node_modules/balanced-match": { - "version": "4.0.4", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.3.0", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "5.0.9", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.2.2", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": "20 || >=22" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacache/node_modules/glob": { - "version": "13.0.6", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.2.0", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" + "ansi-regex": "^6.2.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "11.5.2", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "node_modules/cli-width": { + "version": "4.1.0", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, "engines": { - "node": "20 || >=22" + "node": ">=20" } }, - "node_modules/cacache/node_modules/minimatch": { - "version": "10.2.6", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "6.3.0", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, + "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cacache/node_modules/path-scurry": { - "version": "2.0.2", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, + "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/call-bind": { - "version": "1.0.9", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/callsites": { - "version": "3.1.0", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/clone-deep": { + "version": "4.0.1", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, "engines": { "node": ">=6" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/co": { + "version": "4.6.0", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001806", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "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" + "license": "MIT" }, - "node_modules/chalk": { - "version": "4.1.2", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/color-convert": { + "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=7.0.0" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/color-name": { + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - } + "peer": true }, - "node_modules/chardet": { - "version": "2.2.0", - "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "node_modules/commander": { + "version": "15.0.0", + "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } }, - "node_modules/check-types": { - "version": "11.2.3", - "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "node_modules/common-path-prefix": { + "version": "3.0.0", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/cheerio": { - "version": "1.0.0", - "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "node_modules/compressible": { + "version": "2.0.18", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "encoding-sniffer": "^0.2.0", - "htmlparser2": "^9.1.0", - "parse5": "^7.1.2", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^6.19.5", - "whatwg-mimetype": "^4.0.0" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=18.17" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + "node": ">= 0.6" } }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "node_modules/compression": { + "version": "1.8.1", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "peer": true, "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.2.2", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "peer": true, "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "ms": "2.0.0" } }, - "node_modules/cheerio-select/node_modules/css-what": { - "version": "6.2.2", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "peer": true + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">= 0.6" } }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "9.1.0", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" + "peer": true, + "engines": { + "node": ">=0.8" } }, - "node_modules/cheerio/node_modules/parse5": { - "version": "7.3.0", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "node_modules/content-disposition": { + "version": "1.1.0", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "dev": true, "license": "MIT", - "dependencies": { - "entities": "^6.0.0" + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/cheerio/node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "node_modules/content-type": { + "version": "1.0.5", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": ">= 0.6" } }, - "node_modules/cheerio/node_modules/undici": { - "version": "6.28.0", - "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.17" + "node": ">= 0.6" } }, - "node_modules/cheerio/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "node_modules/cookie-signature": { + "version": "1.2.2", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=6.6.0" } }, - "node_modules/chokidar": { - "version": "5.0.0", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "node_modules/copy-anything": { + "version": "3.0.5", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^5.0.0" + "is-what": "^4.1.8" }, "engines": { - "node": ">= 20.19.0" + "node": ">=12.13" }, "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "node_modules/copy-webpack-plugin": { + "version": "14.0.0", + "integrity": "sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "glob-parent": "^6.0.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^7.0.3", + "tinyglobby": "^0.2.12" + }, "engines": { - "node": ">=6.0" + "node": ">= 20.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "node_modules/chromium-bidi": { - "version": "14.0.0", - "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "node_modules/core-js-compat": { + "version": "3.50.0", + "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "peer": true, "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" + "browserslist": "^4.28.7" }, - "peerDependencies": { - "devtools-protocol": "*" + "engines": { + "node": ">=6.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/chromium-bidi/node_modules/mitt": { - "version": "3.0.1", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "node_modules/core-util-is": { + "version": "1.0.3", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, - "node_modules/chromium-bidi/node_modules/zod": { - "version": "3.25.76", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "node_modules/cors": { + "version": "2.8.6", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "dev": true, "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, "funding": { - "url": "https://github.com/sponsors/colinhacks" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/ci-info": { - "version": "4.4.0", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "node_modules/cosmiconfig": { + "version": "9.0.2", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/cjs-module-lexer": { - "version": "2.2.0", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/css-loader": { + "version": "7.1.4", + "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "restore-cursor": "^5.0.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.40", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.6.3" }, "engines": { - "node": ">=18" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/cli-spinners": { - "version": "3.4.0", - "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "node_modules/css-select": { + "version": "6.0.0", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.20" + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cli-truncate": { - "version": "5.2.0", - "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "node_modules/css-tree": { + "version": "3.2.1", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "slice-ansi": "^8.0.0", - "string-width": "^8.2.0" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=20" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "7.0.0", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.2.2", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/cssesc": { + "version": "3.0.0", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "peer": true, + "bin": { + "cssesc": "bin/cssesc" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "8.2.2", - "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "node_modules/cssstyle": { + "version": "4.6.0", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.2.0", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/cssstyle/node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" - }, + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/cssstyle/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/cli-width": { - "version": "4.1.0", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "node_modules/cssstyle/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "dev": true, - "license": "ISC", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">= 12" + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/cliui": { - "version": "9.0.1", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "node_modules/cssstyle/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "dev": true, - "license": "ISC", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { - "node": ">=20" + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/cssstyle/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/cssstyle/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "10.6.0", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "node_modules/cssstyle/node_modules/lru-cache": { + "version": "10.4.3", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/cliui/node_modules/string-width": { - "version": "7.2.0", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/data-urls": { + "version": "7.0.0", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "16.0.1", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "ansi-regex": "^6.2.2" + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "9.0.2", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "isobject": "^3.0.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/co": { - "version": "4.6.0", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/debug": { + "version": "4.4.3", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "node_modules/decimal.js": { + "version": "10.6.0", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "dev": true, "license": "MIT" }, - "node_modules/color-convert": { - "version": "2.0.1", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/dedent": { + "version": "1.7.2", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" }, - "engines": { - "node": ">=7.0.0" + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } } }, - "node_modules/color-name": { - "version": "1.1.4", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "node_modules/deep-is": { + "version": "0.1.4", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, - "node_modules/commander": { - "version": "14.0.3", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "node_modules/deepmerge": { + "version": "4.3.1", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { - "node": ">=20" + "node": ">=0.10.0" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "license": "ISC" - }, - "node_modules/compressible": { - "version": "2.0.18", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/default-browser": { + "version": "5.5.1", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/compression": { - "version": "1.8.1", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "node_modules/default-browser-id": { + "version": "5.0.1", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/define-data-property": { + "version": "1.1.4", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ms": "2.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/define-properties": { + "version": "1.2.1", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/connect": { - "version": "3.6.6", - "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "node_modules/degenerator": { + "version": "5.0.1", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 14" } }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "node_modules/depd": { + "version": "2.0.0", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8" + "node": ">= 0.8" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/dependency-graph": { + "version": "1.0.0", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/destroy": { + "version": "1.2.0", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "node_modules/content-disposition": { - "version": "1.1.0", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "node_modules/detect-libc": { + "version": "2.1.2", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=8" } }, - "node_modules/content-type": { - "version": "1.0.5", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/detect-newline": { + "version": "3.1.0", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "node_modules/detect-node": { + "version": "2.1.0", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, - "node_modules/cookie": { - "version": "0.7.2", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "node_modules/devtools-protocol": { + "version": "0.0.1608973", + "integrity": "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "node_modules/doctrine": { + "version": "3.0.0", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { - "node": ">=6.6.0" + "node": ">=6.0.0" } }, - "node_modules/copy-anything": { - "version": "2.0.6", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "license": "MIT", "dependencies": { - "is-what": "^3.14.1" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/copy-webpack-plugin": { - "version": "14.0.0", - "integrity": "sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==", + "node_modules/domelementtype": { + "version": "2.3.0", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "license": "MIT", - "peer": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "glob-parent": "^6.0.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^7.0.3", - "tinyglobby": "^0.2.12" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">= 20.9.0" + "node": ">= 4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/core-js-compat": { - "version": "3.49.0", - "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "node_modules/domutils": { + "version": "3.2.2", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, - "license": "MIT", - "peer": true, + "license": "BSD-2-Clause", "dependencies": { - "browserslist": "^4.28.1" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/cors": { - "version": "2.8.6", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.411", + "integrity": "sha512-gglkxzokjHfawpGxq75XdBV2/l3BAPzrsMs70qgaZdTW5rpV1tC4MdgJVP9fN126bODA4ZJQkn1wryEzJyQXIg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, "engines": { - "node": ">= 0.10" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/cosmiconfig": { - "version": "9.0.2", - "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "node_modules/emoji-regex": { + "version": "9.2.2", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/empathic": { + "version": "2.0.1", + "integrity": "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==", "dev": true, "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, "engines": { "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, - "node_modules/create-require": { - "version": "1.1.1", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "node_modules/encodeurl": { + "version": "2.0.0", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, - "node_modules/css-loader": { - "version": "7.1.3", - "integrity": "sha512-frbERmjT0UC5lMheWpJmMilnt9GEhbZJN/heUb7/zaJYeIzj5St9HvDcfshzzOqbsS+rYpMk++2SD3vGETDSyA==", + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.40", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.6.3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/css-select": { - "version": "6.0.0", - "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "node_modules/end-of-stream": { + "version": "1.4.5", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^7.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "nth-check": "^2.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "once": "^1.4.0" } }, - "node_modules/css-tree": { - "version": "3.2.1", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=10.13.0" } }, - "node_modules/css-what": { - "version": "7.0.0", - "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "node_modules/entities": { + "version": "4.5.0", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">= 6" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/envinfo": { + "version": "7.21.0", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, "license": "MIT", - "peer": true, "bin": { - "cssesc": "bin/cssesc" + "envinfo": "dist/cli.js" }, "engines": { "node": ">=4" } }, - "node_modules/cssstyle": { - "version": "4.6.0", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "node_modules/environment": { + "version": "1.1.0", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^3.2.0", - "rrweb-cssom": "^0.8.0" - }, "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cssstyle/node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "node_modules/errno": { + "version": "0.1.8", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/cssstyle/node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" } }, - "node_modules/cssstyle/node_modules/@csstools/css-calc": { - "version": "2.1.4", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "node_modules/error-ex": { + "version": "1.3.4", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/cssstyle/node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "node_modules/es-abstract": { + "version": "1.24.2", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cssstyle/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "node_modules/es-abstract-get": { + "version": "1.0.0", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cssstyle/node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "node_modules/es-define-property": { + "version": "1.0.1", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "node_modules/cssstyle/node_modules/lru-cache": { - "version": "10.4.3", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "node_modules/es-errors": { + "version": "1.3.0", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 0.4" } }, - "node_modules/data-urls": { - "version": "7.0.0", - "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "node_modules/es-module-lexer": { + "version": "2.3.2", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } + "peer": true }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "16.0.1", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "node_modules/es-object-atoms": { + "version": "1.1.2", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" + "es-errors": "^1.3.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": ">= 0.4" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "node_modules/es-to-primitive": { + "version": "1.3.4", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -11394,2336 +11474,2432 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/debug": { - "version": "4.4.3", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/esbuild": { + "version": "0.28.2", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.3" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=6.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, - "node_modules/decimal.js": { - "version": "10.6.0", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "node_modules/esbuild-wasm": { + "version": "0.28.2", + "integrity": "sha512-GccVwhv3mmOUVQHCQm2Ox/rby8n/EqUwvZxE6Pjfikrq/lWw9g9WX/u9EykWnpot3Ko6j426DgQdea2xWKIAQA==", "dev": true, - "license": "MIT" + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/dedent": { - "version": "1.7.2", - "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "node_modules/escalade": { + "version": "3.2.0", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "engines": { + "node": ">=6" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "node_modules/escape-html": { + "version": "1.0.3", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, "license": "MIT" }, - "node_modules/deepmerge": { - "version": "4.3.1", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser": { - "version": "5.5.0", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "node_modules/escodegen": { + "version": "2.1.0", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "license": "MIT", - "peer": true, + "license": "BSD-2-Clause", "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=18" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT", - "peer": true, + "license": "BSD-3-Clause", + "optional": true, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/eslint": { + "version": "8.57.1", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "semver": "^7.5.4" + }, "engines": { "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": ">=6.0.0" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/degenerator": { - "version": "5.0.1", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, "engines": { - "node": ">= 14" + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, - "node_modules/depd": { - "version": "2.0.0", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "node_modules/eslint-module-utils": { + "version": "2.14.0", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", "dev": true, "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/destroy": { - "version": "1.2.0", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", "dev": true, - "license": "Apache-2.0", - "optional": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, "engines": { - "node": ">=8" + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true - }, - "node_modules/dev-ip": { - "version": "1.0.1", - "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", - "dev": true, - "bin": { - "dev-ip": "lib/dev-ip.js" + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/devtools-protocol": { - "version": "0.0.1608973", - "integrity": "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==", + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT" }, - "node_modules/diff": { - "version": "4.0.4", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.18", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "ms": "^2.1.1" } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT", - "peer": true, + "license": "Apache-2.0", "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "esutils": "^2.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.0.0" + "node": "*" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "16.6.2", + "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/eslint-plugin-n/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" + "license": "MIT", + "peer": true }, - "node_modules/domhandler": { - "version": "5.0.3", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "1.1.18", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "peer": true, "dependencies": { - "domelementtype": "^2.3.0" - }, + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-n/node_modules/ignore": { + "version": "5.3.2", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/domutils": { - "version": "3.2.2", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "3.1.5", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "engines": { + "node": "*" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/eslint-plugin-n/node_modules/resolve": { + "version": "1.22.12", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/easy-extender": { - "version": "2.3.4", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "dependencies": { - "lodash": "^4.17.10" }, - "engines": { - "node": ">= 4.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eazy-logger": { - "version": "4.1.0", - "integrity": "sha512-+mn7lRm+Zf1UT/YaH8WXtpU6PIV2iOjzP6jgKoiaq/VNrjYKp+OHZGe2znaLgDeFkw8cL9ffuaUm+nNnzcYyGw==", + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "4.1.2" + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "node_modules/eslint-plugin-node/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, - "node_modules/electron-to-chromium": { - "version": "1.5.399", - "integrity": "sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/eslint-plugin-node/node_modules/brace-expansion": { + "version": "1.1.18", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "5.3.2", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } }, - "node_modules/encodeurl": { - "version": "2.0.0", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/eslint-plugin-node/node_modules/minimatch": { + "version": "3.1.5", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 0.8" + "node": "*" } }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "node_modules/eslint-plugin-node/node_modules/resolve": { + "version": "1.22.12", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/encoding-sniffer/node_modules/iconv-lite": { - "version": "0.6.3", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.6", + "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.13" }, "engines": { - "node": ">=0.10.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/engine.io": { - "version": "6.6.9", - "integrity": "sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==", + "node_modules/eslint-plugin-standard": { + "version": "5.0.0", + "integrity": "sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg==", + "deprecated": "standard 16.0.0 and eslint-config-standard 16.0.0 no longer require the eslint-plugin-standard package. You can remove it from your dependencies with 'npm rm eslint-plugin-standard'. More info here: https://github.com/standard/standard/issues/1316", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "@types/ws": "^8.5.12", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.21.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10.2.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/engine.io-client": { - "version": "6.6.6", - "integrity": "sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==", + "node_modules/eslint-utils": { + "version": "2.1.0", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.21.0", - "xmlhttprequest-ssl": "~2.1.1" + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=10.0.0" + "node": ">=4" } }, - "node_modules/engine.io/node_modules/accepts": { - "version": "1.3.8", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, + "license": "Apache-2.0", "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/engine.io/node_modules/mime-db": { - "version": "1.52.0", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "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/engine.io/node_modules/mime-types": { - "version": "2.1.35", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.18", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/engine.io/node_modules/negotiator": { - "version": "0.6.3", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 4" } }, - "node_modules/enhanced-resolve": { - "version": "5.24.5", - "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "peer": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10.13.0" + "node": "*" } }, - "node_modules/entities": { - "version": "4.5.0", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "node_modules/espree": { + "version": "9.6.1", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": ">=0.12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "url": "https://opencollective.com/eslint" } }, - "node_modules/envinfo": { - "version": "7.21.0", - "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "node_modules/esprima": { + "version": "4.0.1", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "bin": { - "envinfo": "dist/cli.js" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, - "node_modules/environment": { - "version": "1.1.0", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/esquery": { + "version": "1.7.0", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, - "license": "MIT", - "optional": true, + "license": "BSD-3-Clause", "dependencies": { - "prr": "~1.0.1" + "estraverse": "^5.1.0" }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" + "engines": { + "node": ">=0.10" } }, - "node_modules/es-abstract": { - "version": "1.24.2", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "node_modules/esrecurse": { + "version": "4.3.0", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0" } }, - "node_modules/es-abstract-get": { - "version": "1.0.0", - "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "node_modules/estraverse": { + "version": "5.3.0", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.2", - "is-callable": "^1.2.7", - "object-inspect": "^1.13.4" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/estree-walker": { + "version": "2.0.2", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/etag": { + "version": "1.8.1", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.6" } }, - "node_modules/es-module-lexer": { - "version": "2.3.1", - "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "node_modules/eventemitter3": { + "version": "4.0.7", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true, "license": "MIT", "peer": true }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "node_modules/events": { + "version": "3.3.0", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=0.8.x" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/events-universal": { + "version": "1.0.1", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "bare-events": "^2.7.0" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0" } }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "node_modules/eventsource-parser": { + "version": "3.1.1", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", "dev": true, "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0" } }, - "node_modules/es-to-primitive": { - "version": "1.3.4", - "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", + "node_modules/execa": { + "version": "5.1.1", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { - "es-abstract-get": "^1.0.0", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "is-callable": "^1.2.7", - "is-date-object": "^1.1.0", - "is-symbol": "^1.1.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/esbuild": { - "version": "0.28.1", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" + "node": ">= 0.8.0" } }, - "node_modules/esbuild-wasm": { - "version": "0.28.1", - "integrity": "sha512-p/GD4E8oYRjg3kjdKrnMb0s4PzXgJF42e0MF4H0+ACyK/kIlFRp3e0fzOleIG+wBBm6MM3XQrbpe7soEA+vJIA==", + "node_modules/expect": { + "version": "30.4.1", + "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", "dev": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" }, "engines": { - "node": ">=18" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/escalade": { - "version": "3.2.0", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/express": { + "version": "5.2.1", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, "engines": { - "node": ">=6" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/express-rate-limit": { + "version": "8.6.2", + "integrity": "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", "dev": true, "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, "engines": { - "node": ">=10" + "node": ">= 16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "node_modules/extract-zip": { + "version": "2.0.1", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" }, "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "extract-zip": "cli.js" }, "engines": { - "node": ">=6.0" + "node": ">= 10.17.0" }, "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" + "@types/yauzl": "^2.9.1" } }, - "node_modules/eslint": { - "version": "8.57.1", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "pump": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" } }, - "node_modules/eslint-compat-utils": { - "version": "0.5.1", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "node_modules/fast-uri": { + "version": "3.1.5", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", "dev": true, "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { - "semver": "^7.5.4" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" + "node": ">=0.8.0" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.2", - "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "node_modules/fb-watchman": { + "version": "2.0.2", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "dependencies": { + "pend": "~1.2.0" } }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "node_modules/fdir": { + "version": "6.5.0", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", "engines": { "node": ">=12.0.0" }, "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.10", - "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.16.1", - "resolve": "^2.0.0-next.6" + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/file-url": { + "version": "3.0.0", + "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=8" } }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "2.0.0-next.7", - "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "node_modules/fill-range": { + "version": "7.1.1", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.2", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "to-regex-range": "^5.0.1" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 18.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/eslint-module-utils": { - "version": "2.14.0", - "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", + "node_modules/find-cache-directory": { + "version": "6.0.0", + "integrity": "sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^3.2.7" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^8.0.0" }, "engines": { - "node": ">=4" + "node": ">=20" }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/find-cache-directory/node_modules/pkg-dir": { + "version": "8.0.0", + "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "find-up-simple": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "node_modules/find-up": { + "version": "5.0.0", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, - "peerDependencies": { - "eslint": ">=4.19.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-es-x": { - "version": "7.8.0", - "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "node_modules/flat": { + "version": "5.0.2", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ - "https://github.com/sponsors/ota-meshi", - "https://opencollective.com/eslint" + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } ], "license": "MIT", "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.11.0", - "eslint-compat-utils": "^0.5.1" - }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=4.0" }, - "peerDependencies": { - "eslint": ">=8" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "node_modules/for-each": { + "version": "0.3.5", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" + "is-callable": "^1.2.7" }, "engines": { - "node": ">=4" + "node": ">= 0.4" }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.18", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "node_modules/foreground-child": { + "version": "3.3.1", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/forwarded": { + "version": "0.2.0", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/eslint-plugin-import/node_modules/json5": { - "version": "1.0.2", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/fraction.js": { + "version": "5.3.4", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" + "peer": true, + "engines": { + "node": "*" }, - "bin": { - "json5": "lib/cli.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.5", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/fresh": { + "version": "2.0.0", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "license": "ISC" }, - "node_modules/eslint-plugin-import/node_modules/strip-bom": { - "version": "3.0.0", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/fsevents": { + "version": "2.3.3", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { - "version": "3.15.0", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "node_modules/function-bind": { + "version": "1.1.2", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-n": { - "version": "16.6.2", - "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "node_modules/function.prototype.name": { + "version": "1.2.0", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^13.24.0", - "ignore": "^5.2.4", - "is-builtin-module": "^3.2.1", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.18", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.5", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/generator-function": { + "version": "2.0.1", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=8.10.0" + "node": ">= 0.4" }, - "peerDependencies": { - "eslint": ">=5.16.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-node/node_modules/brace-expansion": { - "version": "1.1.18", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "node_modules/get-package-type": { + "version": "0.1.0", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/eslint-plugin-node/node_modules/minimatch": { - "version": "3.1.5", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/get-proto": { + "version": "1.0.1", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" } }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.1", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/get-stream": { + "version": "6.0.1", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.5.6", - "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", + "node_modules/get-symbol-description": { + "version": "1.1.0", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.1", - "synckit": "^0.11.13" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-promise": { - "version": "6.6.0", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "node_modules/get-tsconfig": { + "version": "4.14.3", + "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", "dev": true, - "license": "ISC", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/eslint-plugin-standard": { - "version": "5.0.0", - "integrity": "sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg==", - "deprecated": "standard 16.0.0 and eslint-config-standard 16.0.0 no longer require the eslint-plugin-standard package. You can remove it from your dependencies with 'npm rm eslint-plugin-standard'. More info here: https://github.com/standard/standard/issues/1316", + "node_modules/get-uri": { + "version": "6.0.5", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 14" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/glob": { + "version": "10.5.0", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=6" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/glob-parent": { + "version": "6.0.2", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.15.0", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "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" - } + "license": "MIT" }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.18", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.4", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.2" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/espree": { - "version": "9.6.1", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/globals": { + "version": "13.24.0", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "type-fest": "^0.20.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esprima": { - "version": "4.0.1", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/globalthis": { + "version": "1.0.4", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esquery": { - "version": "1.7.0", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "node_modules/globby": { + "version": "6.1.0", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/globby/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT" + }, + "node_modules/globby/node_modules/brace-expansion": { + "version": "1.1.18", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=4.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/globby/node_modules/minimatch": { + "version": "3.1.5", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/etag": { - "version": "1.8.1", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/gopd": { + "version": "1.2.0", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/events": { - "version": "3.3.0", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/graphemer": { + "version": "1.4.0", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.x" - } + "license": "MIT" }, - "node_modules/events-universal": { - "version": "1.0.1", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "node_modules/handle-thing": { + "version": "2.0.1", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } + "license": "MIT", + "peer": true }, - "node_modules/eventsource": { - "version": "3.0.7", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "node_modules/handlebars": { + "version": "4.7.9", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { - "eventsource-parser": "^3.0.1" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": ">=18.0.0" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/eventsource-parser": { - "version": "3.1.0", - "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/execa": { - "version": "5.1.1", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/has-bigints": { + "version": "1.1.0", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/exit-x": { - "version": "0.2.2", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "node_modules/has-flag": { + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/expect": { - "version": "30.4.1", - "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.4.1", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-util": "30.4.1" + "es-define-property": "^1.0.0" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/express": { - "version": "5.2.1", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "node_modules/has-proto": { + "version": "1.2.0", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" + "dunder-proto": "^1.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express-rate-limit": { - "version": "8.6.1", - "integrity": "sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==", + "node_modules/has-symbols": { + "version": "1.1.0", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "ip-address": "^10.2.0" - }, "engines": { - "node": ">= 16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/finalhandler": { - "version": "2.1.1", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">= 18.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/fresh": { - "version": "2.0.0", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "node_modules/hasown": { + "version": "2.0.4", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/express/node_modules/send": { - "version": "1.2.1", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "node_modules/highlight.js": { + "version": "11.12.0", + "integrity": "sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hono": { + "version": "4.13.3", + "integrity": "sha512-r8AO2mYHoLxSHkgafNeC/BXyb2vWRxD3jem4Ts+ptav8oTG5FIRifAjuJEmZI4bSvvc2ns0GxmIYiZnHqN3mMw==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=16.9.0" } }, - "node_modules/express/node_modules/serve-static": { - "version": "2.2.1", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "node_modules/hoopy": { + "version": "0.1.4", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", "dev": true, "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 6.0.0" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "node_modules/hosted-git-info": { + "version": "10.1.1", + "integrity": "sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" + "lru-cache": "^11.1.0" }, "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/hpack.js": { + "version": "2.1.6", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, - "node_modules/fast-diff": { - "version": "1.3.0", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "Apache-2.0" + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, - "node_modules/fast-glob": { - "version": "3.3.3", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", "dev": true, - "license": "ISC", + "license": "MIT", + "peer": true, "dependencies": { - "is-glob": "^4.0.1" + "@exodus/bytes": "^1.6.0" }, "engines": { - "node": ">= 6" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "node_modules/html-escaper": { + "version": "2.0.2", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.1.5", - "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "node_modules/htmlparser2": { + "version": "10.1.0", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "dev": true, "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" + "url": "https://github.com/sponsors/fb55" } ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.20.1", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=0.8.0" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "node_modules/http-deceiver": { + "version": "1.2.7", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } + "license": "MIT", + "peer": true }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/http-errors": { + "version": "2.0.1", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", "dependencies": { - "pend": "~1.2.0" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/fdir": { - "version": "6.5.0", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/http-parser-js": { + "version": "0.5.10", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "peer": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": ">=8.0.0" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 14" } }, - "node_modules/file-url": { - "version": "3.0.0", - "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/http-proxy-middleware": { + "version": "4.2.0", + "integrity": "sha512-ZA+oNOoM+GLoFTIzhkJptVQov73Srep2LBqhF8hG8CIPKO3nam1jonXVQ/QUH8RbwsmaaVz2SOJdzBNBHNtKbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "to-regex-range": "^5.0.1" + "debug": "^4.4.3", + "httpxy": "^0.5.4", + "is-glob": "^4.0.3", + "is-plain-obj": "^4.1.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">=8" + "node": "^22.15.0 || ^24.0.0 || >=26.0.0" } }, - "node_modules/finalhandler": { - "version": "1.1.0", - "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "node_modules/https-proxy-agent": { + "version": "9.1.0", + "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 20" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/httpxy": { + "version": "0.5.5", + "integrity": "sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } + "peer": true }, - "node_modules/finalhandler/node_modules/encodeurl": { - "version": "1.0.2", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/human-signals": { + "version": "2.1.0", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">= 0.8" + "node": ">=10.17.0" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/hyperdyperid": { + "version": "1.2.0", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.18" + } }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/iconv-lite": { + "version": "0.7.3", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "dev": true, "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "1.3.1", - "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "node_modules/icss-utils": { + "version": "5.1.0", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "7.0.6", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 4" } }, - "node_modules/find-cache-directory": { - "version": "6.0.0", - "integrity": "sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==", + "node_modules/image-size": { + "version": "0.5.5", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^8.0.0" + "optional": true, + "bin": { + "image-size": "bin/image-size.js" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/find-cache-directory/node_modules/pkg-dir": { - "version": "8.0.0", - "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", + "node_modules/immutable": { + "version": "5.1.9", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { - "find-up-simple": "^1.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up": { - "version": "5.0.0", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/import-local": { + "version": "3.2.0", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up-simple": { - "version": "1.0.1", - "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/flat": { - "version": "5.0.2", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "bin": { - "flat": "cli.js" + "license": "MIT", + "engines": { + "node": ">=0.8.19" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/inflight": { + "version": "1.0.6", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/flatted": { - "version": "3.4.4", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "node_modules/inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "node_modules/injection-js": { + "version": "2.6.1", + "integrity": "sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "tslib": "^2.0.0" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "node_modules/internal-slot": { + "version": "1.1.0", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/ip-address": { + "version": "10.5.0", + "integrity": "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 12" } }, - "node_modules/fraction.js": { - "version": "5.3.4", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "node_modules/ipaddr.js": { + "version": "1.9.1", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" + "node": ">= 0.10" } }, - "node_modules/fresh": { - "version": "0.5.2", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/is": { + "version": "3.3.2", + "integrity": "sha512-a2xr4E3s1PjDS8ORcGgXpWx6V+liNs+O3JRD2mb9aeugD7rtkkZ0zgLdYgw0tWsKhsdiezGYptSiMlVazCBTuQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" } }, - "node_modules/fs-extra": { - "version": "3.0.1", - "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/fsevents": { - "version": "2.3.3", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/is-async-function": { + "version": "2.1.1", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.prototype.name": { - "version": "1.2.0", - "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", + "node_modules/is-bigint": { + "version": "1.1.0", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2", - "hasown": "^2.0.4", - "is-callable": "^1.2.7", - "is-document.all": "^1.0.0" + "has-bigints": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13732,70 +13908,70 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peer": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/generator-function": { - "version": "2.0.1", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/is-builtin-module": { + "version": "3.2.1", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-east-asian-width": { - "version": "1.6.0", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "node_modules/is-callable": { + "version": "1.2.7", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/is-core-module": { + "version": "2.16.2", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -13804,49 +13980,86 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/is-data-view": { + "version": "1.0.2", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/is-date-object": { + "version": "1.1.0", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/is-docker": { + "version": "3.0.0", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "node_modules/is-document.all": { + "version": "1.0.0", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -13855,143 +14068,120 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.14.1", - "integrity": "sha512-Dz/6HxkrxgNehhxLVeyv8sad9UzF2xBVeaKBQNDfJ5XiSXmp2gTR0eO0RWiT2NCKS5aGP9jjkOMggTN90qU50A==", + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-uri": { - "version": "6.0.5", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, "engines": { - "node": ">= 14" + "node": ">=6" } }, - "node_modules/glob": { - "version": "10.5.0", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "node_modules/is-generator-function": { + "version": "1.1.2", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/is-glob": { + "version": "4.0.3", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=0.10.0" } }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "node_modules/is-in-ssh": { + "version": "1.0.0", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "peer": true, "engines": { - "node": ">=10.0" + "node": ">=20" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/globals": { - "version": "13.24.0", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "type-fest": "^0.20.2" + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "node_modules/is-interactive": { + "version": "2.0.0", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/is-map": { + "version": "2.0.3", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { - "version": "1.2.0", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { @@ -14001,95 +14191,129 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/is-network-error": { + "version": "1.3.2", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/handle-thing": { - "version": "2.0.1", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "node_modules/is-number": { + "version": "7.0.0", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", - "peer": true + "peer": true, + "engines": { + "node": ">=0.12.0" + } }, - "node_modules/handlebars": { - "version": "4.7.9", - "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "node_modules/is-number-object": { + "version": "1.1.1", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=0.4.7" + "node": ">= 0.4" }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/has-bigints": { - "version": "1.1.0", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "node_modules/is-plain-obj": { + "version": "4.1.0", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "isobject": "^3.0.1" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.2.0", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.0" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -14098,25 +14322,26 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/is-stream": { + "version": "2.0.1", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/is-string": { + "version": "1.1.1", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14125,1984 +14350,2220 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.4", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "node_modules/is-symbol": { + "version": "1.1.1", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/highlight.js": { - "version": "11.11.1", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/hono": { - "version": "4.12.34", - "integrity": "sha512-GqXJqY/xJkJmuloTrnV1ZEXG3fqte+VjkUqoRNZXcrUidiUOP4fMSIHHY4tsqZBK++kVyWmt/AAfSUuy57/eSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/hoopy": { - "version": "0.1.4", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/hosted-git-info": { - "version": "9.0.3", - "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", - "dev": true, - "license": "ISC", "dependencies": { - "lru-cache": "^11.1.0" + "which-typed-array": "^1.1.16" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "11.5.2", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "engines": { - "node": "20 || >=22" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/hpack.js/node_modules/string_decoder": { + "node_modules/is-weakref": { "version": "1.1.1", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "safe-buffer": "~5.1.0" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "node_modules/is-weakset": { + "version": "2.0.4", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@exodus/bytes": "^1.6.0" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "10.1.0", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "node_modules/is-what": { + "version": "4.1.16", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "7.0.1", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=12.13" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/http-errors": { - "version": "2.0.1", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "node_modules/is-wsl": { + "version": "3.1.1", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "node_modules/isarray": { + "version": "2.0.5", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, - "node_modules/http-proxy": { - "version": "1.18.1", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/isexe": { + "version": "2.0.0", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } + "license": "ISC" }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/isobject": { + "version": "3.0.1", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, + "peer": true, "engines": { - "node": ">= 14" + "node": ">=0.10.0" } }, - "node_modules/http-proxy-middleware": { - "version": "3.0.7", - "integrity": "sha512-iwbQltVlx8bCrqePUM8C+hllHvdawVhQJaLrj1X7qllkvFQdXFsr16pW/mo9+JDVjN+QO2XUx9jd8SmoFkE5qw==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/http-proxy": "^1.17.15", - "debug": "^4.3.6", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.3", - "is-plain-object": "^5.0.0", - "micromatch": "^4.0.8" - }, + "license": "BSD-3-Clause", "engines": { - "node": "^14.18.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 14" + "node": ">=10" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/code-frame": { + "version": "7.29.7", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, "engines": { - "node": ">=10.17.0" + "node": ">=6.9.0" } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/compat-data": { + "version": "7.29.7", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=10.18" + "node": ">=6.9.0" } }, - "node_modules/iconv-lite": { - "version": "0.7.3", - "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/core": { + "version": "7.29.7", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@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": ">=0.10.0" + "node": ">=6.9.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/babel" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "peer": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/ignore": { - "version": "5.3.2", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/generator": { + "version": "7.29.8", + "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": ">= 4" + "node": ">=6.9.0" } }, - "node_modules/ignore-walk": { - "version": "8.0.0", - "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minimatch": "^10.0.3" + "@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": "^20.17.0 || >=22.9.0" + "node": ">=6.9.0" } }, - "node_modules/ignore-walk/node_modules/balanced-match": { - "version": "4.0.4", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">=6.9.0" } }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "5.0.9", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "20 || >=22" + "node": ">=6.9.0" } }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.2.6", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.8" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/image-size": { - "version": "0.5.5", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/immutable": { - "version": "3.8.3", - "integrity": "sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "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": ">=6.9.0" } }, - "node_modules/import-local": { - "version": "3.2.0", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/helpers": { + "version": "7.29.7", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/parser": { + "version": "7.29.8", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=0.8.19" + "node": ">=6.0.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/istanbul-lib-instrument/node_modules/@babel/template": { + "version": "7.29.7", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "6.0.0", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", - "dev": true, - "license": "ISC", + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=6.9.0" } }, - "node_modules/injection-js": { - "version": "2.6.1", - "integrity": "sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/traverse": { + "version": "7.29.8", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.0" + "@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/internal-slot": { - "version": "1.1.0", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "node_modules/istanbul-lib-instrument/node_modules/@babel/types": { + "version": "7.29.8", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/ip-address": { - "version": "10.4.0", - "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", + "node_modules/istanbul-lib-instrument/node_modules/convert-source-map": { + "version": "2.0.0", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" + "license": "MIT" + }, + "node_modules/istanbul-lib-instrument/node_modules/js-tokens": { + "version": "4.0.0", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 0.10" + "node": ">=10" } }, - "node_modules/is": { - "version": "3.3.2", - "integrity": "sha512-a2xr4E3s1PjDS8ORcGgXpWx6V+liNs+O3JRD2mb9aeugD7rtkkZ0zgLdYgw0tWsKhsdiezGYptSiMlVazCBTuQ==", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "node_modules/jackspeak": { + "version": "3.4.3", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "license": "MIT" + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } }, - "node_modules/is-async-function": { - "version": "2.1.1", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "node_modules/jest": { + "version": "30.4.2", + "integrity": "sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==", "dev": true, "license": "MIT", "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "@jest/core": "30.4.2", + "@jest/types": "30.4.1", + "import-local": "^3.2.0", + "jest-cli": "30.4.2" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">= 0.4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/is-bigint": { - "version": "1.1.0", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "node_modules/jest-changed-files": { + "version": "30.4.1", + "integrity": "sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" + "execa": "^5.1.1", + "jest-util": "30.4.1", + "p-limit": "^3.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/jest-circus": { + "version": "30.4.2", + "integrity": "sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==", "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", + "p-limit": "^3.1.0", + "pretty-format": "30.4.1", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "node_modules/jest-cli": { + "version": "30.4.2", + "integrity": "sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "@jest/core": "30.4.2", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">= 0.4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "MIT", - "peer": true, + "license": "ISC", "dependencies": { - "builtin-modules": "^3.3.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/jest-cli/node_modules/emoji-regex": { + "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/string-width": { + "version": "4.2.3", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.16.2", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.3" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.3", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/is-date-object": { - "version": "1.1.0", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, + "license": "ISC", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/is-docker": { - "version": "3.0.0", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "node_modules/jest-config": { + "version": "30.4.2", + "integrity": "sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==", "dev": true, "license": "MIT", - "peer": true, - "bin": { - "is-docker": "cli.js" + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.4.0", + "@jest/test-sequencer": "30.4.1", + "@jest/types": "30.4.1", + "babel-jest": "30.4.1", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-circus": "30.4.2", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-runner": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "parse-json": "^5.2.0", + "pretty-format": "30.4.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/is-document.all": { - "version": "1.0.0", - "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "node_modules/jest-config/node_modules/@babel/code-frame": { + "version": "7.29.7", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.4" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/jest-config/node_modules/@babel/compat-data": { + "version": "7.29.7", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "node_modules/jest-config/node_modules/@babel/core": { + "version": "7.29.7", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "@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": ">= 0.4" + "node": ">=6.9.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "node_modules/jest-config/node_modules/@babel/generator": { + "version": "7.29.8", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.1" + "@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": ">=18" + "node": ">=6.9.0" + } + }, + "node_modules/jest-config/node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "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" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/jest-config/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "node_modules/jest-config/node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/jest-config/node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/is-in-ssh": { - "version": "1.0.0", - "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "node_modules/jest-config/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/jest-config/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/jest-config/node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6.9.0" + } + }, + "node_modules/jest-config/node_modules/@babel/helpers": { + "version": "7.29.7", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/is-map": { - "version": "2.0.3", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/jest-config/node_modules/@babel/parser": { + "version": "7.29.8", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "@babel/types": "^7.29.8" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/jest-config/node_modules/@babel/template": { + "version": "7.29.7", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/is-network-error": { - "version": "1.3.2", - "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", + "node_modules/jest-config/node_modules/@babel/traverse": { + "version": "7.29.8", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=16" + "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" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/jest-config/node_modules/@babel/types": { + "version": "7.29.8", + "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": ">=0.12.0" + "node": ">=6.9.0" } }, - "node_modules/is-number-like": { - "version": "1.0.8", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "node_modules/jest-config/node_modules/convert-source-map": { + "version": "2.0.0", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/js-tokens": { + "version": "4.0.0", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/lru-cache": { + "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { - "lodash.isfinite": "^3.3.2" + "yallist": "^3.0.2" } }, - "node_modules/is-number-object": { - "version": "1.1.1", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "node_modules/jest-config/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-diff": { + "version": "30.4.1", + "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "@jest/diff-sequences": "30.4.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.4.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/jest-docblock": { + "version": "30.4.0", + "integrity": "sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==", "dev": true, "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/jest-each": { + "version": "30.4.1", + "integrity": "sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==", "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "jest-util": "30.4.1", + "pretty-format": "30.4.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/jest-environment-jsdom": { + "version": "30.4.1", + "integrity": "sha512-o3nfaN4zej7qgk2X0j8Jhq/S9nAVKs2xK3QeQxeHVvpkEPxaA1yxDGydR+iVI7zPy7Cp62Aq2h3Ja46QvfWHGA==", "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/environment-jsdom-abstract": "30.4.1", + "jsdom": "^26.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-promise": { - "version": "4.0.0", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "node_modules/jest-environment-jsdom/node_modules/agent-base": { + "version": "7.1.4", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 14" + } }, - "node_modules/is-regex": { - "version": "1.2.1", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "node_modules/jest-environment-jsdom/node_modules/data-urls": { + "version": "5.0.0", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/is-set": { - "version": "2.0.3", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "whatwg-encoding": "^3.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=18" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "node_modules/jest-environment-jsdom/node_modules/https-proxy-agent": { + "version": "7.0.6", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 14" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "26.1.0", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, "engines": { - "node": ">=8" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/is-string": { - "version": "1.1.1", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "node_modules/jest-environment-jsdom/node_modules/tldts": { + "version": "6.1.86", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "tldts-core": "^6.1.86" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/is-symbol": { - "version": "1.1.1", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "node_modules/jest-environment-jsdom/node_modules/tldts-core": { + "version": "6.1.86", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { + "version": "5.1.2", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" + "tldts": "^6.1.32" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "5.1.1", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "punycode": "^2.3.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "node_modules/jest-environment-jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/jest-environment-jsdom/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/is-weakref": { - "version": "1.1.1", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "14.2.0", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/is-weakset": { - "version": "2.0.4", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "node_modules/jest-environment-node": { + "version": "30.4.1", + "integrity": "sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-mock": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/is-what": { - "version": "3.14.1", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-wsl": { - "version": "1.1.0", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "node_modules/jest-haste-map": { + "version": "30.4.1", + "integrity": "sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==", "dev": true, "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", + "jest-worker": "30.4.1", + "picomatch": "^4.0.3", + "walker": "^1.0.8" + }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" } }, - "node_modules/isarray": { - "version": "2.0.5", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/jest-leak-detector": { + "version": "30.4.1", + "integrity": "sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==", "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.4.1" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "node_modules/jest-matcher-utils": { + "version": "30.4.1", + "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.4.1", + "pretty-format": "30.4.1" }, "engines": { - "node": ">=10" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/jest-message-util": { + "version": "30.4.1", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.4.1", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", + "picomatch": "^4.0.3", + "pretty-format": "30.4.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" }, "engines": { - "node": ">=10" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "node_modules/jest-message-util/node_modules/@babel/code-frame": { + "version": "7.29.7", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "node_modules/jest-message-util/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/jest-message-util/node_modules/js-tokens": { + "version": "4.0.0", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } + "license": "MIT" }, - "node_modules/jest": { - "version": "30.4.2", - "integrity": "sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==", + "node_modules/jest-mock": { + "version": "30.4.1", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.4.2", "@jest/types": "30.4.1", - "import-local": "^3.2.0", - "jest-cli": "30.4.2" - }, - "bin": { - "jest": "bin/jest.js" + "@types/node": "*", + "jest-util": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "jest-resolve": "*" }, "peerDependenciesMeta": { - "node-notifier": { + "jest-resolve": { "optional": true } } }, - "node_modules/jest-changed-files": { - "version": "30.4.1", - "integrity": "sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==", + "node_modules/jest-preset-angular": { + "version": "17.0.0", + "integrity": "sha512-2yAHkA1c5rSICGJVtLYYqPC5RDsvo4+i4CwWFHVXwv41cHNX7gCWeh074IuZ5mFw7Vwsr+i25EowCnGtKkxNWw==", "dev": true, "license": "MIT", "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.4.1", - "p-limit": "^3.1.0" + "@jest/environment-jsdom-abstract": "^30.4.1", + "bs-logger": "^0.2.6", + "esbuild-wasm": ">=0.28.0", + "jest-util": "^30.4.1", + "pretty-format": "^30.4.1", + "ts-jest": "^29.4.11" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^20.11.1 || >=22.0.0" + }, + "optionalDependencies": { + "esbuild": ">=0.28.0" + }, + "peerDependencies": { + "@angular/compiler-cli": ">=20.0.0 <23.0.0", + "@angular/core": ">=20.0.0 <23.0.0", + "@angular/platform-browser": ">=20.0.0 <23.0.0", + "jest": "^30.0.0", + "jsdom": ">=26.0.0", + "typescript": ">=5.8" } }, - "node_modules/jest-circus": { - "version": "30.4.2", - "integrity": "sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==", + "node_modules/jest-preset-angular/node_modules/@babel/code-frame": { + "version": "7.29.7", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@jest/environment": "30.4.1", - "@jest/expect": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.4.1", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-runtime": "30.4.2", - "jest-snapshot": "30.4.1", - "jest-util": "30.4.1", - "p-limit": "^3.1.0", - "pretty-format": "30.4.1", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-cli": { - "version": "30.4.2", - "integrity": "sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==", + "node_modules/jest-preset-angular/node_modules/@babel/compat-data": { + "version": "7.29.7", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/jest-preset-angular/node_modules/@babel/core": { + "version": "7.29.7", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@jest/core": "30.4.2", - "@jest/test-result": "30.4.1", - "@jest/types": "30.4.1", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.4.2", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" + "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "8.0.1", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/jest-preset-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-preset-angular/node_modules/@babel/generator": { + "version": "7.29.8", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@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": ">=12" + "node": ">=6.9.0" } }, - "node_modules/jest-cli/node_modules/emoji-regex": { - "version": "8.0.0", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/jest-preset-angular/node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true, + "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/jest-cli/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/jest-preset-angular/node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-preset-angular/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/jest-cli/node_modules/string-width": { - "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/jest-preset-angular/node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/jest-preset-angular/node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.3", - "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "node_modules/jest-preset-angular/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/jest-preset-angular/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/jest-config": { - "version": "30.4.2", - "integrity": "sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==", + "node_modules/jest-preset-angular/node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.1.0", - "@jest/pattern": "30.4.0", - "@jest/test-sequencer": "30.4.1", - "@jest/types": "30.4.1", - "babel-jest": "30.4.1", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-circus": "30.4.2", - "jest-docblock": "30.4.0", - "jest-environment-node": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-resolve": "30.4.1", - "jest-runner": "30.4.2", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", - "parse-json": "^5.2.0", - "pretty-format": "30.4.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "peer": true, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/jest-diff": { - "version": "30.4.1", - "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", + "node_modules/jest-preset-angular/node_modules/@babel/helpers": { + "version": "7.29.7", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@jest/diff-sequences": "30.4.0", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.4.1" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-docblock": { - "version": "30.4.0", - "integrity": "sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==", + "node_modules/jest-preset-angular/node_modules/@babel/parser": { + "version": "7.29.8", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "detect-newline": "^3.1.0" + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.0.0" } }, - "node_modules/jest-each": { - "version": "30.4.1", - "integrity": "sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==", + "node_modules/jest-preset-angular/node_modules/@babel/template": { + "version": "7.29.7", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.4.1", - "chalk": "^4.1.2", - "jest-util": "30.4.1", - "pretty-format": "30.4.1" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-environment-jsdom": { - "version": "30.4.1", - "integrity": "sha512-o3nfaN4zej7qgk2X0j8Jhq/S9nAVKs2xK3QeQxeHVvpkEPxaA1yxDGydR+iVI7zPy7Cp62Aq2h3Ja46QvfWHGA==", + "node_modules/jest-preset-angular/node_modules/@babel/traverse": { + "version": "7.29.8", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@jest/environment": "30.4.1", - "@jest/environment-jsdom-abstract": "30.4.1", - "jsdom": "^26.1.0" + "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/jest-environment-jsdom/node_modules/data-urls": { - "version": "5.0.0", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "node_modules/jest-preset-angular/node_modules/@babel/types": { + "version": "7.29.8", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/jest-environment-jsdom/node_modules/entities": { - "version": "6.0.1", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "node_modules/jest-preset-angular/node_modules/convert-source-map": { + "version": "2.0.0", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "license": "MIT", + "optional": true, + "peer": true }, - "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { + "node_modules/jest-preset-angular/node_modules/js-tokens": { "version": "4.0.0", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/jest-preset-angular/node_modules/lru-cache": { + "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" + "yallist": "^3.0.2" } }, - "node_modules/jest-environment-jsdom/node_modules/jsdom": { - "version": "26.1.0", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "node_modules/jest-preset-angular/node_modules/ts-jest": { + "version": "29.4.12", + "integrity": "sha512-Ov6ClY53Fflh6BGAnY2DlTq1hYDrTycz2PVTXBWFW2CU+9zrEqAp9fWdGXl42EXO5RLSFAcAZ2JFKbP+zBTFfw==", "dev": true, "license": "MIT", "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.8.5", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { - "canvas": "^3.0.0" + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" }, "peerDependenciesMeta": { - "canvas": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { "optional": true } } }, - "node_modules/jest-environment-jsdom/node_modules/parse5": { - "version": "7.3.0", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "node_modules/jest-preset-angular/node_modules/type-fest": { + "version": "4.41.0", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-environment-jsdom/node_modules/tldts": { - "version": "6.1.86", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" + "node_modules/jest-preset-angular/node_modules/yargs-parser": { + "version": "21.1.1", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/jest-environment-jsdom/node_modules/tldts-core": { - "version": "6.1.86", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "node_modules/jest-regex-util": { + "version": "30.4.0", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } }, - "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { - "version": "5.1.2", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "node_modules/jest-resolve": { + "version": "30.4.1", + "integrity": "sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "tldts": "^6.1.32" + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" }, "engines": { - "node": ">=16" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-environment-jsdom/node_modules/tr46": { - "version": "5.1.1", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "node_modules/jest-resolve-dependencies": { + "version": "30.4.2", + "integrity": "sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==", "dev": true, "license": "MIT", "dependencies": { - "punycode": "^2.3.1" + "jest-regex-util": "30.4.0", + "jest-snapshot": "30.4.1" }, "engines": { - "node": ">=18" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-environment-jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "node_modules/jest-runner": { + "version": "30.4.2", + "integrity": "sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "dependencies": { + "@jest/console": "30.4.1", + "@jest/environment": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-haste-map": "30.4.1", + "jest-leak-detector": "30.4.1", + "jest-message-util": "30.4.1", + "jest-resolve": "30.4.1", + "jest-runtime": "30.4.2", + "jest-util": "30.4.1", + "jest-watcher": "30.4.1", + "jest-worker": "30.4.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, "engines": { - "node": ">=12" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-environment-jsdom/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { - "version": "14.2.0", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/jest-environment-node": { - "version": "30.4.1", - "integrity": "sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==", + "node_modules/jest-runtime": { + "version": "30.4.2", + "integrity": "sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "30.4.1", "@jest/fake-timers": "30.4.1", + "@jest/globals": "30.4.1", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", "@jest/types": "30.4.1", "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", "jest-mock": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-snapshot": "30.4.1", "jest-util": "30.4.1", - "jest-validate": "30.4.1" + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-haste-map": { + "node_modules/jest-snapshot": { "version": "30.4.1", - "integrity": "sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==", + "integrity": "sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==", "dev": true, "license": "MIT", "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.4.1", + "@jest/transform": "30.4.1", "@jest/types": "30.4.1", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.4.1", "graceful-fs": "^4.2.11", - "jest-regex-util": "30.4.0", + "jest-diff": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", "jest-util": "30.4.1", - "jest-worker": "30.4.1", - "picomatch": "^4.0.3", - "walker": "^1.0.8" + "pretty-format": "30.4.1", + "semver": "^7.7.2", + "synckit": "^0.11.8" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@babel/code-frame": { + "version": "7.29.7", + "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" }, - "optionalDependencies": { - "fsevents": "^2.3.3" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/jest-leak-detector": { - "version": "30.4.1", - "integrity": "sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==", + "node_modules/jest-snapshot/node_modules/@babel/compat-data": { + "version": "7.29.7", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/jest-snapshot/node_modules/@babel/core": { + "version": "7.29.7", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "pretty-format": "30.4.1" + "@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/jest-snapshot/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-snapshot/node_modules/@babel/generator": { + "version": "7.29.8", + "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/jest-snapshot/node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" + } + }, + "node_modules/jest-snapshot/node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-snapshot/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/jest-matcher-utils": { - "version": "30.4.1", - "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", + "node_modules/jest-snapshot/node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.4.1", - "pretty-format": "30.4.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-message-util": { - "version": "30.4.1", - "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", + "node_modules/jest-snapshot/node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.4.1", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-util": "30.4.1", - "picomatch": "^4.0.3", - "pretty-format": "30.4.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/jest-mock": { - "version": "30.4.1", - "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "node_modules/jest-snapshot/node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "30.4.1", - "@types/node": "*", - "jest-util": "30.4.1" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "node_modules/jest-snapshot/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/jest-preset-angular": { - "version": "16.2.0", - "integrity": "sha512-8LW2Ljp6RKJu4B2PLloWX8na0ropo6yRFr89L+aiUGuvQ86PrzgkzHdZQ7lmjJJtZasVLDWY8pUvbNVmM1AEGw==", + "node_modules/jest-snapshot/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/environment-jsdom-abstract": "^30.0.0", - "bs-logger": "^0.2.6", - "esbuild-wasm": ">=0.23.0", - "jest-util": "^30.0.0", - "pretty-format": "^30.0.0", - "ts-jest": "^29.4.0" - }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "optionalDependencies": { - "esbuild": ">=0.23.0" - }, - "peerDependencies": { - "@angular/compiler-cli": ">=19.0.0 <23.0.0", - "@angular/core": ">=19.0.0 <23.0.0", - "@angular/platform-browser": ">=19.0.0 <23.0.0", - "@angular/platform-browser-dynamic": ">=19.0.0 <23.0.0", - "jest": "^30.0.0", - "jsdom": ">=26.0.0", - "typescript": ">=5.5" + "node": ">=6.9.0" } }, - "node_modules/jest-regex-util": { - "version": "30.4.0", - "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "node_modules/jest-snapshot/node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-resolve": { - "version": "30.4.1", - "integrity": "sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==", + "node_modules/jest-snapshot/node_modules/@babel/helpers": { + "version": "7.29.7", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-resolve-dependencies": { - "version": "30.4.2", - "integrity": "sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==", + "node_modules/jest-snapshot/node_modules/@babel/parser": { + "version": "7.29.8", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "30.4.0", - "jest-snapshot": "30.4.1" + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.0.0" } }, - "node_modules/jest-runner": { - "version": "30.4.2", - "integrity": "sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==", + "node_modules/jest-snapshot/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.4.1", - "@jest/environment": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.4.0", - "jest-environment-node": "30.4.1", - "jest-haste-map": "30.4.1", - "jest-leak-detector": "30.4.1", - "jest-message-util": "30.4.1", - "jest-resolve": "30.4.1", - "jest-runtime": "30.4.2", - "jest-util": "30.4.1", - "jest-watcher": "30.4.1", - "jest-worker": "30.4.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/jest-snapshot/node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "node_modules/jest-snapshot/node_modules/@babel/template": { + "version": "7.29.7", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/jest-runtime": { - "version": "30.4.2", - "integrity": "sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==", + "node_modules/jest-snapshot/node_modules/@babel/traverse": { + "version": "7.29.8", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.4.1", - "@jest/fake-timers": "30.4.1", - "@jest/globals": "30.4.1", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-resolve": "30.4.1", - "jest-snapshot": "30.4.1", - "jest-util": "30.4.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-snapshot": { - "version": "30.4.1", - "integrity": "sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==", + "node_modules/jest-snapshot/node_modules/@babel/types": { + "version": "7.29.8", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.4.1", - "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "babel-preset-current-node-syntax": "^1.2.0", - "chalk": "^4.1.2", - "expect": "30.4.1", - "graceful-fs": "^4.2.11", - "jest-diff": "30.4.1", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-util": "30.4.1", - "pretty-format": "30.4.1", - "semver": "^7.7.2", - "synckit": "^0.11.8" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6.9.0" + } + }, + "node_modules/jest-snapshot/node_modules/convert-source-map": { + "version": "2.0.0", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot/node_modules/js-tokens": { + "version": "4.0.0", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/jest-util": { @@ -16206,14 +16667,13 @@ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } }, "node_modules/jose": { - "version": "6.2.7", - "integrity": "sha512-hq1OB1bALKfydZNoViyg6hPVGV4i93ny9Op+n4zP5RSf7SCZEXa/TsG2O3IEr7+WlHRTPnpqDmHfMH6qXAD60w==", + "version": "6.2.9", + "integrity": "sha512-XrchZOFZUl/T3vTwRe8XK+cJrGtMF4th1ARnDfwbBXFKThGhlsxEE4Zu03AD/bjJSt/9jT/mxrOCkJWOg77aPA==", "dev": true, "license": "MIT", "funding": { @@ -16221,8 +16681,8 @@ } }, "node_modules/js-tokens": { - "version": "4.0.0", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "version": "10.0.0", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, @@ -16289,24 +16749,30 @@ } } }, - "node_modules/jsdom/node_modules/lru-cache": { - "version": "11.5.2", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "node_modules/jsdom/node_modules/entities": { + "version": "8.0.0", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "BSD-2-Clause", "peer": true, "engines": { - "node": "20 || >=22" + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/jsdom/node_modules/undici": { - "version": "8.9.0", - "integrity": "sha512-aWZpUj7XoGonMClx4gdDRfgBjqeA+F473aDmROQQbM9n6PRfK/u1q/a0X4wMTgcHfT8H6fpbt98PFuDUwFg2YA==", + "node_modules/jsdom/node_modules/parse5": { + "version": "8.0.1", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "dev": true, "license": "MIT", "peer": true, - "engines": { - "node": ">=22.19.0" + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/jsesc": { @@ -16328,13 +16794,10 @@ "license": "MIT" }, "node_modules/json-parse-even-better-errors": { - "version": "5.0.0", - "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", + "version": "2.3.1", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, - "license": "MIT", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -16372,24 +16835,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jsonfile": { - "version": "3.0.1", - "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, "node_modules/karma-source-map-support": { "version": "1.4.0", "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", @@ -16440,39 +16885,41 @@ } }, "node_modules/less": { - "version": "4.4.2", - "integrity": "sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==", + "version": "4.6.7", + "integrity": "sha512-o3UxHBPPVY1HtCXx15/z1NlknQiWyafRNbtLEv+6xFaDRI2g2xPKIH43do9dSwt8bGLTsjNSaifa48N3d6odsQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" + "copy-anything": "^3.0.5", + "parse-node-version": "^1.0.1" }, "bin": { "lessc": "bin/lessc" }, "engines": { - "node": ">=14" + "node": ">=18" }, "optionalDependencies": { "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", - "make-dir": "^2.1.0", + "make-dir": "^5.1.0", "mime": "^1.4.1", "needle": "^3.1.0", "source-map": "~0.6.0" } }, "node_modules/less-loader": { - "version": "12.3.1", - "integrity": "sha512-JZZmG7gMzoDP3VGeEG8Sh6FW5wygB5jYL7Wp29FFihuRTsIBacqO3LbRPr2yStYD11riVf13selLm/CPFRDBRQ==", + "version": "13.0.0", + "integrity": "sha512-TIa8d6znKH634Mg+7OU3jevZT6KeOhh0amW+YeMPD0GM9buUn5Y7HvtyCR5pUDdLaFfqLA8AX5PTSIHMNSexEA==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "@types/less": "^3.0.8" + }, "engines": { - "node": ">= 18.12.0" + "node": ">= 22.11.0" }, "funding": { "type": "opencollective", @@ -16493,27 +16940,16 @@ } }, "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "5.1.0", + "integrity": "sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==", "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.2", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/less/node_modules/source-map": { @@ -16566,11 +17002,255 @@ } } }, - "node_modules/limiter": { - "version": "1.1.5", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, + "node_modules/lightningcss": { + "version": "1.33.0", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", @@ -16597,25 +17277,22 @@ } }, "node_modules/listr2": { - "version": "9.0.5", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "version": "11.0.0", + "integrity": "sha512-8K88S0aSrcSXdJfiZtEy5BQMnR+TyjrCGLcgAvQs6ta0NEnIm0RJ72/Pv67Jvg07cfBhDbuN74V81lSSVYEFEw==", "dev": true, "license": "MIT", "dependencies": { - "cli-truncate": "^5.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" + "cli-truncate": "^6.1.1", + "log-update": "^8.0.0", + "wrap-ansi": "^10.0.0" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.13.0" } }, "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.2.2", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.3.0", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -16637,30 +17314,17 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.6.0", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/eventemitter3": { - "version": "5.0.4", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "dev": true, - "license": "MIT" - }, "node_modules/listr2/node_modules/string-width": { - "version": "7.2.0", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.2.2", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16682,25 +17346,24 @@ } }, "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.2", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "version": "10.0.1", + "integrity": "sha512-M0N4xzyzosiIok3svYlEo1sdLZts/8FPgYH/GPC3wvlmPoRvnoManGMrE54waYj3tISA8w6lsdesfVv67qSr8Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/lmdb": { - "version": "3.5.1", - "integrity": "sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg==", + "version": "3.5.6", + "integrity": "sha512-j3uE8ReKNyUWDjhfEFSJqE/1DLtfTR5Z8yFzVHvBjAk37wNg7HdScjcv8ttPHRvrdgPQMPWxFFI0SsdBzI5lBw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -16717,27 +17380,13 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.5.1", - "@lmdb/lmdb-darwin-x64": "3.5.1", - "@lmdb/lmdb-linux-arm": "3.5.1", - "@lmdb/lmdb-linux-arm64": "3.5.1", - "@lmdb/lmdb-linux-x64": "3.5.1", - "@lmdb/lmdb-win32-arm64": "3.5.1", - "@lmdb/lmdb-win32-x64": "3.5.1" - } - }, - "node_modules/loader-runner": { - "version": "4.3.2", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "@lmdb/lmdb-darwin-arm64": "3.5.6", + "@lmdb/lmdb-darwin-x64": "3.5.6", + "@lmdb/lmdb-linux-arm": "3.5.6", + "@lmdb/lmdb-linux-arm64": "3.5.6", + "@lmdb/lmdb-linux-x64": "3.5.6", + "@lmdb/lmdb-win32-arm64": "3.5.6", + "@lmdb/lmdb-win32-x64": "3.5.6" } }, "node_modules/loader-utils": { @@ -16783,12 +17432,6 @@ "license": "MIT", "peer": true }, - "node_modules/lodash.isfinite": { - "version": "3.3.2", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.memoize": { "version": "4.1.2", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", @@ -16818,19 +17461,20 @@ } }, "node_modules/log-update": { - "version": "6.1.0", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "version": "8.0.0", + "integrity": "sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-escapes": "^7.0.0", + "ansi-escapes": "^7.3.0", "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "slice-ansi": "^9.0.0", + "string-width": "^8.2.0", + "strip-ansi": "^7.2.0", + "wrap-ansi": "^10.0.0" }, "engines": { - "node": ">=18" + "node": ">=22" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16852,8 +17496,8 @@ } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.2.2", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.3.0", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -16875,40 +17519,17 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.6.0", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.2", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.2.2", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16930,29 +17551,28 @@ } }, "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.2", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "version": "10.0.1", + "integrity": "sha512-M0N4xzyzosiIok3svYlEo1sdLZts/8FPgYH/GPC3wvlmPoRvnoManGMrE54waYj3tISA8w6lsdesfVv67qSr8Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/lru-cache": { - "version": "5.1.1", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "11.5.2", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, "node_modules/lunr": { @@ -16962,8 +17582,8 @@ "license": "MIT" }, "node_modules/magic-string": { - "version": "0.30.21", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "version": "1.0.0", + "integrity": "sha512-CGvjzMN08iv6w1mm4/x3Gh1hLb4VnyRUA15FFpl6CsCIGGoe36k7kY5KNz9QDbSBN5I/fWHM6ZlIkUTa5xdUEA==", "dev": true, "license": "MIT", "dependencies": { @@ -16991,29 +17611,6 @@ "dev": true, "license": "ISC" }, - "node_modules/make-fetch-happen": { - "version": "15.0.6", - "integrity": "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/agent": "^4.0.0", - "@npmcli/redact": "^4.0.0", - "cacache": "^20.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^6.0.0", - "ssri": "^13.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/makeerror": { "version": "1.0.12", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", @@ -17086,20 +17683,20 @@ } }, "node_modules/memfs": { - "version": "4.64.0", - "integrity": "sha512-Kw72fgY7Wn+sD8KmtNWSafl1dz0UvAsE/PHs3YVfLiaZuA3HxNm9sRLqAu0ATiBGJvME1PxZXbBZPv5GycDeAw==", + "version": "4.68.1", + "integrity": "sha512-OD+IDRUvIxu3QHL+nFm9gdyugInD27FDJ+sl4B5QgomPHXMlbw+GP918P8VNKu2FkNlVeqBkpzkwROpamVifRw==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@jsonjoy.com/fs-core": "4.64.0", - "@jsonjoy.com/fs-fsa": "4.64.0", - "@jsonjoy.com/fs-node": "4.64.0", - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-to-fsa": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", - "@jsonjoy.com/fs-print": "4.64.0", - "@jsonjoy.com/fs-snapshot": "4.64.0", + "@jsonjoy.com/fs-core": "4.68.1", + "@jsonjoy.com/fs-fsa": "4.68.1", + "@jsonjoy.com/fs-node": "4.68.1", + "@jsonjoy.com/fs-node-builtins": "4.68.1", + "@jsonjoy.com/fs-node-to-fsa": "4.68.1", + "@jsonjoy.com/fs-node-utils": "4.68.1", + "@jsonjoy.com/fs-print": "4.68.1", + "@jsonjoy.com/fs-snapshot": "4.68.1", "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", @@ -17110,9 +17707,6 @@ "funding": { "type": "github", "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" } }, "node_modules/merge-descriptors": { @@ -17133,15 +17727,6 @@ "dev": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/methods": { "version": "1.1.2", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", @@ -17157,6 +17742,7 @@ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -17170,6 +17756,7 @@ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8.6" }, @@ -17236,8 +17823,8 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.10.0", - "integrity": "sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==", + "version": "2.10.2", + "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", "dev": true, "license": "MIT", "peer": true, @@ -17264,15 +17851,15 @@ "peer": true }, "node_modules/minimatch": { - "version": "9.0.9", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "10.2.6", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^5.0.8" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -17287,131 +17874,110 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.3", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "5.0.2", - "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", + "node_modules/minimizer-webpack-plugin": { + "version": "5.6.1", + "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^2.0.0", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - }, - "optionalDependencies": { - "iconv-lite": "^0.7.2" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.7", - "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minipass": "^3.0.0" + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "node": ">= 10.13.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "peerDependencies": { + "webpack": "^5.1.0" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-sized": { - "version": "2.0.0", - "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", + "node_modules/minimizer-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, - "license": "ISC", + "license": "MIT", + "peer": true, "dependencies": { - "minipass": "^7.1.2" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" } }, - "node_modules/minizlib": { - "version": "3.1.0", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "node_modules/minimizer-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "minipass": "^7.1.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/mitt": { - "version": "1.2.0", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "version": "3.0.1", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true, "license": "MIT" }, @@ -17486,17 +18052,17 @@ } }, "node_modules/mute-stream": { - "version": "2.0.0", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "version": "3.0.0", + "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", "dev": true, "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/nanoid": { - "version": "3.3.16", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.18", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -17588,8 +18154,8 @@ } }, "node_modules/ng-packagr": { - "version": "21.2.6", - "integrity": "sha512-roCbiiI1LuOIuAyxmYPIGU5SP81P/6npgHkm46gtPiXff16OUC4HbKSt67jiKObmcOvMobUwGZePHYVJOeJTWg==", + "version": "22.1.1", + "integrity": "sha512-jZzpQckw2SFvuYI3aWfYMefSVKKG/04E+vrX2KD6coMx7ciLBotVWuLc0331Fjb6XNmAVcsmgQ5NY/Lf+9Himw==", "dev": true, "license": "MIT", "dependencies": { @@ -17597,12 +18163,11 @@ "@rollup/plugin-json": "^6.1.0", "@rollup/wasm-node": "^4.24.0", "ajv": "^8.17.1", - "ansi-colors": "^4.1.3", "browserslist": "^4.26.0", "chokidar": "^5.0.0", - "commander": "^14.0.0", + "commander": "^15.0.0", "dependency-graph": "^1.0.0", - "esbuild": "^0.28.1", + "esbuild": "^0.28.0", "find-cache-directory": "^6.0.0", "injection-js": "^2.4.0", "jsonc-parser": "^3.3.1", @@ -17610,7 +18175,7 @@ "ora": "^9.0.0", "piscina": "^5.0.0", "postcss": "^8.4.47", - "rollup-plugin-dts": "^6.4.0", + "rollup-plugin-dts": "~6.4.1", "rxjs": "^7.8.1", "sass": "^1.81.0", "tinyglobby": "^0.2.12" @@ -17619,16 +18184,16 @@ "ng-packagr": "src/cli/main.js" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" }, "optionalDependencies": { "rollup": "^4.24.0" }, "peerDependencies": { - "@angular/compiler-cli": "^21.0.0 || ^21.2.0-next", + "@angular/compiler-cli": "^22.0.0 || ^22.1.0-next || ^22.2.0-next", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.9 <6.0" + "typescript": ">=6.0 <6.1" }, "peerDependenciesMeta": { "tailwindcss": { @@ -17712,30 +18277,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/node-gyp": { - "version": "12.4.0", - "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "tar": "^7.5.4", - "tinyglobby": "^0.2.12", - "undici": "^6.25.0", - "which": "^6.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/node-gyp-build-optional-packages": { "version": "5.2.2", "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", @@ -17751,39 +18292,6 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "4.0.0", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=20" - } - }, - "node_modules/node-gyp/node_modules/undici": { - "version": "6.28.0", - "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "6.0.1", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^4.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/node-int64": { "version": "0.4.0", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", @@ -17791,8 +18299,8 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.51", - "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "version": "2.0.53", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "dev": true, "license": "MIT", "engines": { @@ -17812,21 +18320,6 @@ "node": ">=0.4.0" } }, - "node_modules/nopt": { - "version": "9.0.0", - "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^4.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", @@ -17836,99 +18329,19 @@ "node": ">=0.10.0" } }, - "node_modules/npm-bundled": { - "version": "5.0.0", - "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^5.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm-install-checks": { - "version": "8.0.0", - "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "5.0.0", - "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/npm-package-arg": { - "version": "13.0.2", - "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", + "version": "14.0.0", + "integrity": "sha512-69XQh3k+dtGa1p+7RaR57IuG3rCko96xr/nUfN4yDYBXbTYICiWcOpsFKLN2GtGE9cyIljE+f1exnaYt9MvM+Q==", "dev": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^9.0.0", - "proc-log": "^6.0.0", + "hosted-git-info": "^10.1.0", + "proc-log": "^7.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^7.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm-packlist": { - "version": "10.0.4", - "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", - "dev": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^8.0.0", - "proc-log": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "11.0.3", - "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "npm-package-arg": "^13.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "19.1.1", - "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^4.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^15.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^13.0.0", - "proc-log": "^6.0.0" + "validate-npm-package-name": "^8.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, "node_modules/npm-run-path": { @@ -18083,6 +18496,19 @@ "license": "MIT", "peer": true }, + "node_modules/obug": { + "version": "2.1.4", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", @@ -18150,18 +18576,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/opn": { - "version": "5.3.0", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/optionator": { "version": "0.9.4", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", @@ -18180,8 +18594,8 @@ } }, "node_modules/ora": { - "version": "9.3.0", - "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", + "version": "9.4.1", + "integrity": "sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==", "dev": true, "license": "MIT", "dependencies": { @@ -18191,7 +18605,7 @@ "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", - "stdin-discarder": "^0.3.1", + "stdin-discarder": "^0.3.2", "string-width": "^8.1.0" }, "engines": { @@ -18202,8 +18616,8 @@ } }, "node_modules/ora/node_modules/ansi-regex": { - "version": "6.2.2", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.3.0", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -18281,6 +18695,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oxc-parser": { + "version": "0.142.0", + "integrity": "sha512-kKR+jPiRJYJDexVoziIg/FVGvr1fT1FZSSJOk6tVoMKKSlsf1Cso+cgGCJkOEDWOP174vRntCPFKg+AS7InWvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.142.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.142.0", + "@oxc-parser/binding-android-arm64": "0.142.0", + "@oxc-parser/binding-darwin-arm64": "0.142.0", + "@oxc-parser/binding-darwin-x64": "0.142.0", + "@oxc-parser/binding-freebsd-x64": "0.142.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.142.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.142.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.142.0", + "@oxc-parser/binding-linux-arm64-musl": "0.142.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.142.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.142.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.142.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.142.0", + "@oxc-parser/binding-linux-x64-gnu": "0.142.0", + "@oxc-parser/binding-linux-x64-musl": "0.142.0", + "@oxc-parser/binding-openharmony-arm64": "0.142.0", + "@oxc-parser/binding-wasm32-wasi": "0.142.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.142.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.142.0", + "@oxc-parser/binding-win32-x64-msvc": "0.142.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", @@ -18311,18 +18762,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "7.0.6", - "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-retry": { "version": "6.2.1", "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", @@ -18374,109 +18813,38 @@ "node": ">=20" } }, - "node_modules/pa11y-ci": { - "version": "4.1.1", - "integrity": "sha512-urSrJTTDtXypYxpjhYSzVsbHlFblmbPgMfCxJI6WyTF3oSxNHfQ77mFIv5PKGiN/k46Qc/tVc8+4Ny+y13pGow==", - "dev": true, - "license": "LGPL-3.0-only", - "dependencies": { - "async": "~3.2.6", - "cheerio": "~1.0.0", - "commander": "~14.0.3", - "globby": "~6.1.0", - "kleur": "~4.1.5", - "lodash": "~4.18.1", - "node-fetch": "~2.7.0", - "pa11y": "^9.1.1", - "protocolify": "~3.0.0", - "puppeteer": "^24.37.5", - "wordwrap": "~1.0.0" - }, - "bin": { - "pa11y-ci": "bin/pa11y-ci.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/pa11y-ci/node_modules/array-union": { - "version": "1.0.2", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pa11y-ci/node_modules/brace-expansion": { - "version": "1.1.18", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/pa11y-ci/node_modules/glob": { - "version": "7.2.3", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/pa11y-ci/node_modules/globby": { - "version": "6.1.0", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pa11y-ci/node_modules/minimatch": { - "version": "3.1.5", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/pa11y-ci": { + "version": "4.1.1", + "integrity": "sha512-urSrJTTDtXypYxpjhYSzVsbHlFblmbPgMfCxJI6WyTF3oSxNHfQ77mFIv5PKGiN/k46Qc/tVc8+4Ny+y13pGow==", "dev": true, - "license": "ISC", + "license": "LGPL-3.0-only", "dependencies": { - "brace-expansion": "^1.1.7" + "async": "~3.2.6", + "cheerio": "~1.0.0", + "commander": "~14.0.3", + "globby": "~6.1.0", + "kleur": "~4.1.5", + "lodash": "~4.18.1", + "node-fetch": "~2.7.0", + "pa11y": "^9.1.1", + "protocolify": "~3.0.0", + "puppeteer": "^24.37.5", + "wordwrap": "~1.0.0" + }, + "bin": { + "pa11y-ci": "bin/pa11y-ci.js" }, "engines": { - "node": "*" + "node": ">=20" } }, - "node_modules/pa11y-ci/node_modules/pify": { - "version": "2.3.0", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/pa11y-ci/node_modules/commander": { + "version": "14.0.3", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=20" } }, "node_modules/pa11y/node_modules/axe-core": { @@ -18488,6 +18856,27 @@ "node": ">=4" } }, + "node_modules/pa11y/node_modules/commander": { + "version": "14.0.3", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/pa11y/node_modules/semver": { + "version": "7.7.4", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/pac-proxy-agent": { "version": "7.2.0", "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", @@ -18507,6 +18896,28 @@ "node": ">= 14" } }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/pac-resolver": { "version": "7.0.1", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", @@ -18526,37 +18937,6 @@ "dev": true, "license": "BlueOak-1.0.0" }, - "node_modules/pacote": { - "version": "21.5.1", - "integrity": "sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/git": "^7.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "@npmcli/run-script": "^10.0.0", - "cacache": "^20.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^13.0.0", - "npm-packlist": "^10.0.1", - "npm-pick-manifest": "^11.0.1", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "sigstore": "^4.0.0", - "ssri": "^13.0.0", - "tar": "^7.4.3" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/parent-module": { "version": "1.0.1", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", @@ -18587,9 +18967,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "node_modules/parse-json/node_modules/@babel/code-frame": { + "version": "7.29.7", + "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/parse-json/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/parse-json/node_modules/js-tokens": { + "version": "4.0.0", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, @@ -18603,23 +19006,24 @@ } }, "node_modules/parse5": { - "version": "8.0.1", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "version": "7.3.0", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, "license": "MIT", "dependencies": { - "entities": "^8.0.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-html-rewriting-stream": { - "version": "8.0.0", - "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", + "version": "8.0.1", + "integrity": "sha512-NaRku2aMpUN1Sh1Gyk1KWUh2A7EJx2c6qYzvwsPtqhoHoaURshdrceYK3LunVCm3WHhm6FS7Vcczbvdh3/UIVw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^6.0.0", + "entities": "^8.0.0", "parse5": "^8.0.0", "parse5-sax-parser": "^8.0.0" }, @@ -18628,49 +19032,37 @@ } }, "node_modules/parse5-html-rewriting-stream/node_modules/entities": { - "version": "6.0.1", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "8.0.0", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=20.19.0" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "version": "8.0.1", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "dev": true, "license": "MIT", "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" + "entities": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": { - "version": "6.0.1", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "7.3.0", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^6.0.0" + "domhandler": "^5.0.3", + "parse5": "^7.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -18688,48 +19080,49 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-parser-stream/node_modules/entities": { - "version": "6.0.1", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-parser-stream/node_modules/parse5": { - "version": "7.3.0", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "node_modules/parse5-sax-parser/node_modules/entities": { + "version": "8.0.0", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/parse5-sax-parser": { - "version": "8.0.0", - "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "8.0.1", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "dev": true, "license": "MIT", "dependencies": { - "parse5": "^8.0.0" + "entities": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5/node_modules/entities": { - "version": "8.0.0", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "version": "6.0.1", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=20.19.0" + "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -18809,15 +19202,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/path-type": { - "version": "4.0.0", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/pend": { "version": "1.2.0", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", @@ -18831,8 +19215,8 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.4", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.5", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { @@ -18843,13 +19227,12 @@ } }, "node_modules/pify": { - "version": "4.0.1", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "2.3.0", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, "node_modules/pinkie": { @@ -19042,29 +19425,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/portscanner": { - "version": "2.2.0", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - }, - "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" - } - }, - "node_modules/portscanner/node_modules/async": { - "version": "2.6.4", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", @@ -19075,8 +19435,8 @@ } }, "node_modules/postcss": { - "version": "8.5.12", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", + "version": "8.5.25", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", "dev": true, "funding": [ { @@ -19094,7 +19454,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -19103,8 +19463,8 @@ } }, "node_modules/postcss-loader": { - "version": "8.2.0", - "integrity": "sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==", + "version": "8.2.1", + "integrity": "sha512-k98jtRzthjj3f76MYTs9JTpRqV1RaaMhEU0Lpw9OTmQZQdppg4B30VZ74BojuBHt3F4KyubHJoXCMUeM8Bqeow==", "dev": true, "license": "MIT", "peer": true, @@ -19121,7 +19481,7 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" }, @@ -19230,8 +19590,8 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.4", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "version": "7.1.5", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", "dev": true, "license": "MIT", "peer": true, @@ -19335,39 +19695,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/primeicons": { - "version": "7.0.0", - "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==", - "license": "MIT" - }, - "node_modules/primeng": { - "version": "21.1.9", - "integrity": "sha512-Z76PtF08X0PNSTCNMobao8Qm71vC56mtZSdUtX/gsn4+q4x0NbUUtkeK1pc33a+kxVm2zkmOwzUIEGmb9VdoIA==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@primeuix/motion": "^0.0.10", - "@primeuix/styled": "^0.7.4", - "@primeuix/styles": "^2.0.3", - "@primeuix/utils": "^0.7.2", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/cdk": "^21.0.0", - "@angular/common": "^21.0.0", - "@angular/core": "^21.0.7", - "@angular/forms": "^21.0.0", - "@angular/platform-browser": "^21.0.0", - "@angular/router": "^21.0.0", - "rxjs": "^6.0.0 || ^7.8.1" - } - }, "node_modules/proc-log": { - "version": "6.1.0", - "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "version": "7.0.0", + "integrity": "sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg==", "dev": true, "license": "ISC", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, "node_modules/process-nextick-args": { @@ -19431,6 +19765,45 @@ "node": ">= 14" } }, + "node_modules/proxy-agent-negotiate": { + "version": "1.1.0", + "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "kerberos": "^2.0.0" + }, + "peerDependenciesMeta": { + "kerberos": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/proxy-agent/node_modules/lru-cache": { "version": "7.18.3", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", @@ -19547,8 +19920,8 @@ } }, "node_modules/pvutils": { - "version": "1.1.5", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "version": "1.2.0", + "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", "dev": true, "license": "MIT", "peer": true, @@ -19650,8 +20023,8 @@ } }, "node_modules/readdirp": { - "version": "5.0.0", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "version": "5.1.1", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "dev": true, "license": "MIT", "engines": { @@ -19809,16 +20182,19 @@ "version": "1.0.0", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/resolve": { - "version": "1.22.12", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "version": "2.0.0-next.7", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -19867,7 +20243,6 @@ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -19914,55 +20289,6 @@ "node": ">=0.10.0" } }, - "node_modules/resp-modifier": { - "version": "6.0.2", - "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", - "dev": true, - "dependencies": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/resp-modifier/node_modules/brace-expansion": { - "version": "1.1.18", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/resp-modifier/node_modules/debug": { - "version": "2.6.9", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/resp-modifier/node_modules/minimatch": { - "version": "3.1.5", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/resp-modifier/node_modules/ms": { - "version": "2.0.0", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, "node_modules/restore-cursor": { "version": "5.1.0", "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", @@ -20014,12 +20340,6 @@ "node": ">=0.10.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, "node_modules/rimraf": { "version": "3.0.2", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", @@ -20036,6 +20356,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.18", "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", @@ -20080,13 +20406,13 @@ } }, "node_modules/rolldown": { - "version": "1.0.0-rc.4", - "integrity": "sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==", + "version": "1.2.0", + "integrity": "sha512-u7tgm5l4Yw1iTqUL4EcYOAt7fFvCgQMLeidrnD4GALlC6aOznCjezYajgxeyKw27u0Q5N7fwgCzjVyPIWzwuBA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.113.0", - "@rolldown/pluginutils": "1.0.0-rc.4" + "@oxc-project/types": "=0.140.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { "rolldown": "bin/cli.mjs" @@ -20095,19 +20421,30 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.4", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.4", - "@rolldown/binding-darwin-x64": "1.0.0-rc.4", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.4", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.4", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.4", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.4", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.4", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.4", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.4", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.4", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.4", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.4" + "@rolldown/binding-android-arm64": "1.2.0", + "@rolldown/binding-darwin-arm64": "1.2.0", + "@rolldown/binding-darwin-x64": "1.2.0", + "@rolldown/binding-freebsd-x64": "1.2.0", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.0", + "@rolldown/binding-linux-arm64-gnu": "1.2.0", + "@rolldown/binding-linux-arm64-musl": "1.2.0", + "@rolldown/binding-linux-ppc64-gnu": "1.2.0", + "@rolldown/binding-linux-s390x-gnu": "1.2.0", + "@rolldown/binding-linux-x64-gnu": "1.2.0", + "@rolldown/binding-linux-x64-musl": "1.2.0", + "@rolldown/binding-openharmony-arm64": "1.2.0", + "@rolldown/binding-wasm32-wasi": "1.2.0", + "@rolldown/binding-win32-arm64-msvc": "1.2.0", + "@rolldown/binding-win32-x64-msvc": "1.2.0" + } + }, + "node_modules/rolldown/node_modules/@oxc-project/types": { + "version": "0.140.0", + "integrity": "sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, "node_modules/rollup": { @@ -20180,12 +20517,53 @@ "typescript": "^4.5 || ^5.0 || ^6.0" } }, + "node_modules/rollup-plugin-dts/node_modules/@babel/code-frame": { + "version": "7.29.7", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/rollup-plugin-dts/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/rollup-plugin-dts/node_modules/convert-source-map": { "version": "2.0.0", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, + "node_modules/rollup-plugin-dts/node_modules/js-tokens": { + "version": "4.0.0", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/rollup-plugin-dts/node_modules/magic-string": { + "version": "0.30.21", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/router": { "version": "2.2.0", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", @@ -20244,12 +20622,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rx": { - "version": "4.1.0", - "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/rxjs": { "version": "7.8.2", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", @@ -20338,36 +20710,33 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.97.3", - "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", + "version": "1.101.0", + "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", + "chokidar": "^5.0.0", + "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.19.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { - "version": "16.0.7", - "integrity": "sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==", + "version": "17.0.0", + "integrity": "sha512-0Ybm8ohBQ9LcrycVrFQp/KQBNX5a3Wda9/smS0mE/xLffzEnwvV8nykOzrbiSWNzTE3IB/jiXx8O4QmDPG2+Gw==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "neo-async": "^2.6.2" - }, "engines": { - "node": ">= 18.12.0" + "node": ">= 22.11.0" }, "funding": { "type": "opencollective", @@ -20375,7 +20744,6 @@ }, "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -20384,9 +20752,6 @@ "@rspack/core": { "optional": true }, - "node-sass": { - "optional": true - }, "sass": { "optional": true }, @@ -20398,40 +20763,6 @@ } } }, - "node_modules/sass/node_modules/chokidar": { - "version": "4.0.3", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sass/node_modules/immutable": { - "version": "5.1.9", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sass/node_modules/readdirp": { - "version": "4.1.2", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/sax": { "version": "1.6.1", "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", @@ -20514,8 +20845,8 @@ } }, "node_modules/semver": { - "version": "7.7.4", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.5", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -20526,56 +20857,34 @@ } }, "node_modules/send": { - "version": "0.19.2", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "version": "1.2.1", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serialize-javascript": { - "version": "7.0.7", - "integrity": "sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==", + "version": "7.1.0", + "integrity": "sha512-RNEqWOyhhUQYN9V1GfHwu9AR/g+NTciH6Z5u3/no6X3/w+04J2lVDL+svFQVXgXrEGBMG2puMVN3gq2SNGuTGw==", "dev": true, "license": "BSD-3-Clause", "peer": true, @@ -20588,6 +20897,7 @@ "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "accepts": "~1.3.8", "batch": "0.6.1", @@ -20610,6 +20920,7 @@ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -20623,6 +20934,7 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -20632,6 +20944,7 @@ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -20641,6 +20954,7 @@ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -20657,6 +20971,7 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -20666,6 +20981,7 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -20677,13 +20993,15 @@ "version": "2.0.0", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/serve-index/node_modules/negotiator": { "version": "0.6.3", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -20693,31 +21011,30 @@ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { - "version": "1.16.3", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "version": "2.2.1", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/server-destroy": { - "version": "1.0.1", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "dev": true, - "license": "ISC" - }, "node_modules/set-function-length": { "version": "1.2.2", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", @@ -20901,23 +21218,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sigstore": { - "version": "4.1.1", - "integrity": "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.1", - "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.1.1", - "@sigstore/tuf": "^4.0.2", - "@sigstore/verify": "^3.1.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/slash": { "version": "3.0.0", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", @@ -20928,8 +21228,8 @@ } }, "node_modules/slice-ansi": { - "version": "8.0.0", - "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "version": "9.0.0", + "integrity": "sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==", "dev": true, "license": "MIT", "dependencies": { @@ -20937,7 +21237,7 @@ "is-fullwidth-code-point": "^5.1.0" }, "engines": { - "node": ">=20" + "node": ">=22" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" @@ -20965,105 +21265,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/socket.io": { - "version": "4.8.3", - "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.8", - "integrity": "sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.4.1", - "ws": "~8.21.0" - } - }, - "node_modules/socket.io-client": { - "version": "4.8.3", - "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1", - "engine.io-client": "~6.6.1", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.7", - "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io/node_modules/accepts": { - "version": "1.3.8", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/mime-db": { - "version": "1.52.0", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/mime-types": { - "version": "2.1.35", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/negotiator": { - "version": "0.6.3", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/sockjs": { "version": "0.3.24", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", @@ -21104,6 +21305,15 @@ "node": ">= 14" } }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/source-map": { "version": "0.7.6", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", @@ -21175,28 +21385,6 @@ "node": ">=0.10.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "4.0.0", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/spdy": { "version": "4.0.2", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", @@ -21235,18 +21423,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/ssri": { - "version": "13.0.1", - "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/stack-utils": { "version": "2.0.6", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", @@ -21302,28 +21478,6 @@ "node": ">= 0.4" } }, - "node_modules/stream-throttle": { - "version": "0.1.3", - "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "commander": "^2.2.0", - "limiter": "^1.0.5" - }, - "bin": { - "throttleproxy": "bin/throttleproxy.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/stream-throttle/node_modules/commander": { - "version": "2.20.3", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, "node_modules/streamx": { "version": "2.28.0", "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", @@ -21406,8 +21560,8 @@ } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.2.2", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.3.0", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -21584,194 +21738,77 @@ }, "engines": { "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/tapable": { - "version": "2.3.3", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tar": { - "version": "7.5.22", - "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar-fs": { - "version": "3.1.3", - "integrity": "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-stream": { - "version": "3.2.0", - "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "bare-fs": "^4.5.5", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/teex": { - "version": "1.0.1", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "streamx": "^2.12.5" - } - }, - "node_modules/terser": { - "version": "5.46.0", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.6.1", - "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@minify-html/node": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "@swc/html": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "cssnano": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "html-minifier-terser": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "postcss": { - "optional": true - }, - "uglify-js": { - "optional": true - } + }, + "funding": { + "url": "https://opencollective.com/synckit" } }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/tapable": { + "version": "2.3.3", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-fs": { + "version": "3.1.3", + "integrity": "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "pump": "^3.0.0", + "tar-stream": "^3.1.5" }, - "engines": { - "node": ">= 10.13.0" + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/tar-stream": { + "version": "3.2.0", + "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", "dev": true, "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/terser": { + "version": "5.49.0", + "integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==", + "dev": true, + "license": "BSD-2-Clause", "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/terser/node_modules/commander": { @@ -21795,6 +21832,12 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.18", "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", @@ -21878,13 +21921,13 @@ "peer": true }, "node_modules/tinyglobby": { - "version": "0.2.15", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.17", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -21924,6 +21967,7 @@ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-number": "^7.0.0" }, @@ -21983,16 +22027,6 @@ "tslib": "2" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/tryer": { "version": "1.0.1", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", @@ -22000,148 +22034,39 @@ "license": "MIT" }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.5.0", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, - "node_modules/ts-jest": { - "version": "29.4.12", - "integrity": "sha512-Ov6ClY53Fflh6BGAnY2DlTq1hYDrTycz2PVTXBWFW2CU+9zrEqAp9fWdGXl42EXO5RLSFAcAZ2JFKbP+zBTFfw==", + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.9", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.8.5", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <7" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.8.5", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" + "minimist": "^1.2.0" }, "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" + "json5": "lib/cli.js" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { @@ -22178,20 +22103,6 @@ "license": "0BSD", "peer": true }, - "node_modules/tuf-js": { - "version": "4.1.0", - "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "4.1.0", - "debug": "^4.4.3", - "make-fetch-happen": "^15.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/type-check": { "version": "0.4.0", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", @@ -22244,8 +22155,8 @@ } }, "node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "version": "2.1.0", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "dev": true, "license": "MIT", "engines": { @@ -22366,45 +22277,9 @@ "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x" } }, - "node_modules/typedoc/node_modules/balanced-match": { - "version": "4.0.4", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "5.0.9", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "10.2.6", - "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": { - "version": "5.9.3", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.3", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -22415,32 +22290,6 @@ "node": ">=14.17" } }, - "node_modules/ua-parser-js": { - "version": "1.0.41", - "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/uc.micro": { "version": "2.1.0", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", @@ -22479,12 +22328,13 @@ } }, "node_modules/undici": { - "version": "7.28.0", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "8.10.0", + "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">=20.18.1" + "node": ">=22.19.0" } }, "node_modules/undici-types": { @@ -22537,15 +22387,6 @@ "node": ">=4" } }, - "node_modules/universalify": { - "version": "0.1.2", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", @@ -22593,8 +22434,8 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.1", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", "dev": true, "funding": [ { @@ -22611,169 +22452,472 @@ } ], "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "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", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-name": { + "version": "8.0.0", + "integrity": "sha512-SCv6OOV6Xj2/3cXy3dGmADluJTNcL3o7hZAglNPTe+WYuEuvxgJzxPrSDLZhF+CwyQOubqgecjMmTJGMVLWjYQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "8.1.5", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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/vite/node_modules/@emnapi/core": { + "version": "1.11.1", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/vite/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/vite/node_modules/@oxc-project/types": { + "version": "0.139.0", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/vite/node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "node_modules/vite/node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/utils-merge": { - "version": "1.0.1", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/vite/node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/uuid": { - "version": "8.3.2", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "node_modules/vite/node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "node_modules/vite/node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "node_modules/vite/node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { - "node": ">=10.12.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/validate-npm-package-name": { - "version": "7.0.2", - "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", + "node_modules/vite/node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/vary": { - "version": "1.1.2", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/vite/node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/vite": { - "version": "7.3.6", - "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "node_modules/vite/node_modules/rolldown": { + "version": "1.1.5", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.27.0 || ^0.28.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { - "vite": "bin/vite.js" + "rolldown": "bin/cli.mjs" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "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 - } + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" } }, "node_modules/w3c-xmlserializer": { @@ -22798,12 +22942,11 @@ } }, "node_modules/watchpack": { - "version": "2.5.1", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "version": "2.5.2", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", "dev": true, "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, "engines": { @@ -22844,37 +22987,32 @@ } }, "node_modules/webpack": { - "version": "5.105.2", - "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==", + "version": "5.109.2", + "integrity": "sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", + "acorn": "^8.16.0", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", - "es-module-lexer": "^2.0.0", + "enhanced-resolve": "^5.24.4", + "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", + "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.6.1", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" }, "bin": { "webpack": "bin/webpack.js" @@ -22893,28 +23031,27 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "7.4.5", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "version": "8.0.3", + "integrity": "sha512-zWrde9VZDiRaFuWsjHO40wm9LxxtXEk8DdzFXdU7eU5ZpiANnZZDBbZgN3guxbEoKqUHd9YupBmynyioz42nkA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", + "memfs": "^4.56.10", + "mime-types": "^3.0.2", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "schema-utils": "^4.3.3" }, "engines": { - "node": ">= 18.12.0" + "node": ">= 20.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^5.101.0" }, "peerDependenciesMeta": { "webpack": { @@ -22923,8 +23060,8 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.2.5", - "integrity": "sha512-4wZtCquSuv9CKX8oybo+mqxtxZqWz47uM1Ch94lxowBztOhWCbhqvRbfC/mODOwxgV2brY+JGZpHq58/SuVFYg==", + "version": "5.2.6", + "integrity": "sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw==", "dev": true, "license": "MIT", "peer": true, @@ -22947,7 +23084,7 @@ "graceful-fs": "^4.2.6", "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", + "launch-editor": "^2.14.1", "open": "^10.0.3", "p-retry": "^6.2.0", "schema-utils": "^4.2.0", @@ -22994,6 +23131,19 @@ "node": ">= 0.6" } }, + "node_modules/webpack-dev-server/node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/webpack-dev-server/node_modules/body-parser": { "version": "1.20.6", "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", @@ -23044,16 +23194,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/webpack-dev-server/node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/webpack-dev-server/node_modules/content-disposition": { "version": "0.5.4", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", @@ -23084,6 +23224,13 @@ "ms": "2.0.0" } }, + "node_modules/webpack-dev-server/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/webpack-dev-server/node_modules/express": { "version": "4.22.2", "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", @@ -23147,7 +23294,17 @@ "unpipe": "~1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/fresh": { + "version": "0.5.2", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" } }, "node_modules/webpack-dev-server/node_modules/glob-parent": { @@ -23202,8 +23359,8 @@ } }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.4.0", - "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "version": "2.5.0", + "integrity": "sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==", "dev": true, "license": "MIT", "peer": true, @@ -23211,17 +23368,14 @@ "node": ">= 10" } }, - "node_modules/webpack-dev-server/node_modules/is-wsl": { - "version": "3.1.1", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "node_modules/webpack-dev-server/node_modules/is-plain-obj": { + "version": "3.0.0", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -23257,26 +23411,6 @@ "node": ">= 0.6" } }, - "node_modules/webpack-dev-server/node_modules/mime-types": { - "version": "2.1.35", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server/node_modules/ms": { - "version": "2.0.0", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/webpack-dev-server/node_modules/negotiator": { "version": "0.6.3", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", @@ -23365,6 +23499,47 @@ "node": ">=8.10.0" } }, + "node_modules/webpack-dev-server/node_modules/send": { + "version": "0.19.2", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/webpack-dev-server/node_modules/serve-static": { + "version": "1.16.3", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/webpack-dev-server/node_modules/type-is": { "version": "1.6.18", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", @@ -23379,6 +23554,49 @@ "node": ">= 0.6" } }, + "node_modules/webpack-dev-server/node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, "node_modules/webpack-dev-server/node_modules/wsl-utils": { "version": "0.1.0", "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", @@ -23466,36 +23684,6 @@ "node": ">=4.0" } }, - "node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/websocket-driver": { "version": "0.7.5", "integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==", @@ -23694,17 +23882,20 @@ "license": "MIT" }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "8.1.0", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs": { @@ -23754,33 +23945,43 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.3.0", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -23803,8 +24004,8 @@ } }, "node_modules/ws": { - "version": "8.21.1", - "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", + "version": "8.21.3", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "dev": true, "license": "MIT", "engines": { @@ -23840,22 +24041,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.1", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/xhr2": { "version": "0.2.1", "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", @@ -23879,14 +24064,6 @@ "dev": true, "license": "MIT" }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.1.2", - "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/y18n": { "version": "5.0.8", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", @@ -23918,15 +24095,15 @@ } }, "node_modules/yargs": { - "version": "18.0.0", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "version": "18.1.0", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "dev": true, "license": "MIT", "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", + "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" }, @@ -23935,17 +24112,17 @@ } }, "node_modules/yargs-parser": { - "version": "21.1.1", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "version": "22.0.0", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, "license": "ISC", "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs/node_modules/ansi-regex": { - "version": "6.2.2", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.3.0", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -23955,24 +24132,17 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "10.6.0", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, "node_modules/yargs/node_modules/string-width": { - "version": "7.2.0", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.2.2", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -23993,15 +24163,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "22.0.0", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, "node_modules/yauzl": { "version": "2.10.0", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", @@ -24012,15 +24173,6 @@ "fd-slicer": "~1.1.0" } }, - "node_modules/yn": { - "version": "3.1.1", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", @@ -24045,22 +24197,9 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zod": { - "version": "4.3.6", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "dev": true, + "version": "4.4.3", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index dcdb90e92..814012621 100644 --- a/package.json +++ b/package.json @@ -37,42 +37,36 @@ }, "private": true, "dependencies": { - "@angular/animations": "^21.2.6", - "@angular/common": "^21.2.6", - "@angular/compiler": "^21.2.6", - "@angular/core": "^21.2.6", - "@angular/forms": "^21.2.6", - "@angular/platform-browser": "^21.2.6", - "@angular/platform-browser-dynamic": "^21.2.6", - "@angular/platform-server": "^21.2.6", - "@angular/router": "^21.2.6", + "@angular/animations": "^22.1.3", + "@angular/common": "^22.1.3", + "@angular/compiler": "^22.1.3", + "@angular/core": "^22.1.3", + "@angular/forms": "^22.1.3", + "@angular/platform-browser": "^22.1.3", + "@angular/platform-browser-dynamic": "^22.1.3", + "@angular/platform-server": "^22.1.3", + "@angular/router": "^22.1.3", "@e965/xlsx": "^0.20.3", - "@primeuix/styled": "^0.7.4", - "@primeuix/utils": "^0.7.1", "@types/lodash-es": "^4.17.12", - "highlight.js": "^11.11.1", + "highlight.js": "^11.12.0", "lodash-es": "^4.17.21", - "primeicons": "^7.0.0", - "primeng": "^21.1.3", "rxjs": "~7.8.2", "tslib": "^2.8.1", "zone.js": "~0.16.1" }, "devDependencies": { - "@angular-builders/jest": "^21.0.3", - "@angular/build": "^21.2.5", - "@angular/cli": "~21.2.5", - "@angular/compiler-cli": "^21.2.6", - "@axe-core/playwright": "^4.11.1", + "@angular-builders/jest": "^22.0.1", + "@angular/build": "^22.1.5", + "@angular/cli": "~22.1.5", + "@angular/compiler-cli": "^22.1.3", + "@axe-core/playwright": "^4.13.0", "@playwright/test": "^1.58.2", - "@types/express": "^4.17.25", "@types/jest": "^30.0.0", "@types/node": "^22.10.10", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", - "browser-sync": "^3.0.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.2", + "eslint-config-prettier": "^10.1.8", "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-node": "^11.1.0", @@ -81,14 +75,14 @@ "eslint-plugin-standard": "^5.0.0", "jest": "^30.3.0", "jest-environment-jsdom": "^30.3.0", - "jest-preset-angular": "^16.1.2", - "ng-packagr": "^21.2.2", + "jest-preset-angular": "^17.0.0", + "ng-packagr": "^22.1.1", "pa11y-ci": "^4.0.1", "prettier": "^3.4.2", "typedoc": "^0.28.14", - "typescript": "~5.9.3" + "typescript": "~6.0.3" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } } diff --git a/playwright/cps-ui-kit/components/cps-loader.spec.ts b/playwright/cps-ui-kit/components/cps-loader.spec.ts index 9a5b9f555..87238a2ec 100644 --- a/playwright/cps-ui-kit/components/cps-loader.spec.ts +++ b/playwright/cps-ui-kit/components/cps-loader.spec.ts @@ -133,7 +133,7 @@ test.describe('cps-loader', () => { .getByTestId('cps-loader-label'); const inlineColor = await label.evaluate((el) => el.style.color); - expect(inlineColor).toBe('var(--cps-color-energy)'); + expect(inlineColor).toBe('var(--cps-color-energy-lighten4)'); const resolvedColor = await label.evaluate( (el) => getComputedStyle(el).color diff --git a/projects/composition/src/app/api-data/cps-autocomplete.json b/projects/composition/src/app/api-data/cps-autocomplete.json index 89c00a37d..7c01352ed 100644 --- a/projects/composition/src/app/api-data/cps-autocomplete.json +++ b/projects/composition/src/app/api-data/cps-autocomplete.json @@ -193,7 +193,7 @@ "name": "prefixIcon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Icon before input value." }, @@ -201,7 +201,7 @@ "name": "prefixIconSize", "optional": false, "readonly": false, - "type": "iconSizeType", + "type": "CpsIconSizeType", "default": "1.125rem", "description": "Size of icon before input value." }, diff --git a/projects/composition/src/app/api-data/cps-button.json b/projects/composition/src/app/api-data/cps-button.json index 33086327d..f63c6f6bc 100644 --- a/projects/composition/src/app/api-data/cps-button.json +++ b/projects/composition/src/app/api-data/cps-button.json @@ -81,7 +81,7 @@ "name": "icon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Name of the icon on the button." }, diff --git a/projects/composition/src/app/api-data/cps-checkbox.json b/projects/composition/src/app/api-data/cps-checkbox.json index 36e0a10f4..c64528a43 100644 --- a/projects/composition/src/app/api-data/cps-checkbox.json +++ b/projects/composition/src/app/api-data/cps-checkbox.json @@ -73,7 +73,7 @@ "name": "icon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Name of the icon." }, diff --git a/projects/composition/src/app/api-data/cps-chip.json b/projects/composition/src/app/api-data/cps-chip.json index f68bbe779..c9042dbc6 100644 --- a/projects/composition/src/app/api-data/cps-chip.json +++ b/projects/composition/src/app/api-data/cps-chip.json @@ -17,7 +17,7 @@ "name": "icon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Name of the icon." }, diff --git a/projects/composition/src/app/api-data/cps-cron-validation.json b/projects/composition/src/app/api-data/cps-cron-validation.json index 4d122635f..8f70b9d58 100644 --- a/projects/composition/src/app/api-data/cps-cron-validation.json +++ b/projects/composition/src/app/api-data/cps-cron-validation.json @@ -26,7 +26,7 @@ ] }, "tokens": { - "description": "Injection tokens exposed by the service.", + "description": "Injection tokens exposed by the component or service.", "values": [ { "name": "CPS_CRON_VALIDATION_SERVICE", diff --git a/projects/composition/src/app/api-data/cps-datepicker.json b/projects/composition/src/app/api-data/cps-datepicker.json index 8e1827cb7..5dbf2c9d4 100644 --- a/projects/composition/src/app/api-data/cps-datepicker.json +++ b/projects/composition/src/app/api-data/cps-datepicker.json @@ -42,7 +42,7 @@ "optional": false, "readonly": false, "type": "CpsDatepickerDateFormat", - "default": "MM/DD/YYYY", + "default": "DD/MM/YYYY", "description": "Date format for displaying and parsing the date string." }, { diff --git a/projects/composition/src/app/api-data/cps-dialog.json b/projects/composition/src/app/api-data/cps-dialog.json index 1e72b5518..8ebbd6b19 100644 --- a/projects/composition/src/app/api-data/cps-dialog.json +++ b/projects/composition/src/app/api-data/cps-dialog.json @@ -49,6 +49,16 @@ } ] }, + "tokens": { + "description": "Injection tokens exposed by the component or service.", + "values": [ + { + "name": "CPS_DIALOG_CONFIG", + "type": "InjectionToken>", + "description": "Injection token used to provide/inject a CpsDialogConfig value.\n\nThere is no default — it is provided per-dialog-instance by\n `CpsDialogService` , so it should only be injected from within a\ndialog's component tree." + } + ] + }, "interfaces": { "description": "Defines the custom interfaces used by the component or service.", "values": [ @@ -95,7 +105,7 @@ "name": "headerIcon", "optional": true, "readonly": false, - "type": "string", + "type": "CpsIconType", "description": "Header icon." }, { diff --git a/projects/composition/src/app/api-data/cps-expansion-panel.json b/projects/composition/src/app/api-data/cps-expansion-panel.json index 12784313b..74ea22124 100644 --- a/projects/composition/src/app/api-data/cps-expansion-panel.json +++ b/projects/composition/src/app/api-data/cps-expansion-panel.json @@ -81,7 +81,7 @@ "name": "prefixIcon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Name of the icon in front of the title." } diff --git a/projects/composition/src/app/api-data/cps-icon.json b/projects/composition/src/app/api-data/cps-icon.json index 020a86b2a..54200f51d 100644 --- a/projects/composition/src/app/api-data/cps-icon.json +++ b/projects/composition/src/app/api-data/cps-icon.json @@ -9,7 +9,7 @@ "name": "icon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Name of the icon." }, @@ -17,7 +17,7 @@ "name": "size", "optional": false, "readonly": false, - "type": "iconSizeType", + "type": "CpsIconSizeType", "default": "small", "description": "Size of the icon, it can be of type number denoting pixels, string or 'fill', 'xsmall', 'small', 'normal' or 'large'." }, @@ -41,18 +41,28 @@ } } }, + "tokens": { + "description": "Injection tokens exposed by the component or service.", + "values": [ + { + "name": "CPS_ICONS_PATH", + "type": "InjectionToken", + "description": "Injection token that is used to provide the path to the icons." + } + ] + }, "types": { "description": "Defines the custom types used by the component or service.", "values": [ { - "name": "IconType", - "value": "'access' | 'access-denied' | 'access-lock' | 'access-unlock' | 'add' | 'add-domain' | 'angle-left' | 'angle-right' | 'attribute' | 'avatar' | 'avatar-top-menu' | 'bell' | 'book' | 'bookmark' | 'browse' | 'burger' | 'burger-arrow' | 'caret-down' | 'change' | 'checked' | 'chevron-down' | 'chevron-down-2' | 'circle' | 'cleansing' | 'close-x' | 'close-x-2' | 'columns' | 'construction' | 'controls' | 'copy' | 'csv' | 'cube' | 'database' | 'datafeed' | 'datepicker' | 'delete' | 'dislike' | 'domain' | 'dots' | 'download' | 'dq' | 'dropdown-menu' | 'edit' | 'expand' | 'export' | 'eye' | 'filter' | 'filter_2' | 'filter-funnel' | 'filter-funnel-filled' | 'follow' | 'graph' | 'grid' | 'grid-view' | 'health' | 'heart' | 'help-circle' | 'home' | 'info-circle' | 'insight' | 'issues' | 'jpeg' | 'json' | 'kafka' | 'kris' | 'last-seen-product' | 'left' | 'like' | 'line-vertical' | 'lock' | 'logout' | 'maximize' | 'measurement' | 'menu-expand' | 'menu-shrink' | 'minimize' | 'minus' | 'moon' | 'move-grabber' | 'open' | 'ownership' | 'path' | 'pdf' | 'pending' | 'plus' | 'projects' | 'question' | 'questions' | 'rectangle-rounded' | 'refresh' | 'remove' | 'right' | 'save' | 'schema' | 'schema_filter' | 'search' | 'settings' | 'smart' | 'sort-icon-asc' | 'sort-icon-desc' | 'star' | 'stepper-completed' | 'success' | 'suggestion' | 'sun' | 'survivorship' | 'table-row-error' | 'table-row-success' | 'table-row-warning' | 'toast-error' | 'toast-info' | 'toast-success' | 'toast-warning' | 'tools' | 'user' | 'users' | 'vector' | 'vector-down' | 'vector-right' | 'vector-up' | 'wallet' | 'warning' | 'widget-button-icon' | 'xls'", - "description": "IconType is used to define the type of the icon." + "name": "CpsIconType", + "value": "'access' | 'access-denied' | 'access-lock' | 'access-unlock' | 'add' | 'add-domain' | 'angle-left' | 'angle-right' | 'attribute' | 'avatar' | 'avatar-top-menu' | 'bell' | 'book' | 'bookmark' | 'browse' | 'burger' | 'burger-arrow' | 'caret-down' | 'change' | 'checked' | 'chevron-down' | 'chevron-down-2' | 'circle' | 'cleansing' | 'close-x' | 'close-x-2' | 'columns' | 'construction' | 'controls' | 'copy' | 'csv' | 'cube' | 'database' | 'datafeed' | 'datepicker' | 'delete' | 'dislike' | 'domain' | 'dots' | 'download' | 'dq' | 'dropdown-menu' | 'edit' | 'expand' | 'export' | 'eye' | 'filter' | 'filter_2' | 'filter-funnel' | 'filter-funnel-filled' | 'follow' | 'graph' | 'grid' | 'grid-view' | 'health' | 'heart' | 'help-circle' | 'home' | 'info-circle' | 'insight' | 'issues' | 'jpeg' | 'json' | 'kafka' | 'kris' | 'last-seen-product' | 'left' | 'like' | 'line-vertical' | 'lock' | 'logout' | 'maximize' | 'measurement' | 'menu-expand' | 'menu-shrink' | 'minimize' | 'minus' | 'moon' | 'move-grabber' | 'open' | 'ownership' | 'path' | 'pdf' | 'pending' | 'plus' | 'projects' | 'question' | 'questions' | 'rectangle-rounded' | 'refresh' | 'remove' | 'right' | 'save' | 'schema' | 'schema_filter' | 'search' | 'settings' | 'smart' | 'sort-icon-asc' | 'sort-icon-desc' | 'star' | 'stepper-completed' | 'success' | 'suggestion' | 'sun' | 'survivorship' | 'table-row-error' | 'table-row-success' | 'table-row-warning' | 'toast-error' | 'toast-info' | 'toast-success' | 'toast-warning' | 'tools' | 'user' | 'users' | 'vector' | 'vector-down' | 'vector-right' | 'vector-up' | 'wallet' | 'warning' | 'widget-button-icon' | 'xls' | \"\"", + "description": "CpsIconType is used to define the type of the icon." }, { - "name": "iconSizeType", + "name": "CpsIconSizeType", "value": "number | string | \"fill\" | \"xsmall\" | \"small\" | \"normal\" | \"large\"", - "description": "iconSizeType is used to define the size of the icon." + "description": "CpsIconSizeType is used to define the size of the icon." } ] } diff --git a/projects/composition/src/app/api-data/cps-info-circle.json b/projects/composition/src/app/api-data/cps-info-circle.json index 758fd0ce0..c954a8d9c 100644 --- a/projects/composition/src/app/api-data/cps-info-circle.json +++ b/projects/composition/src/app/api-data/cps-info-circle.json @@ -9,7 +9,7 @@ "name": "size", "optional": false, "readonly": false, - "type": "iconSizeType", + "type": "CpsIconSizeType", "default": "small", "description": "Size of the icon, it can be of type number denoting pixels, string or 'fill', 'xsmall', 'small', 'normal' or 'large'." }, diff --git a/projects/composition/src/app/api-data/cps-input.json b/projects/composition/src/app/api-data/cps-input.json index 8f8d1c246..a40cdb82d 100644 --- a/projects/composition/src/app/api-data/cps-input.json +++ b/projects/composition/src/app/api-data/cps-input.json @@ -137,7 +137,7 @@ "name": "prefixIcon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Icon before input value." }, @@ -153,7 +153,7 @@ "name": "prefixIconSize", "optional": false, "readonly": false, - "type": "iconSizeType", + "type": "CpsIconSizeType", "default": "1.125rem", "description": "Size of icon before input value." }, diff --git a/projects/composition/src/app/api-data/cps-radio-group.json b/projects/composition/src/app/api-data/cps-radio-group.json index 3aeb3fb70..90d9cfee2 100644 --- a/projects/composition/src/app/api-data/cps-radio-group.json +++ b/projects/composition/src/app/api-data/cps-radio-group.json @@ -236,6 +236,16 @@ } } }, + "tokens": { + "description": "Injection tokens exposed by the component or service.", + "values": [ + { + "name": "CPS_RADIO_GROUP", + "type": "InjectionToken", + "description": "Injection token used by child radio buttons to look up their parent\n `CpsRadioGroupComponent` ." + } + ] + }, "types": { "description": "Defines the custom types used by the component or service.", "values": [ diff --git a/projects/composition/src/app/api-data/cps-select.json b/projects/composition/src/app/api-data/cps-select.json index 5640b67f3..f006061df 100644 --- a/projects/composition/src/app/api-data/cps-select.json +++ b/projects/composition/src/app/api-data/cps-select.json @@ -185,7 +185,7 @@ "name": "prefixIcon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Icon before input value." }, @@ -193,7 +193,7 @@ "name": "prefixIconSize", "optional": false, "readonly": false, - "type": "iconSizeType", + "type": "CpsIconSizeType", "default": "1.125rem", "description": "Size of icon before input value." }, diff --git a/projects/composition/src/app/api-data/cps-sidebar-menu.json b/projects/composition/src/app/api-data/cps-sidebar-menu.json index 46c60d5ea..537b976fe 100644 --- a/projects/composition/src/app/api-data/cps-sidebar-menu.json +++ b/projects/composition/src/app/api-data/cps-sidebar-menu.json @@ -54,7 +54,7 @@ "values": [ { "name": "CpsSidebarMenuItem", - "value": "{\n \"title\": \"string\",\n \"icon\": \"string\",\n \"url?\": \"string\",\n \"target?\": \"string\",\n \"disabled?\": \"boolean\",\n \"items?\": \"CpsMenuItem[]\"\n}", + "value": "{\n \"title\": \"string\",\n \"icon\": \"CpsIconType\",\n \"url?\": \"string\",\n \"target?\": \"string\",\n \"disabled?\": \"boolean\",\n \"items?\": \"CpsMenuItem[]\"\n}", "description": "CpsSidebarMenuItem is used to define the items of the CpsSidebarMenuComponent." } ] diff --git a/projects/composition/src/app/api-data/cps-table.json b/projects/composition/src/app/api-data/cps-table.json index 899dcd751..f716da0af 100644 --- a/projects/composition/src/app/api-data/cps-table.json +++ b/projects/composition/src/app/api-data/cps-table.json @@ -232,7 +232,7 @@ "name": "toolbarIcon", "optional": false, "readonly": false, - "type": "string", + "type": "CpsIconType", "default": "", "description": "Toolbar icon name." }, @@ -440,7 +440,7 @@ "name": "additionalBtnOnSelectIcon", "optional": false, "readonly": false, - "type": "string", + "type": "CpsIconType", "default": "", "description": "AdditionalBtnOnSelect icon." }, @@ -472,7 +472,7 @@ "name": "actionBtnIcon", "optional": false, "readonly": false, - "type": "string", + "type": "CpsIconType", "default": "", "description": "Action button icon." }, diff --git a/projects/composition/src/app/api-data/cps-textarea.json b/projects/composition/src/app/api-data/cps-textarea.json index f7c6b4839..ec0a22057 100644 --- a/projects/composition/src/app/api-data/cps-textarea.json +++ b/projects/composition/src/app/api-data/cps-textarea.json @@ -222,16 +222,6 @@ ], "description": "Callback to invoke when the component receives focus." }, - { - "name": "prefixIconClicked", - "parameters": [ - { - "name": "value", - "type": "any" - } - ], - "description": "Callback to invoke when the prefixIcon is clicked." - }, { "name": "blurred", "parameters": [ diff --git a/projects/composition/src/app/api-data/cps-tree-autocomplete.json b/projects/composition/src/app/api-data/cps-tree-autocomplete.json index f804f5bc5..7a2b10be8 100644 --- a/projects/composition/src/app/api-data/cps-tree-autocomplete.json +++ b/projects/composition/src/app/api-data/cps-tree-autocomplete.json @@ -145,7 +145,7 @@ "name": "prefixIcon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Icon before input value." }, @@ -153,7 +153,7 @@ "name": "prefixIconSize", "optional": false, "readonly": false, - "type": "iconSizeType", + "type": "CpsIconSizeType", "default": "1.125rem", "description": "Size of icon before input value, of type number, string, 'fill', 'xsmall', 'small', 'normal' or 'large'." }, diff --git a/projects/composition/src/app/api-data/cps-tree-select.json b/projects/composition/src/app/api-data/cps-tree-select.json index edd768a03..fbd5ec237 100644 --- a/projects/composition/src/app/api-data/cps-tree-select.json +++ b/projects/composition/src/app/api-data/cps-tree-select.json @@ -137,7 +137,7 @@ "name": "prefixIcon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Icon before input value." }, @@ -145,7 +145,7 @@ "name": "prefixIconSize", "optional": false, "readonly": false, - "type": "iconSizeType", + "type": "CpsIconSizeType", "default": "1.125rem", "description": "Size of icon before input value, of type number, string, 'fill', 'xsmall', 'small', 'normal' or 'large'." }, diff --git a/projects/composition/src/app/api-data/cps-tree-table.json b/projects/composition/src/app/api-data/cps-tree-table.json index 325134c9e..02afcb1f3 100644 --- a/projects/composition/src/app/api-data/cps-tree-table.json +++ b/projects/composition/src/app/api-data/cps-tree-table.json @@ -224,7 +224,7 @@ "name": "toolbarIcon", "optional": false, "readonly": false, - "type": "string", + "type": "CpsIconType", "default": "", "description": "Toolbar icon name." }, @@ -440,7 +440,7 @@ "name": "additionalBtnOnSelectIcon", "optional": false, "readonly": false, - "type": "string", + "type": "CpsIconType", "default": "", "description": "AdditionalBtnOnSelect icon." }, @@ -472,7 +472,7 @@ "name": "actionBtnIcon", "optional": false, "readonly": false, - "type": "string", + "type": "CpsIconType", "default": "", "description": "Action button icon." }, diff --git a/projects/composition/src/app/api-data/internal.json b/projects/composition/src/app/api-data/internal.json index 601e71c56..8ba390e38 100644 --- a/projects/composition/src/app/api-data/internal.json +++ b/projects/composition/src/app/api-data/internal.json @@ -121,7 +121,7 @@ "name": "prefixIcon", "optional": false, "readonly": false, - "type": "IconType", + "type": "CpsIconType", "default": "", "description": "Icon before input value." }, @@ -129,7 +129,7 @@ "name": "prefixIconSize", "optional": false, "readonly": false, - "type": "iconSizeType", + "type": "CpsIconSizeType", "default": "1.125rem", "description": "Size of icon before input value, of type number, string, 'fill', 'xsmall', 'small', 'normal' or 'large'." }, diff --git a/projects/composition/src/app/api-data/types_map.json b/projects/composition/src/app/api-data/types_map.json index 56d0c694d..ac2211dea 100644 --- a/projects/composition/src/app/api-data/types_map.json +++ b/projects/composition/src/app/api-data/types_map.json @@ -1,39 +1,76 @@ { + "CpsAutocompleteComponent": "autocomplete", "CpsAutocompleteAppearanceType": "autocomplete", + "CpsButtonToggleComponent": "button-toggle", "CpsButtonToggleOption": "button-toggle", + "CpsButtonComponent": "button", + "CpsCheckboxComponent": "checkbox", + "CpsChipComponent": "chip", + "CpsDatepickerComponent": "datepicker", "CpsDatepickerAppearanceType": "datepicker", "CpsDatepickerDateFormat": "datepicker", + "CpsDividerComponent": "divider", "CpsDividerType": "divider", - "IconType": "icon", - "iconSizeType": "icon", + "CpsExpansionPanelComponent": "expansion-panel", + "CpsFileUploadComponent": "file-upload", + "CpsIconComponent": "icon", + "CpsIconType": "icon", + "CpsIconSizeType": "icon", + "CpsInfoCircleComponent": "info-circle", + "CpsInputComponent": "input", "CpsInputAppearanceType": "input", + "CpsLoaderComponent": "loader", + "CpsMenuComponent": "menu", "CpsMenuItem": "menu", "CpsMenuAttachPosition": "menu", "CpsMenuHideReason": "menu", + "CpsPaginatorComponent": "paginator", + "CpsProgressCircularComponent": "progress-circular", + "CpsProgressLinearComponent": "progress-linear", + "CpsRadioButtonComponent": "radio-group", + "CpsRadioGroupComponent": "radio-group", "CpsRadioOption": "radio-group", + "CpsRadioComponent": "radio-group", + "CpsSchedulerComponent": "scheduler", + "CpsSelectComponent": "select", "CpsSelectAppearanceType": "select", + "CpsSidebarMenuComponent": "sidebar-menu", "CpsSidebarMenuItem": "sidebar-menu", + "CpsSwitchComponent": "switch", + "CpsTabGroupComponent": "tab-group", "CpsTabChangeEvent": "tab-group", "CpsTabsAnimationType": "tab-group", "CpsTabsAlignmentType": "tab-group", + "CpsTabComponent": "tab-group", "CpsColumnFilterCategoryOption": "table", "CpsColumnFilterType": "table", "CpsColumnFilterMatchMode": "table", + "CpsTableComponent": "table", "CpsTableExportFormat": "table", "CpsTableSize": "table", "CpsTableToolbarSize": "table", "CpsTableSortMode": "table", + "CpsTagComponent": "tag", + "CpsTextareaComponent": "textarea", + "CpsTimepickerComponent": "timepicker", "CpsTime": "timepicker", + "CpsTreeAutocompleteComponent": "tree-autocomplete", "CpsTreeAutocompleteAppearanceType": "tree-autocomplete", + "CpsTreeSelectComponent": "tree-select", "CpsTreeSelectAppearanceType": "tree-select", + "CpsTreeTableComponent": "tree-table", "CpsTreeTableSize": "tree-table", "CpsTreeTableToolbarSize": "tree-table", "CpsTreeTableSortMode": "tree-table", + "CpsBaseTreeDropdownComponent": "internal", + "CpsTooltipDirective": "tooltip", "CpsTooltipPosition": "tooltip", "CpsTooltipOpenOn": "tooltip", + "CpsDialogService": "dialog", "CpsDialogConfig": "dialog", "CpsDialogAutoFocusTarget": "dialog", "CpsDialogRef": "dialog", + "CpsNotificationService": "notification", "CpsNotificationConfig": "notification", "CpsNotificationAppearance": "notification", "CpsNotificationPosition": "notification" diff --git a/projects/composition/src/app/app.component.spec.ts b/projects/composition/src/app/app.component.spec.ts index a56d6e230..872deb483 100644 --- a/projects/composition/src/app/app.component.spec.ts +++ b/projects/composition/src/app/app.component.spec.ts @@ -11,7 +11,7 @@ import { Subject } from 'rxjs'; import { CpsThemeService } from 'cps-ui-kit'; import { AppComponent } from './app.component'; -jest.mock('projects/cps-ui-kit/package.json', () => ({ version: '1.0.0' }), { +jest.mock('../../../cps-ui-kit/package.json', () => ({ version: '1.0.0' }), { virtual: true }); diff --git a/projects/composition/src/app/app.component.ts b/projects/composition/src/app/app.component.ts index 8ecc60031..15c212203 100644 --- a/projects/composition/src/app/app.component.ts +++ b/projects/composition/src/app/app.component.ts @@ -5,11 +5,12 @@ import { inject, NgZone, PLATFORM_ID, - ViewChild + ViewChild, + ChangeDetectionStrategy } from '@angular/core'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; -import packageJson from 'projects/cps-ui-kit/package.json'; +import packageJson from '../../../cps-ui-kit/package.json'; import { NavigationSidebarComponent } from './components/navigation-sidebar/navigation-sidebar.component'; import { distinctUntilChanged, filter, map } from 'rxjs/operators'; import { CpsThemeService } from 'cps-ui-kit'; @@ -19,6 +20,7 @@ import { CpsThemeService } from 'cps-ui-kit'; templateUrl: './app.component.html', styleUrls: ['./app.component.scss'], standalone: false, + changeDetection: ChangeDetectionStrategy.Eager, host: { '(document:keydown.escape)': 'onEscapeKey()' } }) export class AppComponent { diff --git a/projects/composition/src/app/components/component-docs-viewer/component-docs-viewer.component.html b/projects/composition/src/app/components/component-docs-viewer/component-docs-viewer.component.html index 5e67ec1d2..80370fe19 100644 --- a/projects/composition/src/app/components/component-docs-viewer/component-docs-viewer.component.html +++ b/projects/composition/src/app/components/component-docs-viewer/component-docs-viewer.component.html @@ -127,6 +127,41 @@

Types

} } + + @if ( + componentData.tokens && + componentData.tokens.values && + componentData.tokens.values.length > 0 + ) { +
+

Tokens

+

{{ componentData.tokens.description }}

+
+ + + + + + + + + + @for (token of componentData.tokens.values; track token.name) { + + + + + + } + +
NameTypeDescription
+ {{ token.name }} + + + {{ token.description }}
+
+
+ } @if ( componentData.interfaces && diff --git a/projects/composition/src/app/components/component-docs-viewer/component-docs-viewer.component.ts b/projects/composition/src/app/components/component-docs-viewer/component-docs-viewer.component.ts index 4330c7289..987ab77b7 100644 --- a/projects/composition/src/app/components/component-docs-viewer/component-docs-viewer.component.ts +++ b/projects/composition/src/app/components/component-docs-viewer/component-docs-viewer.component.ts @@ -1,11 +1,11 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; import { ComponentAPI, EnumsAPI, InterfaceAPI, TypesAPI } from '../../models/component-api.model'; -import { ServiceAPI } from '../../models/service-api.model'; +import { ServiceAPI, TokensAPI } from '../../models/service-api.model'; import { CpsTabComponent, CpsTabGroupComponent, @@ -22,6 +22,7 @@ import { ApiTypeComponent } from '../shared/api-type/api-type.component'; selector: 'app-component-docs-viewer', templateUrl: './component-docs-viewer.component.html', styleUrl: './component-docs-viewer.component.scss', + changeDetection: ChangeDetectionStrategy.Eager, imports: [ CpsTabComponent, CpsTabGroupComponent, @@ -37,6 +38,7 @@ export class ComponentDocsViewerComponent extends ViewerComponent { types?: TypesAPI; interfaces?: InterfaceAPI; enums?: EnumsAPI; + tokens?: TokensAPI; }; @Input() services?: ServiceAPI[]; diff --git a/projects/composition/src/app/components/dialog-content/dialog-content.component.ts b/projects/composition/src/app/components/dialog-content/dialog-content.component.ts index 72f872be3..3c571c4e8 100644 --- a/projects/composition/src/app/components/dialog-content/dialog-content.component.ts +++ b/projects/composition/src/app/components/dialog-content/dialog-content.component.ts @@ -1,27 +1,34 @@ -import { Component, OnInit } from '@angular/core'; import { + Component, + Inject, + OnInit, + ChangeDetectionStrategy +} from '@angular/core'; +import { + CPS_DIALOG_CONFIG, CpsButtonComponent, - CpsDialogConfig, CpsDialogRef, - CpsIconComponent + CpsIconComponent, + type CpsDialogConfig, + type CpsIconType } from 'cps-ui-kit'; @Component({ imports: [CpsButtonComponent, CpsIconComponent], selector: 'app-dialog-content', templateUrl: './dialog-content.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./dialog-content.component.scss'] }) export class DialogContentComponent implements OnInit { info = ''; - icon = ''; + icon: CpsIconType = ''; closeDisabled = false; - // eslint-disable-next-line no-useless-constructor constructor( private _dialogRef: CpsDialogRef, - private _config: CpsDialogConfig + @Inject(CPS_DIALOG_CONFIG) private _config: CpsDialogConfig ) { this.info = this._config.data.info; this.icon = this._config.data.icon; diff --git a/projects/composition/src/app/components/navigation-sidebar/navigation-sidebar.component.ts b/projects/composition/src/app/components/navigation-sidebar/navigation-sidebar.component.ts index 9eb65e481..d9628716e 100644 --- a/projects/composition/src/app/components/navigation-sidebar/navigation-sidebar.component.ts +++ b/projects/composition/src/app/components/navigation-sidebar/navigation-sidebar.component.ts @@ -7,7 +7,8 @@ import { OnInit, Output, QueryList, - ViewChildren + ViewChildren, + ChangeDetectionStrategy } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { RouterLinkActive, RouterModule } from '@angular/router'; @@ -17,6 +18,7 @@ import { CpsInputComponent } from 'cps-ui-kit'; imports: [RouterModule, CommonModule, FormsModule, CpsInputComponent], selector: 'app-navigation-sidebar', templateUrl: './navigation-sidebar.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./navigation-sidebar.component.scss'] }) export class NavigationSidebarComponent implements OnInit { diff --git a/projects/composition/src/app/components/service-docs-viewer/service-docs-viewer.component.html b/projects/composition/src/app/components/service-docs-viewer/service-docs-viewer.component.html index ed48477ad..39cd105e7 100644 --- a/projects/composition/src/app/components/service-docs-viewer/service-docs-viewer.component.html +++ b/projects/composition/src/app/components/service-docs-viewer/service-docs-viewer.component.html @@ -69,6 +69,43 @@

Methods

} + + @if ( + serviceData.tokens && + serviceData.tokens.values && + serviceData.tokens.values.length > 0 + ) { +
+

Tokens

+

{{ serviceData.tokens.description }}

+
+ + + + + + + + + + @for (token of serviceData.tokens.values; track token.name) { + + + + + + } + +
NameTypeDescription
+ {{ token.name }} + + + {{ token.description }}
+
+
+ } @if ( serviceData.types && diff --git a/projects/composition/src/app/components/service-docs-viewer/service-docs-viewer.component.ts b/projects/composition/src/app/components/service-docs-viewer/service-docs-viewer.component.ts index 3b9712eb5..adacd3e52 100644 --- a/projects/composition/src/app/components/service-docs-viewer/service-docs-viewer.component.ts +++ b/projects/composition/src/app/components/service-docs-viewer/service-docs-viewer.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; import { ServiceAPI } from '../../models/service-api.model'; import { CpsTabComponent, @@ -14,6 +14,7 @@ import { ApiTypeComponent } from '../shared/api-type/api-type.component'; selector: 'app-service-docs-viewer', templateUrl: './service-docs-viewer.component.html', styleUrl: './service-docs-viewer.component.scss', + changeDetection: ChangeDetectionStrategy.Eager, imports: [ CpsTabComponent, CpsTabGroupComponent, diff --git a/projects/composition/src/app/components/shared/api-type/api-type.component.scss b/projects/composition/src/app/components/shared/api-type/api-type.component.scss index 4f3fff784..70583f9c5 100644 --- a/projects/composition/src/app/components/shared/api-type/api-type.component.scss +++ b/projects/composition/src/app/components/shared/api-type/api-type.component.scss @@ -9,7 +9,10 @@ flex-wrap: nowrap; display: inline-flex; align-items: center; - gap: 0.35rem; + + .type-sep { + margin-right: 0.35rem; + } } .type-part { diff --git a/projects/composition/src/app/components/shared/enums/enums.component.ts b/projects/composition/src/app/components/shared/enums/enums.component.ts index 5f759ad23..e4dd8d060 100644 --- a/projects/composition/src/app/components/shared/enums/enums.component.ts +++ b/projects/composition/src/app/components/shared/enums/enums.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; import { EnumsAPI } from '../../../models/component-api.model'; import { EnumValuesPipe } from './enum-values.pipe'; @@ -6,6 +6,7 @@ import { EnumValuesPipe } from './enum-values.pipe'; selector: 'app-enums', templateUrl: './enums.component.html', styleUrl: './enums.component.scss', + changeDetection: ChangeDetectionStrategy.Eager, imports: [EnumValuesPipe] }) export class EnumsComponent { diff --git a/projects/composition/src/app/components/viewer/viewer.component.ts b/projects/composition/src/app/components/viewer/viewer.component.ts index 7710f399f..db615a666 100644 --- a/projects/composition/src/app/components/viewer/viewer.component.ts +++ b/projects/composition/src/app/components/viewer/viewer.component.ts @@ -3,7 +3,8 @@ import { Component, DestroyRef, OnInit, - inject + inject, + ChangeDetectionStrategy } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ActivatedRoute, Router, Scroll } from '@angular/router'; @@ -12,6 +13,7 @@ import { DOCUMENT } from '@angular/common'; @Component({ template: '', + changeDetection: ChangeDetectionStrategy.Eager, standalone: false }) export abstract class ViewerComponent implements OnInit, AfterViewInit { diff --git a/projects/composition/src/app/pages/autocomplete-page/autocomplete-page.component.ts b/projects/composition/src/app/pages/autocomplete-page/autocomplete-page.component.ts index 10620aa1c..b21f67591 100644 --- a/projects/composition/src/app/pages/autocomplete-page/autocomplete-page.component.ts +++ b/projects/composition/src/app/pages/autocomplete-page/autocomplete-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, ReactiveFormsModule, @@ -27,6 +27,7 @@ import { CommonModule } from '@angular/common'; selector: 'app-autocomplete-page', templateUrl: './autocomplete-page.component.html', styleUrls: ['./autocomplete-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class AutocompletePageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/button-page/button-page.component.ts b/projects/composition/src/app/pages/button-page/button-page.component.ts index 9221029cf..a98c38692 100644 --- a/projects/composition/src/app/pages/button-page/button-page.component.ts +++ b/projects/composition/src/app/pages/button-page/button-page.component.ts @@ -1,4 +1,4 @@ -import { Component, inject } from '@angular/core'; +import { Component, inject, ChangeDetectionStrategy } from '@angular/core'; import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; import { CpsButtonComponent, CpsInputComponent } from 'cps-ui-kit'; import { ComponentDocsViewerComponent } from '../../components/component-docs-viewer/component-docs-viewer.component'; @@ -18,6 +18,7 @@ import { buttonExamples } from './button-page.examples'; selector: 'app-button-page', templateUrl: './button-page.component.html', styleUrls: ['./button-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class ButtonPageComponent { diff --git a/projects/composition/src/app/pages/button-toggle-page/button-toggle-page.component.ts b/projects/composition/src/app/pages/button-toggle-page/button-toggle-page.component.ts index 87b21f1ea..bfdae1e56 100644 --- a/projects/composition/src/app/pages/button-toggle-page/button-toggle-page.component.ts +++ b/projects/composition/src/app/pages/button-toggle-page/button-toggle-page.component.ts @@ -1,4 +1,4 @@ -import { Component, inject } from '@angular/core'; +import { Component, inject, ChangeDetectionStrategy } from '@angular/core'; import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { CpsButtonToggleComponent, CpsButtonToggleOption } from 'cps-ui-kit'; @@ -18,6 +18,7 @@ import { CodeExampleComponent } from '../../components/code-example/code-example selector: 'app-button-toggle-page', templateUrl: './button-toggle-page.component.html', styleUrls: ['./button-toggle-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class ButtonTogglePageComponent { diff --git a/projects/composition/src/app/pages/checkbox-page/checkbox-page.component.ts b/projects/composition/src/app/pages/checkbox-page/checkbox-page.component.ts index 5d3a06379..94dfbff6d 100644 --- a/projects/composition/src/app/pages/checkbox-page/checkbox-page.component.ts +++ b/projects/composition/src/app/pages/checkbox-page/checkbox-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { CpsCheckboxComponent } from 'cps-ui-kit'; @@ -18,6 +18,7 @@ import { checkboxExamples } from './checkbox-page.examples'; selector: 'app-checkbox-page', templateUrl: './checkbox-page.component.html', styleUrls: ['./checkbox-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class CheckboxPageComponent { diff --git a/projects/composition/src/app/pages/chip-page/chip-page.component.ts b/projects/composition/src/app/pages/chip-page/chip-page.component.ts index fae83c343..a27f11a44 100644 --- a/projects/composition/src/app/pages/chip-page/chip-page.component.ts +++ b/projects/composition/src/app/pages/chip-page/chip-page.component.ts @@ -1,4 +1,10 @@ -import { Component, ElementRef, inject, ViewChild } from '@angular/core'; +import { + Component, + ElementRef, + inject, + ViewChild, + ChangeDetectionStrategy +} from '@angular/core'; import { CpsButtonComponent, CpsChipComponent, @@ -21,6 +27,7 @@ import { chipExamples } from './chip-page.examples'; selector: 'app-chip-page', templateUrl: './chip-page.component.html', styleUrls: ['./chip-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class ChipPageComponent { diff --git a/projects/composition/src/app/pages/colors-page/colors-page/colors-page.component.ts b/projects/composition/src/app/pages/colors-page/colors-page/colors-page.component.ts index 2ca1bb3ff..ecfee354a 100644 --- a/projects/composition/src/app/pages/colors-page/colors-page/colors-page.component.ts +++ b/projects/composition/src/app/pages/colors-page/colors-page/colors-page.component.ts @@ -1,5 +1,10 @@ import { CommonModule, DOCUMENT } from '@angular/common'; -import { Component, Inject, OnInit } from '@angular/core'; +import { + Component, + Inject, + OnInit, + ChangeDetectionStrategy +} from '@angular/core'; import { CpsInputComponent, CpsNotificationPosition, @@ -18,6 +23,7 @@ type colorGroupsType = { selector: 'app-colors-page', templateUrl: './colors-page.component.html', styleUrls: ['./colors-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class ColorsPageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/datepicker-page/datepicker-page.component.html b/projects/composition/src/app/pages/datepicker-page/datepicker-page.component.html index 178f0b32c..2bfe27f04 100644 --- a/projects/composition/src/app/pages/datepicker-page/datepicker-page.component.html +++ b/projects/composition/src/app/pages/datepicker-page/datepicker-page.component.html @@ -50,7 +50,7 @@ + dateFormat="MM/DD/YYYY"> diff --git a/projects/composition/src/app/pages/datepicker-page/datepicker-page.component.ts b/projects/composition/src/app/pages/datepicker-page/datepicker-page.component.ts index d6c76672a..d3f83c9ad 100644 --- a/projects/composition/src/app/pages/datepicker-page/datepicker-page.component.ts +++ b/projects/composition/src/app/pages/datepicker-page/datepicker-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, ReactiveFormsModule, @@ -23,6 +23,7 @@ import { datepickerExamples } from './datepicker-page.examples'; selector: 'app-datepicker-page', templateUrl: './datepicker-page.component.html', styleUrls: ['./datepicker-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class DatepickerPageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/dialog-page/dialog-page.component.ts b/projects/composition/src/app/pages/dialog-page/dialog-page.component.ts index 19f956876..24cbc5f38 100644 --- a/projects/composition/src/app/pages/dialog-page/dialog-page.component.ts +++ b/projects/composition/src/app/pages/dialog-page/dialog-page.component.ts @@ -1,4 +1,4 @@ -import { Component, SkipSelf } from '@angular/core'; +import { Component, SkipSelf, ChangeDetectionStrategy } from '@angular/core'; import { CpsButtonComponent, CpsDialogService } from 'cps-ui-kit'; import { DialogContentComponent } from '../../components/dialog-content/dialog-content.component'; import { ServiceDocsViewerComponent } from '../../components/service-docs-viewer/service-docs-viewer.component'; @@ -16,6 +16,7 @@ import { dialogExamples } from './dialog-page.examples'; templateUrl: './dialog-page.component.html', styleUrls: ['./dialog-page.component.scss'], host: { class: 'composition-page' }, + changeDetection: ChangeDetectionStrategy.Eager, providers: [CpsDialogService] }) export class DialogPageComponent { diff --git a/projects/composition/src/app/pages/divider-page/divider-page.component.ts b/projects/composition/src/app/pages/divider-page/divider-page.component.ts index 06a3f2459..16d7726b1 100644 --- a/projects/composition/src/app/pages/divider-page/divider-page.component.ts +++ b/projects/composition/src/app/pages/divider-page/divider-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { CpsDividerComponent } from 'cps-ui-kit'; import { ComponentDocsViewerComponent } from '../../components/component-docs-viewer/component-docs-viewer.component'; import { CodeExampleComponent } from '../../components/code-example/code-example.component'; @@ -14,6 +14,7 @@ import { dividerExamples } from './divider-page.examples'; ], templateUrl: './divider-page.component.html', styleUrl: './divider-page.component.scss', + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class DividerPageComponent { diff --git a/projects/composition/src/app/pages/expansion-panel-page/expansion-panel-page.component.ts b/projects/composition/src/app/pages/expansion-panel-page/expansion-panel-page.component.ts index e1e273920..d62169c4d 100644 --- a/projects/composition/src/app/pages/expansion-panel-page/expansion-panel-page.component.ts +++ b/projects/composition/src/app/pages/expansion-panel-page/expansion-panel-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { CpsButtonComponent, CpsExpansionPanelComponent } from 'cps-ui-kit'; import ComponentData from '../../api-data/cps-expansion-panel.json'; @@ -16,6 +16,7 @@ import { expansionPanelExamples } from './expansion-panel-page.examples'; selector: 'app-expansion-panel-page', templateUrl: './expansion-panel-page.component.html', styleUrls: ['./expansion-panel-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class ExpansionPanelPageComponent { diff --git a/projects/composition/src/app/pages/file-upload-page/file-upload-page.component.ts b/projects/composition/src/app/pages/file-upload-page/file-upload-page.component.ts index 5f5b8b052..ddfed7ee5 100644 --- a/projects/composition/src/app/pages/file-upload-page/file-upload-page.component.ts +++ b/projects/composition/src/app/pages/file-upload-page/file-upload-page.component.ts @@ -1,4 +1,4 @@ -import { Component, ViewChild } from '@angular/core'; +import { Component, ViewChild, ChangeDetectionStrategy } from '@angular/core'; import { CpsFileUploadComponent, CpsButtonToggleComponent, @@ -23,6 +23,7 @@ import { fileUploadExamples } from './file-upload-page.examples'; ], templateUrl: './file-upload-page.component.html', styleUrls: ['./file-upload-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class FileUploadPageComponent { diff --git a/projects/composition/src/app/pages/icons-page/icons-page/icons-page.component.ts b/projects/composition/src/app/pages/icons-page/icons-page/icons-page.component.ts index 79de00f85..3e1ae35d1 100644 --- a/projects/composition/src/app/pages/icons-page/icons-page/icons-page.component.ts +++ b/projects/composition/src/app/pages/icons-page/icons-page/icons-page.component.ts @@ -1,11 +1,17 @@ -import { Component, OnInit, inject } from '@angular/core'; +import { + Component, + OnInit, + inject, + ChangeDetectionStrategy +} from '@angular/core'; import { FormsModule } from '@angular/forms'; import { CpsIconComponent, CpsInputComponent, CpsNotificationPosition, CpsNotificationService, - iconNames + cpsIconNames, + type CpsIconType } from 'cps-ui-kit'; import ComponentData from '../../../api-data/cps-icon.json'; @@ -24,17 +30,18 @@ import { iconsExamples } from './icons-page.examples'; selector: 'app-icons-page', templateUrl: './icons-page.component.html', styleUrls: ['./icons-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class IconsPageComponent implements OnInit { - filteredIconsList: string[] = []; + filteredIconsList: CpsIconType[] = []; componentData = ComponentData; readonly examples = iconsExamples; private _notificationService = inject(CpsNotificationService); ngOnInit() { - this.filteredIconsList = iconNames; + this.filteredIconsList = [...cpsIconNames]; } onSearchChanged(value: string) { @@ -43,7 +50,7 @@ export class IconsPageComponent implements OnInit { private _filterIcons(name: string) { name = name.toLowerCase(); - this.filteredIconsList = iconNames.filter((n) => + this.filteredIconsList = cpsIconNames.filter((n) => n.toLowerCase().includes(name) ); } diff --git a/projects/composition/src/app/pages/info-circle-page/info-circle-page.component.ts b/projects/composition/src/app/pages/info-circle-page/info-circle-page.component.ts index ab6ee52e0..6a70aeb64 100644 --- a/projects/composition/src/app/pages/info-circle-page/info-circle-page.component.ts +++ b/projects/composition/src/app/pages/info-circle-page/info-circle-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { CpsInfoCircleComponent } from 'cps-ui-kit'; @@ -15,6 +15,7 @@ import { infoCircleExamples } from './info-circle-page.examples'; CodeExampleComponent ], templateUrl: './info-circle-page.component.html', + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class InfoCirclePageComponent { diff --git a/projects/composition/src/app/pages/input-page/input-page.component.ts b/projects/composition/src/app/pages/input-page/input-page.component.ts index 0aa4e24ae..e20bccc8e 100644 --- a/projects/composition/src/app/pages/input-page/input-page.component.ts +++ b/projects/composition/src/app/pages/input-page/input-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { AbstractControl, FormsModule, @@ -26,6 +26,7 @@ import { inputExamples } from './input-page.examples'; selector: 'app-input-page', templateUrl: './input-page.component.html', styleUrls: ['./input-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class InputPageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/loader-page/loader-page.component.html b/projects/composition/src/app/pages/loader-page/loader-page.component.html index bca667854..98b73198a 100644 --- a/projects/composition/src/app/pages/loader-page/loader-page.component.html +++ b/projects/composition/src/app/pages/loader-page/loader-page.component.html @@ -40,7 +40,7 @@
diff --git a/projects/composition/src/app/pages/loader-page/loader-page.component.ts b/projects/composition/src/app/pages/loader-page/loader-page.component.ts index 85d6a4242..887f111a6 100644 --- a/projects/composition/src/app/pages/loader-page/loader-page.component.ts +++ b/projects/composition/src/app/pages/loader-page/loader-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { CpsButtonComponent, CpsLoaderComponent } from 'cps-ui-kit'; import { ComponentDocsViewerComponent } from '../../components/component-docs-viewer/component-docs-viewer.component'; import { CodeExampleComponent } from '../../components/code-example/code-example.component'; @@ -16,6 +16,7 @@ import { loaderExamples } from './loader-page.examples'; selector: 'app-loader-page', templateUrl: './loader-page.component.html', styleUrls: ['./loader-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class LoaderPageComponent { diff --git a/projects/composition/src/app/pages/loader-page/loader-page.examples.ts b/projects/composition/src/app/pages/loader-page/loader-page.examples.ts index db613aa88..d8df5d6f9 100644 --- a/projects/composition/src/app/pages/loader-page/loader-page.examples.ts +++ b/projects/composition/src/app/pages/loader-page/loader-page.examples.ts @@ -35,7 +35,7 @@ onFullScreenClick() { relativeLoaderThemedLabelOpacity: { html: `
- +
` }, diff --git a/projects/composition/src/app/pages/menu-page/menu-page.component.ts b/projects/composition/src/app/pages/menu-page/menu-page.component.ts index f4aab323c..698617972 100644 --- a/projects/composition/src/app/pages/menu-page/menu-page.component.ts +++ b/projects/composition/src/app/pages/menu-page/menu-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { CpsButtonComponent, CpsMenuComponent, @@ -19,6 +19,7 @@ import { menuExamples } from './menu-page.examples'; ], templateUrl: './menu-page.component.html', styleUrls: ['./menu-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class MenuPageComponent { diff --git a/projects/composition/src/app/pages/notification-page/notification-page.component.ts b/projects/composition/src/app/pages/notification-page/notification-page.component.ts index 94604faf3..ffb29255f 100644 --- a/projects/composition/src/app/pages/notification-page/notification-page.component.ts +++ b/projects/composition/src/app/pages/notification-page/notification-page.component.ts @@ -1,4 +1,4 @@ -import { Component, inject } from '@angular/core'; +import { Component, inject, ChangeDetectionStrategy } from '@angular/core'; import { CpsButtonComponent, CpsNotificationAppearance, @@ -19,6 +19,7 @@ import { notificationExamples } from './notification-page.examples'; ], templateUrl: './notification-page.component.html', styleUrls: ['./notification-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class NotificationPageComponent { diff --git a/projects/composition/src/app/pages/paginator-page/paginator-page.component.ts b/projects/composition/src/app/pages/paginator-page/paginator-page.component.ts index 0cca86825..14e4c412f 100644 --- a/projects/composition/src/app/pages/paginator-page/paginator-page.component.ts +++ b/projects/composition/src/app/pages/paginator-page/paginator-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { CpsPaginatorComponent, CpsSwitchComponent } from 'cps-ui-kit'; import { ComponentDocsViewerComponent } from '../../components/component-docs-viewer/component-docs-viewer.component'; @@ -17,6 +17,7 @@ import { paginatorExamples } from './paginator-page.examples'; ], templateUrl: './paginator-page.component.html', styleUrls: ['./paginator-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class PaginatorPageComponent { diff --git a/projects/composition/src/app/pages/progress-circular-page/progress-circular-page.component.ts b/projects/composition/src/app/pages/progress-circular-page/progress-circular-page.component.ts index 47a9aebdb..cf0478ba0 100644 --- a/projects/composition/src/app/pages/progress-circular-page/progress-circular-page.component.ts +++ b/projects/composition/src/app/pages/progress-circular-page/progress-circular-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { RouterModule } from '@angular/router'; import { CpsIconComponent, CpsProgressCircularComponent } from 'cps-ui-kit'; import { ComponentDocsViewerComponent } from '../../components/component-docs-viewer/component-docs-viewer.component'; @@ -17,6 +17,7 @@ import { progressCircularExamples } from './progress-circular-page.examples'; selector: 'app-progress-circular-page', templateUrl: './progress-circular-page.component.html', styleUrls: ['./progress-circular-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class ProgressCircularPageComponent { diff --git a/projects/composition/src/app/pages/progress-linear-page/progress-linear-page.component.ts b/projects/composition/src/app/pages/progress-linear-page/progress-linear-page.component.ts index 478c81dc6..1d2172f07 100644 --- a/projects/composition/src/app/pages/progress-linear-page/progress-linear-page.component.ts +++ b/projects/composition/src/app/pages/progress-linear-page/progress-linear-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { CpsProgressLinearComponent } from 'cps-ui-kit'; import ComponentData from '../../api-data/cps-progress-linear.json'; import { ComponentDocsViewerComponent } from '../../components/component-docs-viewer/component-docs-viewer.component'; @@ -14,6 +14,7 @@ import { progressLinearExamples } from './progress-linear-page.examples'; selector: 'app-progress-linear-page', templateUrl: './progress-linear-page.component.html', styleUrls: ['./progress-linear-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class ProgressLinearPageComponent { diff --git a/projects/composition/src/app/pages/radio-page/radio-page.component.ts b/projects/composition/src/app/pages/radio-page/radio-page.component.ts index 556680524..745038bfb 100644 --- a/projects/composition/src/app/pages/radio-page/radio-page.component.ts +++ b/projects/composition/src/app/pages/radio-page/radio-page.component.ts @@ -1,4 +1,9 @@ -import { Component, inject, OnInit } from '@angular/core'; +import { + Component, + inject, + OnInit, + ChangeDetectionStrategy +} from '@angular/core'; import { AbstractControl, FormsModule, @@ -34,6 +39,7 @@ import { radioExamples } from './radio-page.examples'; selector: 'app-radio-page', templateUrl: './radio-page.component.html', styleUrls: ['./radio-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class RadioPageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/scheduler-page/scheduler-page.component.ts b/projects/composition/src/app/pages/scheduler-page/scheduler-page.component.ts index 0bd8e081b..0ace45df3 100644 --- a/projects/composition/src/app/pages/scheduler-page/scheduler-page.component.ts +++ b/projects/composition/src/app/pages/scheduler-page/scheduler-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { CpsSchedulerComponent } from 'cps-ui-kit'; import ComponentData from '../../api-data/cps-scheduler.json'; import ServiceData from '../../api-data/cps-cron-validation.json'; @@ -14,6 +14,7 @@ import { schedulerExamples } from './scheduler-page.examples'; CodeExampleComponent ], templateUrl: './scheduler-page.component.html', + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class SchedulerPageComponent { diff --git a/projects/composition/src/app/pages/select-page/select-page.component.ts b/projects/composition/src/app/pages/select-page/select-page.component.ts index ae3bce6e0..5d1afba13 100644 --- a/projects/composition/src/app/pages/select-page/select-page.component.ts +++ b/projects/composition/src/app/pages/select-page/select-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, ReactiveFormsModule, @@ -24,6 +24,7 @@ import { selectExamples } from './select-page.examples'; selector: 'app-select-page', templateUrl: './select-page.component.html', styleUrls: ['./select-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class SelectPageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/sidebar-menu-page/sidebar-menu-page.component.ts b/projects/composition/src/app/pages/sidebar-menu-page/sidebar-menu-page.component.ts index e24f5c452..9b3efe53c 100644 --- a/projects/composition/src/app/pages/sidebar-menu-page/sidebar-menu-page.component.ts +++ b/projects/composition/src/app/pages/sidebar-menu-page/sidebar-menu-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { CpsIconComponent, CpsSidebarMenuComponent, @@ -20,6 +20,7 @@ import { sidebarMenuExamples } from './sidebar-menu-page.examples'; ], templateUrl: './sidebar-menu-page.component.html', styleUrls: ['./sidebar-menu-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class SidebarMenuPageComponent { diff --git a/projects/composition/src/app/pages/switch-page/switch-page.component.ts b/projects/composition/src/app/pages/switch-page/switch-page.component.ts index 559b925bf..b66d9fc5d 100644 --- a/projects/composition/src/app/pages/switch-page/switch-page.component.ts +++ b/projects/composition/src/app/pages/switch-page/switch-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { CpsSwitchComponent } from 'cps-ui-kit'; import ComponentData from '../../api-data/cps-switch.json'; @@ -17,6 +17,7 @@ import { switchExamples } from './switch-page.examples'; selector: 'app-switch-page', templateUrl: './switch-page.component.html', styleUrls: ['./switch-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class SwitchPageComponent { diff --git a/projects/composition/src/app/pages/tab-group-page/tab-group-page.component.ts b/projects/composition/src/app/pages/tab-group-page/tab-group-page.component.ts index d061a0d0a..ec51d8275 100644 --- a/projects/composition/src/app/pages/tab-group-page/tab-group-page.component.ts +++ b/projects/composition/src/app/pages/tab-group-page/tab-group-page.component.ts @@ -1,10 +1,11 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { NgTemplateOutlet } from '@angular/common'; import { CpsTabGroupComponent, CpsTabComponent, CpsTabChangeEvent, - CpsCheckboxComponent + CpsCheckboxComponent, + type CpsIconType } from 'cps-ui-kit'; import ComponentData from '../../api-data/cps-tab-group.json'; import { ComponentDocsViewerComponent } from '../../components/component-docs-viewer/component-docs-viewer.component'; @@ -23,6 +24,7 @@ import { tabGroupExamples } from './tab-group-page.examples'; selector: 'app-tab-group-page', templateUrl: './tab-group-page.component.html', styleUrls: ['./tab-group-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class TabGroupPageComponent { @@ -60,11 +62,12 @@ export class TabGroupPageComponent { tooltipText: `Tooltip of tab ${i + 1}` })); - rightAlignedTabs = [ - { label: 'Tab 1', icon: 'survivorship', id: 'tab1' }, - { label: 'Tab 2', icon: 'kris', id: null }, - { label: 'Tab 3', icon: 'dq', id: null } - ]; + rightAlignedTabs: { label: string; icon: CpsIconType; id: string | null }[] = + [ + { label: 'Tab 1', icon: 'survivorship', id: 'tab1' }, + { label: 'Tab 2', icon: 'kris', id: null }, + { label: 'Tab 3', icon: 'dq', id: null } + ]; stretchedTabs = [{ label: 'Tab 1' }, { label: 'Tab 2' }, { label: 'Tab 3' }]; diff --git a/projects/composition/src/app/pages/table-page/table-page.component.ts b/projects/composition/src/app/pages/table-page/table-page.component.ts index 8d2d80ce8..c2f84a5a7 100644 --- a/projects/composition/src/app/pages/table-page/table-page.component.ts +++ b/projects/composition/src/app/pages/table-page/table-page.component.ts @@ -1,4 +1,10 @@ -import { Component, OnDestroy, OnInit, inject } from '@angular/core'; +import { + Component, + OnDestroy, + OnInit, + inject, + ChangeDetectionStrategy +} from '@angular/core'; import { FormsModule } from '@angular/forms'; import { CpsTableComponent, @@ -47,6 +53,7 @@ import { DatePipe, PercentPipe, UpperCasePipe } from '@angular/common'; ], templateUrl: './table-page.component.html', styleUrls: ['./table-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class TablePageComponent implements OnInit, OnDestroy { diff --git a/projects/composition/src/app/pages/tag-page/tag-page.component.ts b/projects/composition/src/app/pages/tag-page/tag-page.component.ts index cfe212009..8e4f943bc 100644 --- a/projects/composition/src/app/pages/tag-page/tag-page.component.ts +++ b/projects/composition/src/app/pages/tag-page/tag-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { CpsTagComponent } from 'cps-ui-kit'; import ComponentData from '../../api-data/cps-tag.json'; @@ -17,6 +17,7 @@ import { tagExamples } from './tag-page.examples'; selector: 'app-tag-page', templateUrl: './tag-page.component.html', styleUrls: ['./tag-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class TagPageComponent { diff --git a/projects/composition/src/app/pages/textarea-page/textarea-page.component.ts b/projects/composition/src/app/pages/textarea-page/textarea-page.component.ts index 74a655801..e4c1a700e 100644 --- a/projects/composition/src/app/pages/textarea-page/textarea-page.component.ts +++ b/projects/composition/src/app/pages/textarea-page/textarea-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, ReactiveFormsModule, @@ -23,6 +23,7 @@ import { textareaExamples } from './textarea-page.examples'; ], templateUrl: './textarea-page.component.html', styleUrls: ['./textarea-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class TextareaPageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/timepicker-page/timepicker-page.component.ts b/projects/composition/src/app/pages/timepicker-page/timepicker-page.component.ts index bb0c9eac6..aa84a5980 100644 --- a/projects/composition/src/app/pages/timepicker-page/timepicker-page.component.ts +++ b/projects/composition/src/app/pages/timepicker-page/timepicker-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { CommonModule } from '@angular/common'; import { CpsTime, CpsTimepickerComponent } from 'cps-ui-kit'; import { @@ -25,6 +25,7 @@ import { timepickerExamples } from './timepicker-page.examples'; ], templateUrl: './timepicker-page.component.html', styleUrls: ['./timepicker-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class TimepickerPageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/tooltip-page/tooltip-page.component.ts b/projects/composition/src/app/pages/tooltip-page/tooltip-page.component.ts index 788003c4c..2319fa996 100644 --- a/projects/composition/src/app/pages/tooltip-page/tooltip-page.component.ts +++ b/projects/composition/src/app/pages/tooltip-page/tooltip-page.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { CpsButtonComponent, @@ -22,6 +22,7 @@ import { tooltipExamples } from './tooltip-page.examples'; ], templateUrl: './tooltip-page.component.html', styleUrls: ['./tooltip-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class TooltipPageComponent { diff --git a/projects/composition/src/app/pages/tree-autocomplete-page/tree-autocomplete-page.component.ts b/projects/composition/src/app/pages/tree-autocomplete-page/tree-autocomplete-page.component.ts index bed256997..44bc0aebf 100644 --- a/projects/composition/src/app/pages/tree-autocomplete-page/tree-autocomplete-page.component.ts +++ b/projects/composition/src/app/pages/tree-autocomplete-page/tree-autocomplete-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, ReactiveFormsModule, @@ -24,6 +24,7 @@ import { treeAutocompleteExamples } from './tree-autocomplete-page.examples'; selector: 'app-tree-autocomplete-page', templateUrl: './tree-autocomplete-page.component.html', styleUrls: ['./tree-autocomplete-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class TreeAutocompletePageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/tree-select-page/tree-select-page.component.ts b/projects/composition/src/app/pages/tree-select-page/tree-select-page.component.ts index 32bf097e2..ce52067ef 100644 --- a/projects/composition/src/app/pages/tree-select-page/tree-select-page.component.ts +++ b/projects/composition/src/app/pages/tree-select-page/tree-select-page.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, ReactiveFormsModule, @@ -24,6 +24,7 @@ import { treeSelectExamples } from './tree-select-page.examples'; selector: 'app-tree-select-page', templateUrl: './tree-select-page.component.html', styleUrls: ['./tree-select-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class TreeSelectPageComponent implements OnInit { diff --git a/projects/composition/src/app/pages/tree-table-page/tree-table-page.component.ts b/projects/composition/src/app/pages/tree-table-page/tree-table-page.component.ts index 41bdd6ae4..579d5dd34 100644 --- a/projects/composition/src/app/pages/tree-table-page/tree-table-page.component.ts +++ b/projects/composition/src/app/pages/tree-table-page/tree-table-page.component.ts @@ -1,4 +1,10 @@ -import { Component, OnDestroy, OnInit, inject } from '@angular/core'; +import { + Component, + OnDestroy, + OnInit, + inject, + ChangeDetectionStrategy +} from '@angular/core'; import { FormsModule } from '@angular/forms'; import { CpsTreeTableComponent, @@ -45,6 +51,7 @@ import { DatePipe } from '@angular/common'; ], templateUrl: './tree-table-page.component.html', styleUrls: ['./tree-table-page.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { class: 'composition-page' } }) export class TreeTablePageComponent implements OnInit, OnDestroy { diff --git a/projects/composition/src/app/pipes/detect-type.pipe.ts b/projects/composition/src/app/pipes/detect-type.pipe.ts index 4b4f46171..054fa14e8 100644 --- a/projects/composition/src/app/pipes/detect-type.pipe.ts +++ b/projects/composition/src/app/pipes/detect-type.pipe.ts @@ -29,6 +29,38 @@ function splitTopLevelUnion(value: string): string[] { return parts; } +// Finds known type names anywhere inside an arbitrarily nested type +// expression (e.g. the `CpsDialogConfig` inside `InjectionToken>`, +// or the `CpsCronValidationService` inside `InjectionToken`) +// and links just those identifiers, leaving the rest as plain text. +function linkifySegments( + text: string, + types: Record +): TypeSegment[] { + const identifierRe = /[A-Za-z_$][\w$]*/g; + const segments: TypeSegment[] = []; + let lastIndex = 0; + let match: RegExpExecArray | null; + while ((match = identifierRe.exec(text))) { + const identifier = match[0]; + if (identifier in types) { + if (match.index > lastIndex) { + segments.push({ text: text.slice(lastIndex, match.index) }); + } + segments.push({ + text: identifier, + route: `/${types[identifier]}/api`, + fragment: identifier + }); + lastIndex = identifierRe.lastIndex; + } + } + if (lastIndex < text.length) { + segments.push({ text: text.slice(lastIndex) }); + } + return segments.length > 0 ? segments : [{ text }]; +} + @Pipe({ name: 'detectType', pure: true }) export class DetectTypePipe implements PipeTransform { public transform(value: string, types: Record): TypeGroup[] { @@ -39,35 +71,7 @@ export class DetectTypePipe implements PipeTransform { const groups: TypeGroup[] = splitTopLevelUnion(base).map((part, i) => { const typeName = part.trim(); const hasSeparator = i > 0; - if (typeName in types) { - return { - hasSeparator, - segments: [ - { - text: typeName, - route: `/${types[typeName]}/api`, - fragment: typeName - } - ] - }; - } - const genericMatch = typeName.match(/^([^<]+<)([\w$]+)(>.*)$/); - if (genericMatch && genericMatch[2] in types) { - const innerType = genericMatch[2]; - return { - hasSeparator, - segments: [ - { text: genericMatch[1] }, - { - text: innerType, - route: `/${types[innerType]}/api`, - fragment: innerType - }, - { text: genericMatch[3] } - ] - }; - } - return { hasSeparator, segments: [{ text: typeName }] }; + return { hasSeparator, segments: linkifySegments(typeName, types) }; }); if (isArray && groups.length > 0) { diff --git a/projects/composition/tsconfig.app.json b/projects/composition/tsconfig.app.json index 741196093..2d412bbf4 100644 --- a/projects/composition/tsconfig.app.json +++ b/projects/composition/tsconfig.app.json @@ -6,5 +6,13 @@ "types": [] }, "files": ["src/main.ts"], - "include": ["src/**/*.d.ts"] + "include": ["src/**/*.d.ts"], + "angularCompilerOptions": { + "extendedDiagnostics": { + "checks": { + "nullishCoalescingNotNullable": "suppress", + "optionalChainNotNullable": "suppress" + } + } + } } diff --git a/projects/cps-ui-kit/README.md b/projects/cps-ui-kit/README.md index 0a1d20957..01e3736b1 100644 --- a/projects/cps-ui-kit/README.md +++ b/projects/cps-ui-kit/README.md @@ -41,3 +41,7 @@ ### License Apache License 2.0 (see the [LICENSE](https://github.com/AbsaOSS/cps-shared-ui/blob/master/LICENSE) file for the full text) + +### Third-party notices + +`cps-ui-kit` vendors source code from [PrimeNG](https://github.com/primefaces/primeng) and [primeuix](https://github.com/primefaces/primeuix) (both MIT License) rather than depending on them as npm packages. See [NOTICE](https://github.com/AbsaOSS/cps-shared-ui/blob/master/NOTICE) for details. diff --git a/projects/cps-ui-kit/package.json b/projects/cps-ui-kit/package.json index 90a4c320a..16ea1e127 100644 --- a/projects/cps-ui-kit/package.json +++ b/projects/cps-ui-kit/package.json @@ -2,15 +2,12 @@ "name": "cps-ui-kit", "version": "21.30.0", "peerDependencies": { - "@angular/common": "^21.2.6", - "@angular/core": "^21.2.6", - "@angular/forms": "^21.2.6", + "@angular/common": "^22.1.3", + "@angular/core": "^22.1.3", + "@angular/forms": "^22.1.3", "@e965/xlsx": "^0.20.3", - "@primeuix/styled": "^0.7.4", - "@primeuix/utils": "^0.7.1", "@types/lodash-es": "^4.17.12", "lodash-es": "^4.17.21", - "primeng": "^21.1.3", "rxjs": "^7.8.2", "zone.js": "^0.15.1 || ^0.16.0" }, diff --git a/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.html b/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.html index 56ab52767..c2c520e35 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.html +++ b/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.html @@ -367,6 +367,7 @@ (input)="filterOptions($event)" (keydown)="onInputKeyDown($event)" [(ngModel)]="inputText" + [ngModelOptions]="{ standalone: true }" (focus)="onFocus()" (blur)="onBlur()" [attr.aria-describedby]="describedBy" diff --git a/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.scss b/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.scss index a484d8d7b..03bea7161 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.scss @@ -117,6 +117,7 @@ $hover-transition-duration: 0.2s; overflow: hidden; min-height: 2.375rem; width: 100%; + box-sizing: border-box; cursor: text; background: var(--cps-input-background); font-size: 1rem; diff --git a/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.spec.ts index 5be780fc2..cc01c32ad 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-autocomplete/cps-autocomplete.component.spec.ts @@ -1,4 +1,9 @@ -import { Component, NO_ERRORS_SCHEMA, signal } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + NO_ERRORS_SCHEMA, + signal +} from '@angular/core'; import { ComponentFixture, TestBed, @@ -1009,6 +1014,7 @@ describe('CpsAutocompleteComponent', () => { describe('with NgControl (reactive forms)', () => { @Component({ + changeDetection: ChangeDetectionStrategy.Eager, imports: [CpsAutocompleteComponent, ReactiveFormsModule], template: ` { describe('with NgControl (ngModel)', () => { @Component({ + changeDetection: ChangeDetectionStrategy.Eager, imports: [CpsButtonToggleComponent, FormsModule], template: ` span { width: 2.5rem; height: 2.5rem; + box-sizing: border-box; border-radius: 50%; transition: box-shadow 0.2s; border: 0.0625rem solid transparent; diff --git a/projects/cps-ui-kit/src/lib/components/cps-datepicker/cps-datepicker.component.ts b/projects/cps-ui-kit/src/lib/components/cps-datepicker/cps-datepicker.component.ts index a4866a0e6..ac2b6f792 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-datepicker/cps-datepicker.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-datepicker/cps-datepicker.component.ts @@ -10,7 +10,8 @@ import { Output, Self, type SimpleChanges, - ViewChild + ViewChild, + ChangeDetectionStrategy } from '@angular/core'; import { ControlValueAccessor, FormsModule, NgControl } from '@angular/forms'; import { CpsInputComponent } from '../cps-input/cps-input.component'; @@ -21,7 +22,10 @@ import { CpsMenuComponent, CpsMenuHideReason } from '../cps-menu/cps-menu.component'; -import { DatePicker, DatePickerModule } from 'primeng/datepicker'; +import { + DatePicker, + DatePickerModule +} from '../../primeng-temp/datepicker/public_api'; import { logMissingAriaLabelError, generateUniqueId @@ -55,6 +59,7 @@ export type CpsDatepickerDateFormat = ], selector: 'cps-datepicker', templateUrl: './cps-datepicker.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./cps-datepicker.component.scss'] }) export class CpsDatepickerComponent @@ -88,7 +93,7 @@ export class CpsDatepickerComponent * Date format for displaying and parsing the date string. * @group Props */ - @Input() dateFormat: CpsDatepickerDateFormat = 'MM/DD/YYYY'; + @Input() dateFormat: CpsDatepickerDateFormat = 'DD/MM/YYYY'; /** * Placeholder text. Defaults to the configured dateFormat. diff --git a/projects/cps-ui-kit/src/lib/components/cps-divider/cps-divider.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-divider/cps-divider.component.spec.ts index e9e1cd0b1..b44d6eb9a 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-divider/cps-divider.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-divider/cps-divider.component.spec.ts @@ -1,8 +1,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CpsDividerComponent } from './cps-divider.component'; -import { Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, template: ` { @@ -85,13 +85,13 @@ describe('CpsIconComponent', () => { }); describe('Test assets path injection', () => { - it('should use default path when no ICONS_PATH is provided', () => { + it('should use default path when no CPS_ICONS_PATH is provided', () => { createComponent(); expect(component.url).toBe('assets/'); }); - it('should use injected ICONS_PATH value', () => { - TestBed.overrideProvider(ICONS_PATH, { + it('should use injected CPS_ICONS_PATH value', () => { + TestBed.overrideProvider(CPS_ICONS_PATH, { useValue: 'test-assets/' }); createComponent(); diff --git a/projects/cps-ui-kit/src/lib/components/cps-icon/cps-icon.component.ts b/projects/cps-ui-kit/src/lib/components/cps-icon/cps-icon.component.ts index fec16c77c..7fbb753f3 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-icon/cps-icon.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-icon/cps-icon.component.ts @@ -9,19 +9,21 @@ import { OnChanges, OnInit, Renderer2, - type SimpleChanges + type SimpleChanges, + ChangeDetectionStrategy } from '@angular/core'; import { getCSSColor } from '../../utils/colors-utils/colors-utils'; import { convertSize } from '../../utils/internal/size-utils/size-utils'; /** * Injection token that is used to provide the path to the icons. + * @group Tokens */ -export const ICONS_PATH = new InjectionToken( +export const CPS_ICONS_PATH = new InjectionToken( 'Icons path for CpsIconComponent' ); -export const iconNames = [ +export const cpsIconNames = [ 'access', 'access-denied', 'access-lock', @@ -146,19 +148,19 @@ export const iconNames = [ 'warning', 'widget-button-icon', 'xls' -]; +] as const; /** - * IconType is used to define the type of the icon. + * CpsIconType is used to define the type of the icon. * @group Types */ -export type IconType = (typeof iconNames)[number]; +export type CpsIconType = (typeof cpsIconNames)[number] | ''; /** - * iconSizeType is used to define the size of the icon. + * CpsIconSizeType is used to define the size of the icon. * @group Types */ -export type iconSizeType = +export type CpsIconSizeType = number | string | 'fill' | 'xsmall' | 'small' | 'normal' | 'large'; /** @@ -170,6 +172,7 @@ export type iconSizeType = selector: 'cps-icon', templateUrl: './cps-icon.component.html', styleUrls: ['./cps-icon.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { '[attr.role]': 'hasAriaLabel() ? "img" : null', '[attr.aria-hidden]': 'hasAriaLabel() ? null : "true"' @@ -180,13 +183,13 @@ export class CpsIconComponent implements OnInit, OnChanges { * Name of the icon. * @group Props */ - @Input() icon: IconType = ''; + @Input() icon: CpsIconType = ''; /** * Size of the icon, it can be of type number denoting pixels, string or 'fill', 'xsmall', 'small', 'normal' or 'large'. * @group Props */ - @Input() size: iconSizeType = 'small'; + @Input() size: CpsIconSizeType = 'small'; /** * Color of the icon. @@ -221,7 +224,7 @@ export class CpsIconComponent implements OnInit, OnChanges { } iconColor = 'currentColor'; - url = inject(ICONS_PATH, { optional: true }) ?? 'assets/'; + url = inject(CPS_ICONS_PATH, { optional: true }) ?? 'assets/'; cvtSize = ''; classesList: string[] = ['cps-icon']; diff --git a/projects/cps-ui-kit/src/lib/components/cps-info-circle/cps-info-circle.component.ts b/projects/cps-ui-kit/src/lib/components/cps-info-circle/cps-info-circle.component.ts index 423c41223..4aa90d56b 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-info-circle/cps-info-circle.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-info-circle/cps-info-circle.component.ts @@ -1,8 +1,11 @@ -import { Component, Input } from '@angular/core'; -import { CpsIconComponent, iconSizeType } from '../cps-icon/cps-icon.component'; +import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; +import { + CpsIconComponent, + type CpsIconSizeType +} from '../cps-icon/cps-icon.component'; import { CpsTooltipDirective, - CpsTooltipPosition + type CpsTooltipPosition } from '../../directives/cps-tooltip/cps-tooltip.directive'; /** @@ -13,6 +16,7 @@ import { selector: 'cps-info-circle', imports: [CpsIconComponent, CpsTooltipDirective], templateUrl: './cps-info-circle.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./cps-info-circle.component.scss'] }) export class CpsInfoCircleComponent { @@ -20,7 +24,7 @@ export class CpsInfoCircleComponent { * Size of the icon, it can be of type number denoting pixels, string or 'fill', 'xsmall', 'small', 'normal' or 'large'. * @group Props */ - @Input() size: iconSizeType = 'small'; + @Input() size: CpsIconSizeType = 'small'; /** * Tooltip text to provide more info. diff --git a/projects/cps-ui-kit/src/lib/components/cps-input/cps-input.component.scss b/projects/cps-ui-kit/src/lib/components/cps-input/cps-input.component.scss index f160b68d7..69bd3aad0 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-input/cps-input.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-input/cps-input.component.scss @@ -33,6 +33,7 @@ $hover-transition-duration: 0.2s; display: flex; align-items: stretch; min-height: 2.375rem; + box-sizing: border-box; border: 0.0625rem solid $input-border-color; border-radius: 0.25rem; background: var(--cps-input-background); diff --git a/projects/cps-ui-kit/src/lib/components/cps-input/cps-input.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-input/cps-input.component.spec.ts index 212e48c96..1b4c2d83e 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-input/cps-input.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-input/cps-input.component.spec.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -728,6 +728,7 @@ describe('CpsInputComponent', () => { describe('with NgControl (reactive forms)', () => { @Component({ + changeDetection: ChangeDetectionStrategy.Eager, imports: [CpsInputComponent, ReactiveFormsModule], template: `; overlaySubscription: Subscription | undefined; diff --git a/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.html b/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.html index b68f2c352..ad71ca3cf 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.html +++ b/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.html @@ -31,6 +31,7 @@ [options]="rowOptions" [hideDetails]="true" [(ngModel)]="rows" + [ngModelOptions]="{ standalone: true }" (valueChanged)="onRowsPerPageChange($event)" [returnObject]="false" optionsClass="cps-paginator-page-options"> diff --git a/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.scss b/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.scss index 8397c73de..3a34c7e0b 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.scss @@ -51,6 +51,7 @@ $elem-active-background: var(--cps-color-highlight-active); border: 0 none; color: $text-color; min-width: 3rem; + box-sizing: border-box; margin: 0.143rem; padding: 0 0.5rem; font-family: 'Source Sans Pro', sans-serif; @@ -115,6 +116,7 @@ $elem-active-background: var(--cps-color-highlight-active); color: $text-color; min-width: 2rem; height: 2rem; + box-sizing: border-box; margin: 0.143rem; transition: box-shadow 0.2s; } @@ -164,6 +166,7 @@ $elem-active-background: var(--cps-color-highlight-active); color: $text-color; min-width: 2rem; height: 2rem; + box-sizing: border-box; margin: 0.143rem; transition: box-shadow 0.2s; } diff --git a/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.ts b/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.ts index ab36ad5fc..a672ff5fb 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-paginator/cps-paginator.component.ts @@ -9,10 +9,14 @@ import { OnInit, Output, ViewChild, - type SimpleChanges + type SimpleChanges, + ChangeDetectionStrategy } from '@angular/core'; import { DOCUMENT } from '@angular/common'; -import { Paginator, PaginatorModule } from 'primeng/paginator'; +import { + Paginator, + PaginatorModule +} from '../../primeng-temp/paginator/public_api'; import { CpsSelectComponent } from '../cps-select/cps-select.component'; import { getCSSColor } from '../../utils/colors-utils/colors-utils'; import { FormsModule } from '@angular/forms'; @@ -29,6 +33,7 @@ const DEFAULT_ROWS_PER_PAGE = [5, 10, 25, 50]; imports: [PaginatorModule, CpsSelectComponent, FormsModule], templateUrl: './cps-paginator.component.html', styleUrls: ['./cps-paginator.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { role: 'navigation', '[attr.aria-label]': 'computedAriaLabel', diff --git a/projects/cps-ui-kit/src/lib/components/cps-progress-circular/cps-progress-circular.component.ts b/projects/cps-ui-kit/src/lib/components/cps-progress-circular/cps-progress-circular.component.ts index a95681bb3..ee46cd2b8 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-progress-circular/cps-progress-circular.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-progress-circular/cps-progress-circular.component.ts @@ -6,7 +6,8 @@ import { OnInit, OnChanges, inject, - type SimpleChanges + type SimpleChanges, + ChangeDetectionStrategy } from '@angular/core'; import { convertSize } from '../../utils/internal/size-utils/size-utils'; import { getCSSColor } from '../../utils/colors-utils/colors-utils'; @@ -20,6 +21,7 @@ import { getCSSColor } from '../../utils/colors-utils/colors-utils'; selector: 'cps-progress-circular', templateUrl: './cps-progress-circular.component.html', styleUrls: ['./cps-progress-circular.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { role: 'progressbar', '[attr.aria-label]': 'computedAriaLabel' diff --git a/projects/cps-ui-kit/src/lib/components/cps-progress-linear/cps-progress-linear.component.ts b/projects/cps-ui-kit/src/lib/components/cps-progress-linear/cps-progress-linear.component.ts index d665c5bd2..a95c31cf2 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-progress-linear/cps-progress-linear.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-progress-linear/cps-progress-linear.component.ts @@ -4,7 +4,8 @@ import { HostAttributeToken, computed, inject, - input + input, + ChangeDetectionStrategy } from '@angular/core'; import { getCSSColor } from '../../utils/colors-utils/colors-utils'; import { convertSize } from '../../utils/internal/size-utils/size-utils'; @@ -17,6 +18,7 @@ import { convertSize } from '../../utils/internal/size-utils/size-utils'; selector: 'cps-progress-linear', templateUrl: './cps-progress-linear.component.html', styleUrls: ['./cps-progress-linear.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { role: 'progressbar', '[attr.aria-label]': 'computedAriaLabel()' diff --git a/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.scss b/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.scss index a1e646528..6ace4f100 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.scss @@ -30,6 +30,7 @@ $disabled-label-color: var(--cps-color-text-mild); color: $border-color; width: 1.25rem; height: 1.25rem; + box-sizing: border-box; border: 0.15rem solid currentColor; border-radius: 50%; diff --git a/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.ts b/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.ts index 62d0f0e57..05bbd52a4 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.ts @@ -4,7 +4,8 @@ import { Input, OnChanges, Output, - type SimpleChanges + type SimpleChanges, + ChangeDetectionStrategy } from '@angular/core'; import { CpsRadioOption } from '../cps-radio-group.component'; import { CommonModule } from '@angular/common'; @@ -19,6 +20,7 @@ import { generateUniqueId } from '../../../utils/internal/accessibility-utils/ac imports: [CommonModule, CpsTooltipDirective], selector: 'cps-radio-button', templateUrl: './cps-radio-button.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./cps-radio-button.component.scss'] }) export class CpsRadioButtonComponent implements OnChanges { diff --git a/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-group.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-group.component.spec.ts index 8b54012b8..b75b44eb2 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-group.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio-group.component.spec.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CpsRadioGroupComponent } from './cps-radio-group.component'; import { @@ -213,6 +213,7 @@ describe('CpsRadioGroupComponent', () => { describe('with NgControl (reactive forms)', () => { @Component({ + changeDetection: ChangeDetectionStrategy.Eager, imports: [CpsRadioGroupComponent, ReactiveFormsModule], template: `( 'CpsRadioGroupComponent' ); @@ -47,6 +53,7 @@ export const CPS_RADIO_GROUP = new InjectionToken( selector: 'cps-radio-group', templateUrl: './cps-radio-group.component.html', styleUrls: ['./cps-radio-group.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, providers: [ { provide: CPS_RADIO_GROUP, diff --git a/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio/cps-radio.component.ts b/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio/cps-radio.component.ts index 78d380a7f..094577222 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio/cps-radio.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-radio-group/cps-radio/cps-radio.component.ts @@ -1,4 +1,11 @@ -import { Component, Inject, Input, OnInit, Optional } from '@angular/core'; +import { + Component, + Inject, + Input, + OnInit, + Optional, + ChangeDetectionStrategy +} from '@angular/core'; import { CPS_RADIO_GROUP, CpsRadioGroupComponent, @@ -15,6 +22,7 @@ import { CpsRadioButtonComponent } from '../cps-radio-button/cps-radio-button.co imports: [CpsRadioButtonComponent], templateUrl: './cps-radio.component.html', styleUrls: ['./cps-radio.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, host: { 'data-testid': 'cps-radio' } }) export class CpsRadioComponent implements OnInit { diff --git a/projects/cps-ui-kit/src/lib/components/cps-scheduler/cps-scheduler.component.html b/projects/cps-ui-kit/src/lib/components/cps-scheduler/cps-scheduler.component.html index 72069f8b3..2199a8d45 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-scheduler/cps-scheduler.component.html +++ b/projects/cps-ui-kit/src/lib/components/cps-scheduler/cps-scheduler.component.html @@ -7,6 +7,7 @@ [label]="label" [infoTooltip]="infoTooltip" [(ngModel)]="activeScheduleType" + [ngModelOptions]="{ standalone: true }" (ngModelChange)="setActiveScheduleType($event)"> @@ -32,6 +33,7 @@ data-testid="minutes-input" (valueChanged)="regenerateCron()" [(ngModel)]="state.minutes.minutes" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.minutes" class="cps-scheduler-select-control"> @@ -53,6 +55,7 @@ data-testid="hourly-hours-input" (valueChanged)="regenerateCron()" [(ngModel)]="state.hourly.hours" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.hours" class="cps-scheduler-select-control"> @@ -66,6 +69,7 @@ data-testid="hourly-minutes-input" (valueChanged)="regenerateCron()" [(ngModel)]="state.hourly.minutes" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.fullMinutes" class="cps-scheduler-select-control"> @@ -79,6 +83,7 @@ ariaLabel="Daily schedule frequency" [hideDetails]="true" [(ngModel)]="state.daily.subTab" + [ngModelOptions]="{ standalone: true }" (valueChanged)="regenerateCron()" [vertical]="true"> @@ -159,49 +165,56 @@ [disabled]="disabled" data-testid="weekly-MON" label="Monday" - [(ngModel)]="state.weekly.MON"> + [(ngModel)]="state.weekly.MON" + [ngModelOptions]="{ standalone: true }"> + [(ngModel)]="state.weekly.TUE" + [ngModelOptions]="{ standalone: true }"> + [(ngModel)]="state.weekly.WED" + [ngModelOptions]="{ standalone: true }"> + [(ngModel)]="state.weekly.THU" + [ngModelOptions]="{ standalone: true }"> + [(ngModel)]="state.weekly.FRI" + [ngModelOptions]="{ standalone: true }"> + [(ngModel)]="state.weekly.SAT" + [ngModelOptions]="{ standalone: true }"> + [(ngModel)]="state.weekly.SUN" + [ngModelOptions]="{ standalone: true }">
@@ -226,6 +239,7 @@ ariaLabel="Monthly schedule frequency" [hideDetails]="true" [(ngModel)]="state.monthly.subTab" + [ngModelOptions]="{ standalone: true }" (valueChanged)="regenerateCron()" [vertical]="true"> @@ -264,6 +279,7 @@ [hideDetails]="true" (valueChanged)="regenerateCron()" [(ngModel)]="state.monthly.specificDay.months" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.monthsNumeric" class="cps-scheduler-select-control"> @@ -286,6 +302,7 @@ [disabled]="disabled || state.monthly.subTab !== 'specificDay'" label="During the nearest weekday" [(ngModel)]="state.monthly.runOnWeekday" + [ngModelOptions]="{ standalone: true }" class="cps-scheduler-nearest-weekday-checkbox">
@@ -316,6 +333,7 @@ [hideDetails]="true" (valueChanged)="regenerateCron()" [(ngModel)]="state.monthly.specificWeekDay.monthWeek" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.monthWeeks" class="cps-scheduler-select-control"> @@ -330,6 +348,7 @@ [hideDetails]="true" (valueChanged)="regenerateCron()" [(ngModel)]="state.monthly.specificWeekDay.day" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.days" class="cps-scheduler-select-control"> @@ -345,6 +364,7 @@ (valueChanged)="regenerateCron()" data-testid="monthly-weekday-months-input" [(ngModel)]="state.monthly.specificWeekDay.months" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.monthsNumeric" class="cps-scheduler-select-control"> @@ -360,6 +380,7 @@ data-testid="monthly-weekday-start-month-select" (valueChanged)="regenerateCron()" [(ngModel)]="state.monthly.specificWeekDay.startMonth" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.months" class="cps-scheduler-select-control"> @@ -390,6 +411,7 @@ ariaLabel="Yearly schedule frequency" [hideDetails]="true" [(ngModel)]="state.yearly.subTab" + [ngModelOptions]="{ standalone: true }" (valueChanged)="regenerateCron()" [vertical]="true"> @@ -432,6 +455,7 @@ [hideDetails]="true" (valueChanged)="regenerateCron()" [(ngModel)]="state.yearly.specificMonthDay.day" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.monthDaysWithLasts" class="cps-scheduler-select-control"> @@ -458,6 +482,7 @@ " label="During the nearest weekday" [(ngModel)]="state.yearly.runOnWeekday" + [ngModelOptions]="{ standalone: true }" class="cps-scheduler-nearest-weekday-checkbox"> @@ -488,6 +513,7 @@ [hideDetails]="true" (valueChanged)="regenerateCron()" [(ngModel)]="state.yearly.specificMonthWeek.monthWeek" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.monthWeeks" class="cps-scheduler-select-control"> @@ -502,6 +528,7 @@ [hideDetails]="true" (valueChanged)="regenerateCron()" [(ngModel)]="state.yearly.specificMonthWeek.day" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.days" class="cps-scheduler-select-control"> @@ -517,6 +544,7 @@ [hideDetails]="true" (valueChanged)="regenerateCron()" [(ngModel)]="state.yearly.specificMonthWeek.month" + [ngModelOptions]="{ standalone: true }" [options]="selectOptions.months" class="cps-scheduler-select-control"> @@ -565,6 +593,7 @@ [disabled]="disabled" data-testid="timezone-select" [(ngModel)]="timeZone" + [ngModelOptions]="{ standalone: true }" (valueChanged)="onTimeZoneChanged($event)" [returnObject]="false" width="18.75rem" diff --git a/projects/cps-ui-kit/src/lib/components/cps-select/cps-select.component.scss b/projects/cps-ui-kit/src/lib/components/cps-select/cps-select.component.scss index 3982b5e8b..07175cc88 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-select/cps-select.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-select/cps-select.component.scss @@ -126,6 +126,7 @@ $hover-transition-duration: 0.2s; justify-content: space-between; min-height: 2.375rem; width: 100%; + box-sizing: border-box; cursor: pointer; background: white; font-size: 1rem; diff --git a/projects/cps-ui-kit/src/lib/components/cps-select/cps-select.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-select/cps-select.component.spec.ts index 9fdf6b827..b6970dad9 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-select/cps-select.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-select/cps-select.component.spec.ts @@ -1,4 +1,8 @@ -import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + NO_ERRORS_SCHEMA +} from '@angular/core'; import { ComponentFixture, TestBed, @@ -901,6 +905,7 @@ describe('CpsSelectComponent', () => { describe('with NgControl (reactive forms)', () => { @Component({ + changeDetection: ChangeDetectionStrategy.Eager, imports: [CpsSelectComponent, ReactiveFormsModule], template: ` { { title: 'Settings', icon: 'settings', url: '/settings', disabled: true }, { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [ { title: 'Monthly', url: '/reports/monthly' }, { title: 'Annual', url: '/reports/annual' } @@ -92,7 +92,7 @@ describe('CpsSidebarMenuComponent', () => { it('should return false when sub-items have no URLs', () => { const item: CpsSidebarMenuItem = { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [{ title: 'Monthly' }] }; expect(component.isActive(item)).toBe(false); @@ -101,7 +101,7 @@ describe('CpsSidebarMenuComponent', () => { it('should return true when current URL partially matches a sub-item URL', () => { const item: CpsSidebarMenuItem = { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [{ title: 'Monthly', url: '/reports/monthly' }] }; jest.spyOn(router, 'url', 'get').mockReturnValue('/reports/monthly'); @@ -111,7 +111,7 @@ describe('CpsSidebarMenuComponent', () => { it('should return false when current URL does not match any sub-item URL', () => { const item: CpsSidebarMenuItem = { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [{ title: 'Monthly', url: '/reports/monthly' }] }; jest.spyOn(router, 'url', 'get').mockReturnValue('/home'); @@ -122,7 +122,7 @@ describe('CpsSidebarMenuComponent', () => { component.exactRoutes = false; const item: CpsSidebarMenuItem = { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [{ title: 'Reports', url: '/reports' }] }; jest.spyOn(router, 'url', 'get').mockReturnValue('/reports/monthly'); @@ -133,7 +133,7 @@ describe('CpsSidebarMenuComponent', () => { component.exactRoutes = true; const item: CpsSidebarMenuItem = { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [{ title: 'Reports', url: '/reports' }] }; jest.spyOn(router, 'url', 'get').mockReturnValue('/reports/monthly'); @@ -144,7 +144,7 @@ describe('CpsSidebarMenuComponent', () => { component.exactRoutes = true; const item: CpsSidebarMenuItem = { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [{ title: 'Reports', url: '/reports' }] }; jest.spyOn(router, 'url', 'get').mockReturnValue('/reports'); @@ -174,7 +174,7 @@ describe('CpsSidebarMenuComponent', () => { it('should set focusedItemWithMenu on focusin event', () => { const el = document.createElement('button'); - const item: CpsSidebarMenuItem = { title: 'Reports', icon: 'reports' }; + const item: CpsSidebarMenuItem = { title: 'Reports', icon: 'graph' }; const event = { type: 'focusin', currentTarget: el } as any; component.showMenu(event, mockMenu as CpsMenuComponent, item); expect(component.focusedItemWithMenu).toBe(item); @@ -208,7 +208,7 @@ describe('CpsSidebarMenuComponent', () => { it('should call show again on focusin when menu is already visible', () => { const el = document.createElement('button'); - const item: CpsSidebarMenuItem = { title: 'Reports', icon: 'reports' }; + const item: CpsSidebarMenuItem = { title: 'Reports', icon: 'graph' }; const event = { type: 'focusin', currentTarget: el } as any; (mockMenu.isVisible as jest.Mock).mockReturnValue(true); component.showMenu(event, mockMenu as CpsMenuComponent, item); @@ -234,7 +234,7 @@ describe('CpsSidebarMenuComponent', () => { show: jest.fn(), hide: jest.fn() } as unknown as Pick; - item = { title: 'Reports', icon: 'reports' }; + item = { title: 'Reports', icon: 'graph' }; component.allMenus = { forEach: jest.fn() } as any; }); @@ -322,7 +322,7 @@ describe('CpsSidebarMenuComponent', () => { }); it('should reset focusedItemWithMenu on focusout when hiding', () => { - component.focusedItemWithMenu = { title: 'Test', icon: 'icon' }; + component.focusedItemWithMenu = { title: 'Test', icon: 'star' }; const externalEl = document.createElement('div'); const event = { type: 'focusout', relatedTarget: externalEl } as any; component.leaveMenu(event, mockMenu as any); @@ -330,7 +330,7 @@ describe('CpsSidebarMenuComponent', () => { }); it('should not reset focusedItemWithMenu on mouseleave', () => { - const focusedItem: CpsSidebarMenuItem = { title: 'Test', icon: 'icon' }; + const focusedItem: CpsSidebarMenuItem = { title: 'Test', icon: 'star' }; component.focusedItemWithMenu = focusedItem; const externalEl = document.createElement('div'); const event = { type: 'mouseleave', relatedTarget: externalEl } as any; @@ -375,7 +375,7 @@ describe('CpsSidebarMenuComponent', () => { it('showMenu on focusin should be skipped when _pendingTouch is true', () => { (component as unknown as InternalComponent)._pendingTouch = true; const el = document.createElement('button'); - const item: CpsSidebarMenuItem = { title: 'Reports', icon: 'reports' }; + const item: CpsSidebarMenuItem = { title: 'Reports', icon: 'graph' }; const event = { type: 'focusin', currentTarget: el @@ -409,7 +409,7 @@ describe('CpsSidebarMenuComponent', () => { it('toggleMenu should reset _pendingTouch and open the menu (simulates first tap)', () => { (component as unknown as InternalComponent)._pendingTouch = true; const el = document.createElement('button'); - const item: CpsSidebarMenuItem = { title: 'Reports', icon: 'reports' }; + const item: CpsSidebarMenuItem = { title: 'Reports', icon: 'graph' }; const event = { currentTarget: el } as unknown as MouseEvent; (mockMenu.isVisible as jest.Mock).mockReturnValue(false); component.toggleMenu(event, mockMenu as CpsMenuComponent, item); @@ -632,7 +632,7 @@ describe('CpsSidebarMenuComponent', () => { fixture.componentRef.setInput('items', [ { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [{ title: 'Monthly', url: '/reports/monthly' }] } ]); @@ -647,7 +647,7 @@ describe('CpsSidebarMenuComponent', () => { fixture.componentRef.setInput('items', [ { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [{ title: 'Monthly', url: '/reports/monthly' }] } ]); @@ -662,7 +662,7 @@ describe('CpsSidebarMenuComponent', () => { fixture.componentRef.setInput('items', [ { title: 'Reports', - icon: 'reports', + icon: 'graph', items: [{ title: 'Monthly', url: '/reports/monthly' }] } ]); diff --git a/projects/cps-ui-kit/src/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.ts b/projects/cps-ui-kit/src/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.ts index d11a7495a..137040f70 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.ts @@ -9,12 +9,16 @@ import { ViewChildren, computed, inject, - input + input, + ChangeDetectionStrategy } from '@angular/core'; import { CommonModule, isPlatformBrowser } from '@angular/common'; import { Router, RouterModule } from '@angular/router'; import { CpsMenuComponent, CpsMenuItem } from '../cps-menu/cps-menu.component'; -import { CpsIconComponent } from '../cps-icon/cps-icon.component'; +import { + CpsIconComponent, + type CpsIconType +} from '../cps-icon/cps-icon.component'; import { convertSize } from '../../utils/internal/size-utils/size-utils'; import { animate, @@ -34,7 +38,7 @@ import { */ export type CpsSidebarMenuItem = { title: string; - icon: string; + icon: CpsIconType; url?: string; target?: string; disabled?: boolean; @@ -50,6 +54,7 @@ export type CpsSidebarMenuItem = { imports: [CommonModule, CpsMenuComponent, CpsIconComponent, RouterModule], templateUrl: './cps-sidebar-menu.component.html', styleUrls: ['./cps-sidebar-menu.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, animations: [ trigger('onExpand', [ state( diff --git a/projects/cps-ui-kit/src/lib/components/cps-switch/cps-switch.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-switch/cps-switch.component.spec.ts index 52e172de1..ef193008f 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-switch/cps-switch.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-switch/cps-switch.component.spec.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CpsSwitchComponent } from './cps-switch.component'; import { FormsModule } from '@angular/forms'; @@ -187,6 +187,7 @@ describe('CpsSwitchComponent', () => { describe('with NgControl (ngModel)', () => { @Component({ + changeDetection: ChangeDetectionStrategy.Eager, imports: [CpsSwitchComponent, FormsModule], template: ` { diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.ts b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.ts index 933bcd4b5..a46a4680f 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.ts @@ -7,8 +7,8 @@ import { OnInit, Optional } from '@angular/core'; -import { Table } from 'primeng/table'; -import { TreeTable } from 'primeng/treetable'; +import { Table } from '../../../../../primeng-temp/table/public_api'; +import { TreeTable } from '../../../../../primeng-temp/treetable/public_api'; import { Subscription } from 'rxjs'; @Component({ diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.html b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.html index 43874b51a..9facc3731 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.html +++ b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.html @@ -5,7 +5,7 @@ [placeholder]="placeholder" [hideDetails]="true" (keydown.enter)="onEnterKeyDown($event)" - [value]="filterConstraint?.value" + [value]="$safeNavigationMigration(filterConstraint?.value)" (valueChanged)="onValueChange($event)" type="text"> } @@ -15,7 +15,7 @@ [hideDetails]="true" [placeholder]="placeholder" (keydown.enter)="onEnterKeyDown($event)" - [value]="filterConstraint?.value" + [value]="$safeNavigationMigration(filterConstraint?.value)" (valueChanged)="onValueChange($event)" type="number"> } @@ -24,7 +24,7 @@ @@ -36,7 +36,7 @@ [openOnInputFocus]="true" [hideDetails]="true" [placeholder]="placeholder" - [value]="filterConstraint?.value" + [value]="$safeNavigationMigration(filterConstraint?.value)" (keydown.enter)="onEnterKeyDown($event)" (valueChanged)="onValueChange($event)">
@@ -51,7 +51,7 @@ [options]="categories" [hideDetails]="true" [clearable]="true" - [value]="filterConstraint?.value" + [value]="$safeNavigationMigration(filterConstraint?.value)" (valueChanged)="onValueChange($event)" [returnObject]="false" [multiple]="!singleSelection"> @@ -62,7 +62,7 @@ diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.spec.ts index 1fe7833ad..c9a7f0e0d 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { FilterMetadata } from 'primeng/api'; -import { Table } from 'primeng/table'; +import { FilterMetadata } from '../../../../../primeng-temp/api/public_api'; +import { Table } from '../../../../../primeng-temp/table/public_api'; import { TableColumnFilterConstraintComponent } from './table-column-filter-constraint.component'; import { CpsColumnFilterCategoryOption } from '../../../cps-column-filter-types'; diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.ts b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.ts index c22446769..a6f00c7b4 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.ts @@ -3,13 +3,17 @@ import { Input, OnChanges, Optional, - ViewChild + ViewChild, + ChangeDetectionStrategy } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { FilterMetadata, TreeNode } from 'primeng/api'; -import { Table } from 'primeng/table'; -import { TreeTable } from 'primeng/treetable'; +import { + FilterMetadata, + TreeNode +} from '../../../../../primeng-temp/api/public_api'; +import { Table } from '../../../../../primeng-temp/table/public_api'; +import { TreeTable } from '../../../../../primeng-temp/treetable/public_api'; import { CpsInputComponent } from '../../../../cps-input/cps-input.component'; import { CpsDatepickerComponent } from '../../../../cps-datepicker/cps-datepicker.component'; import { @@ -35,6 +39,7 @@ import { CpsAutocompleteComponent ], templateUrl: './table-column-filter-constraint.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./table-column-filter-constraint.component.scss'] }) export class TableColumnFilterConstraintComponent implements OnChanges { diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.html b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.html index ff5ee3537..7a468be35 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.html +++ b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.html @@ -37,6 +37,7 @@ [returnObject]="false" [options]="operatorOptions" [ngModel]="operator" + [ngModelOptions]="{ standalone: true }" (valueChanged)="onOperatorChange($event)"> } @@ -62,6 +63,7 @@ [returnObject]="false" [options]="currentMatchModes" [ngModel]="fieldConstraint.matchMode" + [ngModelOptions]="{ standalone: true }" (valueChanged)=" onMenuMatchModeChange($event, fieldConstraint) "> diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.scss b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.scss index 1e86a5c7f..6af22218e 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.scss @@ -20,6 +20,7 @@ $operator-bg-color: var(--cps-color-bg-light); position: relative; height: 1.5rem; width: 1.5rem; + box-sizing: border-box; padding-left: 0.5rem; padding-right: 0.5rem; margin-right: 0.0625rem; @@ -70,6 +71,7 @@ $operator-bg-color: var(--cps-color-bg-light); overflow: auto; & &-header { min-height: 2rem; + box-sizing: border-box; padding: 0.5rem; border-bottom: 0.0625rem solid $line-color; background: $operator-bg-color; diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.spec.ts index bc2189d67..8443e5816 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.spec.ts @@ -1,9 +1,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { EventEmitter } from '@angular/core'; -import { FilterMetadata, FilterOperator } from 'primeng/api'; -import { Table } from 'primeng/table'; -import { TreeTable } from 'primeng/treetable'; +import { + FilterMetadata, + FilterOperator +} from '../../../../../primeng-temp/api/public_api'; +import { Table } from '../../../../../primeng-temp/table/public_api'; +import { TreeTable } from '../../../../../primeng-temp/treetable/public_api'; import { TableColumnFilterComponent } from './table-column-filter.component'; import { CpsColumnFilterMatchMode } from '../../../cps-column-filter-types'; diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.ts b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.ts index 8d856e0e0..a7fb8be7f 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.ts @@ -8,13 +8,18 @@ import { Optional, QueryList, ViewChild, - ViewChildren + ViewChildren, + ChangeDetectionStrategy } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; -import { FilterMetadata, FilterOperator, SelectItem } from 'primeng/api'; -import { Table } from 'primeng/table'; -import { TreeTable } from 'primeng/treetable'; +import { + FilterMetadata, + FilterOperator, + SelectItem +} from '../../../../../primeng-temp/api/public_api'; +import { Table } from '../../../../../primeng-temp/table/public_api'; +import { TreeTable } from '../../../../../primeng-temp/treetable/public_api'; import { CpsColumnFilterCategoryOption, CpsColumnFilterMatchMode, @@ -42,6 +47,7 @@ import { Subscription } from 'rxjs'; TableColumnFilterConstraintComponent ], templateUrl: './table-column-filter.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./table-column-filter.component.scss'] }) export class TableColumnFilterComponent implements OnInit, OnDestroy { diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.ts b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.ts index 2688373b7..47442357d 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.ts @@ -1,4 +1,11 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { + Component, + EventEmitter, + Input, + OnInit, + Output, + ChangeDetectionStrategy +} from '@angular/core'; import { CpsIconComponent } from '../../../../cps-icon/cps-icon.component'; import { CpsMenuComponent, @@ -12,6 +19,7 @@ import { selector: 'table-row-menu', imports: [CpsIconComponent, CpsMenuComponent], templateUrl: './table-row-menu.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./table-row-menu.component.scss'] }) export class TableRowMenuComponent implements OnInit { diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.html b/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.html index 5de059a52..9bcbcdaf4 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.html +++ b/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.html @@ -510,6 +510,7 @@ [options]="rowOptions" [hideDetails]="true" [(ngModel)]="rows" + [ngModelOptions]="{ standalone: true }" (valueChanged)="onRowsPerPageChanged()" [returnObject]="false" optionsClass="cps-paginator-page-options"> diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.scss b/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.scss index 3f9ed708c..227e55b4e 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.scss @@ -70,6 +70,7 @@ $tbar-normal-height: 4.5rem; justify-content: space-between; align-items: center; padding: 0 0.625rem !important; + box-sizing: border-box; border: unset; background: unset; border-top: 0.0625rem solid $table-borders-color; @@ -213,6 +214,7 @@ $tbar-normal-height: 4.5rem; .p-datatable .p-datatable-thead > tr > th { text-align: left; padding: 1rem 1rem; + box-sizing: border-box; border: 0.0625rem solid $table-borders-color; border-width: 0 0 0.0625rem 0.0625rem; font-weight: normal; @@ -417,6 +419,7 @@ $tbar-normal-height: 4.5rem; background: #ffffff; width: 1.125rem; height: 1.125rem; + box-sizing: border-box; color: $body-text-color; border: 0.125rem solid $checkbox-border-color; border-radius: 0.125rem; @@ -551,6 +554,7 @@ $tbar-normal-height: 4.5rem; border: 0 none; color: $paginator-text-color; min-width: 3rem; + box-sizing: border-box; margin: 0.143rem; padding: 0 0.5rem; font-family: 'Source Sans Pro', sans-serif; @@ -614,6 +618,7 @@ $tbar-normal-height: 4.5rem; color: $paginator-text-color; min-width: 2rem; height: 2rem; + box-sizing: border-box; margin: 0.143rem; transition: box-shadow 0.2s; } @@ -663,6 +668,7 @@ $tbar-normal-height: 4.5rem; color: $paginator-text-color; min-width: 2rem; height: 2rem; + box-sizing: border-box; margin: 0.143rem; transition: box-shadow 0.2s; } @@ -813,6 +819,7 @@ $tbar-normal-height: 4.5rem; left: 0; width: 100%; height: 100%; + box-sizing: border-box; background-color: white; transition-duration: 0.2s; border: 0.0625rem solid $table-borders-color; diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.spec.ts index 0743b7e55..823993788 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.spec.ts @@ -6,7 +6,7 @@ import { tick } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { BaseComponent } from 'primeng/basecomponent'; +import { BaseComponent } from '../../primeng-temp/basecomponent/public_api'; import { CPS_LIVE_ANNOUNCER_SERVICE } from '../../services/cps-live-announcer/cps-live-announcer.service'; import { CpsTableComponent } from './cps-table.component'; diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.ts b/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.ts index 66dbbabe9..d54345f79 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/cps-table.component.ts @@ -17,15 +17,22 @@ import { } from '@angular/core'; import { CommonModule, DOCUMENT } from '@angular/common'; import { FormsModule } from '@angular/forms'; -import { Table, TableService, TableModule } from 'primeng/table'; -import type { TablePassThrough } from 'primeng/types/table'; -import type { PaginatorPassThrough } from 'primeng/types/paginator'; -import { SortEvent } from 'primeng/api'; -import { ObjectUtils } from 'primeng/utils'; +import { + Table, + TableService, + TableModule +} from '../../primeng-temp/table/public_api'; +import type { TablePassThrough } from '../../primeng-temp/types/table/public_api'; +import type { PaginatorPassThrough } from '../../primeng-temp/types/paginator/public_api'; +import { SortEvent } from '../../primeng-temp/api/public_api'; +import { ObjectUtils } from '../../primeng-temp/utils/public_api'; import { CpsInputComponent } from '../cps-input/cps-input.component'; import { CpsButtonComponent } from '../cps-button/cps-button.component'; import { CpsSelectComponent } from '../cps-select/cps-select.component'; -import { CpsIconComponent } from '../cps-icon/cps-icon.component'; +import { + CpsIconComponent, + type CpsIconType +} from '../cps-icon/cps-icon.component'; import { CpsMenuComponent, CpsMenuItem } from '../cps-menu/cps-menu.component'; import { CpsLoaderComponent } from '../cps-loader/cps-loader.component'; import { TableRowMenuComponent } from './components/internal/table-row-menu/table-row-menu.component'; @@ -286,7 +293,7 @@ export class CpsTableComponent implements OnInit, AfterViewChecked, OnChanges { * Toolbar icon name. * @group Props */ - @Input() toolbarIcon = ''; + @Input() toolbarIcon: CpsIconType = ''; /** * Toolbar icon color. @@ -442,7 +449,7 @@ export class CpsTableComponent implements OnInit, AfterViewChecked, OnChanges { * AdditionalBtnOnSelect icon. * @group Props */ - @Input() additionalBtnOnSelectIcon = ''; + @Input() additionalBtnOnSelectIcon: CpsIconType = ''; /** * Determines whether additionalBtnOnSelect is disabled. @@ -466,7 +473,7 @@ export class CpsTableComponent implements OnInit, AfterViewChecked, OnChanges { * Action button icon. * @group Props */ - @Input() actionBtnIcon = ''; + @Input() actionBtnIcon: CpsIconType = ''; /** * Determines whether actionBtn is disabled. diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-filter/cps-table-column-filter.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-filter/cps-table-column-filter.directive.spec.ts index 1714d7aed..480bfbe8c 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-filter/cps-table-column-filter.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-filter/cps-table-column-filter.directive.spec.ts @@ -1,8 +1,13 @@ -import { Component, EventEmitter, ViewChild } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + ViewChild +} from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { Table } from 'primeng/table'; +import { Table } from '../../../../primeng-temp/table/public_api'; import { CpsColumnFilterMatchMode, CpsColumnFilterType @@ -10,6 +15,7 @@ import { import { CpsTableColumnFilterDirective } from './cps-table-column-filter.directive'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, standalone: true, template: ` diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-resizable/cps-table-column-resizable.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-resizable/cps-table-column-resizable.directive.ts index 6008d1527..9fb2af488 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-resizable/cps-table-column-resizable.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-resizable/cps-table-column-resizable.directive.ts @@ -1,5 +1,5 @@ import { Directive, Input, inject } from '@angular/core'; -import { ResizableColumn } from 'primeng/table'; +import { ResizableColumn } from '../../../../primeng-temp/table/public_api'; import { CPS_ROOT_FONT_SIZE_SERVICE } from '../../../../services/cps-root-font-size/cps-root-font-size.service'; /** diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-sortable/cps-table-column-sortable.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-sortable/cps-table-column-sortable.directive.spec.ts index be2e8cf92..615969895 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-sortable/cps-table-column-sortable.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-sortable/cps-table-column-sortable.directive.spec.ts @@ -1,13 +1,14 @@ -import { Component, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { Subject } from 'rxjs'; -import { DomHandler } from 'primeng/dom'; -import { Table } from 'primeng/table'; +import { DomHandler } from '../../../../primeng-temp/dom/public_api'; +import { Table } from '../../../../primeng-temp/table/public_api'; import { CpsTableColumnSortableDirective } from './cps-table-column-sortable.directive'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, standalone: true, template: `Name`, imports: [CpsTableColumnSortableDirective] diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-sortable/cps-table-column-sortable.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-sortable/cps-table-column-sortable.directive.ts index 09e939179..366687693 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-sortable/cps-table-column-sortable.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-column-sortable/cps-table-column-sortable.directive.ts @@ -7,8 +7,8 @@ import { OnInit, ViewContainerRef } from '@angular/core'; -import { DomHandler } from 'primeng/dom'; -import { Table } from 'primeng/table'; +import { DomHandler } from '../../../../primeng-temp/dom/public_api'; +import { Table } from '../../../../primeng-temp/table/public_api'; import { Subscription } from 'rxjs'; import { CpsSortIconComponent } from '../../components/internal/cps-sort-icon/cps-sort-icon.component'; diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-header-selectable/cps-table-header-selectable.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-header-selectable/cps-table-header-selectable.directive.spec.ts index 3d126a6b0..afada8e3f 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-header-selectable/cps-table-header-selectable.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-header-selectable/cps-table-header-selectable.directive.spec.ts @@ -1,4 +1,5 @@ import { + ChangeDetectionStrategy, Component, ComponentRef, ViewChild, @@ -8,10 +9,11 @@ import { import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { TableHeaderCheckbox } from 'primeng/table'; +import { TableHeaderCheckbox } from '../../../../primeng-temp/table/public_api'; import { CpsTableHeaderSelectableDirective } from './cps-table-header-selectable.directive'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, standalone: true, template: ``, imports: [CpsTableHeaderSelectableDirective] @@ -21,7 +23,11 @@ class TestHostComponent { directive!: CpsTableHeaderSelectableDirective; } -@Component({ standalone: true, template: '' }) +@Component({ + changeDetection: ChangeDetectionStrategy.Eager, + standalone: true, + template: '' +}) class VcrProbeComponent { readonly vcr = inject(ViewContainerRef); } diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-header-selectable/cps-table-header-selectable.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-header-selectable/cps-table-header-selectable.directive.ts index 3596f57b2..da8c003f4 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-header-selectable/cps-table-header-selectable.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-header-selectable/cps-table-header-selectable.directive.ts @@ -6,7 +6,7 @@ import { OnInit, ViewContainerRef } from '@angular/core'; -import { TableHeaderCheckbox } from 'primeng/table'; +import { TableHeaderCheckbox } from '../../../../primeng-temp/table/public_api'; /** * CpsTableHeaderSelectableDirective is a directive used to apply a checkbox to a header cell. diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-row-selectable/cps-table-row-selectable.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-row-selectable/cps-table-row-selectable.directive.spec.ts index 8e4a32777..863f6e02a 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-row-selectable/cps-table-row-selectable.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-row-selectable/cps-table-row-selectable.directive.spec.ts @@ -1,4 +1,5 @@ import { + ChangeDetectionStrategy, Component, ComponentRef, ViewChild, @@ -8,10 +9,11 @@ import { import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { TableCheckbox } from 'primeng/table'; +import { TableCheckbox } from '../../../../primeng-temp/table/public_api'; import { CpsTableRowSelectableDirective } from './cps-table-row-selectable.directive'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, standalone: true, template: ``, imports: [CpsTableRowSelectableDirective] @@ -23,7 +25,11 @@ class TestHostComponent { value: unknown = 'row-1'; } -@Component({ standalone: true, template: '' }) +@Component({ + changeDetection: ChangeDetectionStrategy.Eager, + standalone: true, + template: '' +}) class VcrProbeComponent { readonly vcr = inject(ViewContainerRef); } diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-row-selectable/cps-table-row-selectable.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-row-selectable/cps-table-row-selectable.directive.ts index f41581391..3f07d98b2 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-row-selectable/cps-table-row-selectable.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/cps-table-row-selectable/cps-table-row-selectable.directive.ts @@ -7,7 +7,7 @@ import { OnInit, ViewContainerRef } from '@angular/core'; -import { TableCheckbox } from 'primeng/table'; +import { TableCheckbox } from '../../../../primeng-temp/table/public_api'; /** * CpsTableRowSelectableDirective is a directive used to apply a checkbox to a body cell. diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/internal/table-unsort/table-unsort.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/internal/table-unsort/table-unsort.directive.spec.ts index 5d327d153..41ea1ba59 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/internal/table-unsort/table-unsort.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/internal/table-unsort/table-unsort.directive.spec.ts @@ -1,4 +1,4 @@ -import { Table } from 'primeng/table'; +import { Table } from '../../../../../primeng-temp/table/public_api'; import { TableUnsortDirective } from './table-unsort.directive'; type Row = { id: number; name: string }; diff --git a/projects/cps-ui-kit/src/lib/components/cps-table/directives/internal/table-unsort/table-unsort.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-table/directives/internal/table-unsort/table-unsort.directive.ts index a9778658d..eb2be76bb 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-table/directives/internal/table-unsort/table-unsort.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-table/directives/internal/table-unsort/table-unsort.directive.ts @@ -1,7 +1,7 @@ import { Directive, Host, Self, Optional } from '@angular/core'; -import { SortMeta } from 'primeng/api'; -import { Table } from 'primeng/table'; -import { ObjectUtils } from 'primeng/utils'; +import { SortMeta } from '../../../../../primeng-temp/api/public_api'; +import { Table } from '../../../../../primeng-temp/table/public_api'; +import { ObjectUtils } from '../../../../../primeng-temp/utils/public_api'; @Directive({ selector: '[tWithUnsort]', diff --git a/projects/cps-ui-kit/src/lib/components/cps-tag/cps-tag.component.scss b/projects/cps-ui-kit/src/lib/components/cps-tag/cps-tag.component.scss index 4c9dc564e..12cc6c39e 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tag/cps-tag.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-tag/cps-tag.component.scss @@ -9,6 +9,7 @@ .cps-tag { font-family: 'Source Sans Pro', sans-serif; min-height: 1.5625rem; + box-sizing: border-box; align-items: center; padding: 0 0.625rem; background-color: white; diff --git a/projects/cps-ui-kit/src/lib/components/cps-tag/cps-tag.component.ts b/projects/cps-ui-kit/src/lib/components/cps-tag/cps-tag.component.ts index 401a0b7bf..560d0f541 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tag/cps-tag.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tag/cps-tag.component.ts @@ -9,7 +9,8 @@ import { Optional, Output, Self, - type SimpleChanges + type SimpleChanges, + ChangeDetectionStrategy } from '@angular/core'; import { getCSSColor } from '../../utils/colors-utils/colors-utils'; import { ControlValueAccessor, NgControl } from '@angular/forms'; @@ -22,6 +23,7 @@ import { ControlValueAccessor, NgControl } from '@angular/forms'; imports: [CommonModule], selector: 'cps-tag', templateUrl: './cps-tag.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./cps-tag.component.scss'] }) export class CpsTagComponent diff --git a/projects/cps-ui-kit/src/lib/components/cps-textarea/cps-textarea.component.scss b/projects/cps-ui-kit/src/lib/components/cps-textarea/cps-textarea.component.scss index 45d1dec11..7be8b6c8d 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-textarea/cps-textarea.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-textarea/cps-textarea.component.scss @@ -28,6 +28,7 @@ $hover-transition-duration: 0.2s; .cps-textarea-wrap { position: relative; overflow: hidden; + box-sizing: border-box; border: 0.0625rem solid $textarea-border-color; border-radius: 0.25rem; &:hover { @@ -76,6 +77,7 @@ $hover-transition-duration: 0.2s; appearance: none; border-radius: 0; width: 100%; + box-sizing: border-box; &:focus { outline: 0; } diff --git a/projects/cps-ui-kit/src/lib/components/cps-textarea/cps-textarea.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-textarea/cps-textarea.component.spec.ts index 64999eee9..3452824b7 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-textarea/cps-textarea.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-textarea/cps-textarea.component.spec.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CpsTextareaComponent } from './cps-textarea.component'; import { @@ -405,6 +405,7 @@ describe('CpsTextareaComponent', () => { describe('with NgControl (reactive forms)', () => { @Component({ + changeDetection: ChangeDetectionStrategy.Eager, imports: [CpsTextareaComponent, ReactiveFormsModule], template: ` @@ -67,7 +67,7 @@ (focused)="onFieldFocus()" (blurred)="onFieldBlur()" [returnObject]="false" - [value]="value?.minutes" + [value]="$safeNavigationMigration(value?.minutes)" (valueChanged)="updateMinutes($event)" [externalError]="minutesError" placeholder="MM"> @@ -93,7 +93,7 @@ (focused)="onFieldFocus()" (blurred)="onFieldBlur()" [returnObject]="false" - [value]="value?.seconds" + [value]="$safeNavigationMigration(value?.seconds)" (valueChanged)="updateSeconds($event)" [externalError]="secondsError" placeholder="SS"> diff --git a/projects/cps-ui-kit/src/lib/components/cps-timepicker/cps-timepicker.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-timepicker/cps-timepicker.component.spec.ts index e08e16544..6cfe724fb 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-timepicker/cps-timepicker.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-timepicker/cps-timepicker.component.spec.ts @@ -1,4 +1,8 @@ -import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + NO_ERRORS_SCHEMA +} from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { By } from '@angular/platform-browser'; @@ -694,6 +698,7 @@ describe('CpsTimepickerComponent', () => { describe('with NgControl (reactive forms)', () => { @Component({ + changeDetection: ChangeDetectionStrategy.Eager, imports: [CpsTimepickerComponent, ReactiveFormsModule], template: ` diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.scss b/projects/cps-ui-kit/src/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.scss index faa01d074..d8929a0fa 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.scss @@ -123,6 +123,7 @@ $hover-transition-duration: 0.2s; overflow: hidden; min-height: 2.375rem; width: 100%; + box-sizing: border-box; cursor: text; background: white; font-size: 1rem; diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.ts index 73b1e1c90..21a26548d 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.ts @@ -5,7 +5,8 @@ import { ElementRef, Input, Optional, - ViewChild + ViewChild, + ChangeDetectionStrategy } from '@angular/core'; import { FormsModule, NgControl } from '@angular/forms'; import { CpsIconComponent } from '../cps-icon/cps-icon.component'; @@ -13,8 +14,8 @@ import { CpsChipComponent } from '../cps-chip/cps-chip.component'; import { CpsProgressLinearComponent } from '../cps-progress-linear/cps-progress-linear.component'; import { CpsInfoCircleComponent } from '../cps-info-circle/cps-info-circle.component'; import { isEqual } from 'lodash-es'; -import { TreeModule } from 'primeng/tree'; -import type { TreeNode } from 'primeng/api'; +import { TreeModule } from '../../primeng-temp/tree/public_api'; +import type { TreeNode } from '../../primeng-temp/api/public_api'; import { CpsMenuComponent, CpsMenuHideReason @@ -45,6 +46,7 @@ export type CpsTreeAutocompleteAppearanceType = ], selector: 'cps-tree-autocomplete', templateUrl: './cps-tree-autocomplete.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./cps-tree-autocomplete.component.scss'] }) export class CpsTreeAutocompleteComponent extends CpsBaseTreeDropdownComponent { diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-select/cps-tree-select.component.scss b/projects/cps-ui-kit/src/lib/components/cps-tree-select/cps-tree-select.component.scss index 3e6357fd4..37c38f73c 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-select/cps-tree-select.component.scss +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-select/cps-tree-select.component.scss @@ -113,6 +113,7 @@ $hover-transition-duration: 0.2s; justify-content: space-between; min-height: 2.375rem; width: 100%; + box-sizing: border-box; cursor: pointer; background: white; font-size: 1rem; diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-select/cps-tree-select.component.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-select/cps-tree-select.component.ts index 09fc11e2e..055b4f5f8 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-select/cps-tree-select.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-select/cps-tree-select.component.ts @@ -1,11 +1,17 @@ -import { ChangeDetectorRef, Component, Input, Optional } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + Input, + Optional, + ChangeDetectionStrategy +} from '@angular/core'; import { FormsModule, NgControl } from '@angular/forms'; import { CpsIconComponent } from '../cps-icon/cps-icon.component'; import { CpsChipComponent } from '../cps-chip/cps-chip.component'; import { CpsProgressLinearComponent } from '../cps-progress-linear/cps-progress-linear.component'; import { CpsInfoCircleComponent } from '../cps-info-circle/cps-info-circle.component'; import { CombineLabelsPipe } from '../../pipes/internal/combine-labels/combine-labels.pipe'; -import { TreeModule } from 'primeng/tree'; +import { TreeModule } from '../../primeng-temp/tree/public_api'; import { CpsMenuComponent } from '../cps-menu/cps-menu.component'; import { CpsBaseTreeDropdownComponent } from '../internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component'; @@ -34,6 +40,7 @@ export type CpsTreeSelectAppearanceType = providers: [CombineLabelsPipe], selector: 'cps-tree-select', templateUrl: './cps-tree-select.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./cps-tree-select.component.scss'] }) export class CpsTreeSelectComponent extends CpsBaseTreeDropdownComponent { diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.html b/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.html index be048cf92..261c69c41 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.html +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.html @@ -464,6 +464,7 @@ [options]="rowOptions" [hideDetails]="true" [(ngModel)]="rows" + [ngModelOptions]="{ standalone: true }" (valueChanged)="onRowsPerPageChanged()" [returnObject]="false" optionsClass="cps-paginator-page-options"> diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.spec.ts index b71018d13..c4db0d280 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.spec.ts @@ -1,7 +1,7 @@ import { signal, SimpleChange } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { BaseComponent } from 'primeng/basecomponent'; +import { BaseComponent } from '../../primeng-temp/basecomponent/public_api'; import { CPS_ROOT_FONT_SIZE_SERVICE } from '../../services/cps-root-font-size/cps-root-font-size.service'; import { CpsTreeTableComponent } from './cps-tree-table.component'; diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.ts index e35767f9f..91631b9dc 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/cps-tree-table.component.ts @@ -1,6 +1,6 @@ import { CommonModule, DOCUMENT } from '@angular/common'; -import type { PaginatorPassThrough } from 'primeng/types/paginator'; -import type { TreeTablePassThrough } from 'primeng/types/treetable'; +import type { PaginatorPassThrough } from '../../primeng-temp/types/paginator/public_api'; +import type { TreeTablePassThrough } from '../../primeng-temp/types/treetable/public_api'; import { AfterViewChecked, AfterViewInit, @@ -26,18 +26,21 @@ import { } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { cloneDeep } from 'lodash-es'; -import { DomHandler } from 'primeng/dom'; +import { DomHandler } from '../../primeng-temp/dom/public_api'; import { TreeTable, TreeTableModule, TreeTableService, TreeTableSortEvent, TreeTableStyle -} from 'primeng/treetable'; +} from '../../primeng-temp/treetable/public_api'; import { Subscription, fromEvent } from 'rxjs'; import { convertSize } from '../../utils/internal/size-utils/size-utils'; import { CpsButtonComponent } from '../cps-button/cps-button.component'; -import { CpsIconComponent } from '../cps-icon/cps-icon.component'; +import { + CpsIconComponent, + type CpsIconType +} from '../cps-icon/cps-icon.component'; import { CpsInputComponent } from '../cps-input/cps-input.component'; import { CpsLoaderComponent } from '../cps-loader/cps-loader.component'; import { CpsMenuItem } from '../cps-menu/cps-menu.component'; @@ -293,7 +296,7 @@ export class CpsTreeTableComponent * Toolbar icon name. * @group Props */ - @Input() toolbarIcon = ''; + @Input() toolbarIcon: CpsIconType = ''; /** * Toolbar icon color. @@ -455,7 +458,7 @@ export class CpsTreeTableComponent * AdditionalBtnOnSelect icon. * @group Props */ - @Input() additionalBtnOnSelectIcon = ''; + @Input() additionalBtnOnSelectIcon: CpsIconType = ''; /** * Determines whether additionalBtnOnSelect is disabled. @@ -479,7 +482,7 @@ export class CpsTreeTableComponent * Action button icon. * @group Props */ - @Input() actionBtnIcon = ''; + @Input() actionBtnIcon: CpsIconType = ''; /** * Determines whether actionBtn is disabled. diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-filter/cps-tree-table-column-filter.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-filter/cps-tree-table-column-filter.directive.spec.ts index 7ae854ad4..aec8ae154 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-filter/cps-tree-table-column-filter.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-filter/cps-tree-table-column-filter.directive.spec.ts @@ -1,8 +1,13 @@ -import { Component, EventEmitter, ViewChild } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + ViewChild +} from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { TreeTable } from 'primeng/treetable'; +import { TreeTable } from '../../../../primeng-temp/treetable/public_api'; import { CpsColumnFilterMatchMode, CpsColumnFilterType @@ -10,6 +15,7 @@ import { import { CpsTreeTableColumnFilterDirective } from './cps-tree-table-column-filter.directive'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, template: ` diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-resizable/cps-tree-table-column-resizable.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-resizable/cps-tree-table-column-resizable.directive.ts index 53a1d669e..5d37fc61d 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-resizable/cps-tree-table-column-resizable.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-resizable/cps-tree-table-column-resizable.directive.ts @@ -1,5 +1,5 @@ import { Directive, Input, inject } from '@angular/core'; -import { TTResizableColumn } from 'primeng/treetable'; +import { TTResizableColumn } from '../../../../primeng-temp/treetable/public_api'; import { CPS_ROOT_FONT_SIZE_SERVICE } from '../../../../services/cps-root-font-size/cps-root-font-size.service'; /** diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable/cps-tree-table-column-sortable.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable/cps-tree-table-column-sortable.directive.spec.ts index b5c822ec6..0eda4cc1e 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable/cps-tree-table-column-sortable.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable/cps-tree-table-column-sortable.directive.spec.ts @@ -1,13 +1,14 @@ -import { Component, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { Subject } from 'rxjs'; -import { DomHandler } from 'primeng/dom'; -import { TreeTable } from 'primeng/treetable'; +import { DomHandler } from '../../../../primeng-temp/dom/public_api'; +import { TreeTable } from '../../../../primeng-temp/treetable/public_api'; import { CpsTreeTableColumnSortableDirective } from './cps-tree-table-column-sortable.directive'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, template: `Name`, imports: [CpsTreeTableColumnSortableDirective] }) diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable/cps-tree-table-column-sortable.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable/cps-tree-table-column-sortable.directive.ts index b8b3a1f5f..4dd4a3d87 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable/cps-tree-table-column-sortable.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable/cps-tree-table-column-sortable.directive.ts @@ -7,8 +7,8 @@ import { OnInit, ViewContainerRef } from '@angular/core'; -import { DomHandler } from 'primeng/dom'; -import { TreeTable } from 'primeng/treetable'; +import { DomHandler } from '../../../../primeng-temp/dom/public_api'; +import { TreeTable } from '../../../../primeng-temp/treetable/public_api'; import { Subscription } from 'rxjs'; import { CpsSortIconComponent } from '../../../cps-table/components/internal/cps-sort-icon/cps-sort-icon.component'; diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable/cps-tree-table-header-selectable.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable/cps-tree-table-header-selectable.directive.spec.ts index 5cbc741f6..0b8d0554e 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable/cps-tree-table-header-selectable.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable/cps-tree-table-header-selectable.directive.spec.ts @@ -1,4 +1,5 @@ import { + ChangeDetectionStrategy, Component, ComponentRef, ViewChild, @@ -8,10 +9,11 @@ import { import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { TTHeaderCheckbox } from 'primeng/treetable'; +import { TTHeaderCheckbox } from '../../../../primeng-temp/treetable/public_api'; import { CpsTreeTableHeaderSelectableDirective } from './cps-tree-table-header-selectable.directive'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, template: ``, imports: [CpsTreeTableHeaderSelectableDirective] }) @@ -20,7 +22,10 @@ class TestHostComponent { directive!: CpsTreeTableHeaderSelectableDirective; } -@Component({ template: '' }) +@Component({ + changeDetection: ChangeDetectionStrategy.Eager, + template: '' +}) class VcrProbeComponent { readonly vcr = inject(ViewContainerRef); } diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable/cps-tree-table-header-selectable.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable/cps-tree-table-header-selectable.directive.ts index 5f1909a70..42c88f06f 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable/cps-tree-table-header-selectable.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable/cps-tree-table-header-selectable.directive.ts @@ -6,7 +6,7 @@ import { OnInit, ViewContainerRef } from '@angular/core'; -import { TTHeaderCheckbox } from 'primeng/treetable'; +import { TTHeaderCheckbox } from '../../../../primeng-temp/treetable/public_api'; /** * CpsTreeTableHeaderSelectableDirective is a directive used to apply a checkbox to a header cell. diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable/cps-tree-table-row-selectable.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable/cps-tree-table-row-selectable.directive.spec.ts index ea4031863..eee0a5536 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable/cps-tree-table-row-selectable.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable/cps-tree-table-row-selectable.directive.spec.ts @@ -1,4 +1,5 @@ import { + ChangeDetectionStrategy, Component, ComponentRef, ViewChild, @@ -8,10 +9,11 @@ import { import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { TTCheckbox } from 'primeng/treetable'; +import { TTCheckbox } from '../../../../primeng-temp/treetable/public_api'; import { CpsTreeTableRowSelectableDirective } from './cps-tree-table-row-selectable.directive'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, template: ``, imports: [CpsTreeTableRowSelectableDirective] }) @@ -22,7 +24,10 @@ class TestHostComponent { value: unknown = 'row-1'; } -@Component({ template: '' }) +@Component({ + changeDetection: ChangeDetectionStrategy.Eager, + template: '' +}) class VcrProbeComponent { readonly vcr = inject(ViewContainerRef); } diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable/cps-tree-table-row-selectable.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable/cps-tree-table-row-selectable.directive.ts index 68307799a..805276c01 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable/cps-tree-table-row-selectable.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable/cps-tree-table-row-selectable.directive.ts @@ -7,7 +7,7 @@ import { OnInit, ViewContainerRef } from '@angular/core'; -import { TTCheckbox } from 'primeng/treetable'; +import { TTCheckbox } from '../../../../primeng-temp/treetable/public_api'; /** * CpsTreeTableRowSelectableDirective is a directive used to apply a checkbox to a body cell. diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler/cps-tree-table-row-toggler.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler/cps-tree-table-row-toggler.directive.spec.ts index 2481e91d4..6722676b3 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler/cps-tree-table-row-toggler.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler/cps-tree-table-row-toggler.directive.spec.ts @@ -1,4 +1,5 @@ import { + ChangeDetectionStrategy, Component, ComponentRef, ViewChild, @@ -8,10 +9,11 @@ import { import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { TreeTableToggler } from 'primeng/treetable'; +import { TreeTableToggler } from '../../../../primeng-temp/treetable/public_api'; import { CpsTreetableRowTogglerDirective } from './cps-tree-table-row-toggler.directive'; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, template: ` Content `, @@ -24,7 +26,10 @@ class TestHostComponent { rowNode: unknown = { node: { data: 'row-1' } }; } -@Component({ template: '' }) +@Component({ + changeDetection: ChangeDetectionStrategy.Eager, + template: '' +}) class VcrProbeComponent { readonly vcr = inject(ViewContainerRef); } diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler/cps-tree-table-row-toggler.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler/cps-tree-table-row-toggler.directive.ts index a12908f01..228edd25e 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler/cps-tree-table-row-toggler.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler/cps-tree-table-row-toggler.directive.ts @@ -11,7 +11,7 @@ import { ViewContainerRef, type SimpleChanges } from '@angular/core'; -import { TreeTableToggler } from 'primeng/treetable'; +import { TreeTableToggler } from '../../../../primeng-temp/treetable/public_api'; /** * CpsTreetableRowTogglerDirective is a directive used to apply a chevron toggler icon to a body cell. diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/internal/tree-table-unsort/tree-table-unsort.directive.spec.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/internal/tree-table-unsort/tree-table-unsort.directive.spec.ts index c14c5137b..c08606098 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/internal/tree-table-unsort/tree-table-unsort.directive.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/internal/tree-table-unsort/tree-table-unsort.directive.spec.ts @@ -1,4 +1,4 @@ -import { TreeTable } from 'primeng/treetable'; +import { TreeTable } from '../../../../../primeng-temp/treetable/public_api'; import { TreeTableUnsortDirective } from './tree-table-unsort.directive'; type Node = { diff --git a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/internal/tree-table-unsort/tree-table-unsort.directive.ts b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/internal/tree-table-unsort/tree-table-unsort.directive.ts index 6807ddbc1..ffbbada2f 100644 --- a/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/internal/tree-table-unsort/tree-table-unsort.directive.ts +++ b/projects/cps-ui-kit/src/lib/components/cps-tree-table/directives/internal/tree-table-unsort/tree-table-unsort.directive.ts @@ -1,6 +1,6 @@ import { Directive, Host, Self, Optional } from '@angular/core'; -import { TreeTable } from 'primeng/treetable'; -import { ObjectUtils } from 'primeng/utils'; +import { TreeTable } from '../../../../../primeng-temp/treetable/public_api'; +import { ObjectUtils } from '../../../../../primeng-temp/utils/public_api'; @Directive({ standalone: true, diff --git a/projects/cps-ui-kit/src/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.spec.ts b/projects/cps-ui-kit/src/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.spec.ts index edf4a16e4..ce5cb7ad2 100644 --- a/projects/cps-ui-kit/src/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.spec.ts @@ -1,4 +1,9 @@ -import { Component, NO_ERRORS_SCHEMA, signal } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + NO_ERRORS_SCHEMA, + signal +} from '@angular/core'; import { ComponentFixture, fakeAsync, @@ -1458,6 +1463,7 @@ describe('CpsBaseTreeDropdownComponent', () => { describe('with NgControl (reactive forms)', () => { @Component({ + changeDetection: ChangeDetectionStrategy.Eager, imports: [CpsTreeSelectComponent, ReactiveFormsModule], template: ``, imports: [CpsTooltipDirective] }) @@ -22,12 +23,14 @@ const mockRootFontSizeService = { }; @Component({ + changeDetection: ChangeDetectionStrategy.Eager, template: `
`, imports: [CpsTooltipDirective] }) class LegitTooltipComponent {} @Component({ + changeDetection: ChangeDetectionStrategy.Eager, template: `
/` in the upstream repository + +PrimeNG dropped MIT licensing starting with major version 22 (see +https://primeui.dev/nextchapter). Version 21.1.9 is the final MIT release, and remains +MIT "forever" per PrimeTek's own announcement — this vendored copy is legitimately +licensed. This directory exists so `cps-ui-kit` no longer depends on the `primeng` npm +package at all, avoiding any future dependency on PrimeNG's post-v21 commercial/community +license terms. + +This directory contains the 360 files of the 37 PrimeNG modules that `cps-ui-kit`'s +components transitively depend on. It excludes files that are never actually referenced: +whole `types//` directories for components that aren't vendored (`chart`, +`contextmenu`, `dataview`, `multiselect`, `password`, `picklist`, `textarea`), a few +orphaned `index.ts` stubs shadowed by the `public_api.ts` that every real consumer +resolves through instead, 27 icon components never rendered by any exposed feature, +one vestigial icon import (`FilterSlashIcon`) never actually rendered despite being +imported, and `ContextMenuService` (for wiring a `` overlay that isn't +used anywhere). + +This code in turn depends on `@primeuix/utils`, `@primeuix/styled`, and +`@primeuix/motion` (design-token/styling and motion helpers from the same PrimeTek +organization) — those are also vendored locally rather than kept as npm dependencies; +see `../primeuix-temp/NOTICE.md`. + +## License + +The code in this directory is licensed under the MIT License, reproduced below verbatim +from upstream's `LICENSE.md` (scoped to the "PRIMENG COMMUNITY VERSIONS LICENSE" section +only — upstream's `LICENSE.md` also bundles a separate commercial "PRIMENG LTS VERSIONS +LICENSE" for `-lts`-suffixed packages, which does not apply here; nothing in this +directory was sourced from an `-lts` package). + +``` +The MIT License (MIT) + +Copyright (c) 2016-2026 PrimeTek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +## Modifications + +Per the MIT license's own terms and Apache-2.0 §4(b) of this repository's own license +(this repository is Apache-2.0 licensed; see the root [LICENSE](../../../../../LICENSE)), +every file in this directory carries a header comment identifying its original upstream +path and noting it was modified. None of the modifications below change runtime +behavior — all are type-checking or module-resolution adjustments needed to compile +unmodified upstream logic under this repository's stricter tooling: + +1. **Import paths rewritten.** Every `primeng/` import specifier is a relative + path pointing at the corresponding vendored file (there is no `primeng` npm package + installed in this repository). +2. **`// @ts-nocheck` on every file.** This repository's `tsconfig.json` is considerably + stricter than PrimeNG's own (`strict`, `noImplicitOverride`, `noUnusedLocals`/ + `noUnusedParameters`, etc.), which PrimeNG's own code wasn't written against. +3. **A small number of shared-helper types widened** (never narrowed) to match how + they're actually used at runtime, where a single root-cause type was responsible for + many downstream Angular template type errors: + - `BaseComponent.cx()` (`basecomponent/basecomponent.ts`) always returns `string` + instead of `string | undefined`. + - A few `@Input()`/`input()` types in `autofocus.ts`, `togglebutton.ts`, and + `badge.ts` widened to include `| undefined`. + - `button.ts`: `Button.buttonProps` and `ButtonDirective.buttonProps` widened to + `ButtonProps | undefined` — neither `` nor `pButton` is ever bound with + `[buttonProps]` anywhere in this codebase, so the property is genuinely `undefined` + unless a future consumer sets it explicitly. +4. **`$any(...)` casts at template expressions and `@HostListener` argument strings** + (across `table.ts`, `treetable.ts`, `tree.ts`, `datepicker.ts`, `overlay.ts`, + `select.ts`, `scroller.ts`, `paginator.ts`, `inputnumber.ts`) where Angular's + `strictTemplates` (enabled here, not upstream) flags a type mismatch that + `@ts-nocheck` can't suppress (Angular's template type-checker runs a separate + synthetic check that ignores the source file's `@ts-nocheck` pragma). `$any()` is + Angular's own documented escape hatch for this — type-checking only, zero runtime + effect. A couple of these reproduce pre-existing upstream quirks verbatim rather than + "fixing" them — e.g. `treetable.ts`'s non-virtual-scroll branch references a + `serializedValue` property that doesn't exist on that component either here or + upstream; both resolve it to `undefined` at runtime the same way. +5. **One dead template binding removed**, in `table.ts`'s `ColumnFilterFormElement`: + `[showButtons]="showButtons"` was bound to a property that only exists as a + read-only getter (not an `@Input()`) on that component in both upstream and here, so + it was already an inert no-op — the getter still independently derives its value via + DI from `colFilter`. +6. **One structural template rewrite**, in `tree.ts`'s empty-state block: upstream's + `*ngIf="cond; else emptyFilter"` paired with a separately-referenced + `` doesn't resolve correctly in this compiler + configuration. Rewritten using equivalent `@if (cond) { … } @else { … }` block + syntax with the same two branches and condition — behaviorally identical. +7. **A few genuinely-unnecessary `?.` operators removed**, where the operand is + provably always defined at runtime: `table.ts`'s `filterButtonProps?.` (5 sites — + `filterButtonProps` has a full default object value so is never `undefined`; the + deeper `popover?.x` chains were kept, since `popover`'s own type legitimately allows + `undefined`), and `tree.ts`'s `$event.target?.value` (a native DOM event bound + directly on a static element guarantees a non-null `target`). + +No other changes were made. Component logic, styles, and public APIs are otherwise +unmodified from PrimeNG 21.1.9. diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/blockableui.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/blockableui.ts new file mode 100755 index 000000000..34659c96c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/blockableui.ts @@ -0,0 +1,19 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/blockableui.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * Represents a blockable user interface element. + */ +export interface BlockableUI { + /** + * Retrieves the blockable element associated with the UI. + * @returns The HTML element that can be blocked. + */ + getBlockableElement(): HTMLElement; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/confirmaeventtype.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/confirmaeventtype.ts new file mode 100644 index 000000000..f3fed25ae --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/confirmaeventtype.ts @@ -0,0 +1,17 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/confirmaeventtype.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * Type of the confirm event. + */ +export enum ConfirmEventType { + ACCEPT, + REJECT, + CANCEL +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/confirmation.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/confirmation.ts new file mode 100755 index 000000000..4284eb230 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/confirmation.ts @@ -0,0 +1,126 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/confirmation.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { EventEmitter } from '@angular/core'; + +/** + * Represents a confirmation dialog configuration. + * @group Interface + */ +export interface Confirmation { + /** + * The message to be displayed in the confirmation dialog. + */ + message?: string; + /** + * A unique key to identify the confirmation dialog. + */ + key?: string; + /** + * The name of the icon to be displayed in the confirmation dialog. + */ + icon?: string; + /** + * The header text of the confirmation dialog. + */ + header?: string; + /** + * The callback function to be executed when the accept button is clicked. + */ + accept?: Function; + /** + * The callback function to be executed when the reject button is clicked. + */ + reject?: Function; + /** + * The label text for the accept button. + */ + acceptLabel?: string; + /** + * The label text for the reject button. + */ + rejectLabel?: string; + /** + * The name of the icon to be displayed on the accept button. + */ + acceptIcon?: string; + /** + * The name of the icon to be displayed on the reject button. + */ + rejectIcon?: string; + /** + * Specifies whether the accept button should be visible. + */ + acceptVisible?: boolean; + /** + * Specifies whether the reject button should be visible. + */ + rejectVisible?: boolean; + /** + * Specifies whether to block scrolling on the page when the confirmation dialog is displayed. + */ + blockScroll?: boolean; + /** + * Specifies whether the confirmation dialog should be closed when the escape key is pressed. + */ + closeOnEscape?: boolean; + /** + * Specifies whether clicking outside the confirmation dialog should dismiss it. + */ + dismissableMask?: boolean; + /** + * The ID or class name of the element to receive focus by default when the confirmation dialog is opened. + */ + defaultFocus?: string; + /** + * The CSS class name to be applied to the accept button. + */ + acceptButtonStyleClass?: string; + /** + * The CSS class name to be applied to the reject button. + */ + rejectButtonStyleClass?: string; + /** + * The target event where the confirmation dialog is triggered from. + */ + target?: EventTarget; + /** + * An event emitter for the accept event. + */ + acceptEvent?: EventEmitter; + /** + * An event emitter for the reject event. + */ + rejectEvent?: EventEmitter; + /** + * Accept button properties. + */ + acceptButtonProps?: any; + /** + * Reject button properties. + */ + rejectButtonProps?: any; + /** + * Close button properties. + */ + closeButtonProps?: any; + /** + * Defines if the dialog is closable. + */ + closable?: boolean; + /** + * Defines the dialog position. + */ + position?: string; + /** + * Specifies whether the dialog displayed as modal or not. + * @defaultValue true + */ + modal?: boolean; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/confirmationservice.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/confirmationservice.ts new file mode 100755 index 000000000..56f695cc4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/confirmationservice.ts @@ -0,0 +1,48 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/confirmationservice.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs'; +import { Confirmation } from './confirmation'; +/** + * Methods used in confirmation service. + * @group Service + */ +@Injectable() +export class ConfirmationService { + private requireConfirmationSource = new Subject(); + private acceptConfirmationSource = new Subject(); + + requireConfirmation$ = this.requireConfirmationSource.asObservable(); + accept = this.acceptConfirmationSource.asObservable(); + /** + * Callback to invoke on confirm. + * @param {Confirmation} confirmation - Represents a confirmation dialog configuration. + * @group Method + */ + confirm(confirmation: Confirmation) { + this.requireConfirmationSource.next(confirmation); + return this; + } + /** + * Closes the dialog. + * @group Method + */ + close() { + this.requireConfirmationSource.next(null); + return this; + } + /** + * Accepts the dialog. + * @group Method + */ + onAccept() { + this.acceptConfirmationSource.next(null); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/filtermatchmode.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/filtermatchmode.ts new file mode 100644 index 000000000..320204592 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/filtermatchmode.ts @@ -0,0 +1,31 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/filtermatchmode.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export class FilterMatchMode { + public static readonly STARTS_WITH = 'startsWith'; + public static readonly CONTAINS = 'contains'; + public static readonly NOT_CONTAINS = 'notContains'; + public static readonly ENDS_WITH = 'endsWith'; + public static readonly EQUALS = 'equals'; + public static readonly NOT_EQUALS = 'notEquals'; + public static readonly IN = 'in'; + public static readonly LESS_THAN = 'lt'; + public static readonly LESS_THAN_OR_EQUAL_TO = 'lte'; + public static readonly GREATER_THAN = 'gt'; + public static readonly GREATER_THAN_OR_EQUAL_TO = 'gte'; + public static readonly BETWEEN = 'between'; + public static readonly IS = 'is'; + public static readonly IS_NOT = 'isNot'; + public static readonly BEFORE = 'before'; + public static readonly AFTER = 'after'; + public static readonly DATE_IS = 'dateIs'; + public static readonly DATE_IS_NOT = 'dateIsNot'; + public static readonly DATE_BEFORE = 'dateBefore'; + public static readonly DATE_AFTER = 'dateAfter'; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/filtermetadata.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/filtermetadata.ts new file mode 100755 index 000000000..c5a8f7deb --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/filtermetadata.ts @@ -0,0 +1,27 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/filtermetadata.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * Represents metadata for filtering a data set. + * @group Interface + */ +export interface FilterMetadata { + /** + * The value used for filtering. + */ + value?: any; + /** + * The match mode for filtering. + */ + matchMode?: string; + /** + * The operator for filtering. + */ + operator?: string; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/filteroperator.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/filteroperator.ts new file mode 100644 index 000000000..208fd7206 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/filteroperator.ts @@ -0,0 +1,13 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/filteroperator.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export class FilterOperator { + public static readonly AND = 'and'; + public static readonly OR = 'or'; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/filterservice.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/filterservice.ts new file mode 100644 index 000000000..f0130bb6d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/filterservice.ts @@ -0,0 +1,271 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/filterservice.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { equals, removeAccents, resolveFieldData } from '../../primeuix-temp/utils/src/index'; + +@Injectable({ providedIn: 'root' }) +export class FilterService { + filter(value: any[], fields: any[], filterValue: any, filterMatchMode: string, filterLocale?: string) { + let filteredItems: any[] = []; + + if (value) { + for (let item of value) { + for (let field of fields) { + let fieldValue = resolveFieldData(item, field); + + if (this.filters[filterMatchMode](fieldValue, filterValue, filterLocale)) { + filteredItems.push(item); + break; + } + } + } + } + + return filteredItems; + } + + public filters: { [rule: string]: Function } = { + startsWith: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null || filter.trim() === '') { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + let filterValue = removeAccents(filter.toString()).toLocaleLowerCase(filterLocale); + let stringValue = removeAccents(value.toString()).toLocaleLowerCase(filterLocale); + + return stringValue.slice(0, filterValue.length) === filterValue; + }, + + contains: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null || (typeof filter === 'string' && filter.trim() === '')) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + let filterValue = removeAccents(filter.toString()).toLocaleLowerCase(filterLocale); + let stringValue = removeAccents(value.toString()).toLocaleLowerCase(filterLocale); + + return stringValue.indexOf(filterValue) !== -1; + }, + + notContains: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null || (typeof filter === 'string' && filter.trim() === '')) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + let filterValue = removeAccents(filter.toString()).toLocaleLowerCase(filterLocale); + let stringValue = removeAccents(value.toString()).toLocaleLowerCase(filterLocale); + + return stringValue.indexOf(filterValue) === -1; + }, + + endsWith: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null || filter.trim() === '') { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + let filterValue = removeAccents(filter.toString()).toLocaleLowerCase(filterLocale); + let stringValue = removeAccents(value.toString()).toLocaleLowerCase(filterLocale); + + return stringValue.indexOf(filterValue, stringValue.length - filterValue.length) !== -1; + }, + + equals: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null || (typeof filter === 'string' && filter.trim() === '')) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + if (value.getTime && filter.getTime) return value.getTime() === filter.getTime(); + else if (value == filter) return true; + else return removeAccents(value.toString()).toLocaleLowerCase(filterLocale) == removeAccents(filter.toString()).toLocaleLowerCase(filterLocale); + }, + + notEquals: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null || (typeof filter === 'string' && filter.trim() === '')) { + return false; + } + + if (value === undefined || value === null) { + return true; + } + + if (value.getTime && filter.getTime) return value.getTime() !== filter.getTime(); + else if (value == filter) return false; + else return removeAccents(value.toString()).toLocaleLowerCase(filterLocale) != removeAccents(filter.toString()).toLocaleLowerCase(filterLocale); + }, + + in: (value: any, filter: any[]): boolean => { + if (filter === undefined || filter === null || filter.length === 0) { + return true; + } + + for (let i = 0; i < filter.length; i++) { + if (equals(value, filter[i])) { + return true; + } + } + + return false; + }, + + between: (value: any, filter: any[]): boolean => { + if (filter == null || filter[0] == null || filter[1] == null) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + if (value.getTime) return filter[0].getTime() <= value.getTime() && value.getTime() <= filter[1].getTime(); + else return filter[0] <= value && value <= filter[1]; + }, + + lt: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + if (value.getTime && filter.getTime) return value.getTime() < filter.getTime(); + else return value < filter; + }, + + lte: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + if (value.getTime && filter.getTime) return value.getTime() <= filter.getTime(); + else return value <= filter; + }, + + gt: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + if (value.getTime && filter.getTime) return value.getTime() > filter.getTime(); + else return value > filter; + }, + + gte: (value: any, filter: any, filterLocale?: any): boolean => { + if (filter === undefined || filter === null) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + if (value.getTime && filter.getTime) return value.getTime() >= filter.getTime(); + else return value >= filter; + }, + + is: (value: any, filter: any, filterLocale?: any): boolean => { + return this.filters.equals(value, filter, filterLocale); + }, + + isNot: (value: any, filter: any, filterLocale?: any): boolean => { + return this.filters.notEquals(value, filter, filterLocale); + }, + + before: (value: any, filter: any, filterLocale?: any): boolean => { + return this.filters.lt(value, filter, filterLocale); + }, + + after: (value: any, filter: any, filterLocale?: any): boolean => { + return this.filters.gt(value, filter, filterLocale); + }, + + dateIs: (value: any, filter: any): boolean => { + if (filter === undefined || filter === null) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + return value.toDateString() === filter.toDateString(); + }, + + dateIsNot: (value: any, filter: any): boolean => { + if (filter === undefined || filter === null) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + return value.toDateString() !== filter.toDateString(); + }, + + dateBefore: (value: any, filter: any): boolean => { + if (filter === undefined || filter === null) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + + return value.getTime() < filter.getTime(); + }, + + dateAfter: (value: any, filter: any): boolean => { + if (filter === undefined || filter === null) { + return true; + } + + if (value === undefined || value === null) { + return false; + } + value.setHours(0, 0, 0, 0); + + return value.getTime() > filter.getTime(); + } + }; + + register(rule: string, fn: Function) { + this.filters[rule] = fn; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/lazyloadevent.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/lazyloadevent.ts new file mode 100755 index 000000000..0d1b8f2d8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/lazyloadevent.ts @@ -0,0 +1,55 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/lazyloadevent.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { FilterMetadata } from './filtermetadata'; +import { SortMeta } from './sortmeta'; + +/** + * Represents an event object for lazy loading data. + * @group Interface + */ +export interface LazyLoadEvent { + /** + * The index of the first record to be loaded. + */ + first?: number; + /** + * The index of the last record to be loaded. + */ + last?: number; + /** + * The number of rows to load. + */ + rows?: number; + /** + * The field to be used for sorting. + */ + sortField?: string; + /** + * The sort order for the field. + */ + sortOrder?: number; + /** + * An array of sort metadata objects for multiple column sorting. + */ + multiSortMeta?: SortMeta[]; + /** + * An object containing filter metadata for filtering the data. + * The keys represent the field names, and the values represent the corresponding filter metadata. + */ + filters?: { [s: string]: FilterMetadata }; + /** + * The global filter value for filtering across all columns. + */ + globalFilter?: any; + /** + * A function that can be called to force an update in the lazy loaded data. + */ + forceUpdate?: () => void; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/lazyloadmeta.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/lazyloadmeta.ts new file mode 100644 index 000000000..a5ceab70c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/lazyloadmeta.ts @@ -0,0 +1,26 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/lazyloadmeta.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { FilterMetadata } from './filtermetadata'; +import { SortMeta } from './sortmeta'; +/** + * Meta data for lazy load event. + * @group Interface + */ +export interface LazyLoadMeta { + first?: number | undefined | null; + rows?: number | undefined | null; + sortField?: string | string[] | null | undefined; + sortOrder?: number | undefined | null; + filters?: { [s: string]: FilterMetadata | FilterMetadata[] | undefined }; + globalFilter?: string | string[] | undefined | null; + multiSortMeta?: SortMeta[] | undefined | null; + forceUpdate?: Function; + last?: number | undefined | null; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/lifecycle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/lifecycle.ts new file mode 100644 index 000000000..7207a7f79 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/lifecycle.ts @@ -0,0 +1,60 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/lifecycle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, DoCheck, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; + +export interface Lifecycle { + /** + * Simulates Angular's ngOnInit hook. + * @see {@link OnInit#ngOnInit} + */ + onInit(): void; + /** + * Simulates Angular's ngOnChanges hook. + * @see {@link OnChanges#ngOnChanges} + */ + onChanges(changes: SimpleChanges): void; + /** + * Simulates Angular's ngDoCheck hook. + * @see {@link DoCheck#ngDoCheck} + */ + onDoCheck(): void; + /** + * Simulates Angular's ngOnDestroy hook. + * @see {@link OnDestroy#ngOnDestroy} + */ + onDestroy(): void; + /** + * Simulates Angular's ngAfterContentInit hook. + * @see {@link AfterContentInit#ngAfterContentInit} + */ + onAfterContentInit(): void; + /** + * Simulates Angular's ngAfterContentChecked hook. + * @see {@link AfterContentChecked#ngAfterContentChecked} + */ + onAfterContentChecked(): void; + /** + * Simulates Angular's ngAfterViewInit hook. + * @see {@link AfterViewInit#ngAfterViewInit} + */ + onAfterViewInit(): void; + /** + * Simulates Angular's ngAfterViewChecked hook. + * @see {@link AfterViewChecked#ngAfterViewChecked} + */ + onAfterViewChecked(): void; +} + +export interface LifecycleHooks extends Partial { + /** + * Defines a function to be called before the component's initialization (constructor phase). + */ + onBeforeInit?(): void; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/megamenuitem.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/megamenuitem.ts new file mode 100644 index 000000000..53d86bec7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/megamenuitem.ts @@ -0,0 +1,138 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/megamenuitem.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { QueryParamsHandling } from '@angular/router'; +import { MenuItem } from './menuitem'; + +/** + * MegaMenuItem API provides the following properties. + * @group Interface + */ +export interface MegaMenuItem { + /** + * Text of the item. + */ + label?: string; + /** + * Icon of the item. + */ + icon?: string; + /** + * Callback to execute when item is clicked. + */ + command?: (event?: any) => void; + /** + * External link to navigate when item is clicked. + */ + url?: string; + /** + * An array of children menuitems. + */ + items?: MenuItem[][]; + /** + * Specifies whether the mega menu item is expanded. + */ + expanded?: boolean; + /** + * When set as true, disables the menuitem. + */ + disabled?: boolean; + /** + * Whether the dom element of menuitem is created or not. + */ + visible?: boolean; + /** + * Specifies where to open the linked document. + */ + target?: string; + /** + * Configuration for active router link. + */ + routerLinkActiveOptions?: any; + /** + * Defines the item as a separator. + */ + separator?: boolean; + /** + * Value of the badge. + */ + badge?: string; + /** + * Style class of the badge. + */ + badgeStyleClass?: string; + /** + * Inline style of the menuitem. + */ + style?: any; + /** + * Style class of the menuitem. + */ + styleClass?: string; + /** + * Inline style of the item's icon. + */ + iconStyle?: any; + /** + * Tooltip text of the item. + */ + title?: string; + /** + * Identifier of the element. + */ + id?: string; + /** + * Value of HTML data-* attribute. + */ + automationId?: any; + /** + * Specifies tab order of the item. + */ + tabindex?: string; + /** + * RouterLink definition for internal navigation. + */ + routerLink?: any; + /** + * Query parameters for internal navigation via routerLink. + */ + queryParams?: { [k: string]: any }; + /** + * Sets the hash fragment for the URL. + */ + fragment?: string; + /** + * How to handle query parameters in the router link for the next navigation. One of: + merge : Merge new with current parameters. + preserve : Preserve current parameters.k. + */ + queryParamsHandling?: QueryParamsHandling; + /** + * When true, preserves the URL fragment for the next navigation. + */ + preserveFragment?: boolean; + /** + * When true, navigates without pushing a new state into history. + */ + skipLocationChange?: boolean; + /** + * When true, navigates while replacing the current state in history. + */ + replaceUrl?: boolean; + /** + * Developer-defined state that can be passed to any navigation. + */ + state?: { + [k: string]: any; + }; + /** + * Optional + */ + [key: string]: any; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/menuitem.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/menuitem.ts new file mode 100755 index 000000000..85bf5514f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/menuitem.ts @@ -0,0 +1,195 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/menuitem.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { QueryParamsHandling } from '@angular/router'; +import { MegaMenuItem } from './megamenuitem'; +import { TooltipOptions } from './tooltipoptions'; + +/** + * MenuItem provides the following properties. Note that not all of them may be utilized by the tabmenu component. + * @group Interface + */ +export interface MenuItem { + /** + * Text of the item. + */ + label?: string; + /** + * Icon of the item. + */ + icon?: string; + /** + * Callback to execute when item is clicked. + */ + command?(event: MenuItemCommandEvent): void; + /** + * External link to navigate when item is clicked. + */ + url?: string; + /** + * An array of children menuitems. + */ + items?: MenuItem[]; + /** + * Visibility of submenu. + */ + expanded?: boolean; + /** + * When set as true, disables the menuitem. + */ + disabled?: boolean; + /** + * Whether the dom element of menuitem is created or not. + */ + visible?: boolean; + /** + * Specifies where to open the linked document. + */ + target?: string; + /** + * Whether to escape the label or not. Set to false to display html content. + */ + escape?: boolean; + /** + * Configuration for active router link. + */ + routerLinkActiveOptions?: any; + /** + * Defines the item as a separator. + */ + separator?: boolean; + /** + * Value of the badge. + */ + badge?: string; + /** + * Tooltip of the item. + */ + tooltip?: string; + /** + * Position of the tooltip item. + */ + tooltipPosition?: string; + /** + * Style class of the badge. + */ + badgeStyleClass?: string; + /** + * Inline style of the menuitem. + */ + style?: { [klass: string]: any } | null | undefined; + /** + * Style class of the menuitem. + */ + styleClass?: string; + /** + * Tooltip text of the item. + */ + title?: string; + /** + * Identifier of the element. + */ + id?: string; + /** + * Value of HTML data-* attribute. + */ + automationId?: any; + /** + * Specifies tab order of the item. + */ + tabindex?: string; + /** + * RouterLink definition for internal navigation. + */ + routerLink?: any; + /** + * Query parameters for internal navigation via routerLink. + */ + queryParams?: { [k: string]: any }; + /** + * Sets the hash fragment for the URL. + */ + fragment?: string; + /** + * How to handle query parameters in the router link for the next navigation. One of: + merge : Merge new with current parameters. + preserve : Preserve current parameters.k. + */ + queryParamsHandling?: QueryParamsHandling; + /** + * When true, preserves the URL fragment for the next navigation. + */ + preserveFragment?: boolean; + /** + * When true, navigates without pushing a new state into history. + */ + skipLocationChange?: boolean; + /** + * When true, navigates while replacing the current state in history. + */ + replaceUrl?: boolean; + /** + * Inline style of the item's icon. + */ + iconStyle?: { [klass: string]: any } | null | undefined; + /** + * Class of the item's icon. + */ + iconClass?: string; + /** + * Inline style of the item's label. + */ + labelStyle?: { [klass: string]: any } | null | undefined; + /** + * Class of the item's label. + */ + labelClass?: string; + /** + * Inline style of the item's link. + */ + linkStyle?: { [klass: string]: any } | null | undefined; + /** + * Class of the item's link. + */ + linkClass?: string; + /** + * Developer-defined state that can be passed to any navigation. + * @see {MenuItemState} + */ + state?: { [k: string]: any }; + /** + * Options of the item's tooltip. + * @see {TooltipOptions} + */ + tooltipOptions?: TooltipOptions; + /** + * Optional + */ + [key: string]: any; +} + +/** + * Custom command event + * @see {@link MenuItem.command} + * @group Events + */ +export interface MenuItemCommandEvent { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Selected menu item. + */ + item?: MenuItem | MegaMenuItem; + /** + * Index of the selected item. + */ + index?: number; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/messageservice.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/messageservice.ts new file mode 100755 index 000000000..12e228349 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/messageservice.ts @@ -0,0 +1,52 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/messageservice.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs'; +import { ToastMessageOptions } from './toastmessage'; +/** + * Message service used in messages and toast components. + * @group Service + */ +@Injectable() +export class MessageService { + private messageSource = new Subject(); + private clearSource = new Subject(); + + messageObserver = this.messageSource.asObservable(); + clearObserver = this.clearSource.asObservable(); + /** + * Inserts single message. + * @param {ToastMessageOptions} message - Message to be added. + * @group Method + */ + add(message: ToastMessageOptions) { + if (message) { + this.messageSource.next(message); + } + } + /** + * Inserts new messages. + * @param {Message[]} messages - Messages to be added. + * @group Method + */ + addAll(messages: ToastMessageOptions[]) { + if (messages && messages.length) { + this.messageSource.next(messages); + } + } + /** + * Clears the message with the given key. + * @param {string} key - Key of the message to be cleared. + * @group Method + */ + clear(key?: string) { + this.clearSource.next(key || null); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/overlayoptions.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/overlayoptions.ts new file mode 100644 index 000000000..19f99e1aa --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/overlayoptions.ts @@ -0,0 +1,206 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/overlayoptions.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { MotionOptions } from '../../primeuix-temp/motion/src/index'; + +/** + * Represents the type of overlay mode, which can be 'modal', 'overlay', or undefined. + * @group Types + */ +export type OverlayModeType = 'modal' | 'overlay' | undefined; + +/** + * Represents the type of direction for a responsive overlay, which can be one of the specified values or undefined. + * @group Types + */ +export type ResponsiveOverlayDirectionType = 'center' | 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end' | undefined; + +/** + * Represents the options for an overlay listener. + * @group Interface + */ +export interface OverlayListenerOptions { + /** + * The type of listener, which can be 'scroll', 'outside', 'resize', or undefined. + */ + type?: 'scroll' | 'outside' | 'resize' | undefined; + /** + * The mode of the overlay listener. + */ + mode?: OverlayModeType; + /** + * Indicates whether the overlay listener is valid. + */ + valid?: boolean; +} + +/** + * Represents the options for a responsive overlay. + * @group Events + */ +export interface ResponsiveOverlayOptions { + /** + * The inline style for the responsive overlay. + */ + style?: any; + /** + * The CSS class for the responsive overlay. + */ + styleClass?: string; + /** + * The inline style for the content of the responsive overlay. + */ + contentStyle?: any; + /** + * The CSS class for the content of the responsive overlay. + */ + contentStyleClass?: string; + /** + * The breakpoint for the responsive overlay. + */ + breakpoint?: string; + /** + * The media query for the responsive overlay. + */ + media?: string; + /** + * The direction for the responsive overlay. + */ + direction?: ResponsiveOverlayDirectionType; +} + +/** + * Represents an event that occurs when an overlay is shown. + * @group Events + */ +export interface OverlayOnShowEvent { + /** + * The overlay element. + */ + overlay?: HTMLElement | undefined; + /** + * The target element. + */ + target?: HTMLElement | undefined; + /** + * The mode of the overlay. + */ + mode?: OverlayModeType; +} + +/** + * Represents an event that occurs before an overlay is shown. + * @extends {OverlayOnShowEvent} + * @group Events + */ +export interface OverlayOnBeforeShowEvent extends OverlayOnShowEvent {} +/** + * Represents an event that occurs before an overlay is hidden. + * @extends {OverlayOnBeforeShowEvent} + * @group Events + */ +export interface OverlayOnBeforeHideEvent extends OverlayOnBeforeShowEvent {} +/** + * Represents an event that occurs when an overlay is hidden. + * @extends {OverlayOnShowEvent} + * @group Events + */ +export interface OverlayOnHideEvent extends OverlayOnShowEvent {} +/** + * Represents the options for an overlay. + * @group Interface + */ +export interface OverlayOptions { + /** + * The mode of the overlay. + */ + mode?: OverlayModeType; + /** + * The inline style for the overlay. + */ + style?: any; + /** + * The CSS class for the overlay. + */ + styleClass?: string; + /** + * The inline style for the content of the overlay. + */ + contentStyle?: any; + /** + * The CSS class for the content of the overlay. + */ + contentStyleClass?: string; + /** + * The target element. + */ + target?: any; + /** + * The element or location where the overlay should be appended. + */ + appendTo?: 'body' | HTMLElement | undefined; + /** + * Indicates whether the overlay should have an auto-generated z-index. + */ + autoZIndex?: boolean; + /** + * The base z-index value for the overlay. + */ + baseZIndex?: number; + /** + * The transition options for showing the overlay. + * @deprecated since v21.0.0. Use `motionOptions` instead. + */ + showTransitionOptions?: string; + /** + * The transition options for hiding the overlay. + * @deprecated since v21.0.0. Use `motionOptions` instead. + */ + hideTransitionOptions?: string; + /** + * The motion options for the overlay. + */ + motionOptions?: MotionOptions; + /** + * Indicates whether the overlay should be hidden when the escape key is pressed. + */ + hideOnEscape?: boolean; + /** + * A listener function for handling events related to the overlay. + */ + listener?: (event: Event, options?: OverlayListenerOptions) => boolean | void; + /** + * The options for a responsive overlay. + */ + responsive?: ResponsiveOverlayOptions | undefined; + /** + * A callback function that is invoked before the overlay is shown. + */ + onBeforeShow?: (event?: OverlayOnBeforeShowEvent) => void; + /** + * A callback function that is invoked when the overlay is shown. + */ + onShow?: (event?: OverlayOnShowEvent) => void; + /** + * A callback function that is invoked before the overlay is hidden. + */ + onBeforeHide?: (event?: OverlayOnBeforeHideEvent) => void; + /** + * A callback function that is invoked when the overlay is hidden. + */ + onHide?: (event?: OverlayOnHideEvent) => void; + /** + * A callback function that is invoked when the overlay's animation starts. + */ + onAnimationStart?: (event?: AnimationEvent) => void; + /** + * A callback function that is invoked when the overlay's animation is done. + */ + onAnimationDone?: (event?: AnimationEvent) => void; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/overlayservice.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/overlayservice.ts new file mode 100644 index 000000000..6acebd636 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/overlayservice.ts @@ -0,0 +1,32 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/overlayservice.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs'; + +@Injectable({ providedIn: 'root' }) +export class OverlayService { + private clickSource = new Subject(); + + private parentDragSource = new Subject(); + + clickObservable = this.clickSource.asObservable(); + + parentDragObservable = this.parentDragSource.asObservable(); + + add(event: any) { + if (event) { + this.clickSource.next(event); + } + } + + emitParentDrag(container: Element) { + this.parentDragSource.next(container); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/passthrough.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/passthrough.ts new file mode 100644 index 000000000..c5c3cbdc4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/passthrough.ts @@ -0,0 +1,76 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/passthrough.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { LifecycleHooks } from './lifecycle'; + +/** + * Defines the pass-through options. + */ +export interface PassThroughOptions { + /** + * Defines whether the props should be merged. + * @default false + */ + mergeProps?: boolean | ((global: unknown, self: unknown, datasets?: unknown) => unknown); + /** + * Defines whether the sections should be merged. + * @default true + */ + mergeSections?: boolean | undefined; +} + +/** + * Defines the pass-through method options. + * @template I Type of instance. + * @template PI Type of parent instance. + */ +export interface PassThroughContext { + /** + * Defines instance. + */ + instance: I; + /** + * Defines parent options. + */ + parent: { + instance: PI; + }; + /** + * Defines passthrough(pt) options in global config. + */ + global?: Record | undefined; +} + +export interface CommonPassThrough { + /** + * Used to manage all lifecycle hooks. + */ + hooks?: LifecycleHooks; +} + +type HTMLElementProps = { + [K in keyof T as T[K] extends Function ? never : K]?: T[K]; +}; + +type OnGlobalEventHandlers = { + [K in keyof GlobalEventHandlers as K extends `on${infer Rest}` ? `on${Rest}` : never]?: GlobalEventHandlers[K]; +}; + +type PassThroughAttributes = Omit, 'style'> & + OnGlobalEventHandlers & { + [key: string]: any; + } & { + style?: Partial | undefined; + }; + +export declare type PassThroughOption = PassThroughAttributes | ((options: PassThroughContext) => PassThroughAttributes | string) | string | null | undefined; + +type AllPassThrough = O & CommonPassThrough; + +export declare type PassThrough = AllPassThrough | ((context: PassThroughContext) => AllPassThrough) | null | undefined; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/primeicons.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/primeicons.ts new file mode 100644 index 000000000..1e9867dff --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/primeicons.ts @@ -0,0 +1,322 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/primeicons.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export class PrimeIcons { + public static readonly ADDRESS_BOOK = 'pi pi-address-book'; + public static readonly ALIGN_CENTER = 'pi pi-align-center'; + public static readonly ALIGN_JUSTIFY = 'pi pi-align-justify'; + public static readonly ALIGN_LEFT = 'pi pi-align-left'; + public static readonly ALIGN_RIGHT = 'pi pi-align-right'; + public static readonly AMAZON = 'pi pi-amazon'; + public static readonly ANDROID = 'pi pi-android'; + public static readonly ANGLE_DOUBLE_DOWN = 'pi pi-angle-double-down'; + public static readonly ANGLE_DOUBLE_LEFT = 'pi pi-angle-double-left'; + public static readonly ANGLE_DOUBLE_RIGHT = 'pi pi-angle-double-right'; + public static readonly ANGLE_DOUBLE_UP = 'pi pi-angle-double-up'; + public static readonly ANGLE_DOWN = 'pi pi-angle-down'; + public static readonly ANGLE_LEFT = 'pi pi-angle-left'; + public static readonly ANGLE_RIGHT = 'pi pi-angle-right'; + public static readonly ANGLE_UP = 'pi pi-angle-up'; + public static readonly APPLE = 'pi pi-apple'; + public static readonly ARROWS_ALT = 'pi pi-arrows-alt'; + public static readonly ARROW_CIRCLE_DOWN = 'pi pi-arrow-circle-down'; + public static readonly ARROW_CIRCLE_LEFT = 'pi pi-arrow-circle-left'; + public static readonly ARROW_CIRCLE_RIGHT = 'pi pi-arrow-circle-right'; + public static readonly ARROW_CIRCLE_UP = 'pi pi-arrow-circle-up'; + public static readonly ARROW_DOWN = 'pi pi-arrow-down'; + public static readonly ARROW_DOWN_LEFT = 'pi pi-arrow-down-left'; + public static readonly ARROW_DOWN_LEFT_AND_ARROW_UP_RIGHT_TO_CENTER = 'pi pi-arrow-down-left-and-arrow-up-right-to-center'; + public static readonly ARROW_DOWN_RIGHT = 'pi pi-arrow-down-right'; + public static readonly ARROW_LEFT = 'pi pi-arrow-left'; + public static readonly ARROW_RIGHT_ARROW_LEFT = 'pi pi-arrow-right-arrow-left'; + public static readonly ARROW_RIGHT = 'pi pi-arrow-right'; + public static readonly ARROW_UP = 'pi pi-arrow-up'; + public static readonly ARROW_UP_LEFT = 'pi pi-arrow-up-left'; + public static readonly ARROW_UP_RIGHT = 'pi pi-arrow-up-right'; + public static readonly ARROW_UP_RIGHT_AND_ARROW_DOWN_LEFT_FROM_CENTER = 'pi pi-arrow-up-right-and-arrow-down-left-from-center'; + public static readonly ARROWS_H = 'pi pi-arrows-h'; + public static readonly ARROWS_V = 'pi pi-arrows-v'; + public static readonly ASTERISK = 'pi pi-asterisk'; + public static readonly AT = 'pi pi-at'; + public static readonly BACKWARD = 'pi pi-backward'; + public static readonly BAN = 'pi pi-ban'; + public static readonly BARCODE = 'pi pi-barcode'; + public static readonly BARS = 'pi pi-bars'; + public static readonly BELL = 'pi pi-bell'; + public static readonly BELL_SLASH = 'pi pi-bell-slash'; + public static readonly BITCOIN = 'pi pi-bitcoin'; + public static readonly BOLT = 'pi pi-bolt'; + public static readonly BOOK = 'pi pi-book'; + public static readonly BOOKMARK = 'pi pi-bookmark'; + public static readonly BOOKMARK_FILL = 'pi pi-bookmark-fill'; + public static readonly BOX = 'pi pi-box'; + public static readonly BRIEFCASE = 'pi pi-briefcase'; + public static readonly BUILDING = 'pi pi-building'; + public static readonly BUILDING_COLUMNS = 'pi pi-building-columns'; + public static readonly BULLSEYE = 'pi pi-bullseye'; + public static readonly CALCULATOR = 'pi pi-calculator'; + public static readonly CALENDAR = 'pi pi-calendar'; + public static readonly CALENDAR_CLOCK = 'pi pi-calendar-clock'; + public static readonly CALENDAR_MINUS = 'pi pi-calendar-minus'; + public static readonly CALENDAR_PLUS = 'pi pi-calendar-plus'; + public static readonly CALENDAR_TIMES = 'pi pi-calendar-times'; + public static readonly CAMERA = 'pi pi-camera'; + public static readonly CAR = 'pi pi-car'; + public static readonly CARET_DOWN = 'pi pi-caret-down'; + public static readonly CARET_LEFT = 'pi pi-caret-left'; + public static readonly CARET_RIGHT = 'pi pi-caret-right'; + public static readonly CARET_UP = 'pi pi-caret-up'; + public static readonly CART_ARROW_DOWN = 'pi pi-cart-arrow-down'; + public static readonly CART_MINUS = 'pi pi-cart-minus'; + public static readonly CART_PLUS = 'pi pi-cart-plus'; + public static readonly CHART_BAR = 'pi pi-chart-bar'; + public static readonly CHART_LINE = 'pi pi-chart-line'; + public static readonly CHART_PIE = 'pi pi-chart-pie'; + public static readonly CHART_SCATTER = 'pi pi-chart-scatter'; + public static readonly CHECK = 'pi pi-check'; + public static readonly CHECK_CIRCLE = 'pi pi-check-circle'; + public static readonly CHECK_SQUARE = 'pi pi-check-square'; + public static readonly CHEVRON_CIRCLE_DOWN = 'pi pi-chevron-circle-down'; + public static readonly CHEVRON_CIRCLE_LEFT = 'pi pi-chevron-circle-left'; + public static readonly CHEVRON_CIRCLE_RIGHT = 'pi pi-chevron-circle-right'; + public static readonly CHEVRON_CIRCLE_UP = 'pi pi-chevron-circle-up'; + public static readonly CHEVRON_DOWN = 'pi pi-chevron-down'; + public static readonly CHEVRON_LEFT = 'pi pi-chevron-left'; + public static readonly CHEVRON_RIGHT = 'pi pi-chevron-right'; + public static readonly CHEVRON_UP = 'pi pi-chevron-up'; + public static readonly CIRCLE = 'pi pi-circle'; + public static readonly CIRCLE_FILL = 'pi pi-circle-fill'; + public static readonly CLIPBOARD = 'pi pi-clipboard'; + public static readonly CLOCK = 'pi pi-clock'; + public static readonly CLONE = 'pi pi-clone'; + public static readonly CLOUD = 'pi pi-cloud'; + public static readonly CLOUD_DOWNLOAD = 'pi pi-cloud-download'; + public static readonly CLOUD_UPLOAD = 'pi pi-cloud-upload'; + public static readonly CODE = 'pi pi-code'; + public static readonly COG = 'pi pi-cog'; + public static readonly COMMENT = 'pi pi-comment'; + public static readonly COMMENTS = 'pi pi-comments'; + public static readonly COMPASS = 'pi pi-compass'; + public static readonly COPY = 'pi pi-copy'; + public static readonly CREDIT_CARD = 'pi pi-credit-card'; + public static readonly CROWN = 'pi pi-crown'; + public static readonly DATABASE = 'pi pi-database'; + public static readonly DESKTOP = 'pi pi-desktop'; + public static readonly DELETE_LEFT = 'pi pi-delete-left'; + public static readonly DIRECTIONS = 'pi pi-directions'; + public static readonly DIRECTIONS_ALT = 'pi pi-directions-alt'; + public static readonly DISCORD = 'pi pi-discord'; + public static readonly DOLLAR = 'pi pi-dollar'; + public static readonly DOWNLOAD = 'pi pi-download'; + public static readonly EJECT = 'pi pi-eject'; + public static readonly ELLIPSIS_H = 'pi pi-ellipsis-h'; + public static readonly ELLIPSIS_V = 'pi pi-ellipsis-v'; + public static readonly ENVELOPE = 'pi pi-envelope'; + public static readonly EQUALS = 'pi pi-equals'; + public static readonly ERASER = 'pi pi-eraser'; + public static readonly ETHEREUM = 'pi pi-ethereum'; + public static readonly EURO = 'pi pi-euro'; + public static readonly EXCLAMATION_CIRCLE = 'pi pi-exclamation-circle'; + public static readonly EXCLAMATION_TRIANGLE = 'pi pi-exclamation-triangle'; + public static readonly EXPAND = 'pi pi-expand'; + public static readonly EXTERNAL_LINK = 'pi pi-external-link'; + public static readonly EYE = 'pi pi-eye'; + public static readonly EYE_SLASH = 'pi pi-eye-slash'; + public static readonly FACE_SMILE = 'pi pi-face-smile'; + public static readonly FACEBOOK = 'pi pi-facebook'; + public static readonly FAST_BACKWARD = 'pi pi-fast-backward'; + public static readonly FAST_FORWARD = 'pi pi-fast-forward'; + public static readonly FILE = 'pi pi-file'; + public static readonly FILE_ARROW_UP = 'pi pi-file-arrow-up'; + public static readonly FILE_CHECK = 'pi pi-file-check'; + public static readonly FILE_EDIT = 'pi pi-file-edit'; + public static readonly FILE_IMPORT = 'pi pi-file-import'; + public static readonly FILE_PDF = 'pi pi-file-pdf'; + public static readonly FILE_PLUS = 'pi pi-file-plus'; + public static readonly FILE_EXCEL = 'pi pi-file-excel'; + public static readonly FILE_EXPORT = 'pi pi-file-export'; + public static readonly FILE_WORD = 'pi pi-file-word'; + public static readonly FILTER = 'pi pi-filter'; + public static readonly FILTER_FILL = 'pi pi-filter-fill'; + public static readonly FILTER_SLASH = 'pi pi-filter-slash'; + public static readonly FLAG = 'pi pi-flag'; + public static readonly FLAG_FILL = 'pi pi-flag-fill'; + public static readonly FOLDER = 'pi pi-folder'; + public static readonly FOLDER_OPEN = 'pi pi-folder-open'; + public static readonly FOLDER_PLUS = 'pi pi-folder-plus'; + public static readonly FORWARD = 'pi pi-forward'; + public static readonly GAUGE = 'pi pi-gauge'; + public static readonly GIFT = 'pi pi-gift'; + public static readonly GITHUB = 'pi pi-github'; + public static readonly GLOBE = 'pi pi-globe'; + public static readonly GOOGLE = 'pi pi-google'; + public static readonly GRADUATION_CAP = 'pi pi-graduation-cap'; + public static readonly HAMMER = 'pi pi-hammer'; + public static readonly HASHTAG = 'pi pi-hashtag'; + public static readonly HEADPHONES = 'pi pi-headphones'; + public static readonly HEART = 'pi pi-heart'; + public static readonly HEART_FILL = 'pi pi-heart-fill'; + public static readonly HISTORY = 'pi pi-history'; + public static readonly HOME = 'pi pi-home'; + public static readonly HOURGLASS = 'pi pi-hourglass'; + public static readonly ID_CARD = 'pi pi-id-card'; + public static readonly IMAGE = 'pi pi-image'; + public static readonly IMAGES = 'pi pi-images'; + public static readonly INBOX = 'pi pi-inbox'; + public static readonly INDIAN_RUPEE = 'pi pi-indian-rupee'; + public static readonly INFO = 'pi pi-info'; + public static readonly INFO_CIRCLE = 'pi pi-info-circle'; + public static readonly INSTAGRAM = 'pi pi-instagram'; + public static readonly KEY = 'pi pi-key'; + public static readonly LANGUAGE = 'pi pi-language'; + public static readonly LIGHTBULB = 'pi pi-lightbulb'; + public static readonly LINK = 'pi pi-link'; + public static readonly LINKEDIN = 'pi pi-linkedin'; + public static readonly LIST = 'pi pi-list'; + public static readonly LIST_CHECK = 'pi pi-list-check'; + public static readonly LOCK = 'pi pi-lock'; + public static readonly LOCK_OPEN = 'pi pi-lock-open'; + public static readonly MAP = 'pi pi-map'; + public static readonly MAP_MARKER = 'pi pi-map-marker'; + public static readonly MARS = 'pi pi-mars'; + public static readonly MEGAPHONE = 'pi pi-megaphone'; + public static readonly MICROCHIP = 'pi pi-microchip'; + public static readonly MICROCHIP_AI = 'pi pi-microchip-ai'; + public static readonly MICROPHONE = 'pi pi-microphone'; + public static readonly MICROSOFT = 'pi pi-microsoft'; + public static readonly MINUS = 'pi pi-minus'; + public static readonly MINUS_CIRCLE = 'pi pi-minus-circle'; + public static readonly MOBILE = 'pi pi-mobile'; + public static readonly MONEY_BILL = 'pi pi-money-bill'; + public static readonly MOON = 'pi pi-moon'; + public static readonly OBJECTS_COLUMN = 'pi pi-objects-column'; + public static readonly PALETTE = 'pi pi-palette'; + public static readonly PAPERCLIP = 'pi pi-paperclip'; + public static readonly PAUSE = 'pi pi-pause'; + public static readonly PAUSE_CIRCLE = 'pi pi-pause-circle'; + public static readonly PAYPAL = 'pi pi-paypal'; + public static readonly PEN_TO_SQUARE = 'pi pi-pen-to-square'; + public static readonly PENCIL = 'pi pi-pencil'; + public static readonly PERCENTAGE = 'pi pi-percentage'; + public static readonly PHONE = 'pi pi-phone'; + public static readonly PINTEREST = 'pi pi-pinterest'; + public static readonly PLAY = 'pi pi-play'; + public static readonly PLAY_CIRCLE = 'pi pi-play-circle'; + public static readonly PLUS = 'pi pi-plus'; + public static readonly PLUS_CIRCLE = 'pi pi-plus-circle'; + public static readonly POUND = 'pi pi-pound'; + public static readonly POWER_OFF = 'pi pi-power-off'; + public static readonly PRIME = 'pi pi-prime'; + public static readonly PRINT = 'pi pi-print'; + public static readonly QRCODE = 'pi pi-qrcode'; + public static readonly QUESTION = 'pi pi-question'; + public static readonly QUESTION_CIRCLE = 'pi pi-question-circle'; + public static readonly RECEIPT = 'pi pi-receipt'; + public static readonly REDDIT = 'pi pi-reddit'; + public static readonly REFRESH = 'pi pi-refresh'; + public static readonly REPLAY = 'pi pi-replay'; + public static readonly REPLY = 'pi pi-reply'; + public static readonly SAVE = 'pi pi-save'; + public static readonly SEARCH = 'pi pi-search'; + public static readonly SEARCH_MINUS = 'pi pi-search-minus'; + public static readonly SEARCH_PLUS = 'pi pi-search-plus'; + public static readonly SEND = 'pi pi-send'; + public static readonly SERVER = 'pi pi-server'; + public static readonly SHARE_ALT = 'pi pi-share-alt'; + public static readonly SHIELD = 'pi pi-shield'; + public static readonly SHOP = 'pi pi-shop'; + public static readonly SHOPPING_BAG = 'pi pi-shopping-bag'; + public static readonly SHOPPING_CART = 'pi pi-shopping-cart'; + public static readonly SIGN_IN = 'pi pi-sign-in'; + public static readonly SIGN_OUT = 'pi pi-sign-out'; + public static readonly SITEMAP = 'pi pi-sitemap'; + public static readonly SLACK = 'pi pi-slack'; + public static readonly SLIDERS_H = 'pi pi-sliders-h'; + public static readonly SLIDERS_V = 'pi pi-sliders-v'; + public static readonly SORT = 'pi pi-sort'; + public static readonly SORT_ALPHA_DOWN = 'pi pi-sort-alpha-down'; + public static readonly SORT_ALPHA_DOWN_ALT = 'pi pi-sort-alpha-down-alt'; + public static readonly SORT_ALPHA_UP = 'pi pi-sort-alpha-up'; + public static readonly SORT_ALPHA_UP_ALT = 'pi pi-sort-alpha-up-alt'; + public static readonly SORT_ALT = 'pi pi-sort-alt'; + public static readonly SORT_ALT_SLASH = 'pi pi-sort-alt-slash'; + public static readonly SORT_AMOUNT_DOWN = 'pi pi-sort-amount-down'; + public static readonly SORT_AMOUNT_DOWN_ALT = 'pi pi-sort-amount-down-alt'; + public static readonly SORT_AMOUNT_UP = 'pi pi-sort-amount-up'; + public static readonly SORT_AMOUNT_UP_ALT = 'pi pi-sort-amount-up-alt'; + public static readonly SORT_DOWN = 'pi pi-sort-down'; + public static readonly SORT_DOWN_FILL = 'pi pi-sort-down-fill'; + public static readonly SORT_NUMERIC_DOWN = 'pi pi-sort-numeric-down'; + public static readonly SORT_NUMERIC_DOWN_ALT = 'pi pi-sort-numeric-down-alt'; + public static readonly SORT_NUMERIC_UP = 'pi pi-sort-numeric-up'; + public static readonly SORT_NUMERIC_UP_ALT = 'pi pi-sort-numeric-up-alt'; + public static readonly SORT_UP = 'pi pi-sort-up'; + public static readonly SORT_UP_FILL = 'pi pi-sort-up-fill'; + public static readonly SPARKLES = 'pi pi-sparkles'; + public static readonly SPINNER = 'pi pi-spinner'; + public static readonly SPINNER_DOTTED = 'pi pi-spinner-dotted'; + public static readonly STAR = 'pi pi-star'; + public static readonly STAR_FILL = 'pi pi-star-fill'; + public static readonly STAR_HALF = 'pi pi-star-half'; + public static readonly STAR_HALF_FILL = 'pi pi-star-half-fill'; + public static readonly STEP_BACKWARD = 'pi pi-step-backward'; + public static readonly STEP_BACKWARD_ALT = 'pi pi-step-backward-alt'; + public static readonly STEP_FORWARD = 'pi pi-step-forward'; + public static readonly STEP_FORWARD_ALT = 'pi pi-step-forward-alt'; + public static readonly STOP = 'pi pi-stop'; + public static readonly STOP_CIRCLE = 'pi pi-stop-circle'; + public static readonly STOPWATCH = 'pi pi-stopwatch'; + public static readonly SUN = 'pi pi-sun'; + public static readonly SYNC = 'pi pi-sync'; + public static readonly TABLE = 'pi pi-table'; + public static readonly TABLET = 'pi pi-tablet'; + public static readonly TAG = 'pi pi-tag'; + public static readonly TAGS = 'pi pi-tags'; + public static readonly TELEGRAM = 'pi pi-telegram'; + public static readonly TH_LARGE = 'pi pi-th-large'; + public static readonly THUMBS_DOWN = 'pi pi-thumbs-down'; + public static readonly THUMBS_DOWN_FILL = 'pi pi-thumbs-down-fill'; + public static readonly THUMBS_UP = 'pi pi-thumbs-up'; + public static readonly THUMBS_UP_FILL = 'pi pi-thumbs-up-fill'; + public static readonly THUMBTACK = 'pi pi-thumbtack'; + public static readonly TICKET = 'pi pi-ticket'; + public static readonly TIKTOK = 'pi pi-tiktok'; + public static readonly TIMES = 'pi pi-times'; + public static readonly TIMES_CIRCLE = 'pi pi-times-circle'; + public static readonly TRASH = 'pi pi-trash'; + public static readonly TROPHY = 'pi pi-trophy'; + public static readonly TRUCK = 'pi pi-truck'; + public static readonly TURKISH_LIRA = 'pi pi-turkish-lira'; + public static readonly TWITCH = 'pi pi-twitch'; + public static readonly TWITTER = 'pi pi-twitter'; + public static readonly UNDO = 'pi pi-undo'; + public static readonly UNLOCK = 'pi pi-unlock'; + public static readonly UPLOAD = 'pi pi-upload'; + public static readonly USER = 'pi pi-user'; + public static readonly USER_EDIT = 'pi pi-user-edit'; + public static readonly USER_MINUS = 'pi pi-user-minus'; + public static readonly USER_PLUS = 'pi pi-user-plus'; + public static readonly USERS = 'pi pi-users'; + public static readonly VENUS = 'pi pi-venus'; + public static readonly VERIFIED = 'pi pi-verified'; + public static readonly VIDEO = 'pi pi-video'; + public static readonly VIMEO = 'pi pi-vimeo'; + public static readonly VOLUME_DOWN = 'pi pi-volume-down'; + public static readonly VOLUME_OFF = 'pi pi-volume-off'; + public static readonly VOLUME_UP = 'pi pi-volume-up'; + public static readonly WALLET = 'pi pi-wallet'; + public static readonly WAREHOUSE = 'pi pi-warehouse'; + public static readonly WAVE_PULSE = 'pi pi-wave-pulse'; + public static readonly WHATSAPP = 'pi pi-whatsapp'; + public static readonly WIFI = 'pi pi-wifi'; + public static readonly WINDOW_MAXIMIZE = 'pi pi-window-maximize'; + public static readonly WINDOW_MINIMIZE = 'pi pi-window-minimize'; + public static readonly WRENCH = 'pi pi-wrench'; + public static readonly YOUTUBE = 'pi pi-youtube'; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/public_api.ts new file mode 100644 index 000000000..a0ac2557d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/public_api.ts @@ -0,0 +1,42 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './blockableui'; +export * from './confirmaeventtype'; +export * from './confirmation'; +export * from './confirmationservice'; +export * from './filtermatchmode'; +export * from './filtermetadata'; +export * from './filteroperator'; +export * from './filterservice'; +export * from './lazyloadevent'; +export * from './lazyloadmeta'; +export * from './lifecycle'; +export * from './megamenuitem'; +export * from './menuitem'; +export * from './messageservice'; +export * from './overlayoptions'; +export * from './overlayservice'; +export * from './passthrough'; +export * from './primeicons'; +export * from './scrolleroptions'; +export * from './selectitem'; +export * from './selectitemgroup'; +export * from './shared'; +export * from './sortevent'; +export * from './sortmeta'; +export * from './tablestate'; +export * from './toastmessage'; +export * from './tooltipoptions'; +export * from './translation'; +export * from './translationkeys'; +export * from './treedragdropservice'; +export * from './treenode'; +export * from './treenodedragevent'; +export * from './treetablenode'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/scrolleroptions.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/scrolleroptions.ts new file mode 100644 index 000000000..c0186fb66 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/scrolleroptions.ts @@ -0,0 +1,131 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/scrolleroptions.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * Options for the scroller. + * @group Interface + */ +export interface ScrollerOptions { + /** + * Unique identifier of the element. + */ + id?: string | undefined; + /** + * Inline style of the component. + */ + style?: { [klass: string]: any } | null | undefined; + /** + * Style class of the element. + */ + styleClass?: string | undefined; + /** + * Inline style of the content. + */ + contentStyle?: { [klass: string]: any } | null | undefined; + /** + * Style class of the content. + */ + contentStyleClass?: string | undefined; + /** + * Index of the element in tabbing order. + */ + tabindex?: number | undefined; + /** + * An array of objects to display. + */ + items?: any[]; + /** + * The height/width of item according to orientation. + */ + itemSize?: any; + /** + * Height of the scroll viewport. + */ + scrollHeight?: string | undefined; + /** + * Width of the scroll viewport. + */ + scrollWidth?: string | undefined; + /** + * The orientation of scrollbar. + */ + orientation?: 'vertical' | 'horizontal' | 'both'; + /** + * Used to specify how many items to load in each load method in lazy mode. + */ + step?: number | undefined; + /** + * Delay in scroll before new data is loaded. + */ + delay?: number | undefined; + /** + * Delay after window's resize finishes. + */ + resizeDelay?: number | undefined; + /** + * Used to append each loaded item to top without removing any items from the DOM. Using very large data may cause the browser to crash. + */ + appendOnly?: boolean; + /** + * Specifies whether the scroller should be displayed inline or not. + */ + inline?: boolean; + /** + * Defines if data is loaded and interacted with in lazy manner. + */ + lazy?: boolean; + /** + * If disabled, the scroller feature is eliminated and the content is displayed directly. + */ + disabled?: boolean; + /** + * Used to implement a custom loader instead of using the loader feature in the scroller. + */ + loaderDisabled?: boolean; + /** + * Columns to display. + */ + columns?: any[] | undefined; + /** + * Used to implement a custom spacer instead of using the spacer feature in the scroller. + */ + showSpacer?: boolean; + /** + * Defines whether to show loader. + */ + showLoader?: boolean; + /** + * Determines how many additional elements to add to the DOM outside of the view. According to the scrolls made up and down, extra items are added in a certain algorithm in the form of multiples of this number. Default value is half the number of items shown in the view. + */ + numToleratedItems?: any; + /** + * Defines whether the data is loaded. + */ + loading?: boolean; + /** + * Defines whether to dynamically change the height or width of scrollable container. + */ + autoSize?: boolean; + /** + * Function to optimize the dom operations by delegating to ngForTrackBy, default algoritm checks for object identity. + */ + trackBy?: Function; + /** + * Callback to invoke in lazy mode to load new data. + */ + onLazyLoad?: Function | undefined; + /** + * Callback to invoke when scroll position changes. + */ + onScroll?: Function | undefined; + /** + * Callback to invoke when scroll position and item's range in view changes. + */ + onScrollIndexChange?: Function | undefined; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/selectitem.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/selectitem.ts new file mode 100755 index 000000000..37c8e1e0c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/selectitem.ts @@ -0,0 +1,21 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/selectitem.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * Represents an option item. + * @group Interface + */ +export interface SelectItem { + label?: string; + value: T; + styleClass?: string; + icon?: string; + title?: string; + disabled?: boolean; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/selectitemgroup.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/selectitemgroup.ts new file mode 100755 index 000000000..5195e6359 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/selectitemgroup.ts @@ -0,0 +1,19 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/selectitemgroup.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { SelectItem } from './selectitem'; +/** + * Represents a group of select items. + * @group Interface + */ +export interface SelectItemGroup { + label: string; + value?: any; + items: SelectItem[]; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/shared.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/shared.ts new file mode 100755 index 000000000..a47739138 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/shared.ts @@ -0,0 +1,50 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/shared.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { Component, Directive, Input, NgModule, TemplateRef, ChangeDetectionStrategy } from '@angular/core'; + +@Component({ + selector: 'p-header', + template: '', + changeDetection: ChangeDetectionStrategy.Eager, + standalone: false +}) +export class Header {} + +@Component({ + selector: 'p-footer', + template: '', + changeDetection: ChangeDetectionStrategy.Eager, + standalone: false +}) +export class Footer {} + +@Directive({ + selector: '[pTemplate]', + standalone: true +}) +export class PrimeTemplate { + @Input() type: string | undefined; + + @Input('pTemplate') name: string | undefined; + + constructor(public template: TemplateRef) {} + + getType(): string { + return this.name!; + } +} + +@NgModule({ + imports: [CommonModule, PrimeTemplate], + exports: [Header, Footer, PrimeTemplate], + declarations: [Header, Footer] +}) +export class SharedModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/sortevent.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/sortevent.ts new file mode 100755 index 000000000..c06d693e1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/sortevent.ts @@ -0,0 +1,21 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/sortevent.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { SortMeta } from './sortmeta'; +/** + * Represents an event triggered when sorting is applied. + * @group Interface + */ +export interface SortEvent { + data?: any[]; + mode?: string; + field?: string; + order?: number; + multiSortMeta?: SortMeta[]; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/sortmeta.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/sortmeta.ts new file mode 100755 index 000000000..2f945eb4d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/sortmeta.ts @@ -0,0 +1,17 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/sortmeta.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * Represents metadata for sorting. + * @group Interface + */ +export interface SortMeta { + field: string; + order: number; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/tablestate.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/tablestate.ts new file mode 100755 index 000000000..c1fec10ca --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/tablestate.ts @@ -0,0 +1,66 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/tablestate.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { FilterMetadata } from './filtermetadata'; +import { SortMeta } from './sortmeta'; + +/** + * Represents the state of a table component. + * @group Interface + */ +export interface TableState { + /** + * The index of the first row to be displayed. + */ + first?: number; + /** + * The number of rows to be displayed per page. + */ + rows?: number; + /** + * The field used for sorting. + */ + sortField?: string; + /** + * The sort order. + */ + sortOrder?: number; + /** + * An array of sort metadata when multiple sorting is applied. + */ + multiSortMeta?: SortMeta[]; + /** + * The filters to be applied to the table. + */ + filters?: { [s: string]: FilterMetadata | FilterMetadata[] }; + /** + * The column widths for the table. + */ + columnWidths?: string; + /** + * The width of the table. + */ + tableWidth?: string; + /** + * The width of the wrapper element containing the table. + */ + wrapperWidth?: string; + /** + * The selected item(s) in the table. + */ + selection?: any; + /** + * The order of the columns in the table. + */ + columnOrder?: string[]; + /** + * The keys of the expanded rows in the table. + */ + expandedRowKeys?: { [s: string]: boolean }; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/toastmessage.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/toastmessage.ts new file mode 100755 index 000000000..9c3c3c5bc --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/toastmessage.ts @@ -0,0 +1,29 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/toastmessage.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * Deines valid options for the toast message. + * @group Interface + */ +export interface ToastMessageOptions { + text?: any; + severity?: string; + summary?: string; + detail?: string; + id?: any; + key?: string; + life?: number; + sticky?: boolean; + closable?: boolean; + data?: any; + icon?: string; + contentStyleClass?: string; + styleClass?: string; + closeIcon?: string; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/tooltipoptions.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/tooltipoptions.ts new file mode 100644 index 000000000..e90cd3ba4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/tooltipoptions.ts @@ -0,0 +1,79 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/tooltipoptions.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { ElementRef, TemplateRef } from '@angular/core'; + +/** + * Defines options of Tooltip. + * @group Interface + */ +export interface TooltipOptions { + /** + * Label of tooltip. + */ + tooltipLabel?: string; + /** + * Position of tooltip. + */ + tooltipPosition?: 'right' | 'left' | 'top' | 'bottom'; + /** + * Event to show the tooltip. + */ + tooltipEvent?: 'hover' | 'focus' | 'both'; + /** + * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). + * @defaultValue body + */ + appendTo?: HTMLElement | ElementRef | TemplateRef | string | null | undefined | any; + /** + * Type of CSS position. + */ + positionStyle?: string; + /** + * Style class of the tooltip. + */ + tooltipStyleClass?: string; + /** + * Whether the z-index should be managed automatically to always go on top or have a fixed value. + * @defaultValue auto + */ + tooltipZIndex?: string; + /** + * By default the tooltip contents are rendered as text. Set to false to support html tags in the content. + */ + escape?: boolean; + /** + * When present, it specifies that the component should be disabled. + */ + disabled?: boolean; + /** + * Specifies the additional vertical offset of the tooltip from its default position. + */ + positionTop?: number; + /** + * Specifies the additional horizontal offset of the tooltip from its default position. + */ + positionLeft?: number; + /** + * Delay to show the tooltip in milliseconds. + */ + showDelay?: number; + /** + * Delay to hide the tooltip in milliseconds. + */ + hideDelay?: number; + /** + * Time to wait in milliseconds to hide the tooltip even it is active. + */ + life?: number; + /** + * When present, it adds a custom id to the tooltip. + */ + id?: string; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/translation.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/translation.ts new file mode 100644 index 000000000..284be76c5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/translation.ts @@ -0,0 +1,148 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/translation.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * Represents a set of translated strings used in a component or application. + * @group Interface + */ +export interface Translation { + startsWith?: string; + contains?: string; + notContains?: string; + endsWith?: string; + equals?: string; + completed?: string; + notEquals?: string; + noFilter?: string; + lt?: string; + lte?: string; + gt?: string; + gte?: string; + is?: string; + isNot?: string; + before?: string; + after?: string; + dateIs?: string; + dateIsNot?: string; + dateBefore?: string; + dateAfter?: string; + clear?: string; + apply?: string; + matchAll?: string; + matchAny?: string; + addRule?: string; + removeRule?: string; + accept?: string; + reject?: string; + choose?: string; + upload?: string; + cancel?: string; + fileSizeTypes?: string[]; + dayNames?: string[]; + dayNamesShort?: string[]; + dayNamesMin?: string[]; + monthNames?: string[]; + monthNamesShort?: string[]; + dateFormat?: string; + firstDayOfWeek?: number; + today?: string; + weekHeader?: string; + weak?: string; + medium?: string; + strong?: string; + passwordPrompt?: string; + emptyMessage?: string; + emptyFilterMessage?: string; + fileChosenMessage?: string; + noFileChosenMessage?: string; + pending?: string; + chooseYear?: string; + chooseMonth?: string; + chooseDate?: string; + prevDecade?: string; + nextDecade?: string; + prevYear?: string; + nextYear?: string; + prevMonth?: string; + nextMonth?: string; + prevHour?: string; + nextHour?: string; + prevMinute?: string; + nextMinute?: string; + prevSecond?: string; + nextSecond?: string; + am?: string; + pm?: string; + searchMessage?: string; + selectionMessage?: string; + emptySelectionMessage?: string; + emptySearchMessage?: string; + aria?: Aria; +} +/** + * Represents a set of translated HTML attributes used in a component or application. + * @group Interface + */ +export interface Aria { + trueLabel?: string; + falseLabel?: string; + nullLabel?: string; + star?: string; + stars?: string; + selectAll?: string; + unselectAll?: string; + close?: string; + previous?: string; + next?: string; + navigation?: string; + scrollTop?: string; + moveTop?: string; + moveUp?: string; + moveDown?: string; + moveBottom?: string; + moveToTarget?: string; + moveToSource?: string; + moveAllToTarget?: string; + moveAllToSource?: string; + pageLabel?: string; + firstPageLabel?: string; + lastPageLabel?: string; + nextPageLabel?: string; + prevPageLabel?: string; + rowsPerPageLabel?: string; + previousPageLabel?: string; + jumpToPageDropdownLabel?: string; + jumpToPageInputLabel?: string; + selectRow?: string; + unselectRow?: string; + expandRow?: string; + collapseRow?: string; + showFilterMenu?: string; + hideFilterMenu?: string; + filterOperator?: string; + filterConstraint?: string; + editRow?: string; + saveEdit?: string; + cancelEdit?: string; + listView?: string; + gridView?: string; + slide?: string; + slideNumber?: string; + zoomImage?: string; + zoomIn?: string; + zoomOut?: string; + rotateRight?: string; + rotateLeft?: string; + listLabel?: string; + selectColor?: string; + removeLabel?: string; + browseFiles?: string; + maximizeLabel?: string; + minimizeLabel?: string; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/translationkeys.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/translationkeys.ts new file mode 100644 index 000000000..640373f2d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/translationkeys.ts @@ -0,0 +1,59 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/translationkeys.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export class TranslationKeys { + public static readonly STARTS_WITH = 'startsWith'; + public static readonly CONTAINS = 'contains'; + public static readonly NOT_CONTAINS = 'notContains'; + public static readonly ENDS_WITH = 'endsWith'; + public static readonly EQUALS = 'equals'; + public static readonly NOT_EQUALS = 'notEquals'; + public static readonly NO_FILTER = 'noFilter'; + public static readonly LT = 'lt'; + public static readonly LTE = 'lte'; + public static readonly GT = 'gt'; + public static readonly GTE = 'gte'; + public static readonly IS = 'is'; + public static readonly IS_NOT = 'isNot'; + public static readonly BEFORE = 'before'; + public static readonly AFTER = 'after'; + public static readonly CLEAR = 'clear'; + public static readonly APPLY = 'apply'; + public static readonly MATCH_ALL = 'matchAll'; + public static readonly MATCH_ANY = 'matchAny'; + public static readonly ADD_RULE = 'addRule'; + public static readonly REMOVE_RULE = 'removeRule'; + public static readonly ACCEPT = 'accept'; + public static readonly REJECT = 'reject'; + public static readonly CHOOSE = 'choose'; + public static readonly UPLOAD = 'upload'; + public static readonly CANCEL = 'cancel'; + public static readonly PENDING = 'pending'; + public static readonly FILE_SIZE_TYPES = 'fileSizeTypes'; + public static readonly DAY_NAMES = 'dayNames'; + public static readonly DAY_NAMES_SHORT = 'dayNamesShort'; + public static readonly DAY_NAMES_MIN = 'dayNamesMin'; + public static readonly MONTH_NAMES = 'monthNames'; + public static readonly MONTH_NAMES_SHORT = 'monthNamesShort'; + public static readonly FIRST_DAY_OF_WEEK = 'firstDayOfWeek'; + public static readonly TODAY = 'today'; + public static readonly WEEK_HEADER = 'weekHeader'; + public static readonly WEAK = 'weak'; + public static readonly MEDIUM = 'medium'; + public static readonly STRONG = 'strong'; + public static readonly PASSWORD_PROMPT = 'passwordPrompt'; + public static readonly EMPTY_MESSAGE = 'emptyMessage'; + public static readonly EMPTY_FILTER_MESSAGE = 'emptyFilterMessage'; + public static readonly SHOW_FILTER_MENU = 'showFilterMenu'; + public static readonly HIDE_FILTER_MENU = 'hideFilterMenu'; + public static readonly SELECTION_MESSAGE = 'selectionMessage'; + public static readonly ARIA = 'aria'; + public static readonly SELECT_COLOR = 'selectColor'; + public static readonly BROWSE_FILES = 'browseFiles'; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/treedragdropservice.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/treedragdropservice.ts new file mode 100755 index 000000000..e5ef58f7f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/treedragdropservice.ts @@ -0,0 +1,29 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/treedragdropservice.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs'; +import { TreeNodeDragEvent } from './treenodedragevent'; + +@Injectable() +export class TreeDragDropService { + private dragStartSource = new Subject(); + private dragStopSource = new Subject(); + + dragStart$ = this.dragStartSource.asObservable(); + dragStop$ = this.dragStopSource.asObservable(); + + startDrag(event: TreeNodeDragEvent) { + this.dragStartSource.next(event); + } + + stopDrag(event: TreeNodeDragEvent) { + this.dragStopSource.next(event); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/treenode.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/treenode.ts new file mode 100755 index 000000000..cb7f63c24 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/treenode.ts @@ -0,0 +1,91 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/treenode.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * Represents a node in a tree data structure. + * @group Interface + */ +export interface TreeNode { + checked?: boolean; + /** + * Label of the node. + */ + label?: string; + /** + * Data represented by the node. + */ + data?: T; + /** + * Icon of the node to display next to content. + */ + icon?: string; + /** + * Icon to use in expanded state. + */ + expandedIcon?: string; + /** + * Icon to use in collapsed state. + */ + collapsedIcon?: string; + /** + * An array of treenodes as children. + */ + children?: TreeNode[]; + /** + * Specifies if the node has children. Used in lazy loading. + * @defaultValue false + */ + leaf?: boolean; + /** + * Expanded state of the node. + * @defaultValue false + */ + expanded?: boolean; + /** + * Type of the node to match a template. + */ + type?: string; + /** + * Parent of the node. + */ + parent?: TreeNode; + /** + * Defines if value is partially selected. + */ + partialSelected?: boolean; + /** + * Inline style of the node. + */ + style?: any; + /** + * Style class of the node. + */ + styleClass?: string; + /** + * Defines if the node is draggable. + */ + draggable?: boolean; + /** + * Defines if the node is droppable. + */ + droppable?: boolean; + /** + * Whether the node is selectable when selection mode is enabled. + * @defaultValue false + */ + selectable?: boolean; + /** + * Mandatory unique key of the node. + */ + key?: string; + /** + * Whether the node is loading. Used in lazy loading. + */ + loading?: boolean; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/treenodedragevent.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/treenodedragevent.ts new file mode 100755 index 000000000..93fa4d131 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/treenodedragevent.ts @@ -0,0 +1,37 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/treenodedragevent.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TreeNode } from './treenode'; + +/** + * Represents the event data for a tree node drag operation. + * @group Interface + */ +export interface TreeNodeDragEvent { + /** + * Tree instance. + */ + tree?: any; + /** + * Node to be dragged. + */ + node?: TreeNode; + /** + * Child nodes of dragged node. + */ + subNodes?: TreeNode[]; + /** + * Index of dragged node. + */ + index?: number; + /** + * Scope of dragged node. + */ + scope?: any; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/api/treetablenode.ts b/projects/cps-ui-kit/src/lib/primeng-temp/api/treetablenode.ts new file mode 100644 index 000000000..80917e091 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/api/treetablenode.ts @@ -0,0 +1,46 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/api/treetablenode.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TreeNode } from './treenode'; + +/** + * Tree table node element. + * @extends {TreeNode} + * @group Interface + */ +export interface TreeTableNode extends TreeNode { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Row of the node. + */ + rowNode?: any; + /** + * Node instance. + */ + node?: TreeNode; + /** + * Selection type. + */ + type?: string; + /** + * Node index. + */ + index?: number; + /** + * Node level. + */ + level?: number; + /** + * Boolean value indicates if node is in viewport. + */ + visible?: boolean; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/autofocus/autofocus.ts b/projects/cps-ui-kit/src/lib/primeng-temp/autofocus/autofocus.ts new file mode 100644 index 000000000..65551a31f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/autofocus/autofocus.ts @@ -0,0 +1,79 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/autofocus/autofocus.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { DOCUMENT, isPlatformBrowser } from '@angular/common'; +import { Directive, ElementRef, inject, Input, NgModule, PLATFORM_ID } from '@angular/core'; +import { BaseComponent } from '../basecomponent/public_api'; +import { DomHandler } from '../dom/public_api'; + +/** + * AutoFocus manages focus on focusable element on load. + * @group Components + */ +@Directive({ + selector: '[pAutoFocus]', + standalone: true +}) +export class AutoFocus extends BaseComponent { + /** + * When present, it specifies that the component should automatically get focus on load. + * @group Props + */ + @Input('pAutoFocus') autofocus: boolean | undefined = false; + + focused: boolean = false; + + platformId = inject(PLATFORM_ID); + + document: Document = inject(DOCUMENT); + + host: ElementRef = inject(ElementRef); + + onAfterContentChecked() { + // This sets the `attr.autofocus` which is different than the Input `autofocus` attribute. + if (this.autofocus === false) { + this.host.nativeElement.removeAttribute('autofocus'); + } else { + this.host.nativeElement.setAttribute('autofocus', true); + } + + if (!this.focused) { + this.autoFocus(); + } + } + + onAfterViewChecked() { + if (!this.focused) { + this.autoFocus(); + } + } + + autoFocus() { + if (isPlatformBrowser(this.platformId) && this.autofocus) { + setTimeout(() => { + const focusableElements = DomHandler.getFocusableElements(this.host?.nativeElement); + + if (focusableElements.length === 0) { + this.host.nativeElement.focus(); + } + if (focusableElements.length > 0) { + focusableElements[0].focus(); + } + + this.focused = true; + }); + } + } +} + +@NgModule({ + imports: [AutoFocus], + exports: [AutoFocus] +}) +export class AutoFocusModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/autofocus/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/autofocus/public_api.ts new file mode 100644 index 000000000..794c79d95 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/autofocus/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/autofocus/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './autofocus'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/badge/badge.ts b/projects/cps-ui-kit/src/lib/primeng-temp/badge/badge.ts new file mode 100755 index 000000000..c682a79ee --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/badge/badge.ts @@ -0,0 +1,357 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/badge/badge.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { booleanAttribute, ChangeDetectionStrategy, Component, Directive, effect, inject, InjectionToken, Input, input, NgModule, SimpleChanges, ViewEncapsulation } from '@angular/core'; +import { addClass, createElement, hasClass, isNotEmpty, removeClass, uuid } from '../../primeuix-temp/utils/src/index'; +import { SharedModule } from '../api/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import type { BadgePassThrough } from '../types/badge/public_api'; +import { BadgeStyle } from './style/badgestyle'; + +const BADGE_INSTANCE = new InjectionToken('BADGE_INSTANCE'); + +const BADGE_DIRECTIVE_INSTANCE = new InjectionToken('BADGE_DIRECTIVE_INSTANCE'); + +/** + * Badge Directive is directive usage of badge component. + * @group Components + */ +@Directive({ + selector: '[pBadge]', + providers: [BadgeStyle, { provide: BADGE_DIRECTIVE_INSTANCE, useExisting: BadgeDirective }, { provide: PARENT_INSTANCE, useExisting: BadgeDirective }], + standalone: true +}) +export class BadgeDirective extends BaseComponent { + $pcBadgeDirective: BadgeDirective | undefined = inject(BADGE_DIRECTIVE_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + /** + * Used to pass attributes to DOM elements inside the Badge component. + * @defaultValue undefined + * @deprecated use pBadgePT instead. + * @group Props + */ + ptBadgeDirective = input(); + /** + * Used to pass attributes to DOM elements inside the Badge component. + * @defaultValue undefined + * @group Props + */ + pBadgePT = input(); + /** + * Indicates whether the component should be rendered without styles. + * @defaultValue undefined + * @group Props + */ + pBadgeUnstyled = input(); + /** + * When specified, disables the component. + * @group Props + */ + @Input('badgeDisabled') public disabled: boolean; + /** + * Size of the badge, valid options are "large" and "xlarge". + * @group Props + */ + @Input() public badgeSize: 'large' | 'xlarge' | 'small' | null | undefined; + /** + * Size of the badge, valid options are "large" and "xlarge". + * @group Props + * @deprecated use badgeSize instead. + */ + @Input() public set size(value: 'large' | 'xlarge' | 'small' | null | undefined) { + this._size = value; + console.log('size property is deprecated and will removed in v18, use badgeSize instead.'); + } + get size() { + return this._size; + } + _size: 'large' | 'xlarge' | 'small' | null | undefined; + /** + * Severity type of the badge. + * @group Props + */ + @Input() severity: 'secondary' | 'info' | 'success' | 'warn' | 'danger' | 'contrast' | null | undefined; + /** + * Value to display inside the badge. + * @group Props + */ + @Input() public value: string | number; + /** + * Inline style of the element. + * @group Props + */ + @Input() badgeStyle: { [klass: string]: any } | null | undefined; + /** + * Class of the element. + * @group Props + */ + @Input() badgeStyleClass: string; + + private id!: string; + + badgeEl: HTMLElement; + + _componentStyle = inject(BadgeStyle); + + private get activeElement(): HTMLElement { + return this.el.nativeElement.nodeName.indexOf('-') != -1 ? this.el.nativeElement.firstChild : this.el.nativeElement; + } + + private get canUpdateBadge(): boolean { + return isNotEmpty(this.id) && !this.disabled; + } + + constructor() { + super(); + effect(() => { + const pt = this.ptBadgeDirective() || this.pBadgePT(); + pt && this.directivePT.set(pt); + }); + + effect(() => { + this.pBadgeUnstyled() && this.directiveUnstyled.set(this.pBadgeUnstyled()); + }); + } + + onChanges(changes: SimpleChanges): void { + const { value, size, severity, disabled, badgeStyle, badgeStyleClass } = changes; + + if (disabled) { + this.toggleDisableState(); + } + + if (!this.canUpdateBadge) { + return; + } + + if (severity) { + this.setSeverity(severity.previousValue); + } + + if (size) { + this.setSizeClasses(); + } + + if (value) { + this.setValue(); + } + + if (badgeStyle || badgeStyleClass) { + this.applyStyles(); + } + } + + onAfterViewInit(): void { + this.id = uuid('pn_id_') + '_badge'; + this.renderBadgeContent(); + } + + private setValue(element?: HTMLElement): void { + const badge = element ?? this.document.getElementById(this.id); + + if (!badge) { + return; + } + + if (this.value != null) { + if (hasClass(badge, 'p-badge-dot')) { + removeClass(badge, 'p-badge-dot'); + } + + if (this.value && String(this.value).length === 1) { + addClass(badge, 'p-badge-circle'); + } else { + removeClass(badge, 'p-badge-circle'); + } + } else { + if (!hasClass(badge, 'p-badge-dot')) { + addClass(badge, 'p-badge-dot'); + } + + removeClass(badge, 'p-badge-circle'); + } + + badge.textContent = ''; + const badgeValue = this.value != null ? String(this.value) : ''; + this.renderer.appendChild(badge, this.document.createTextNode(badgeValue)); + } + + private setSizeClasses(element?: HTMLElement): void { + const badge = element ?? this.document.getElementById(this.id); + + if (!badge) { + return; + } + + if (this.badgeSize) { + if (this.badgeSize === 'large') { + addClass(badge, 'p-badge-lg'); + removeClass(badge, 'p-badge-xl'); + } + + if (this.badgeSize === 'xlarge') { + addClass(badge, 'p-badge-xl'); + removeClass(badge, 'p-badge-lg'); + } + } else if (this.size && !this.badgeSize) { + if (this.size === 'large') { + addClass(badge, 'p-badge-lg'); + removeClass(badge, 'p-badge-xl'); + } + + if (this.size === 'xlarge') { + addClass(badge, 'p-badge-xl'); + removeClass(badge, 'p-badge-lg'); + } + } else { + removeClass(badge, 'p-badge-lg'); + removeClass(badge, 'p-badge-xl'); + } + } + + private renderBadgeContent(): void { + if (this.disabled) { + return; + } + + const el = this.activeElement; + const badge = createElement('span', { class: this.cx('root'), id: this.id, 'p-bind': this.ptm('root') }); + this.setSeverity(null, badge); + this.setSizeClasses(badge); + this.setValue(badge); + addClass(el, 'p-overlay-badge'); + this.renderer.appendChild(el, badge); + this.badgeEl = badge; + this.applyStyles(); + } + + private applyStyles(): void { + if (this.badgeEl && this.badgeStyle && typeof this.badgeStyle === 'object') { + for (const [key, value] of Object.entries(this.badgeStyle)) { + this.renderer.setStyle(this.badgeEl, key, value); + } + } + if (this.badgeEl && this.badgeStyleClass) { + this.badgeEl.classList.add(...this.badgeStyleClass.split(' ')); + } + } + + private setSeverity(oldSeverity?: 'success' | 'info' | 'warn' | 'danger' | null, element?: HTMLElement): void { + const badge = element ?? this.document.getElementById(this.id); + + if (!badge) { + return; + } + + if (this.severity) { + addClass(badge, `p-badge-${this.severity}`); + } + + if (oldSeverity) { + removeClass(badge, `p-badge-${oldSeverity}`); + } + } + + private toggleDisableState(): void { + if (!this.id) { + return; + } + + if (this.disabled) { + const badge = this.activeElement?.querySelector(`#${this.id}`); + + if (badge) { + this.renderer.removeChild(this.activeElement, badge); + } + } else { + this.renderBadgeContent(); + } + } +} +/** + * Badge is a small status indicator for another element. + * @group Components + */ +@Component({ + selector: 'p-badge', + template: `{{ value() }}`, + standalone: true, + imports: [CommonModule, SharedModule, BindModule], + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + providers: [BadgeStyle, { provide: BADGE_INSTANCE, useExisting: Badge }, { provide: PARENT_INSTANCE, useExisting: Badge }], + host: { + '[class]': "cn(cx('root'), styleClass())", + '[style.display]': 'badgeDisabled() ? "none" : null', + '[attr.data-p]': 'dataP' + }, + hostDirectives: [Bind] +}) +export class Badge extends BaseComponent { + componentName = 'Badge'; + + $pcBadge: Badge | undefined = inject(BADGE_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + /** + * Class of the element. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + styleClass = input(); + /** + * Size of the badge, valid options are "large" and "xlarge". + * @group Props + */ + badgeSize = input<'small' | 'large' | 'xlarge' | null>(); + /** + * Size of the badge, valid options are "large" and "xlarge". + * @group Props + */ + size = input<'small' | 'large' | 'xlarge' | null>(); + /** + * Severity type of the badge. + * @group Props + */ + severity = input<'secondary' | 'info' | 'success' | 'warn' | 'warning' | 'danger' | 'contrast' | 'help' | 'primary' | null>(); + /** + * Value to display inside the badge. + * @group Props + */ + value = input(); + /** + * When specified, disables the component. + * @group Props + */ + badgeDisabled = input(false, { transform: booleanAttribute }); + + _componentStyle = inject(BadgeStyle); + + get dataP() { + return this.cn({ + circle: this.value() != null && String(this.value()).length === 1, + empty: this.value() == null, + disabled: this.badgeDisabled(), + [this.severity() as string]: this.severity(), + [this.size() as string]: this.size() + }); + } +} + +@NgModule({ + imports: [Badge, BadgeDirective, SharedModule], + exports: [Badge, BadgeDirective, SharedModule] +}) +export class BadgeModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/badge/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/badge/public_api.ts new file mode 100644 index 000000000..016204fd8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/badge/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/badge/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './badge'; +export * from './style/badgestyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/badge/style/badgestyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/badge/style/badgestyle.ts new file mode 100644 index 000000000..37efe730b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/badge/style/badgestyle.ts @@ -0,0 +1,84 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/badge/style/badgestyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as badge_style } from '../../../primeuix-temp/styles/src/badge/index'; +import { isEmpty, isNotEmpty } from '../../../primeuix-temp/utils/src/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` + ${badge_style} + + /* For PrimeNG (directive)*/ + .p-overlay-badge { + position: relative; + } + + .p-overlay-badge > .p-badge { + position: absolute; + top: 0; + inset-inline-end: 0; + transform: translate(50%, -50%); + transform-origin: 100% 0; + margin: 0; + } +`; + +const classes = { + root: ({ instance }) => { + const value = typeof instance.value === 'function' ? instance.value() : instance.value; + const size = typeof instance.size === 'function' ? instance.size() : instance.size; + const badgeSize = typeof instance.badgeSize === 'function' ? instance.badgeSize() : instance.badgeSize; + const severity = typeof instance.severity === 'function' ? instance.severity() : instance.severity; + + return [ + 'p-badge p-component', + { + 'p-badge-circle': isNotEmpty(value) && String(value).length === 1, + 'p-badge-dot': isEmpty(value), + 'p-badge-sm': size === 'small' || badgeSize === 'small', + 'p-badge-lg': size === 'large' || badgeSize === 'large', + 'p-badge-xl': size === 'xlarge' || badgeSize === 'xlarge', + 'p-badge-info': severity === 'info', + 'p-badge-success': severity === 'success', + 'p-badge-warn': severity === 'warn', + 'p-badge-danger': severity === 'danger', + 'p-badge-secondary': severity === 'secondary', + 'p-badge-contrast': severity === 'contrast' + } + ]; + } +}; + +@Injectable() +export class BadgeStyle extends BaseStyle { + name = 'badge'; + + style = style; + + classes = classes; +} + +/** + * + * Badge represents people using icons, labels and images. + * + * [Live Demo](https://www.primeng.org/badge) + * + * @module badgestyle + * + */ +export enum BadgeClasses { + /** + * Class name of the root element + */ + root = 'p-badge' +} + +export interface BadgeStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/base/base.ts b/projects/cps-ui-kit/src/lib/primeng-temp/base/base.ts new file mode 100644 index 000000000..93f83a34c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/base/base.ts @@ -0,0 +1,27 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/base/base.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export default { + _loadedStyleNames: new Set(), + getLoadedStyleNames() { + return this._loadedStyleNames; + }, + isStyleNameLoaded(name) { + return this._loadedStyleNames.has(name); + }, + setLoadedStyleName(name) { + this._loadedStyleNames.add(name); + }, + deleteLoadedStyleName(name) { + this._loadedStyleNames.delete(name); + }, + clearLoadedStyleNames() { + this._loadedStyleNames.clear(); + } +}; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/base/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/base/public_api.ts new file mode 100644 index 000000000..8bd7eae58 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/base/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/base/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export { default as Base } from './base'; +export * from './style/basestyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/base/style/basestyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/base/style/basestyle.ts new file mode 100644 index 000000000..b99980c4b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/base/style/basestyle.ts @@ -0,0 +1,125 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/base/style/basestyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { inject, Injectable } from '@angular/core'; +import { css as Css, dt, Theme } from '../../../primeuix-temp/styled/src/index'; +import { style as base_style } from '../../../primeuix-temp/styles/src/base/index'; +import { minifyCSS, resolve } from '../../../primeuix-temp/utils/src/index'; +import { UseStyle } from '../../usestyle/public_api'; + +const css = /*css*/ ` +.p-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.p-hidden-accessible input, +.p-hidden-accessible select { + transform: scale(0); +} + +.p-overflow-hidden { + overflow: hidden; + padding-right: dt('scrollbar.width'); +} +`; + +@Injectable({ providedIn: 'root' }) +export class BaseStyle { + name = 'base'; + + useStyle: UseStyle = inject(UseStyle); + + css: string | undefined = undefined; + + style: any = undefined; + + classes = {}; + + inlineStyles = {}; + + load = (style, options = {}, transform = (cs) => cs) => { + const computedStyle = transform(Css`${resolve(style, { dt })}`); + + return computedStyle ? this.useStyle.use(minifyCSS(computedStyle), { name: this.name, ...options }) : {}; + }; + + loadCSS = (options = {}) => { + return this.load(this.css, options); + }; + + loadStyle = (options: any = {}, style: string = '') => { + return this.load(this.style, options, (computedStyle = '') => Theme.transformCSS(options.name || this.name, `${computedStyle}${Css`${style}`}`)); + }; + + loadBaseCSS = (options = {}) => { + return this.load(css, options); + }; + + loadBaseStyle = (options: any = {}, style: string = '') => { + return this.load(base_style, options, (computedStyle = '') => Theme.transformCSS(options.name || this.name, `${computedStyle}${Css`${style}`}`)); + }; + + getCommonTheme = (params?) => { + return Theme.getCommon(this.name, params); + }; + + getComponentTheme = (params) => { + return Theme.getComponent(this.name, params); + }; + + getPresetTheme = (preset, selector, params) => { + return Theme.getCustomPreset(this.name, preset, selector, params); + }; + + getLayerOrderThemeCSS = () => { + return Theme.getLayerOrderCSS(this.name); + }; + + getStyleSheet = (extendedCSS = '', props = {}) => { + if (this.css) { + const _css = resolve(this.css, { dt }); + const _style = minifyCSS(Css`${_css}${extendedCSS}`); + const _props = Object.entries(props) + .reduce((acc, [k, v]) => acc.push(`${k}="${v}"`) && acc, []) + .join(' '); + + return ``; + } + + return ''; + }; + + getCommonThemeStyleSheet = (params, props = {}) => { + return Theme.getCommonStyleSheet(this.name, params, props); + }; + + getThemeStyleSheet = (params, props = {}) => { + let css = [Theme.getStyleSheet(this.name, params, props)]; + + if (this.style) { + const name = this.name === 'base' ? 'global-style' : `${this.name}-style`; + const _css = Css`${resolve(this.style, { dt })}`; + const _style = minifyCSS(Theme.transformCSS(name, _css as string)); + const _props = Object.entries(props) + .reduce((acc, [k, v]) => acc.push(`${k}="${v}"`) && acc, []) + .join(' '); + + css.push(``); + } + + return css.join(''); + }; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/basecomponent/basecomponent.ts b/projects/cps-ui-kit/src/lib/primeng-temp/basecomponent/basecomponent.ts new file mode 100644 index 000000000..4057c6703 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/basecomponent/basecomponent.ts @@ -0,0 +1,534 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/basecomponent/basecomponent.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { DOCUMENT, isPlatformServer } from '@angular/common'; +import { ChangeDetectorRef, computed, Directive, effect, ElementRef, inject, InjectionToken, Injector, input, PLATFORM_ID, Renderer2, signal, SimpleChanges } from '@angular/core'; +import { Theme, ThemeService } from '../../primeuix-temp/styled/src/index'; +import { cn, getKeyValue, isArray, isFunction, isNotEmpty, isString, mergeProps, resolve, toFlatCase, uuid } from '../../primeuix-temp/utils/src/index'; +import type { Lifecycle, PassThroughOptions } from '../api/public_api'; +import { Base, BaseStyle } from '../base/public_api'; +import { PrimeNG } from '../config/public_api'; +import { BaseComponentStyle } from './style/basecomponentstyle'; + +export const PARENT_INSTANCE = new InjectionToken('PARENT_INSTANCE'); + +@Directive({ + standalone: true, + providers: [BaseComponentStyle, BaseStyle] +}) +export class BaseComponent implements Lifecycle { + public document: Document = inject(DOCUMENT); + + public platformId: any = inject(PLATFORM_ID); + + public el: ElementRef = inject(ElementRef); + + public readonly injector: Injector = inject(Injector); + + public readonly cd: ChangeDetectorRef = inject(ChangeDetectorRef); + + public renderer: Renderer2 = inject(Renderer2); + + public config: PrimeNG = inject(PrimeNG); + + public $parentInstance: BaseComponent | undefined = inject(PARENT_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + public baseComponentStyle: BaseComponentStyle = inject(BaseComponentStyle); + + public baseStyle: BaseStyle = inject(BaseStyle); + + public scopedStyleEl: any; + + public parent = this.$params.parent; + + protected readonly cn = cn; + + private _themeScopedListener: () => void; + + private themeChangeListenerMap: Map = new Map(); + + /******************** Inputs ********************/ + + /** + * Defines scoped design tokens of the component. + * @defaultValue undefined + * @group Props + */ + dt = input(); + /** + * Indicates whether the component should be rendered without styles. + * @defaultValue undefined + * @group Props + */ + unstyled = input(); + /** + * Used to pass attributes to DOM elements inside the component. + * @defaultValue undefined + * @group Props + */ + pt = input(); + /** + * Used to configure passthrough(pt) options of the component. + * @group Props + * @defaultValue undefined + */ + ptOptions = input(); + + /******************** Computed ********************/ + + $attrSelector = uuid('pc'); + + get $name() { + return this['componentName'] || 'UnknownComponent'; + } + + private get $hostName() { + return this['hostName']; + } + + get $el() { + return this.el?.nativeElement; + } + + directivePT = signal(undefined); + + directiveUnstyled = signal(undefined); + + $unstyled = computed(() => { + return this.unstyled() ?? this.directiveUnstyled() ?? this.config?.unstyled() ?? false; + }); + + $pt = computed(() => { + return resolve(this.pt() || this.directivePT(), this.$params); + }); + + get $globalPT() { + return this._getPT(this.config?.pt(), undefined, (value) => resolve(value, this.$params)); + } + + get $defaultPT() { + return this._getPT(this.config?.pt(), undefined, (value) => this._getOptionValue(value, this.$hostName || this.$name, this.$params) || resolve(value, this.$params)); + } + + get $style() { + return { theme: undefined, css: undefined, classes: undefined, inlineStyles: undefined, ...(this._getHostInstance(this) || {}).$style, ...this['_componentStyle'] }; + } + + get $styleOptions() { + return { nonce: this.config?.csp().nonce }; + } + + get $params() { + const parentInstance = this._getHostInstance(this) || this.$parentInstance; + + return { + instance: this as any, + parent: { + instance: parentInstance + } + }; + } + + /******************** Lifecycle Hooks ********************/ + + onInit() { + // NOOP - to be implemented by subclasses + } + + onChanges(changes: SimpleChanges) { + // NOOP - to be implemented by subclasses + } + + onDoCheck() { + // NOOP - to be implemented by subclasses + } + + onAfterContentInit() { + // NOOP - to be implemented by subclasses + } + + onAfterContentChecked() { + // NOOP - to be implemented by subclasses + } + + onAfterViewInit() { + // NOOP - to be implemented by subclasses + } + + onAfterViewChecked() { + // NOOP - to be implemented by subclasses + } + + onDestroy() { + // NOOP - to be implemented by subclasses + } + + /******************** Angular Lifecycle Hooks ********************/ + + constructor() { + // watch _dt_ changes + effect((onCleanup) => { + if (this.document && !isPlatformServer(this.platformId)) { + if (this.dt()) { + this._loadScopedThemeStyles(this.dt()); + this._themeScopedListener = () => this._loadScopedThemeStyles(this.dt()); + this._themeChangeListener('_themeScopedListener', this._themeScopedListener); + } else { + this._unloadScopedThemeStyles(); + } + } + + onCleanup(() => { + this._offThemeChangeListener('_themeScopedListener'); + }); + }); + + // watch _unstyled_ changes + effect((onCleanup) => { + if (this.document && !isPlatformServer(this.platformId)) { + if (!this.$unstyled()) { + this._loadCoreStyles(); + this._themeChangeListener('_loadCoreStyles', this._loadCoreStyles); // Update styles with theme settings + } + } + + onCleanup(() => { + this._offThemeChangeListener('_loadCoreStyles'); + }); + }); + + this._hook('onBeforeInit'); + } + + /** + * ⚠ Do not override ngOnInit! + * + * Use 'onInit()' in subclasses instead. + */ + ngOnInit() { + this._loadCoreStyles(); + this._loadStyles(); + + this.onInit(); + this._hook('onInit'); + } + + /** + * ⚠ Do not override ngOnChanges! + * + * Use 'onChanges(changes: SimpleChanges)' in subclasses instead. + */ + ngOnChanges(changes: SimpleChanges) { + this.onChanges(changes); + this._hook('onChanges', changes); + } + + /** + * ⚠ Do not override ngDoCheck! + * + * Use 'onDoCheck()' in subclasses instead. + */ + ngDoCheck() { + this.onDoCheck(); + this._hook('onDoCheck'); + } + + /** + * ⚠ Do not override ngAfterContentInit! + * + * Use 'onAfterContentInit()' in subclasses instead. + */ + ngAfterContentInit() { + this.onAfterContentInit(); + this._hook('onAfterContentInit'); + } + + /** + * ⚠ Do not override ngAfterContentChecked! + * + * Use 'onAfterContentChecked()' in subclasses instead. + */ + ngAfterContentChecked() { + this.onAfterContentChecked(); + this._hook('onAfterContentChecked'); + } + + /** + * ⚠ Do not override ngAfterViewInit! + * + * Use 'onAfterViewInit()' in subclasses instead. + */ + ngAfterViewInit() { + // @todo - remove this after implementing pt for root + this.$el?.setAttribute(this.$attrSelector, ''); + + this.onAfterViewInit(); + this._hook('onAfterViewInit'); + } + + /** + * ⚠ Do not override ngAfterViewChecked! + * + * Use 'onAfterViewChecked()' in subclasses instead. + */ + ngAfterViewChecked() { + this.onAfterViewChecked(); + this._hook('onAfterViewChecked'); + } + + /** + * ⚠ Do not override ngOnDestroy! + * + * Use 'onDestroy()' in subclasses instead. + */ + ngOnDestroy() { + this._removeThemeListeners(); + this._unloadScopedThemeStyles(); + + this.onDestroy(); + this._hook('onDestroy'); + } + + /******************** Methods ********************/ + + private _mergeProps(fn: any, ...args: any[]) { + return isFunction(fn) ? fn(...args) : mergeProps(...args); + } + + private _getHostInstance(instance: any) { + return instance ? (this.$hostName ? (this.$name === this.$hostName ? instance : this._getHostInstance(instance.$parentInstance)) : instance.$parentInstance) : undefined; + } + + private _getPropValue(name: string) { + return this[name] || this._getHostInstance(this)?.[name]; + } + + private _getOptionValue(options: any, key = '', params = {}) { + return getKeyValue(options, key, params); + } + + private _hook(hookName: string, ...args: any[]) { + if (!this.$hostName) { + const selfHook = this._usePT(this._getPT(this.$pt(), this.$name), this._getOptionValue, `hooks.${hookName}`); + const defaultHook = this._useDefaultPT(this._getOptionValue, `hooks.${hookName}`); + + selfHook?.(...args); + defaultHook?.(...args); + } + } + + /********** Load Styles **********/ + + private _load() { + if (!Base.isStyleNameLoaded('base')) { + this.baseStyle.loadBaseCSS(this.$styleOptions); + this._loadGlobalStyles(); + + Base.setLoadedStyleName('base'); + } + + this._loadThemeStyles(); + } + + private _loadStyles() { + this._load(); + this._themeChangeListener('_load', () => this._load()); + } + + private _loadGlobalStyles() { + const globalCSS = this._useGlobalPT(this._getOptionValue, 'global.css', this.$params); + + isNotEmpty(globalCSS) && this.baseStyle.load(globalCSS, { name: 'global', ...this.$styleOptions }); + } + + private _loadCoreStyles() { + if (!Base.isStyleNameLoaded(this.$style?.name) && this.$style?.name) { + this.baseComponentStyle.loadCSS(this.$styleOptions); + this.$style.loadCSS(this.$styleOptions); + + Base.setLoadedStyleName(this.$style.name); + } + } + + private _loadThemeStyles() { + if (this.$unstyled() || this.config?.theme() === 'none') return; + + // common + if (!Theme.isStyleNameLoaded('common')) { + const { primitive, semantic, global, style } = this.$style?.getCommonTheme?.() || {}; + + this.baseStyle.load(primitive?.css, { name: 'primitive-variables', ...this.$styleOptions }); + this.baseStyle.load(semantic?.css, { name: 'semantic-variables', ...this.$styleOptions }); + this.baseStyle.load(global?.css, { name: 'global-variables', ...this.$styleOptions }); + this.baseStyle.loadBaseStyle({ name: 'global-style', ...this.$styleOptions }, style); + + Theme.setLoadedStyleName('common'); + } + + // component + if (!Theme.isStyleNameLoaded(this.$style?.name) && this.$style?.name) { + const { css, style } = this.$style?.getComponentTheme?.() || {}; + + this.$style?.load(css, { name: `${this.$style?.name}-variables`, ...this.$styleOptions }); + this.$style?.loadStyle({ name: `${this.$style?.name}-style`, ...this.$styleOptions }, style); + + Theme.setLoadedStyleName(this.$style?.name); + } + + // layer order + if (!Theme.isStyleNameLoaded('layer-order')) { + const layerOrder = this.$style?.getLayerOrderThemeCSS?.(); + + this.baseStyle.load(layerOrder, { name: 'layer-order', first: true, ...this.$styleOptions }); + Theme.setLoadedStyleName('layer-order'); + } + } + + private _loadScopedThemeStyles(preset) { + const { css } = this.$style?.getPresetTheme?.(preset, `[${this.$attrSelector}]`) || {}; + const scopedStyle = this.$style?.load(css, { name: `${this.$attrSelector}-${this.$style?.name}`, ...this.$styleOptions }); + + this.scopedStyleEl = scopedStyle?.el; + } + + private _unloadScopedThemeStyles() { + this.scopedStyleEl?.remove(); + } + + private _themeChangeListener(id: string, callback = () => {}) { + this._offThemeChangeListener(id); + Base.clearLoadedStyleNames(); + const hold = callback.bind(this); + this.themeChangeListenerMap.set(id, hold); + ThemeService.on('theme:change', hold); + } + + private _removeThemeListeners() { + this._offThemeChangeListener('_themeScopedListener'); + this._offThemeChangeListener('_loadCoreStyles'); + this._offThemeChangeListener('_load'); + } + + private _offThemeChangeListener(id: string) { + if (this.themeChangeListenerMap.has(id)) { + ThemeService.off('theme:change', this.themeChangeListenerMap.get(id)); + this.themeChangeListenerMap.delete(id); + } + } + + /********** Passthrough **********/ + + private _getPTValue(obj = {}, key = '', params = {}, searchInDefaultPT = true) { + const searchOut = /./g.test(key) && !!params[key.split('.')[0]]; + const { mergeSections = true, mergeProps: useMergeProps = false } = this._getPropValue('ptOptions')?.() || this.config?.['ptOptions']?.() || {}; + const global = searchInDefaultPT ? (searchOut ? this._useGlobalPT(this._getPTClassValue, key, params) : this._useDefaultPT(this._getPTClassValue, key, params)) : undefined; + const self = searchOut ? undefined : this._usePT(this._getPT(obj, this.$hostName || this.$name), this._getPTClassValue, key, { ...params, global: global || {} }); + const datasets = this._getPTDatasets(key); + + return mergeSections || (!mergeSections && self) ? (useMergeProps ? this._mergeProps(useMergeProps, global, self, datasets) : { ...global, ...self, ...datasets }) : { ...self, ...datasets }; + } + + private _getPTDatasets(key = '') { + const datasetPrefix = 'data-pc-'; + const isExtended = key === 'root' && isNotEmpty(this.$pt()?.['data-pc-section']); + + return ( + key !== 'transition' && { + ...(key === 'root' && { + [`${datasetPrefix}name`]: toFlatCase(isExtended ? this.$pt()?.['data-pc-section'] : this.$name), + ...(isExtended && { [`${datasetPrefix}extend`]: toFlatCase(this.$name) }), + [`${this.$attrSelector}`]: '' // @todo - use `data-pc-id: this.$attrSelector` instead. + }), + [`${datasetPrefix}section`]: toFlatCase(key.includes('.') ? (key.split('.').at(-1) ?? '') : key) + } + ); + } + + private _getPTClassValue(options?: any, key?: any, params?: any) { + const value = this._getOptionValue(options, key, params); + + return isString(value) || isArray(value) ? { class: value } : value; + } + + private _getPT(pt: any, key = '', callback?: any) { + const getValue = (value, checkSameKey = false) => { + const computedValue = callback ? callback(value) : value; + const _key = toFlatCase(key); + const _cKey = toFlatCase(this.$hostName || this.$name); + + return (checkSameKey ? (_key !== _cKey ? computedValue?.[_key] : undefined) : computedValue?.[_key]) ?? computedValue; + }; + + return pt?.hasOwnProperty('_usept') + ? { + _usept: pt['_usept'], + originalValue: getValue(pt.originalValue), + value: getValue(pt.value) + } + : getValue(pt, true); + } + + private _usePT(pt: any, callback: any, key: any, params?: any) { + const fn = (value) => callback?.call(this, value, key, params); + + if (pt?.hasOwnProperty('_usept')) { + const { mergeSections = true, mergeProps: useMergeProps = false } = pt['_usept'] || this.config?.['ptOptions']() || {}; + const originalValue = fn(pt.originalValue); + const value = fn(pt.value); + + if (originalValue === undefined && value === undefined) return undefined; + else if (isString(value)) return value; + else if (isString(originalValue)) return originalValue; + + return mergeSections || (!mergeSections && value) ? (useMergeProps ? this._mergeProps(useMergeProps, originalValue, value) : { ...originalValue, ...value }) : value; + } + + return fn(pt); + } + + private _useGlobalPT(callback: any, key: any, params?: any) { + return this._usePT(this.$globalPT, callback, key, params); + } + + private _useDefaultPT(callback: any, key: any, params?: any) { + return this._usePT(this.$defaultPT, callback, key, params); + } + + /******************** Exposed API ********************/ + + public ptm(key = '', params = {}) { + return this._getPTValue(this.$pt() as any, key, { ...this.$params, ...params }); + } + + public ptms(keys: string[], params = {}) { + return keys.reduce((acc, arg) => { + acc = mergeProps(acc, this.ptm(arg, params)) || {}; + return acc; + }, {}); + } + + public ptmo(obj = {}, key = '', params = {}) { + return this._getPTValue(obj, key, { instance: this, ...params }, false); + } + + public cx(key: string, params = {}): string { + return (!this.$unstyled() ? cn(this._getOptionValue(this.$style.classes, key, { ...this.$params, ...params })) : undefined) ?? ''; + } + + public sx(key = '', when = true, params = {}) { + if (when) { + const self = this._getOptionValue(this.$style.inlineStyles, key, { ...this.$params, ...params }) as Record; + const base = this._getOptionValue(this.baseComponentStyle.inlineStyles, key, { ...this.$params, ...params }) as Record; + + return { ...base, ...self }; + } + + return undefined; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/basecomponent/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/basecomponent/public_api.ts new file mode 100644 index 000000000..5fad279d6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/basecomponent/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/basecomponent/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './basecomponent'; +export * from './style/basecomponentstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/basecomponent/style/basecomponentstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/basecomponent/style/basecomponentstyle.ts new file mode 100644 index 000000000..19ed79ce4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/basecomponent/style/basecomponentstyle.ts @@ -0,0 +1,16 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/basecomponent/style/basecomponentstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { BaseStyle } from '../../base/public_api'; + +@Injectable({ providedIn: 'root' }) +export class BaseComponentStyle extends BaseStyle { + name = 'common'; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/baseeditableholder/baseeditableholder.ts b/projects/cps-ui-kit/src/lib/primeng-temp/baseeditableholder/baseeditableholder.ts new file mode 100644 index 000000000..45d5d7965 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/baseeditableholder/baseeditableholder.ts @@ -0,0 +1,74 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/baseeditableholder/baseeditableholder.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { booleanAttribute, computed, Directive, input, signal } from '@angular/core'; +import { ControlValueAccessor } from '@angular/forms'; +import { BaseModelHolder } from '../basemodelholder/public_api'; + +@Directive({ standalone: true }) +export class BaseEditableHolder extends BaseModelHolder implements ControlValueAccessor { + /** + * There must be a value (if set). + * @defaultValue false + * @group Props + */ + required = input(undefined, { transform: booleanAttribute }); + /** + * When present, it specifies that the component should have invalid state style. + * @defaultValue false + * @group Props + */ + invalid = input(undefined, { transform: booleanAttribute }); + /** + * When present, it specifies that the component should have disabled state style. + * @defaultValue false + * @group Props + */ + disabled = input(undefined, { transform: booleanAttribute }); + /** + * When present, it specifies that the name of the input. + * @defaultValue undefined + * @group Props + */ + name = input(); + + _disabled = signal(false); + + $disabled = computed(() => this.disabled() || this._disabled()); + + onModelChange: Function = () => {}; + + onModelTouched: Function = () => {}; + + writeDisabledState(value: boolean) { + this._disabled.set(value); + } + + writeControlValue(value: any, setModelValue?: (value: any) => void) { + // NOOP - this method should be overridden in the derived classes + } + + /**** Angular ControlValueAccessors ****/ + writeValue(value: any) { + this.writeControlValue(value, this.writeModelValue.bind(this)); + } + + registerOnChange(fn: Function) { + this.onModelChange = fn; + } + + registerOnTouched(fn: Function) { + this.onModelTouched = fn; + } + + setDisabledState(val: boolean) { + this.writeDisabledState(val); + this.cd.markForCheck(); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/baseeditableholder/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/baseeditableholder/public_api.ts new file mode 100644 index 000000000..f2d3e82be --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/baseeditableholder/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/baseeditableholder/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './baseeditableholder'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/baseinput/baseinput.ts b/projects/cps-ui-kit/src/lib/primeng-temp/baseinput/baseinput.ts new file mode 100644 index 000000000..515f19ada --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/baseinput/baseinput.ts @@ -0,0 +1,84 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/baseinput/baseinput.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { booleanAttribute, computed, Directive, inject, input } from '@angular/core'; +import { BaseEditableHolder } from '../baseeditableholder/public_api'; +import { Fluid } from '../fluid/public_api'; + +@Directive({ standalone: true }) +export class BaseInput extends BaseEditableHolder { + pcFluid: Fluid | null = inject(Fluid, { optional: true, host: true, skipSelf: true }); + + /** + * Spans 100% width of the container when enabled. + * @defaultValue false + * @group Props + */ + fluid = input(undefined, { transform: booleanAttribute }); + /** + * Specifies the input variant of the component. + * @defaultValue 'outlined' + * @group Props + */ + variant = input<'filled' | 'outlined' | undefined>(); + /** + * Specifies the size of the component. + * @defaultValue undefined + * @group Props + */ + size = input<'large' | 'small' | undefined>(); + /** + * Specifies the visible width of the input element in characters. + * @defaultValue undefined + * @group Props + */ + inputSize = input(); + /** + * Specifies the value must match the pattern. + * @defaultValue undefined + * @group Props + */ + pattern = input(); + /** + * The value must be greater than or equal to the value. + * @defaultValue undefined + * @group Props + */ + min = input(); + /** + * The value must be less than or equal to the value. + * @defaultValue undefined + * @group Props + */ + max = input(); + /** + * Unless the step is set to the any literal, the value must be min + an integral multiple of the step. + * @defaultValue undefined + * @group Props + */ + step = input(); + /** + * The number of characters (code points) must not be less than the value of the attribute, if non-empty. + * @defaultValue undefined + * @group Props + */ + minlength = input(); + /** + * The number of characters (code points) must not exceed the value of the attribute. + * @defaultValue undefined + * @group Props + */ + maxlength = input(); + + $variant = computed(() => this.variant() || this.config.inputStyle() || this.config.inputVariant()); + + get hasFluid() { + return this.fluid() ?? !!this.pcFluid; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/baseinput/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/baseinput/public_api.ts new file mode 100644 index 000000000..e8217643f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/baseinput/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/baseinput/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './baseinput'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/basemodelholder/basemodelholder.ts b/projects/cps-ui-kit/src/lib/primeng-temp/basemodelholder/basemodelholder.ts new file mode 100644 index 000000000..b459f19c0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/basemodelholder/basemodelholder.ts @@ -0,0 +1,23 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/basemodelholder/basemodelholder.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { computed, Directive, signal } from '@angular/core'; +import { isNotEmpty } from '../../primeuix-temp/utils/src/index'; +import { BaseComponent } from '../basecomponent/public_api'; + +@Directive({ standalone: true }) +export class BaseModelHolder extends BaseComponent { + modelValue = signal(undefined); + + $filled = computed(() => isNotEmpty(this.modelValue())); + + writeModelValue(value: any) { + this.modelValue.set(value); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/basemodelholder/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/basemodelholder/public_api.ts new file mode 100644 index 000000000..a3444222f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/basemodelholder/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/basemodelholder/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './basemodelholder'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/bind/bind.ts b/projects/cps-ui-kit/src/lib/primeng-temp/bind/bind.ts new file mode 100644 index 000000000..03773a793 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/bind/bind.ts @@ -0,0 +1,90 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/bind/bind.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { computed, Directive, effect, ElementRef, input, NgModule, Renderer2, signal } from '@angular/core'; +import { cn, equals } from '../../primeuix-temp/utils/src/index'; + +/** + * Bind directive provides dynamic attribute, property, and event listener binding functionality. + * @group Components + */ +@Directive({ + selector: '[pBind]', + standalone: true, + host: { + '[style]': 'styles()', + '[class]': 'classes()' + } +}) +export class Bind { + /** + * Dynamic attributes, properties, and event listeners to be applied to the host element. + * @group Props + */ + pBind = input<{ [key: string]: any } | undefined>(undefined); + + private _attrs = signal<{ [key: string]: any } | undefined>(undefined); + private attrs = computed(() => this._attrs() || this.pBind()); + + styles = computed(() => this.attrs()?.style); + classes = computed(() => cn(this.attrs()?.class)); + + private listeners: { eventName: string; unlisten: () => void }[] = []; + + constructor( + private el: ElementRef, + private renderer: Renderer2 + ) { + effect(() => { + const { style, class: className, ...rest } = this.attrs() || {}; + + for (const [key, value] of Object.entries(rest)) { + if (key.startsWith('on') && typeof value === 'function') { + const eventName = key.slice(2).toLowerCase(); + + // add listener if not already added + if (!this.listeners.some((l) => l.eventName === eventName)) { + const unlisten = this.renderer.listen(this.el.nativeElement, eventName, value); + this.listeners.push({ eventName, unlisten }); + } + } else if (value === null || value === undefined) { + // remove attr + this.renderer.removeAttribute(this.el.nativeElement, key); + } else { + // attr & prop fallback + this.renderer.setAttribute(this.el.nativeElement, key, value.toString()); + if (key in this.el.nativeElement) { + (this.el.nativeElement as any)[key] = value; + } + } + } + }); + } + + ngOnDestroy() { + this.clearListeners(); + } + + public setAttrs(attrs: { [key: string]: any } | undefined) { + if (!equals(this._attrs(), attrs)) { + this._attrs.set(attrs); + } + } + + private clearListeners() { + this.listeners.forEach(({ unlisten }) => unlisten()); + this.listeners = []; + } +} + +@NgModule({ + imports: [Bind], + exports: [Bind] +}) +export class BindModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/bind/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/bind/public_api.ts new file mode 100644 index 000000000..14427aa78 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/bind/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/bind/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './bind'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/button/button.ts b/projects/cps-ui-kit/src/lib/primeng-temp/button/button.ts new file mode 100755 index 000000000..330ddbc10 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/button/button.ts @@ -0,0 +1,932 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/button/button.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule, isPlatformBrowser } from '@angular/common'; +import { + booleanAttribute, + ChangeDetectionStrategy, + Component, + computed, + ContentChild, + contentChild, + ContentChildren, + Directive, + effect, + EventEmitter, + inject, + InjectionToken, + input, + Input, + NgModule, + numberAttribute, + Output, + QueryList, + TemplateRef, + ViewEncapsulation +} from '@angular/core'; +import { addClass, createElement, findSingle, isEmpty } from '../../primeuix-temp/utils/src/index'; +import { PrimeTemplate, SharedModule } from '../api/public_api'; +import { AutoFocus } from '../autofocus/public_api'; +import { BadgeModule } from '../badge/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind } from '../bind/public_api'; +import { Fluid } from '../fluid/public_api'; +import { SpinnerIcon } from '../icons/public_api'; +import { Ripple } from '../ripple/public_api'; +import type { ButtonIconTemplateContext, ButtonLoadingIconTemplateContext, ButtonPassThrough, ButtonProps, ButtonSeverity } from '../types/button/public_api'; +import { ButtonStyle } from './style/buttonstyle'; + +const BUTTON_INSTANCE = new InjectionToken + `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + providers: [ButtonStyle, { provide: BUTTON_INSTANCE, useExisting: Button }, { provide: PARENT_INSTANCE, useExisting: Button }], + hostDirectives: [Bind] +}) +export class Button extends BaseComponent { + componentName = 'Button'; + + @Input() hostName: any = ''; + + $pcButton: Button | undefined = inject(BUTTON_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + bindDirectiveInstance = inject(Bind, { self: true }); + + _componentStyle = inject(ButtonStyle); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('host')); + } + + /** + * Type of the button. + * @group Props + */ + @Input() type: string = 'button'; + + /** + * Value of the badge. + * @group Props + */ + @Input() badge: string | undefined; + + /** + * When present, it specifies that the component should be disabled. + * @group Props + */ + @Input({ transform: booleanAttribute }) disabled: boolean | undefined; + + /** + * Add a shadow to indicate elevation. + * @group Props + */ + @Input({ transform: booleanAttribute }) raised: boolean = false; + + /** + * Add a circular border radius to the button. + * @group Props + */ + @Input({ transform: booleanAttribute }) rounded: boolean = false; + + /** + * Add a textual class to the button without a background initially. + * @group Props + */ + @Input({ transform: booleanAttribute }) text: boolean = false; + + /** + * Add a plain textual class to the button without a background initially. + * @group Props + */ + @Input({ transform: booleanAttribute }) plain: boolean = false; + + /** + * Add a border class without a background initially. + * @group Props + */ + @Input({ transform: booleanAttribute }) outlined: boolean = false; + + /** + * Add a link style to the button. + * @group Props + */ + @Input({ transform: booleanAttribute }) link: boolean = false; + + /** + * Add a tabindex to the button. + * @group Props + */ + @Input({ transform: numberAttribute }) tabindex: number | undefined; + + /** + * Defines the size of the button. + * @group Props + */ + @Input() size: 'small' | 'large' | undefined; + + /** + * Specifies the variant of the component. + * @group Props + */ + @Input() variant: 'outlined' | 'text' | undefined; + + /** + * Inline style of the element. + * @group Props + */ + @Input() style: { [klass: string]: any } | null | undefined; + + /** + * Class of the element. + * @group Props + */ + @Input() styleClass: string | undefined; + + /** + * Style class of the badge. + * @group Props + * @deprecated use badgeSeverity instead. + */ + @Input() badgeClass: string | undefined; + + /** + * Severity type of the badge. + * @group Props + * @defaultValue secondary + */ + @Input() badgeSeverity: 'success' | 'info' | 'warn' | 'danger' | 'help' | 'primary' | 'secondary' | 'contrast' | null | undefined = 'secondary'; + + /** + * Used to define a string that autocomplete attribute the current element. + * @group Props + */ + @Input() ariaLabel: string | undefined; + + /** + * When present, it specifies that the component should automatically get focus on load. + * @group Props + */ + @Input({ transform: booleanAttribute }) autofocus: boolean | undefined; + + /** + * Position of the icon. + * @group Props + */ + @Input() iconPos: ButtonIconPosition = 'left'; + + /** + * Name of the icon. + * @group Props + */ + @Input() icon: string | undefined; + + /** + * Text of the button. + * @group Props + */ + @Input() label: string | undefined; + + /** + * Whether the button is in loading state. + * @group Props + */ + @Input({ transform: booleanAttribute }) loading: boolean = false; + + /** + * Icon to display in loading state. + * @group Props + */ + @Input() loadingIcon: string | undefined; + + /** + * Defines the style of the button. + * @group Props + */ + @Input() severity: ButtonSeverity; + + /** + * Used to pass all properties of the ButtonProps to the Button component. + * @group Props + */ + @Input() buttonProps: ButtonProps | undefined; + + /** + * Spans 100% width of the container when enabled. + * @defaultValue undefined + * @group Props + */ + fluid = input(undefined, { transform: booleanAttribute }); + + /** + * Callback to execute when button is clicked. + * This event is intended to be used with the component. Using a regular + + + + + + + + + +
+ + + +
+
+
+ + + + + + + + +
+ + + + {{ yearPickerValues()[0] }} - {{ yearPickerValues()[yearPickerValues().length - 1] }} + + +
+ + + + + + + + +
+ + + + + + + + + + + + + +
+ {{ getTranslation('weekHeader') }} + + {{ weekDay }} +
+ + {{ $any(month.weekNumbers)[j] }} + + + + + {{ date.day }} + + + + + + + +
+ {{ date.day }} +
+
+
+
+
+
+ + {{ m }} +
+ {{ m }} +
+
+
+
+ + {{ y }} +
+ {{ y }} +
+
+
+
+
+
+ + + + + + + 0{{ currentHour }} + + + + + + +
+
+ {{ timeSeparator }} +
+
+ + + + + + + 0{{ currentMinute }} + + + + + + +
+
+ {{ timeSeparator }} +
+
+ + + + + + + 0{{ currentSecond }} + + + + + + +
+
+ {{ timeSeparator }} +
+
+ + + + + + + {{ pm ? 'PM' : 'AM' }} + + + + + + +
+
+
+ @if (buttonBarTemplate || _buttonBarTemplate) { + + } @else { + + + } +
+ + +
+
+ `, + providers: [DATEPICKER_VALUE_ACCESSOR, DatePickerStyle, { provide: DATEPICKER_INSTANCE, useExisting: DatePicker }, { provide: PARENT_INSTANCE, useExisting: DatePicker }], + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + host: { + '[class]': "cn(cx('root'), styleClass)", + '[style]': "sx('root')" + } +}) +export class DatePicker extends BaseInput { + componentName = 'DatePicker'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + $pcDatePicker: DatePicker | undefined = inject(DATEPICKER_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + @Input() iconDisplay: 'input' | 'button' = 'button'; + /** + * Style class of the component. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * Inline style of the input field. + * @group Props + */ + @Input() inputStyle: { [klass: string]: any } | null | undefined; + /** + * Identifier of the focus input to match a label defined for the component. + * @group Props + */ + @Input() inputId: string | undefined; + /** + * Style class of the input field. + * @group Props + */ + @Input() inputStyleClass: string | undefined; + /** + * Placeholder text for the input. + * @group Props + */ + @Input() placeholder: string | undefined; + /** + * Establishes relationships between the component and label(s) where its value should be one or more element IDs. + * @group Props + */ + @Input() ariaLabelledBy: string | undefined; + /** + * Defines a string that labels the input for accessibility. + * @group Props + */ + @Input() ariaLabel: string | undefined; + + /** + * Defines a string that labels the icon button for accessibility. + * @group Props + */ + @Input() iconAriaLabel: string | undefined; + /** + * Format of the date which can also be defined at locale settings. + * @group Props + */ + @Input() + get dateFormat(): string | undefined { + return this._dateFormat; + } + set dateFormat(value: string | undefined) { + this._dateFormat = value; + if (this.initialized) { + this.updateInputfield(); + } + } + /** + * Separator for multiple selection mode. + * @group Props + */ + @Input() multipleSeparator: string = ','; + /** + * Separator for joining start and end dates on range selection mode. + * @group Props + */ + @Input() rangeSeparator: string = '-'; + /** + * When enabled, displays the datepicker as inline. Default is false for popup mode. + * @group Props + */ + @Input({ transform: booleanAttribute }) inline: boolean = false; + /** + * Whether to display dates in other months (non-selectable) at the start or end of the current month. To make these days selectable use the selectOtherMonths option. + * @group Props + */ + @Input({ transform: booleanAttribute }) showOtherMonths: boolean = true; + /** + * Whether days in other months shown before or after the current month are selectable. This only applies if the showOtherMonths option is set to true. + * @group Props + */ + @Input({ transform: booleanAttribute }) selectOtherMonths: boolean | undefined; + /** + * When enabled, displays a button with icon next to input. + * @group Props + */ + @Input({ transform: booleanAttribute }) showIcon: boolean | undefined; + /** + * Icon of the datepicker button. + * @group Props + */ + @Input() icon: string | undefined; + /** + * When specified, prevents entering the date manually with keyboard. + * @group Props + */ + @Input({ transform: booleanAttribute }) readonlyInput: boolean | undefined; + /** + * The cutoff year for determining the century for a date. + * @group Props + */ + @Input() shortYearCutoff: any = '+10'; + /** + * Specifies 12 or 24 hour format. + * @group Props + */ + @Input() + get hourFormat(): string { + return this._hourFormat; + } + set hourFormat(value: string) { + this._hourFormat = value; + if (this.initialized) { + this.updateInputfield(); + } + } + /** + * Whether to display timepicker only. + * @group Props + */ + @Input({ transform: booleanAttribute }) timeOnly: boolean | undefined; + /** + * Hours to change per step. + * @group Props + */ + @Input({ transform: numberAttribute }) stepHour: number = 1; + /** + * Minutes to change per step. + * @group Props + */ + @Input({ transform: numberAttribute }) stepMinute: number = 1; + /** + * Seconds to change per step. + * @group Props + */ + @Input({ transform: numberAttribute }) stepSecond: number = 1; + /** + * Whether to show the seconds in time picker. + * @group Props + */ + @Input({ transform: booleanAttribute }) showSeconds: boolean = false; + /** + * When disabled, datepicker will not be visible with input focus. + * @group Props + */ + @Input({ transform: booleanAttribute }) showOnFocus: boolean = true; + /** + * When enabled, datepicker will show week numbers. + * @group Props + */ + @Input({ transform: booleanAttribute }) showWeek: boolean = false; + /** + * When enabled, datepicker will start week numbers from first day of the year. + * @group Props + */ + @Input() startWeekFromFirstDayOfYear: boolean = false; + /** + * When enabled, a clear icon is displayed to clear the value. + * @group Props + */ + @Input({ transform: booleanAttribute }) showClear: boolean = false; + /** + * Type of the value to write back to ngModel, default is date and alternative is string. + * @group Props + */ + @Input() dataType: string = 'date'; + /** + * Defines the quantity of the selection, valid values are "single", "multiple" and "range". + * @group Props + */ + @Input() selectionMode: 'single' | 'multiple' | 'range' | undefined = 'single'; + /** + * Maximum number of selectable dates in multiple mode. + * @group Props + */ + @Input({ transform: numberAttribute }) maxDateCount: number | undefined; + /** + * Whether to display today and clear buttons at the footer + * @group Props + */ + @Input({ transform: booleanAttribute }) showButtonBar: boolean | undefined; + /** + * Style class of the today button. + * @group Props + */ + @Input() todayButtonStyleClass: string | undefined; + /** + * Style class of the clear button. + * @group Props + */ + @Input() clearButtonStyleClass: string | undefined; + /** + * When present, it specifies that the component should automatically get focus on load. + * @group Props + */ + @Input({ transform: booleanAttribute }) autofocus: boolean | undefined; + /** + * Whether to automatically manage layering. + * @group Props + */ + @Input({ transform: booleanAttribute }) autoZIndex: boolean = true; + /** + * Base zIndex value to use in layering. + * @group Props + */ + @Input({ transform: numberAttribute }) baseZIndex: number = 0; + /** + * Style class of the datetimepicker container element. + * @group Props + */ + @Input() panelStyleClass: string | undefined; + /** + * Inline style of the datetimepicker container element. + * @group Props + */ + @Input() panelStyle: any; + /** + * Keep invalid value when input blur. + * @group Props + */ + @Input({ transform: booleanAttribute }) keepInvalid: boolean = false; + /** + * Whether to hide the overlay on date selection. + * @group Props + */ + @Input({ transform: booleanAttribute }) hideOnDateTimeSelect: boolean = true; + /** + * When enabled, datepicker overlay is displayed as optimized for touch devices. + * @group Props + */ + @Input({ transform: booleanAttribute }) touchUI: boolean | undefined; + /** + * Separator of time selector. + * @group Props + */ + @Input() timeSeparator: string = ':'; + /** + * When enabled, can only focus on elements inside the datepicker. + * @group Props + */ + @Input({ transform: booleanAttribute }) focusTrap: boolean = true; + /** + * Transition options of the show animation. + * @group Props + * @deprecated since v21.0.0, use `motionOptions` instead. + */ + @Input() showTransitionOptions: string = '.12s cubic-bezier(0, 0, 0.2, 1)'; + /** + * Transition options of the hide animation. + * @group Props + * @deprecated since v21.0.0, use `motionOptions` instead. + */ + @Input() hideTransitionOptions: string = '.1s linear'; + /** + * Index of the element in tabbing order. + * @group Props + */ + @Input({ transform: numberAttribute }) tabindex: number | undefined; + /** + * The minimum selectable date. + * @group Props + */ + @Input() get minDate(): Date | undefined | null { + return this._minDate; + } + set minDate(date: Date | undefined | null) { + this._minDate = date; + + if (this.currentMonth != undefined && this.currentMonth != null && this.currentYear) { + this.createMonths(this.currentMonth, this.currentYear); + } + } + /** + * The maximum selectable date. + * @group Props + */ + @Input() get maxDate(): Date | undefined | null { + return this._maxDate; + } + set maxDate(date: Date | undefined | null) { + this._maxDate = date; + + if (this.currentMonth != undefined && this.currentMonth != null && this.currentYear) { + this.createMonths(this.currentMonth, this.currentYear); + } + } + /** + * Array with dates that should be disabled (not selectable). + * @group Props + */ + @Input() get disabledDates(): Date[] { + return this._disabledDates; + } + set disabledDates(disabledDates: Date[]) { + this._disabledDates = disabledDates; + if (this.currentMonth != undefined && this.currentMonth != null && this.currentYear) { + this.createMonths(this.currentMonth, this.currentYear); + } + } + /** + * Array with weekday numbers that should be disabled (not selectable). + * @group Props + */ + @Input() get disabledDays(): number[] { + return this._disabledDays; + } + set disabledDays(disabledDays: number[]) { + this._disabledDays = disabledDays; + + if (this.currentMonth != undefined && this.currentMonth != null && this.currentYear) { + this.createMonths(this.currentMonth, this.currentYear); + } + } + /** + * Whether to display timepicker. + * @group Props + */ + @Input() get showTime(): boolean { + return this._showTime; + } + set showTime(showTime: boolean) { + this._showTime = showTime; + + if (this.currentHour === undefined) { + this.initTime(this.value || new Date()); + } + this.updateInputfield(); + } + /** + * An array of options for responsive design. + * @group Props + */ + @Input() get responsiveOptions(): DatePickerResponsiveOptions[] { + return this._responsiveOptions; + } + set responsiveOptions(responsiveOptions: DatePickerResponsiveOptions[]) { + this._responsiveOptions = responsiveOptions; + + this.destroyResponsiveStyleElement(); + this.createResponsiveStyle(); + } + /** + * Number of months to display. + * @group Props + */ + @Input() get numberOfMonths(): number { + return this._numberOfMonths; + } + set numberOfMonths(numberOfMonths: number) { + this._numberOfMonths = numberOfMonths; + + this.destroyResponsiveStyleElement(); + this.createResponsiveStyle(); + } + /** + * Defines the first of the week for various date calculations. + * @group Props + */ + @Input() get firstDayOfWeek(): number { + return this._firstDayOfWeek; + } + set firstDayOfWeek(firstDayOfWeek: number) { + this._firstDayOfWeek = firstDayOfWeek; + + this.createWeekDays(); + } + /** + * Type of view to display, valid values are "date" for datepicker and "month" for month picker. + * @group Props + */ + @Input() get view(): DatePickerTypeView { + return this._view; + } + set view(view: DatePickerTypeView) { + this._view = view; + this.currentView = this._view; + } + /** + * Set the date to highlight on first opening if the field is blank. + * @group Props + */ + @Input() get defaultDate(): Date | null { + return this._defaultDate; + } + set defaultDate(defaultDate: Date | null) { + this._defaultDate = defaultDate!; + + if (this.initialized) { + const date = defaultDate || new Date(); + this.currentMonth = date.getMonth(); + this.currentYear = date.getFullYear(); + this.initTime(date); + this.createMonths(this.currentMonth, this.currentYear); + } + } + /** + * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). + * @defaultValue 'self' + * @group Props + */ + appendTo = input | 'self' | 'body' | null | undefined | any>(undefined); + /** + * The motion options. + * @group Props + */ + motionOptions = input(undefined); + + computedMotionOptions = computed(() => { + return { + ...this.ptm('motion'), + ...this.motionOptions() + }; + }); + /** + * Callback to invoke on focus of input field. + * @param {Event} event - browser event. + * @group Emits + */ + @Output() onFocus: EventEmitter = new EventEmitter(); + /** + * Callback to invoke on blur of input field. + * @param {Event} event - browser event. + * @group Emits + */ + @Output() onBlur: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when date panel closed. + * @param {HTMLDivElement} element - The element being transitioned/animated. + * @group Emits + */ + @Output() onClose: EventEmitter = new EventEmitter(); + /** + * Callback to invoke on date select. + * @param {Date} date - date value. + * @group Emits + */ + @Output() onSelect: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when input field cleared. + * @group Emits + */ + @Output() onClear: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when input field is being typed. + * @param {Event} event - browser event + * @group Emits + */ + @Output() onInput: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when today button is clicked. + * @param {Date} date - today as a date instance. + * @group Emits + */ + @Output() onTodayClick: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when clear button is clicked. + * @param {Event} event - browser event. + * @group Emits + */ + @Output() onClearClick: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a month is changed using the navigators. + * @param {DatePickerMonthChangeEvent} event - custom month change event. + * @group Emits + */ + @Output() onMonthChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a year is changed using the navigators. + * @param {DatePickerYearChangeEvent} event - custom year change event. + * @group Emits + */ + @Output() onYearChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when clicked outside of the date panel. + * @group Emits + */ + @Output() onClickOutside: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when datepicker panel is shown. + * @param {HTMLDivElement} element - The element being transitioned/animated. + * @group Emits + */ + @Output() onShow: EventEmitter = new EventEmitter(); + + @ViewChild('inputfield', { static: false }) inputfieldViewChild: Nullable; + + @ViewChild('contentWrapper', { static: false }) set content(content: ElementRef) { + this.contentViewChild = content; + + if (this.contentViewChild && this.overlay) { + if (this.isMonthNavigate) { + Promise.resolve(null).then(() => this.updateFocus()); + this.isMonthNavigate = false; + } else { + if (!this.focus && !this.inline) { + this.initFocusableCell(); + } + } + } + } + + _componentStyle = inject(DatePickerStyle); + + contentViewChild!: ElementRef; + + value: any; + + dates: Nullable; + + months!: Month[]; + + weekDays: Nullable; + + currentMonth!: number; + + currentYear!: number; + + currentHour: Nullable; + + currentMinute: Nullable; + + currentSecond: Nullable; + p; + pm: Nullable; + + mask: Nullable; + + maskClickListener: VoidListener; + + overlay: Nullable; + + responsiveStyleElement: HTMLStyleElement | undefined | null; + + overlayVisible: Nullable; + + overlayMinWidth: Nullable; + + $appendTo = computed(() => this.appendTo() || this.config.overlayAppendTo()); + + calendarElement: Nullable; + + timePickerTimer: any; + + documentClickListener: VoidListener; + + animationEndListener: VoidListener; + + ticksTo1970: Nullable; + + yearOptions: Nullable; + + focus: Nullable; + + isKeydown: Nullable; + + _minDate?: Date | null; + + _maxDate?: Date | null; + + _dateFormat: string | undefined; + + _hourFormat: string = '24'; + + _showTime!: boolean; + + _yearRange!: string; + + preventDocumentListener: Nullable; + + dayClass(date) { + return this._componentStyle.classes.day({ instance: this, date: date }); + } + + /** + * Custom template for date cells. + * @param {DatePickerDateTemplateContext} context - date template context. + * @group Templates + */ + @ContentChild('date', { descendants: false }) dateTemplate: Nullable>; + + /** + * Custom template for header section. + * @group Templates + */ + @ContentChild('header', { descendants: false }) headerTemplate: Nullable>; + + /** + * Custom template for footer section. + * @group Templates + */ + @ContentChild('footer', { descendants: false }) footerTemplate: Nullable>; + + /** + * Custom template for disabled date cells. + * @param {DatePickerDisabledDateTemplateContext} context - disabled date template context. + * @group Templates + */ + @ContentChild('disabledDate', { descendants: false }) disabledDateTemplate: Nullable>; + + /** + * Custom template for decade view. + * @param {DatePickerDecadeTemplateContext} context - decade template context. + * @group Templates + */ + @ContentChild('decade', { descendants: false }) decadeTemplate: Nullable>; + + /** + * Custom template for previous month icon. + * @group Templates + */ + @ContentChild('previousicon', { descendants: false }) previousIconTemplate: Nullable>; + + /** + * Custom template for next month icon. + * @group Templates + */ + @ContentChild('nexticon', { descendants: false }) nextIconTemplate: Nullable>; + + /** + * Custom template for trigger icon. + * @group Templates + */ + @ContentChild('triggericon', { descendants: false }) triggerIconTemplate: Nullable>; + + /** + * Custom template for clear icon. + * @group Templates + */ + @ContentChild('clearicon', { descendants: false }) clearIconTemplate: Nullable>; + + /** + * Custom template for decrement icon. + * @group Templates + */ + @ContentChild('decrementicon', { descendants: false }) decrementIconTemplate: Nullable>; + + /** + * Custom template for increment icon. + * @group Templates + */ + @ContentChild('incrementicon', { descendants: false }) incrementIconTemplate: Nullable>; + + /** + * Custom template for input icon. + * @param {DatePickerInputIconTemplateContext} context - input icon template context. + * @group Templates + */ + @ContentChild('inputicon', { descendants: false }) inputIconTemplate: Nullable>; + + /** + * Custom template for button bar. + * @param {DatePickerButtonBarTemplateContext} context - button bar template context. + * @group Templates + */ + @ContentChild('buttonbar', { descendants: false }) buttonBarTemplate: Nullable>; + + _dateTemplate: TemplateRef | undefined; + + _headerTemplate: TemplateRef | undefined; + + _footerTemplate: TemplateRef | undefined; + + _disabledDateTemplate: TemplateRef | undefined; + + _decadeTemplate: TemplateRef | undefined; + + _previousIconTemplate: TemplateRef | undefined; + + _nextIconTemplate: TemplateRef | undefined; + + _triggerIconTemplate: TemplateRef | undefined; + + _clearIconTemplate: TemplateRef | undefined; + + _decrementIconTemplate: TemplateRef | undefined; + + _incrementIconTemplate: TemplateRef | undefined; + + _inputIconTemplate: TemplateRef | undefined; + + _buttonBarTemplate: TemplateRef | undefined; + + _disabledDates!: Array; + + _disabledDays!: Array; + + selectElement: Nullable; + + todayElement: Nullable; + + focusElement: Nullable; + + scrollHandler: Nullable; + + documentResizeListener: VoidListener; + + navigationState: Nullable = null; + + isMonthNavigate: Nullable; + + initialized: Nullable; + + translationSubscription: Nullable; + + _locale!: LocaleSettings; + + _responsiveOptions!: DatePickerResponsiveOptions[]; + + currentView: Nullable; + + attributeSelector: Nullable; + + panelId: Nullable; + + _numberOfMonths: number = 1; + + _firstDayOfWeek!: number; + + _view: DatePickerTypeView = 'date'; + + preventFocus: Nullable; + + _defaultDate!: Date; + + _focusKey: Nullable = null; + + private window: Window; + + get locale() { + return this._locale; + } + + get iconButtonAriaLabel() { + return this.iconAriaLabel ? this.iconAriaLabel : this.getTranslation('chooseDate'); + } + + get prevIconAriaLabel() { + return this.currentView === 'year' ? this.getTranslation('prevDecade') : this.currentView === 'month' ? this.getTranslation('prevYear') : this.getTranslation('prevMonth'); + } + + get nextIconAriaLabel() { + return this.currentView === 'year' ? this.getTranslation('nextDecade') : this.currentView === 'month' ? this.getTranslation('nextYear') : this.getTranslation('nextMonth'); + } + + constructor( + private zone: NgZone, + public overlayService: OverlayService + ) { + super(); + this.window = this.document.defaultView as Window; + } + + onInit() { + this.attributeSelector = uuid('pn_id_'); + this.panelId = this.attributeSelector + '_panel'; + const date = this.defaultDate || new Date(); + this.createResponsiveStyle(); + this.currentMonth = date.getMonth(); + this.currentYear = date.getFullYear(); + this.yearOptions = []; + this.currentView = this.view; + + if (this.view === 'date') { + this.createWeekDays(); + this.initTime(date); + this.createMonths(this.currentMonth, this.currentYear); + this.ticksTo1970 = ((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000; + } + + this.translationSubscription = this.config.translationObserver.subscribe(() => { + this.createWeekDays(); + this.cd.markForCheck(); + }); + + this.initialized = true; + } + + onAfterViewInit() { + if (this.inline) { + this.contentViewChild && this.contentViewChild.nativeElement.setAttribute(this.attributeSelector, ''); + } else { + if (!this.$disabled() && this.overlay) { + this.initFocusableCell(); + if (this.numberOfMonths === 1) { + if (this.contentViewChild && this.contentViewChild.nativeElement) { + this.contentViewChild.nativeElement.style.width = getOuterWidth(this.el?.nativeElement) + 'px'; + } + } + } + } + } + + onAfterViewChecked() { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + + @ContentChildren(PrimeTemplate) templates!: QueryList; + + onAfterContentInit() { + this.templates.forEach((item) => { + switch (item.getType()) { + case 'date': + this._dateTemplate = item.template; + break; + + case 'decade': + this._decadeTemplate = item.template; + break; + + case 'disabledDate': + this._disabledDateTemplate = item.template; + break; + + case 'header': + this._headerTemplate = item.template; + break; + + case 'inputicon': + this._inputIconTemplate = item.template; + break; + + case 'buttonbar': + this._buttonBarTemplate = item.template; + break; + + case 'previousicon': + this._previousIconTemplate = item.template; + break; + + case 'nexticon': + this._nextIconTemplate = item.template; + break; + + case 'triggericon': + this._triggerIconTemplate = item.template; + break; + + case 'clearicon': + this._clearIconTemplate = item.template; + break; + + case 'decrementicon': + this._decrementIconTemplate = item.template; + break; + + case 'incrementicon': + this._incrementIconTemplate = item.template; + break; + + case 'footer': + this._footerTemplate = item.template; + break; + + default: + this._dateTemplate = item.template; + break; + } + }); + } + + getTranslation(option: string) { + return this.config.getTranslation(option); + } + + populateYearOptions(start: number, end: number) { + this.yearOptions = []; + + for (let i = start; i <= end; i++) { + this.yearOptions.push(i); + } + } + + createWeekDays() { + this.weekDays = []; + let dayIndex = this.getFirstDateOfWeek(); + let dayLabels = this.getTranslation(TranslationKeys.DAY_NAMES_MIN); + for (let i = 0; i < 7; i++) { + this.weekDays.push(dayLabels[dayIndex]); + dayIndex = dayIndex == 6 ? 0 : ++dayIndex; + } + } + + monthPickerValues() { + let monthPickerValues: any[] = []; + for (let i = 0; i <= 11; i++) { + monthPickerValues.push(this.config.getTranslation('monthNamesShort')[i]); + } + + return monthPickerValues; + } + + yearPickerValues() { + let yearPickerValues: any[] = []; + let base = this.currentYear - (this.currentYear % 10); + for (let i = 0; i < 10; i++) { + yearPickerValues.push(base + i); + } + + return yearPickerValues; + } + + createMonths(month: number, year: number) { + this.months = this.months = []; + for (let i = 0; i < this.numberOfMonths; i++) { + let m = month + i; + let y = year; + if (m > 11) { + m = m % 12; + y = year + Math.floor((month + i) / 12); + } + + this.months.push(this.createMonth(m, y)); + } + } + + getWeekNumber(date: Date) { + let checkDate = new Date(date.getTime()); + if (this.startWeekFromFirstDayOfYear) { + let firstDayOfWeek: number = +this.getFirstDateOfWeek(); + checkDate.setDate(checkDate.getDate() + 6 + firstDayOfWeek - checkDate.getDay()); + } else { + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + } + let time = checkDate.getTime(); + checkDate.setMonth(0); + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate.getTime()) / 86400000) / 7) + 1; + } + + createMonth(month: number, year: number): Month { + let dates = []; + let firstDay = this.getFirstDayOfMonthIndex(month, year); + let daysLength = this.getDaysCountInMonth(month, year); + let prevMonthDaysLength = this.getDaysCountInPrevMonth(month, year); + let dayNo = 1; + let today = new Date(); + let weekNumbers = []; + let monthRows = Math.ceil((daysLength + firstDay) / 7); + + for (let i = 0; i < monthRows; i++) { + let week: any[] = []; + + if (i == 0) { + for (let j = prevMonthDaysLength - firstDay + 1; j <= prevMonthDaysLength; j++) { + let prev = this.getPreviousMonthAndYear(month, year); + week.push({ + day: j, + month: prev.month, + year: prev.year, + otherMonth: true, + today: this.isToday(today, j, prev.month, prev.year), + selectable: this.isSelectable(j, prev.month, prev.year, true) + }); + } + + let remainingDaysLength = 7 - week.length; + for (let j = 0; j < remainingDaysLength; j++) { + week.push({ + day: dayNo, + month: month, + year: year, + today: this.isToday(today, dayNo, month, year), + selectable: this.isSelectable(dayNo, month, year, false) + }); + dayNo++; + } + } else { + for (let j = 0; j < 7; j++) { + if (dayNo > daysLength) { + let next = this.getNextMonthAndYear(month, year); + week.push({ + day: dayNo - daysLength, + month: next.month, + year: next.year, + otherMonth: true, + today: this.isToday(today, dayNo - daysLength, next.month, next.year), + selectable: this.isSelectable(dayNo - daysLength, next.month, next.year, true) + }); + } else { + week.push({ + day: dayNo, + month: month, + year: year, + today: this.isToday(today, dayNo, month, year), + selectable: this.isSelectable(dayNo, month, year, false) + }); + } + + dayNo++; + } + } + + if (this.showWeek) { + (weekNumbers as any[]).push(this.getWeekNumber(new Date(week[0].year, week[0].month, week[0].day))); + } + + (dates as any[]).push(week); + } + + return { + month: month, + year: year, + dates: dates, + weekNumbers: weekNumbers + }; + } + + initTime(date: Date) { + this.pm = date.getHours() > 11; + + if (this.showTime) { + this.currentMinute = date.getMinutes(); + this.currentSecond = this.showSeconds ? date.getSeconds() : 0; + this.setCurrentHourPM(date.getHours()); + } else if (this.timeOnly) { + this.currentMinute = 0; + this.currentHour = 0; + this.currentSecond = 0; + } + } + + navBackward(event: any) { + if (this.$disabled()) { + event.preventDefault(); + return; + } + + this.isMonthNavigate = true; + + if (this.currentView === 'month') { + this.decrementYear(); + setTimeout(() => { + this.updateFocus(); + }, 1); + } else if (this.currentView === 'year') { + this.decrementDecade(); + setTimeout(() => { + this.updateFocus(); + }, 1); + } else { + if (this.currentMonth === 0) { + this.currentMonth = 11; + this.decrementYear(); + } else { + this.currentMonth--; + } + + this.onMonthChange.emit({ month: this.currentMonth + 1, year: this.currentYear }); + this.createMonths(this.currentMonth, this.currentYear); + } + } + + navForward(event: any) { + if (this.$disabled()) { + event.preventDefault(); + return; + } + + this.isMonthNavigate = true; + + if (this.currentView === 'month') { + this.incrementYear(); + setTimeout(() => { + this.updateFocus(); + }, 1); + } else if (this.currentView === 'year') { + this.incrementDecade(); + setTimeout(() => { + this.updateFocus(); + }, 1); + } else { + if (this.currentMonth === 11) { + this.currentMonth = 0; + this.incrementYear(); + } else { + this.currentMonth++; + } + + this.onMonthChange.emit({ month: this.currentMonth + 1, year: this.currentYear }); + this.createMonths(this.currentMonth, this.currentYear); + } + } + + decrementYear() { + this.currentYear--; + let _yearOptions = this.yearOptions; + + if (this.currentYear < _yearOptions[0]) { + let difference = _yearOptions[_yearOptions.length - 1] - _yearOptions[0]; + this.populateYearOptions(_yearOptions[0] - difference, _yearOptions[_yearOptions.length - 1] - difference); + } + } + + decrementDecade() { + this.currentYear = this.currentYear - 10; + } + + incrementDecade() { + this.currentYear = this.currentYear + 10; + } + + incrementYear() { + this.currentYear++; + let _yearOptions = this.yearOptions; + + if (this.currentYear > _yearOptions[_yearOptions.length - 1]) { + let difference = _yearOptions[_yearOptions.length - 1] - _yearOptions[0]; + this.populateYearOptions(_yearOptions[0] + difference, _yearOptions[_yearOptions.length - 1] + difference); + } + } + + switchToMonthView(event: Event) { + this.setCurrentView('month'); + event.preventDefault(); + } + + switchToYearView(event: Event) { + this.setCurrentView('year'); + event.preventDefault(); + } + + onDateSelect(event: Event, dateMeta: any) { + if (this.$disabled() || !dateMeta.selectable) { + event.preventDefault(); + return; + } + + if (this.isMultipleSelection() && this.isSelected(dateMeta)) { + this.value = this.value.filter((date: Date, i: number) => { + return !this.isDateEquals(date, dateMeta); + }); + if (this.value.length === 0) { + this.value = null; + } + this.updateModel(this.value); + } else { + if (this.shouldSelectDate(dateMeta)) { + this.selectDate(dateMeta); + } + } + + if (this.hideOnDateTimeSelect && (this.isSingleSelection() || (this.isRangeSelection() && this.value[1]))) { + setTimeout(() => { + event.preventDefault(); + this.hideOverlay(); + + if (this.mask) { + this.disableModality(); + } + + this.cd.markForCheck(); + }, 150); + } + + this.updateInputfield(); + event.preventDefault(); + } + + shouldSelectDate(dateMeta: any) { + if (this.isMultipleSelection()) return this.maxDateCount != null ? this.maxDateCount > (this.value ? this.value.length : 0) : true; + else return true; + } + + onMonthSelect(event: Event, index: number) { + if (this.view === 'month') { + this.onDateSelect(event, { year: this.currentYear, month: index, day: 1, selectable: true }); + } else { + this.currentMonth = index; + this.createMonths(this.currentMonth, this.currentYear); + this.setCurrentView('date'); + this.onMonthChange.emit({ month: this.currentMonth + 1, year: this.currentYear }); + } + } + + onYearSelect(event: Event, year: number) { + if (this.view === 'year') { + this.onDateSelect(event, { year: year, month: 0, day: 1, selectable: true }); + } else { + this.currentYear = year; + this.setCurrentView('month'); + this.onYearChange.emit({ month: this.currentMonth + 1, year: this.currentYear }); + } + } + + updateInputfield() { + let formattedValue = ''; + + if (this.value) { + if (this.isSingleSelection()) { + formattedValue = this.formatDateTime(this.value); + } else if (this.isMultipleSelection()) { + for (let i = 0; i < this.value.length; i++) { + let dateAsString = this.formatDateTime(this.value[i]); + formattedValue += dateAsString; + if (i !== this.value.length - 1) { + formattedValue += this.multipleSeparator + ' '; + } + } + } else if (this.isRangeSelection()) { + if (this.value && this.value.length) { + let startDate = this.value[0]; + let endDate = this.value[1]; + + formattedValue = this.formatDateTime(startDate); + if (endDate) { + formattedValue += ' ' + this.rangeSeparator + ' ' + this.formatDateTime(endDate); + } + } + } + } + + this.writeModelValue(formattedValue); + + this.inputFieldValue = formattedValue; + + if (this.inputfieldViewChild && this.inputfieldViewChild.nativeElement) { + this.inputfieldViewChild.nativeElement.value = this.inputFieldValue; + } + } + + inputFieldValue: Nullable = null; + + formatDateTime(date: any) { + let formattedValue = this.keepInvalid ? date : null; + const isDateValid = this.isValidDateForTimeConstraints(date); + + if (this.isValidDate(date)) { + if (this.timeOnly) { + formattedValue = this.formatTime(date); + } else { + formattedValue = this.formatDate(date, this.getDateFormat()); + if (this.showTime) { + formattedValue += ' ' + this.formatTime(date); + } + } + } else if (this.dataType === 'string') { + formattedValue = date; + } + formattedValue = isDateValid ? formattedValue : ''; + return formattedValue; + } + + formatDateMetaToDate(dateMeta: any): Date { + return new Date(dateMeta.year, dateMeta.month, dateMeta.day); + } + + formatDateKey(date: Date): string { + return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`; + } + + setCurrentHourPM(hours: number) { + if (this.hourFormat == '12') { + this.pm = hours > 11; + if (hours >= 12) { + this.currentHour = hours == 12 ? 12 : hours - 12; + } else { + this.currentHour = hours == 0 ? 12 : hours; + } + } else { + this.currentHour = hours; + } + } + + setCurrentView(currentView: DatePickerTypeView) { + this.currentView = currentView; + this.cd.detectChanges(); + this.alignOverlay(); + } + + selectDate(dateMeta: any) { + let date = this.formatDateMetaToDate(dateMeta); + + if (this.showTime) { + if (this.hourFormat == '12') { + if (this.currentHour === 12) date.setHours(this.pm ? 12 : 0); + else date.setHours(this.pm ? this.currentHour + 12 : this.currentHour); + } else { + date.setHours(this.currentHour); + } + + date.setMinutes(this.currentMinute); + date.setSeconds(this.currentSecond); + } + + if (this.minDate && this.minDate > date) { + date = this.minDate; + this.setCurrentHourPM(date.getHours()); + this.currentMinute = date.getMinutes(); + this.currentSecond = date.getSeconds(); + } + + if (this.maxDate && this.maxDate < date) { + date = this.maxDate; + this.setCurrentHourPM(date.getHours()); + this.currentMinute = date.getMinutes(); + this.currentSecond = date.getSeconds(); + } + + if (this.isSingleSelection()) { + this.updateModel(date); + } else if (this.isMultipleSelection()) { + this.updateModel(this.value ? [...this.value, date] : [date]); + } else if (this.isRangeSelection()) { + if (this.value && this.value.length) { + let startDate = this.value[0]; + let endDate = this.value[1]; + + if (!endDate && date.getTime() >= startDate.getTime()) { + endDate = date; + } else { + startDate = date; + endDate = null; + } + + this.updateModel([startDate, endDate]); + } else { + this.updateModel([date, null]); + } + } + + this.onSelect.emit(date); + } + + updateModel(value: any) { + this.value = value; + + if (this.dataType == 'date') { + this.writeModelValue(this.value); + this.onModelChange(this.value); + } else if (this.dataType == 'string') { + if (this.isSingleSelection()) { + this.onModelChange(this.formatDateTime(this.value)); + } else { + let stringArrValue: any[] | null = null; + if (Array.isArray(this.value)) { + stringArrValue = this.value.map((date: Date) => this.formatDateTime(date)); + } + this.writeModelValue(stringArrValue); + this.onModelChange(stringArrValue); + } + } + } + + getFirstDayOfMonthIndex(month: number, year: number) { + let day = new Date(); + day.setDate(1); + day.setMonth(month); + day.setFullYear(year); + + let dayIndex = day.getDay() + this.getSundayIndex(); + return dayIndex >= 7 ? dayIndex - 7 : dayIndex; + } + + getDaysCountInMonth(month: number, year: number) { + return 32 - this.daylightSavingAdjust(new Date(year, month, 32)).getDate(); + } + + getDaysCountInPrevMonth(month: number, year: number) { + let prev = this.getPreviousMonthAndYear(month, year); + return this.getDaysCountInMonth(prev.month, prev.year); + } + + getPreviousMonthAndYear(month: number, year: number) { + let m, y; + + if (month === 0) { + m = 11; + y = year - 1; + } else { + m = month - 1; + y = year; + } + + return { month: m, year: y }; + } + + getNextMonthAndYear(month: number, year: number) { + let m, y; + + if (month === 11) { + m = 0; + y = year + 1; + } else { + m = month + 1; + y = year; + } + + return { month: m, year: y }; + } + + getSundayIndex() { + let firstDayOfWeek = this.getFirstDateOfWeek(); + + return firstDayOfWeek > 0 ? 7 - firstDayOfWeek : 0; + } + + isSelected(dateMeta: any): boolean | undefined { + if (this.value) { + if (this.isSingleSelection()) { + return this.isDateEquals(this.value, dateMeta); + } else if (this.isMultipleSelection()) { + let selected = false; + for (let date of this.value) { + selected = this.isDateEquals(date, dateMeta); + if (selected) { + break; + } + } + + return selected; + } else if (this.isRangeSelection()) { + if (this.value[1]) return this.isDateEquals(this.value[0], dateMeta) || this.isDateEquals(this.value[1], dateMeta) || this.isDateBetween(this.value[0], this.value[1], dateMeta); + else return this.isDateEquals(this.value[0], dateMeta); + } + } else { + return false; + } + } + + isComparable() { + return this.value != null && typeof this.value !== 'string'; + } + + isMonthSelected(month) { + if (!this.isComparable()) return false; + + if (this.isMultipleSelection()) { + return this.value.some((currentValue) => currentValue.getMonth() === month && currentValue.getFullYear() === this.currentYear); + } else if (this.isRangeSelection()) { + if (!this.value[1]) { + return this.value[0]?.getFullYear() === this.currentYear && this.value[0]?.getMonth() === month; + } else { + const currentDate = new Date(this.currentYear, month, 1); + const startDate = new Date(this.value[0].getFullYear(), this.value[0].getMonth(), 1); + const endDate = new Date(this.value[1].getFullYear(), this.value[1].getMonth(), 1); + + return currentDate >= startDate && currentDate <= endDate; + } + } else { + return this.value.getMonth() === month && this.value.getFullYear() === this.currentYear; + } + } + + isMonthDisabled(month: number, year?: number) { + const yearToCheck = year ?? this.currentYear; + + for (let day = 1; day < this.getDaysCountInMonth(month, yearToCheck) + 1; day++) { + if (this.isSelectable(day, month, yearToCheck, false)) { + return false; + } + } + return true; + } + + isYearDisabled(year: number) { + return Array(12) + .fill(0) + .every((v, month) => this.isMonthDisabled(month, year)); + } + + isYearSelected(year: number) { + if (this.isComparable()) { + let value = this.isRangeSelection() ? this.value[0] : this.value; + + return !this.isMultipleSelection() ? value.getFullYear() === year : false; + } + + return false; + } + + isDateEquals(value: any, dateMeta: any) { + if (value && isDate(value)) return value.getDate() === dateMeta.day && value.getMonth() === dateMeta.month && value.getFullYear() === dateMeta.year; + else return false; + } + + isDateBetween(start: Date, end: Date, dateMeta: any) { + let between: boolean = false; + if (isDate(start) && isDate(end)) { + let date: Date = this.formatDateMetaToDate(dateMeta); + return start.getTime() <= date.getTime() && end.getTime() >= date.getTime(); + } + + return between; + } + + isSingleSelection(): boolean { + return this.selectionMode === 'single'; + } + + isRangeSelection(): boolean { + return this.selectionMode === 'range'; + } + + isMultipleSelection(): boolean { + return this.selectionMode === 'multiple'; + } + + isToday(today: Date, day: number, month: number, year: number): boolean { + return today.getDate() === day && today.getMonth() === month && today.getFullYear() === year; + } + + isSelectable(day: any, month: any, year: any, otherMonth: any): boolean { + let validMin = true; + let validMax = true; + let validDate = true; + let validDay = true; + + if (otherMonth && !this.selectOtherMonths) { + return false; + } + + if (this.minDate) { + if (this.minDate.getFullYear() > year) { + validMin = false; + } else if (this.minDate.getFullYear() === year && this.currentView != 'year') { + if (this.minDate.getMonth() > month) { + validMin = false; + } else if (this.minDate.getMonth() === month) { + if (this.minDate.getDate() > day) { + validMin = false; + } + } + } + } + + if (this.maxDate) { + if (this.maxDate.getFullYear() < year) { + validMax = false; + } else if (this.maxDate.getFullYear() === year) { + if (this.maxDate.getMonth() < month) { + validMax = false; + } else if (this.maxDate.getMonth() === month) { + if (this.maxDate.getDate() < day) { + validMax = false; + } + } + } + } + + if (this.disabledDates) { + validDate = !this.isDateDisabled(day, month, year); + } + + if (this.disabledDays) { + validDay = !this.isDayDisabled(day, month, year); + } + + return validMin && validMax && validDate && validDay; + } + + isDateDisabled(day: number, month: number, year: number): boolean { + if (this.disabledDates) { + for (let disabledDate of this.disabledDates) { + if (disabledDate.getFullYear() === year && disabledDate.getMonth() === month && disabledDate.getDate() === day) { + return true; + } + } + } + + return false; + } + + isDayDisabled(day: number, month: number, year: number): boolean { + if (this.disabledDays) { + let weekday = new Date(year, month, day); + let weekdayNumber = weekday.getDay(); + return this.disabledDays.indexOf(weekdayNumber) !== -1; + } + return false; + } + + onInputFocus(event: Event) { + this.focus = true; + if (this.showOnFocus) { + this.showOverlay(); + } + this.onFocus.emit(event); + } + + onInputClick() { + if (this.showOnFocus && !this.overlayVisible) { + this.showOverlay(); + } + } + + onInputBlur(event: Event) { + this.focus = false; + this.onBlur.emit(event); + if (!this.keepInvalid) { + this.updateInputfield(); + } + this.onModelTouched(); + } + + onButtonClick(event: Event, inputfield: any = this.inputfieldViewChild?.nativeElement) { + if (this.$disabled()) { + return; + } + + if (!this.overlayVisible) { + inputfield.focus(); + this.showOverlay(); + } else { + this.hideOverlay(); + } + } + + clear() { + this.value = null; + this.inputFieldValue = null; + this.writeModelValue(this.value); + this.onModelChange(this.value); + this.updateInputfield(); + this.onClear.emit(); + } + + onOverlayClick(event: Event) { + this.overlayService.add({ + originalEvent: event, + target: this.el.nativeElement + }); + } + + getMonthName(index: number) { + return this.config.getTranslation('monthNames')[index]; + } + + getYear(month: any) { + return this.currentView === 'month' ? this.currentYear : month.year; + } + + switchViewButtonDisabled() { + return this.numberOfMonths > 1 || this.$disabled(); + } + + onPrevButtonClick(event: Event) { + this.navigationState = { backward: true, button: true }; + this.navBackward(event); + } + + onNextButtonClick(event: Event) { + this.navigationState = { backward: false, button: true }; + this.navForward(event); + } + + onContainerButtonKeydown(event: KeyboardEvent) { + switch (event.which) { + //tab + case 9: + if (!this.inline) { + this.trapFocus(event); + } + if (this.inline) { + const headerElements = findSingle(this.el?.nativeElement, '.p-datepicker-header'); + const element = event.target; + if (this.timeOnly) { + return; + } else { + if (element == headerElements?.children[headerElements?.children?.length! - 1]) { + this.initFocusableCell(); + } + } + } + break; + + //escape + case 27: + this.inputfieldViewChild?.nativeElement.focus(); + this.overlayVisible = false; + event.preventDefault(); + break; + + default: + //Noop + break; + } + } + + onInputKeydown(event: any) { + this.isKeydown = true; + if (event.keyCode === 40 && this.contentViewChild) { + this.trapFocus(event); + } else if (event.keyCode === 27) { + if (this.overlayVisible) { + this.inputfieldViewChild?.nativeElement.focus(); + this.overlayVisible = false; + event.preventDefault(); + } + } else if (event.keyCode === 13) { + if (this.overlayVisible) { + this.overlayVisible = false; + event.preventDefault(); + } + } else if (event.keyCode === 9 && this.contentViewChild) { + getFocusableElements(this.contentViewChild.nativeElement).forEach((el: any) => (el.tabIndex = '-1')); + if (this.overlayVisible) { + this.overlayVisible = false; + } + } + } + + onDateCellKeydown(event: any, dateMeta: any, groupIndex: number) { + const cellContent = event.currentTarget; + const cell = cellContent.parentElement; + const currentDate = this.formatDateMetaToDate(dateMeta); + switch (event.which) { + //down arrow + case 40: { + cellContent.tabIndex = '-1'; + let cellIndex = getIndex(cell); + let nextRow = cell.parentElement.nextElementSibling; + if (nextRow) { + let focusCell = nextRow.children[cellIndex].children[0]; + if (hasClass(focusCell, 'p-disabled')) { + this.navigationState = { backward: false }; + this.navForward(event); + } else { + nextRow.children[cellIndex].children[0].tabIndex = '0'; + nextRow.children[cellIndex].children[0].focus(); + } + } else { + this.navigationState = { backward: false }; + this.navForward(event); + } + event.preventDefault(); + break; + } + + //up arrow + case 38: { + cellContent.tabIndex = '-1'; + let cellIndex = getIndex(cell); + let prevRow = cell.parentElement.previousElementSibling; + if (prevRow) { + let focusCell = prevRow.children[cellIndex].children[0]; + if (hasClass(focusCell, 'p-disabled')) { + this.navigationState = { backward: true }; + this.navBackward(event); + } else { + focusCell.tabIndex = '0'; + focusCell.focus(); + } + } else { + this.navigationState = { backward: true }; + this.navBackward(event); + } + event.preventDefault(); + break; + } + + //left arrow + case 37: { + cellContent.tabIndex = '-1'; + let prevCell = cell.previousElementSibling; + if (prevCell) { + let focusCell = prevCell.children[0]; + if (hasClass(focusCell, 'p-disabled') || hasClass(focusCell.parentElement, 'p-datepicker-weeknumber')) { + this.navigateToMonth(true, groupIndex); + } else { + focusCell.tabIndex = '0'; + focusCell.focus(); + } + } else { + this.navigateToMonth(true, groupIndex); + } + event.preventDefault(); + break; + } + + //right arrow + case 39: { + cellContent.tabIndex = '-1'; + let nextCell = cell.nextElementSibling; + if (nextCell) { + let focusCell = nextCell.children[0]; + if (hasClass(focusCell, 'p-disabled')) { + this.navigateToMonth(false, groupIndex); + } else { + focusCell.tabIndex = '0'; + focusCell.focus(); + } + } else { + this.navigateToMonth(false, groupIndex); + } + event.preventDefault(); + break; + } + + //enter + //space + case 13: + case 32: { + this.onDateSelect(event, dateMeta); + event.preventDefault(); + break; + } + + //escape + case 27: { + this.inputfieldViewChild?.nativeElement.focus(); + this.overlayVisible = false; + event.preventDefault(); + break; + } + + //tab + case 9: { + if (!this.inline) { + this.trapFocus(event); + } + break; + } + + // page up + case 33: { + cellContent.tabIndex = '-1'; + const dateToFocus = new Date(currentDate.getFullYear(), currentDate.getMonth() - 1, currentDate.getDate()); + const focusKey = this.formatDateKey(dateToFocus); + this.navigateToMonth(true, groupIndex, `span[data-date='${focusKey}']:not(.p-disabled):not(.p-ink)`); + event.preventDefault(); + break; + } + + // page down + case 34: { + cellContent.tabIndex = '-1'; + const dateToFocus = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, currentDate.getDate()); + const focusKey = this.formatDateKey(dateToFocus); + this.navigateToMonth(false, groupIndex, `span[data-date='${focusKey}']:not(.p-disabled):not(.p-ink)`); + event.preventDefault(); + break; + } + + //home + case 36: + cellContent.tabIndex = '-1'; + const firstDayDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1); + const firstDayDateKey = this.formatDateKey(firstDayDate); + const firstDayCell = findSingle(cellContent.offsetParent, `span[data-date='${firstDayDateKey}']:not(.p-disabled):not(.p-ink)`); + if (firstDayCell) { + firstDayCell.tabIndex = '0'; + firstDayCell.focus(); + } + event.preventDefault(); + break; + + //end + case 35: + cellContent.tabIndex = '-1'; + const lastDayDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0); + const lastDayDateKey = this.formatDateKey(lastDayDate); + const lastDayCell = findSingle(cellContent.offsetParent, `span[data-date='${lastDayDateKey}']:not(.p-disabled):not(.p-ink)`); + if (lastDayDate) { + lastDayCell.tabIndex = '0'; + lastDayCell.focus(); + } + event.preventDefault(); + break; + + default: + //no op + break; + } + } + + onMonthCellKeydown(event: any, index: number) { + const cell = event.currentTarget; + switch (event.which) { + //arrows + case 38: + case 40: { + cell.tabIndex = '-1'; + var cells = cell.parentElement.children; + var cellIndex = getIndex(cell); + let nextCell = cells[event.which === 40 ? cellIndex + 3 : cellIndex - 3]; + if (nextCell) { + nextCell.tabIndex = '0'; + nextCell.focus(); + } + event.preventDefault(); + break; + } + + //left arrow + case 37: { + cell.tabIndex = '-1'; + let prevCell = cell.previousElementSibling; + if (prevCell) { + prevCell.tabIndex = '0'; + prevCell.focus(); + } else { + this.navigationState = { backward: true }; + this.navBackward(event); + } + + event.preventDefault(); + break; + } + + //right arrow + case 39: { + cell.tabIndex = '-1'; + let nextCell = cell.nextElementSibling; + if (nextCell) { + nextCell.tabIndex = '0'; + nextCell.focus(); + } else { + this.navigationState = { backward: false }; + this.navForward(event); + } + + event.preventDefault(); + break; + } + + //enter + //space + case 13: + case 32: { + this.onMonthSelect(event, index); + event.preventDefault(); + break; + } + + //escape + case 27: { + this.inputfieldViewChild?.nativeElement.focus(); + this.overlayVisible = false; + event.preventDefault(); + break; + } + + //tab + case 9: { + if (!this.inline) { + this.trapFocus(event); + } + break; + } + + default: + //no op + break; + } + } + + onYearCellKeydown(event: any, index: number) { + const cell = event.currentTarget; + + switch (event.which) { + //arrows + case 38: + case 40: { + cell.tabIndex = '-1'; + var cells = cell.parentElement.children; + var cellIndex = getIndex(cell); + let nextCell = cells[event.which === 40 ? cellIndex + 2 : cellIndex - 2]; + if (nextCell) { + nextCell.tabIndex = '0'; + nextCell.focus(); + } + event.preventDefault(); + break; + } + + //left arrow + case 37: { + cell.tabIndex = '-1'; + let prevCell = cell.previousElementSibling; + if (prevCell) { + prevCell.tabIndex = '0'; + prevCell.focus(); + } else { + this.navigationState = { backward: true }; + this.navBackward(event); + } + + event.preventDefault(); + break; + } + + //right arrow + case 39: { + cell.tabIndex = '-1'; + let nextCell = cell.nextElementSibling; + if (nextCell) { + nextCell.tabIndex = '0'; + nextCell.focus(); + } else { + this.navigationState = { backward: false }; + this.navForward(event); + } + + event.preventDefault(); + break; + } + + //enter + //space + case 13: + case 32: { + this.onYearSelect(event, index); + event.preventDefault(); + break; + } + + //escape + case 27: { + this.inputfieldViewChild?.nativeElement.focus(); + this.overlayVisible = false; + event.preventDefault(); + break; + } + + //tab + case 9: { + this.trapFocus(event); + break; + } + + default: + //no op + break; + } + } + + navigateToMonth(prev: boolean, groupIndex: number, focusKey?: string) { + if (prev) { + if (this.numberOfMonths === 1 || groupIndex === 0) { + this.navigationState = { backward: true }; + this._focusKey = focusKey; + this.navBackward(event); + } else { + let prevMonthContainer = this.contentViewChild.nativeElement.children[groupIndex - 1]; + if (focusKey) { + const firstDayCell = findSingle(prevMonthContainer, focusKey); + firstDayCell.tabIndex = '0'; + firstDayCell.focus(); + } else { + let cells = find(prevMonthContainer, '.p-datepicker-calendar td span:not(.p-disabled):not(.p-ink)'); + let focusCell = cells[cells.length - 1]; + focusCell.tabIndex = '0'; + focusCell.focus(); + } + } + } else { + if (this.numberOfMonths === 1 || groupIndex === this.numberOfMonths - 1) { + this.navigationState = { backward: false }; + this._focusKey = focusKey; + this.navForward(event); + } else { + let nextMonthContainer = this.contentViewChild.nativeElement.children[groupIndex + 1]; + if (focusKey) { + const firstDayCell = findSingle(nextMonthContainer, focusKey); + firstDayCell.tabIndex = '0'; + firstDayCell.focus(); + } else { + let focusCell = findSingle(nextMonthContainer, '.p-datepicker-calendar td span:not(.p-disabled):not(.p-ink)'); + focusCell.tabIndex = '0'; + focusCell.focus(); + } + } + } + } + + updateFocus() { + let cell; + + if (this.navigationState) { + if (this.navigationState.button) { + this.initFocusableCell(); + + if (this.navigationState.backward) (findSingle(this.contentViewChild.nativeElement, '.p-datepicker-prev-button') as any).focus(); + else (findSingle(this.contentViewChild.nativeElement, '.p-datepicker-next-button') as any).focus(); + } else { + if (this.navigationState.backward) { + let cells; + + if (this.currentView === 'month') { + cells = find(this.contentViewChild.nativeElement, '.p-datepicker-month-view .p-datepicker-month:not(.p-disabled)'); + } else if (this.currentView === 'year') { + cells = find(this.contentViewChild.nativeElement, '.p-datepicker-year-view .p-datepicker-year:not(.p-disabled)'); + } else { + cells = find(this.contentViewChild.nativeElement, this._focusKey || '.p-datepicker-calendar td span:not(.p-disabled):not(.p-ink)'); + } + + if (cells && cells.length > 0) { + cell = cells[cells.length - 1]; + } + } else { + if (this.currentView === 'month') { + cell = findSingle(this.contentViewChild.nativeElement, '.p-datepicker-month-view .p-datepicker-month:not(.p-disabled)'); + } else if (this.currentView === 'year') { + cell = findSingle(this.contentViewChild.nativeElement, '.p-datepicker-year-view .p-datepicker-year:not(.p-disabled)'); + } else { + cell = findSingle(this.contentViewChild.nativeElement, this._focusKey || '.p-datepicker-calendar td span:not(.p-disabled):not(.p-ink)'); + } + } + + if (cell) { + cell.tabIndex = '0'; + cell.focus(); + } + } + + this.navigationState = null; + this._focusKey = null; + } else { + this.initFocusableCell(); + } + } + + initFocusableCell() { + const contentEl = this.contentViewChild?.nativeElement; + let cell!: any; + + if (this.currentView === 'month') { + let cells = find(contentEl, '.p-datepicker-month-view .p-datepicker-month:not(.p-disabled)'); + let selectedCell = findSingle(contentEl, '.p-datepicker-month-view .p-datepicker-month.p-highlight'); + cells.forEach((cell: any) => (cell.tabIndex = -1)); + cell = selectedCell || cells[0]; + + if (cells.length === 0) { + let disabledCells = find(contentEl, '.p-datepicker-month-view .p-datepicker-month.p-disabled[tabindex = "0"]'); + disabledCells.forEach((cell: any) => (cell.tabIndex = -1)); + } + } else if (this.currentView === 'year') { + let cells = find(contentEl, '.p-datepicker-year-view .p-datepicker-year:not(.p-disabled)'); + let selectedCell = findSingle(contentEl, '.p-datepicker-year-view .p-datepicker-year.p-highlight'); + cells.forEach((cell: any) => (cell.tabIndex = -1)); + cell = selectedCell || cells[0]; + + if (cells.length === 0) { + let disabledCells = find(contentEl, '.p-datepicker-year-view .p-datepicker-year.p-disabled[tabindex = "0"]'); + disabledCells.forEach((cell: any) => (cell.tabIndex = -1)); + } + } else { + cell = findSingle(contentEl, 'span.p-highlight'); + if (!cell) { + let todayCell = findSingle(contentEl, 'td.p-datepicker-today span:not(.p-disabled):not(.p-ink)'); + if (todayCell) cell = todayCell; + else cell = findSingle(contentEl, '.p-datepicker-calendar td span:not(.p-disabled):not(.p-ink)'); + } + } + + if (cell) { + cell.tabIndex = '0'; + + if (!this.preventFocus && (!this.navigationState || !this.navigationState.button)) { + setTimeout(() => { + if (!this.$disabled()) { + cell.focus(); + } + }, 1); + } + + this.preventFocus = false; + } + } + + trapFocus(event: any) { + let focusableElements = getFocusableElements(this.contentViewChild.nativeElement); + + if (focusableElements && focusableElements.length > 0) { + if (!focusableElements[0].ownerDocument.activeElement) { + focusableElements[0].focus(); + } else { + let focusedIndex = focusableElements.indexOf(focusableElements[0].ownerDocument.activeElement); + + if (event.shiftKey) { + if (focusedIndex == -1 || focusedIndex === 0) { + if (this.focusTrap) { + focusableElements[focusableElements.length - 1].focus(); + } else { + if (focusedIndex === -1) return this.hideOverlay(); + else if (focusedIndex === 0) return; + } + } else { + focusableElements[focusedIndex - 1].focus(); + } + } else { + if (focusedIndex == -1) { + if (this.timeOnly) { + focusableElements[0].focus(); + } else { + let spanIndex = 0; + + for (let i = 0; i < focusableElements.length; i++) { + if (focusableElements[i].tagName === 'SPAN') spanIndex = i; + } + + focusableElements[spanIndex].focus(); + } + } else if (focusedIndex === focusableElements.length - 1) { + if (!this.focusTrap && focusedIndex != -1) return this.hideOverlay(); + + focusableElements[0].focus(); + } else { + focusableElements[focusedIndex + 1].focus(); + } + } + } + } + + event.preventDefault(); + } + + onMonthDropdownChange(m: string) { + this.currentMonth = parseInt(m); + this.onMonthChange.emit({ month: this.currentMonth + 1, year: this.currentYear }); + this.createMonths(this.currentMonth, this.currentYear); + } + + onYearDropdownChange(y: string) { + this.currentYear = parseInt(y); + this.onYearChange.emit({ month: this.currentMonth + 1, year: this.currentYear }); + this.createMonths(this.currentMonth, this.currentYear); + } + + convertTo24Hour(hours: number, pm: boolean) { + //@ts-ignore + if (this.hourFormat == '12') { + if (hours === 12) { + return pm ? 12 : 0; + } else { + return pm ? hours + 12 : hours; + } + } + return hours; + } + + constrainTime(hour: number, minute: number, second: number, pm: boolean) { + let returnTimeTriple: number[] = [hour, minute, second]; + let minHoursExceeds12: boolean = false; + let value = this.value; + const convertedHour = this.convertTo24Hour(hour, pm); + const isRange = this.isRangeSelection(), + isMultiple = this.isMultipleSelection(), + isMultiValue = isRange || isMultiple; + + if (isMultiValue) { + if (!this.value) { + this.value = [new Date(), new Date()]; + } + if (isRange) { + value = this.value[1] || this.value[0]; + } + if (isMultiple) { + value = this.value[this.value.length - 1]; + } + } + const valueDateString = value && isDate(value) ? value.toDateString() : null; + let isMinDate = this.minDate && valueDateString && this.minDate.toDateString() === valueDateString; + let isMaxDate = this.maxDate && valueDateString && this.maxDate.toDateString() === valueDateString; + + if (isMinDate) { + minHoursExceeds12 = this.minDate!.getHours() >= 12; + } + + switch ( + true // intentional fall through + ) { + case isMinDate && minHoursExceeds12 && this.minDate!.getHours() === 12 && this.minDate!.getHours() > convertedHour: + returnTimeTriple[0] = 11; + case isMinDate && this.minDate!.getHours() === convertedHour && this.minDate!.getMinutes() > minute: + returnTimeTriple[1] = this.minDate!.getMinutes(); + case isMinDate && this.minDate!.getHours() === convertedHour && this.minDate!.getMinutes() === minute && this.minDate!.getSeconds() > second: + returnTimeTriple[2] = this.minDate!.getSeconds(); + break; + case isMinDate && !minHoursExceeds12 && this.minDate!.getHours() - 1 === convertedHour && this.minDate!.getHours() > convertedHour: + returnTimeTriple[0] = 11; + this.pm = true; + case isMinDate && this.minDate!.getHours() === convertedHour && this.minDate!.getMinutes() > minute: + returnTimeTriple[1] = this.minDate!.getMinutes(); + case isMinDate && this.minDate!.getHours() === convertedHour && this.minDate!.getMinutes() === minute && this.minDate!.getSeconds() > second: + returnTimeTriple[2] = this.minDate!.getSeconds(); + break; + + case isMinDate && minHoursExceeds12 && this.minDate!.getHours() > convertedHour && convertedHour !== 12: + this.setCurrentHourPM(this.minDate!.getHours()); + returnTimeTriple[0] = this.currentHour || 0; + case isMinDate && this.minDate!.getHours() === convertedHour && this.minDate!.getMinutes() > minute: + returnTimeTriple[1] = this.minDate!.getMinutes(); + case isMinDate && this.minDate!.getHours() === convertedHour && this.minDate!.getMinutes() === minute && this.minDate!.getSeconds() > second: + returnTimeTriple[2] = this.minDate!.getSeconds(); + break; + case isMinDate && this.minDate!.getHours() > convertedHour: + returnTimeTriple[0] = this.minDate!.getHours(); + case isMinDate && this.minDate!.getHours() === convertedHour && this.minDate!.getMinutes() > minute: + returnTimeTriple[1] = this.minDate!.getMinutes(); + case isMinDate && this.minDate!.getHours() === convertedHour && this.minDate!.getMinutes() === minute && this.minDate!.getSeconds() > second: + returnTimeTriple[2] = this.minDate!.getSeconds(); + break; + case isMaxDate && this.maxDate!.getHours() < convertedHour: + returnTimeTriple[0] = this.maxDate!.getHours(); + case isMaxDate && this.maxDate!.getHours() === convertedHour && this.maxDate!.getMinutes() < minute: + returnTimeTriple[1] = this.maxDate!.getMinutes(); + case isMaxDate && this.maxDate!.getHours() === convertedHour && this.maxDate!.getMinutes() === minute && this.maxDate!.getSeconds() < second: + returnTimeTriple[2] = this.maxDate!.getSeconds(); + break; + } + + return returnTimeTriple; + } + + incrementHour(event: any) { + const prevHour = this.currentHour ?? 0; + let newHour = (this.currentHour ?? 0) + this.stepHour; + let newPM = this.pm; + if (this.hourFormat == '24') newHour = newHour >= 24 ? newHour - 24 : newHour; + else if (this.hourFormat == '12') { + // Before the AM/PM break, now after + if (prevHour < 12 && newHour > 11) { + newPM = !this.pm; + } + newHour = newHour >= 13 ? newHour - 12 : newHour; + } + this.toggleAMPMIfNotMinDate(newPM!); + [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(newHour, this.currentMinute!, this.currentSecond!, newPM!); + event.preventDefault(); + } + + toggleAMPMIfNotMinDate(newPM: boolean) { + let value = this.value; + const valueDateString = value && isDate(value) ? value.toDateString() : null; + let isMinDate = this.minDate && valueDateString && this.minDate.toDateString() === valueDateString; + if (isMinDate && this.minDate!.getHours() >= 12) { + this.pm = true; + } else { + this.pm = newPM; + } + } + + onTimePickerElementMouseDown(event: Event, type: number, direction: number) { + if (!this.$disabled()) { + this.repeat(event, null, type, direction); + event.preventDefault(); + } + } + + onTimePickerElementMouseUp(event: Event) { + if (!this.$disabled()) { + this.clearTimePickerTimer(); + this.updateTime(); + } + } + + onTimePickerElementMouseLeave() { + if (!this.$disabled() && this.timePickerTimer) { + this.clearTimePickerTimer(); + this.updateTime(); + } + } + + repeat(event: Event | null, interval: number | null, type: number | null, direction: number | null) { + let i = interval || 500; + + this.clearTimePickerTimer(); + this.timePickerTimer = setTimeout(() => { + this.repeat(event, 100, type, direction); + this.cd.markForCheck(); + }, i); + + switch (type) { + case 0: + if (direction === 1) this.incrementHour(event); + else this.decrementHour(event); + break; + + case 1: + if (direction === 1) this.incrementMinute(event); + else this.decrementMinute(event); + break; + + case 2: + if (direction === 1) this.incrementSecond(event); + else this.decrementSecond(event); + break; + } + + this.updateInputfield(); + } + + clearTimePickerTimer() { + if (this.timePickerTimer) { + clearTimeout(this.timePickerTimer); + this.timePickerTimer = null; + } + } + + decrementHour(event: any) { + let newHour = (this.currentHour ?? 0) - this.stepHour; + let newPM = this.pm; + if (this.hourFormat == '24') newHour = newHour < 0 ? 24 + newHour : newHour; + else if (this.hourFormat == '12') { + // If we were at noon/midnight, then switch + if (this.currentHour === 12) { + newPM = !this.pm; + } + newHour = newHour <= 0 ? 12 + newHour : newHour; + } + this.toggleAMPMIfNotMinDate(newPM!); + [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(newHour, this.currentMinute!, this.currentSecond!, newPM!); + event.preventDefault(); + } + + incrementMinute(event: any) { + let newMinute = (this.currentMinute ?? 0) + this.stepMinute; + newMinute = newMinute > 59 ? newMinute - 60 : newMinute; + [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour || 0, newMinute, this.currentSecond!, this.pm!); + event.preventDefault(); + } + + decrementMinute(event: any) { + let newMinute = (this.currentMinute ?? 0) - this.stepMinute; + newMinute = newMinute < 0 ? 60 + newMinute : newMinute; + [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour || 0, newMinute, this.currentSecond || 0, this.pm!); + event.preventDefault(); + } + + incrementSecond(event: any) { + let newSecond = this.currentSecond + this.stepSecond; + newSecond = newSecond > 59 ? newSecond - 60 : newSecond; + [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour || 0, this.currentMinute || 0, newSecond, this.pm!); + event.preventDefault(); + } + + decrementSecond(event: any) { + let newSecond = this.currentSecond - this.stepSecond; + newSecond = newSecond < 0 ? 60 + newSecond : newSecond; + [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour || 0, this.currentMinute || 0, newSecond, this.pm!); + event.preventDefault(); + } + + updateTime() { + let value = this.value; + if (this.isRangeSelection()) { + value = this.value[1] || this.value[0]; + } + if (this.isMultipleSelection()) { + value = this.value[this.value.length - 1]; + } + value = value && isDate(value) ? new Date(value.getTime()) : new Date(); + + if (this.hourFormat == '12') { + if (this.currentHour === 12) value.setHours(this.pm ? 12 : 0); + else value.setHours(this.pm ? this.currentHour + 12 : this.currentHour); + } else { + value.setHours(this.currentHour); + } + + value.setMinutes(this.currentMinute); + value.setSeconds(this.currentSecond); + if (this.isRangeSelection()) { + if (this.value[1]) value = [this.value[0], value]; + else value = [value, null]; + } + + if (this.isMultipleSelection()) { + value = [...this.value.slice(0, -1), value]; + } + + this.updateModel(value); + this.onSelect.emit(value); + this.updateInputfield(); + } + + toggleAMPM(event: any) { + const newPM = !this.pm; + this.pm = newPM; + [this.currentHour, this.currentMinute, this.currentSecond] = this.constrainTime(this.currentHour || 0, this.currentMinute || 0, this.currentSecond || 0, newPM); + this.updateTime(); + event.preventDefault(); + } + + onUserInput(event: KeyboardEvent | any) { + // IE 11 Workaround for input placeholder : https://github.com/primefaces/primeng/issues/2026 + + if (!this.isKeydown) { + return; + } + this.isKeydown = false; + + let val = (event.target).value; + try { + let value = this.parseValueFromString(val); + if (this.isValidSelection(value)) { + this.updateModel(value); + this.updateUI(); + } else if (this.keepInvalid) { + this.updateModel(value); + } + } catch (err) { + //invalid date + let value = this.keepInvalid ? val : null; + this.updateModel(value); + } + + this.onInput.emit(event); + } + + isValidSelection(value: any): boolean { + if (this.isSingleSelection()) { + return this.isSelectable(value.getDate(), value.getMonth(), value.getFullYear(), false); + } + let isValid = value.every((v: any) => this.isSelectable(v.getDate(), v.getMonth(), v.getFullYear(), false)); + if (isValid && this.isRangeSelection()) { + isValid = value.length === 1 || (value.length > 1 && value[1] >= value[0]); + } + return isValid; + } + + parseValueFromString(text: string): Date | Date[] | null { + if (!text || text.trim().length === 0) { + return null; + } + + let value: any; + + if (this.isSingleSelection()) { + value = this.parseDateTime(text); + } else if (this.isMultipleSelection()) { + let tokens = text.split(this.multipleSeparator); + value = []; + for (let token of tokens) { + value.push(this.parseDateTime(token.trim())); + } + } else if (this.isRangeSelection()) { + let tokens = text.split(' ' + this.rangeSeparator + ' '); + value = []; + for (let i = 0; i < tokens.length; i++) { + value[i] = this.parseDateTime(tokens[i].trim()); + } + } + + return value; + } + + parseDateTime(text: any): Date { + let date: Date; + let parts: string[] = text.split(' '); + + if (this.timeOnly) { + date = new Date(); + this.populateTime(date, parts[0], parts[1]); + } else { + const dateFormat = this.getDateFormat(); + if (this.showTime) { + let ampm = this.hourFormat == '12' ? parts.pop() : null; + let timeString = parts.pop(); + + date = this.parseDate(parts.join(' '), dateFormat); + this.populateTime(date, timeString, ampm); + } else { + date = this.parseDate(text, dateFormat); + } + } + + return date; + } + + populateTime(value: any, timeString: any, ampm: any) { + if (this.hourFormat == '12' && !ampm) { + throw 'Invalid Time'; + } + + this.pm = ampm === 'PM' || ampm === 'pm'; + let time = this.parseTime(timeString); + value.setHours(time.hour); + value.setMinutes(time.minute); + value.setSeconds(time.second); + } + + isValidDate(date: any) { + return isDate(date) && isNotEmpty(date); + } + + updateUI() { + let propValue = this.value; + if (Array.isArray(propValue)) { + propValue = propValue.length === 2 ? propValue[1] : propValue[0]; + } + + let val = this.defaultDate && this.isValidDate(this.defaultDate) && !this.value ? this.defaultDate : propValue && this.isValidDate(propValue) ? propValue : new Date(); + + this.currentMonth = val.getMonth(); + this.currentYear = val.getFullYear(); + this.createMonths(this.currentMonth, this.currentYear); + + if (this.showTime || this.timeOnly) { + this.setCurrentHourPM(val.getHours()); + this.currentMinute = val.getMinutes(); + this.currentSecond = this.showSeconds ? val.getSeconds() : 0; + } + } + + showOverlay() { + if (!this.overlayVisible) { + this.updateUI(); + + if (!this.touchUI) { + this.preventFocus = true; + } + + this.overlayMinWidth = this.el.nativeElement.offsetWidth; + this.overlayVisible = true; + } + } + + hideOverlay() { + this.inputfieldViewChild?.nativeElement.focus(); + this.overlayVisible = false; + this.clearTimePickerTimer(); + + if (this.touchUI) { + this.disableModality(); + } + + this.cd.markForCheck(); + } + + toggle() { + if (!this.inline) { + if (!this.overlayVisible) { + this.showOverlay(); + this.inputfieldViewChild?.nativeElement.focus(); + } else { + this.hideOverlay(); + } + } + } + + onOverlayBeforeEnter(event: MotionEvent) { + this.overlay = event.element as HTMLElement; + this.$attrSelector && this.overlay!.setAttribute(this.$attrSelector, ''); + const styles = !this.inline ? { position: 'absolute', top: '0', minWidth: `${this.overlayMinWidth}px` } : undefined; + addStyle(this.overlay!, styles || {}); + this.appendOverlay(); + this.alignOverlay(); + this.setZIndex(); + this.updateFocus(); + this.bindListeners(); + this.onShow.emit(event.element as HTMLElement); + } + + onOverlayAfterLeave(event: MotionEvent) { + if (this.autoZIndex) { + ZIndexUtils.clear(event.element as HTMLElement); + } + this.restoreOverlayAppend(); + this.onOverlayHide(); + + this.onClose.emit(event.element as HTMLElement); + } + + appendOverlay() { + if (this.$appendTo() && this.$appendTo() !== 'self') { + if (this.$appendTo() === 'body') this.document.body.appendChild(this.overlay); + else appendChild(this.$appendTo(), this.overlay!); + } + } + + restoreOverlayAppend() { + if (this.overlay && this.$appendTo() !== 'self') { + this.el.nativeElement.appendChild(this.overlay!); + } + } + + alignOverlay() { + if (this.touchUI) { + this.enableModality(this.overlay); + } else if (this.overlay) { + if (this.$appendTo() && this.$appendTo() !== 'self') { + absolutePosition(this.overlay, this.inputfieldViewChild?.nativeElement); + } else { + relativePosition(this.overlay, this.inputfieldViewChild?.nativeElement); + } + } + } + + bindListeners() { + this.bindDocumentClickListener(); + this.bindDocumentResizeListener(); + this.bindScrollListener(); + } + + setZIndex() { + if (this.autoZIndex) { + if (this.touchUI) ZIndexUtils.set('modal', this.overlay, this.baseZIndex || this.config.zIndex.modal); + else ZIndexUtils.set('overlay', this.overlay, this.baseZIndex || this.config.zIndex.overlay); + } + } + + enableModality(element: any) { + if (!this.mask && this.touchUI) { + this.mask = this.renderer.createElement('div'); + this.renderer.setStyle(this.mask, 'zIndex', String(parseInt(element.style.zIndex) - 1)); + let maskStyleClass = 'p-overlay-mask p-datepicker-mask p-datepicker-mask-scrollblocker p-overlay-mask p-overlay-mask-enter-active'; + addClass(this.mask!, maskStyleClass); + + this.maskClickListener = this.renderer.listen(this.mask, 'click', (event: any) => { + this.disableModality(); + this.overlayVisible = false; + }); + this.renderer.appendChild(this.document.body, this.mask); + blockBodyScroll(); + } + } + + disableModality() { + if (this.mask) { + addClass(this.mask, 'p-overlay-mask-leave'); + if (!this.animationEndListener) { + this.animationEndListener = this.renderer.listen(this.mask, 'animationend', this.destroyMask.bind(this)); + } + } + } + + destroyMask() { + if (!this.mask) { + return; + } + this.renderer.removeChild(this.document.body, this.mask); + let bodyChildren = this.document.body.children; + let hasBlockerMasks!: boolean; + for (let i = 0; i < bodyChildren.length; i++) { + let bodyChild = bodyChildren[i]; + if (hasClass(bodyChild, 'p-datepicker-mask-scrollblocker')) { + hasBlockerMasks = true; + break; + } + } + + if (!hasBlockerMasks) { + unblockBodyScroll(); + } + + this.unbindAnimationEndListener(); + this.unbindMaskClickListener(); + this.mask = null; + } + + unbindMaskClickListener() { + if (this.maskClickListener) { + this.maskClickListener(); + this.maskClickListener = null; + } + } + + unbindAnimationEndListener() { + if (this.animationEndListener && this.mask) { + this.animationEndListener(); + this.animationEndListener = null; + } + } + + getDateFormat() { + return this.dateFormat || this.getTranslation('dateFormat'); + } + + getFirstDateOfWeek() { + return this._firstDayOfWeek || this.getTranslation(TranslationKeys.FIRST_DAY_OF_WEEK); + } + + // Ported from jquery-ui datepicker formatDate + formatDate(date: any, format: any) { + if (!date) { + return ''; + } + + let iFormat!: any; + const lookAhead = (match: string) => { + const matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match; + if (matches) { + iFormat++; + } + return matches; + }, + formatNumber = (match: string, value: any, len: any) => { + let num = '' + value; + if (lookAhead(match)) { + while (num.length < len) { + num = '0' + num; + } + } + return num; + }, + formatName = (match: string, value: any, shortNames: any, longNames: any) => { + return lookAhead(match) ? longNames[value] : shortNames[value]; + }; + let output = ''; + let literal = false; + + if (date) { + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + output += format.charAt(iFormat); + } + } else { + switch (format.charAt(iFormat)) { + case 'd': + output += formatNumber('d', date.getDate(), 2); + break; + case 'D': + output += formatName('D', date.getDay(), this.getTranslation(TranslationKeys.DAY_NAMES_SHORT), this.getTranslation(TranslationKeys.DAY_NAMES)); + break; + case 'o': + output += formatNumber('o', Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3); + break; + case 'm': + output += formatNumber('m', date.getMonth() + 1, 2); + break; + case 'M': + output += formatName('M', date.getMonth(), this.getTranslation(TranslationKeys.MONTH_NAMES_SHORT), this.getTranslation(TranslationKeys.MONTH_NAMES)); + break; + case 'y': + output += lookAhead('y') ? date.getFullYear() : (date.getFullYear() % 100 < 10 ? '0' : '') + (date.getFullYear() % 100); + break; + case '@': + output += date.getTime(); + break; + case '!': + output += date.getTime() * 10000 + this.ticksTo1970; + break; + case "'": + if (lookAhead("'")) { + output += "'"; + } else { + literal = true; + } + break; + default: + output += format.charAt(iFormat); + } + } + } + } + return output; + } + + formatTime(date: any) { + if (!date) { + return ''; + } + + let output = ''; + let hours = date.getHours(); + let minutes = date.getMinutes(); + let seconds = date.getSeconds(); + + if (this.hourFormat == '12' && hours > 11 && hours != 12) { + hours -= 12; + } + + if (this.hourFormat == '12') { + output += hours === 0 ? 12 : hours < 10 ? '0' + hours : hours; + } else { + output += hours < 10 ? '0' + hours : hours; + } + output += ':'; + output += minutes < 10 ? '0' + minutes : minutes; + + if (this.showSeconds) { + output += ':'; + output += seconds < 10 ? '0' + seconds : seconds; + } + + if (this.hourFormat == '12') { + output += date.getHours() > 11 ? ' PM' : ' AM'; + } + + return output; + } + + parseTime(value: any) { + let tokens: string[] = value.split(':'); + let validTokenLength = this.showSeconds ? 3 : 2; + + if (tokens.length !== validTokenLength) { + throw 'Invalid time'; + } + + let h = parseInt(tokens[0]); + let m = parseInt(tokens[1]); + let s = this.showSeconds ? parseInt(tokens[2]) : null; + + if (isNaN(h) || isNaN(m) || h > 23 || m > 59 || (this.hourFormat == '12' && h > 12) || (this.showSeconds && (isNaN(s) || s > 59))) { + throw 'Invalid time'; + } else { + if (this.hourFormat == '12') { + if (h !== 12 && this.pm) { + h += 12; + } else if (!this.pm && h === 12) { + h -= 12; + } + } + + return { hour: h, minute: m, second: s }; + } + } + + // Ported from jquery-ui datepicker parseDate + parseDate(value: any, format: any) { + if (format == null || value == null) { + throw 'Invalid arguments'; + } + + value = typeof value === 'object' ? value.toString() : value + ''; + if (value === '') { + return null; + } + + let iFormat!: any, + dim, + extra, + iValue = 0, + shortYearCutoff = typeof this.shortYearCutoff !== 'string' ? this.shortYearCutoff : (new Date().getFullYear() % 100) + parseInt(this.shortYearCutoff, 10), + year = -1, + month = -1, + day = -1, + doy = -1, + literal = false, + date, + lookAhead = (match: any) => { + let matches = iFormat + 1 < format.length && format.charAt(iFormat + 1) === match; + if (matches) { + iFormat++; + } + return matches; + }, + getNumber = (match: any) => { + let isDoubled = lookAhead(match), + size = match === '@' ? 14 : match === '!' ? 20 : match === 'y' && isDoubled ? 4 : match === 'o' ? 3 : 2, + minSize = match === 'y' ? size : 1, + digits = new RegExp('^\\d{' + minSize + ',' + size + '}'), + num = value.substring(iValue).match(digits); + if (!num) { + throw 'Missing number at position ' + iValue; + } + iValue += num[0].length; + return parseInt(num[0], 10); + }, + getName = (match: any, shortNames: any, longNames: any) => { + let index = -1; + let arr = lookAhead(match) ? longNames : shortNames; + let names = []; + + for (let i = 0; i < arr.length; i++) { + (names as any[]).push([i, arr[i]]); + } + (names as any[]).sort((a, b) => { + return -((a as any)[1].length - (b as any)[1].length); + }); + + for (let i = 0; i < (names as any[]).length; i++) { + let name = (names as any[])[i][1]; + if (value.substr(iValue, (name as string).length).toLowerCase() === (name as string).toLowerCase()) { + index = (names as any[])[i][0]; + iValue += (name as string).length; + break; + } + } + + if (index !== -1) { + return index + 1; + } else { + throw 'Unknown name at position ' + iValue; + } + }, + checkLiteral = () => { + if (value.charAt(iValue) !== format.charAt(iFormat)) { + throw 'Unexpected literal at position ' + iValue; + } + iValue++; + }; + + if (this.view === 'month') { + day = 1; + } + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + checkLiteral(); + } + } else { + switch (format.charAt(iFormat)) { + case 'd': + day = getNumber('d'); + break; + case 'D': + getName('D', this.getTranslation(TranslationKeys.DAY_NAMES_SHORT), this.getTranslation(TranslationKeys.DAY_NAMES)); + break; + case 'o': + doy = getNumber('o'); + break; + case 'm': + month = getNumber('m'); + break; + case 'M': + month = getName('M', this.getTranslation(TranslationKeys.MONTH_NAMES_SHORT), this.getTranslation(TranslationKeys.MONTH_NAMES)); + break; + case 'y': + year = getNumber('y'); + break; + case '@': + date = new Date(getNumber('@')); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case '!': + date = new Date((getNumber('!') - this.ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")) { + checkLiteral(); + } else { + literal = true; + } + break; + default: + checkLiteral(); + } + } + } + + if (iValue < value.length) { + extra = value.substr(iValue); + if (!/^\s+/.test(extra)) { + throw 'Extra/unparsed characters found in date: ' + extra; + } + } + + if (year === -1) { + year = new Date().getFullYear(); + } else if (year < 100) { + year += new Date().getFullYear() - (new Date().getFullYear() % 100) + (year <= shortYearCutoff ? 0 : -100); + } + + if (doy > -1) { + month = 1; + day = doy; + do { + dim = this.getDaysCountInMonth(year, month - 1); + if (day <= dim) { + break; + } + month++; + day -= dim; + } while (true); + } + + if (this.view === 'year') { + month = month === -1 ? 1 : month; + day = day === -1 ? 1 : day; + } + + date = this.daylightSavingAdjust(new Date(year, month - 1, day)); + + if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) { + throw 'Invalid date'; // E.g. 31/02/00 + } + + return date; + } + + daylightSavingAdjust(date: any) { + if (!date) { + return null; + } + + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + + return date; + } + + isValidDateForTimeConstraints(selectedDate: Date) { + if (this.keepInvalid) { + return true; // If we are keeping invalid dates, we don't need to check for time constraints + } + return (!this.minDate || selectedDate >= this.minDate) && (!this.maxDate || selectedDate <= this.maxDate); + } + + onTodayButtonClick(event: any) { + const date: Date = new Date(); + const dateMeta = { + day: date.getDate(), + month: date.getMonth(), + year: date.getFullYear(), + otherMonth: date.getMonth() !== this.currentMonth || date.getFullYear() !== this.currentYear, + today: true, + selectable: true + }; + + this.createMonths(date.getMonth(), date.getFullYear()); + this.onDateSelect(event, dateMeta); + this.onTodayClick.emit(date); + } + + onClearButtonClick(event: any) { + this.updateModel(null); + this.updateInputfield(); + this.hideOverlay(); + this.onClearClick.emit(event); + } + + createResponsiveStyle() { + if (this.numberOfMonths > 1 && this.responsiveOptions) { + if (!this.responsiveStyleElement) { + this.responsiveStyleElement = this.renderer.createElement('style'); + (this.responsiveStyleElement).type = 'text/css'; + setAttribute(this.responsiveStyleElement!, 'nonce', this.config?.csp()?.nonce); + this.renderer.appendChild(this.document.body, this.responsiveStyleElement); + } + + let innerHTML = ''; + if (this.responsiveOptions) { + let responsiveOptions = [...this.responsiveOptions].filter((o) => !!(o.breakpoint && o.numMonths)).sort((o1: any, o2: any) => -1 * o1.breakpoint.localeCompare(o2.breakpoint, undefined, { numeric: true })); + + for (let i = 0; i < responsiveOptions.length; i++) { + let { breakpoint, numMonths } = responsiveOptions[i]; + let styles = ` + .p-datepicker[${this.attributeSelector}] .p-datepicker-group:nth-child(${numMonths}) .p-datepicker-next { + display: inline-flex !important; + } + `; + + for (let j: number = numMonths; j < this.numberOfMonths; j++) { + styles += ` + .p-datepicker[${this.attributeSelector}] .p-datepicker-group:nth-child(${j + 1}) { + display: none !important; + } + `; + } + + innerHTML += ` + @media screen and (max-width: ${breakpoint}) { + ${styles} + } + `; + } + } + + (this.responsiveStyleElement).innerHTML = innerHTML; + setAttribute(this.responsiveStyleElement!, 'nonce', this.config?.csp()?.nonce); + } + } + + destroyResponsiveStyleElement() { + if (this.responsiveStyleElement) { + this.responsiveStyleElement.remove(); + this.responsiveStyleElement = null; + } + } + + bindDocumentClickListener() { + if (!this.documentClickListener) { + this.zone.runOutsideAngular(() => { + const documentTarget: any = this.el ? this.el.nativeElement.ownerDocument : this.document; + + this.documentClickListener = this.renderer.listen(documentTarget, 'mousedown', (event) => { + if (this.isOutsideClicked(event) && this.overlayVisible) { + this.zone.run(() => { + this.hideOverlay(); + this.onClickOutside.emit(event); + + this.cd.markForCheck(); + }); + } + }); + }); + } + } + + unbindDocumentClickListener() { + if (this.documentClickListener) { + this.documentClickListener(); + this.documentClickListener = null; + } + } + + bindDocumentResizeListener() { + if (!this.documentResizeListener && !this.touchUI) { + this.documentResizeListener = this.renderer.listen(this.window, 'resize', this.onWindowResize.bind(this)); + } + } + + unbindDocumentResizeListener() { + if (this.documentResizeListener) { + this.documentResizeListener(); + this.documentResizeListener = null; + } + } + + bindScrollListener() { + if (!this.scrollHandler) { + this.scrollHandler = new ConnectedOverlayScrollHandler(this.el?.nativeElement, () => { + if (this.overlayVisible) { + this.hideOverlay(); + } + }); + } + + this.scrollHandler.bindScrollListener(); + } + + unbindScrollListener() { + if (this.scrollHandler) { + this.scrollHandler.unbindScrollListener(); + } + } + + isOutsideClicked(event: Event) { + return !(this.el.nativeElement.isSameNode(event.target) || this.isNavIconClicked(event) || this.el.nativeElement.contains(event.target) || (this.overlay && this.overlay.contains(event.target))); + } + + isNavIconClicked(event: any) { + return hasClass(event.target, 'p-datepicker-prev-button') || hasClass(event.target, 'p-datepicker-prev-icon') || hasClass(event.target, 'p-datepicker-next-button') || hasClass(event.target, 'p-datepicker-next-icon'); + } + + onWindowResize() { + if (this.overlayVisible && !isTouchDevice()) { + this.hideOverlay(); + } + } + + onOverlayHide() { + this.currentView = this.view; + + if (this.mask) { + this.destroyMask(); + } + + this.unbindDocumentClickListener(); + this.unbindDocumentResizeListener(); + this.unbindScrollListener(); + this.overlay = null; + } + + /** + * @override + * + * @see {@link BaseEditableHolder.writeControlValue} + * Writes the value to the control. + */ + writeControlValue(value: any): void { + this.value = value; + if (this.value && typeof this.value === 'string') { + try { + this.value = this.parseValueFromString(this.value); + } catch { + if (this.keepInvalid) { + this.value = value; + } + } + } + + this.updateInputfield(); + this.updateUI(); + this.cd.markForCheck(); + } + + onDestroy() { + if (this.scrollHandler) { + this.scrollHandler.destroy(); + this.scrollHandler = null; + } + + if (this.translationSubscription) { + this.translationSubscription.unsubscribe(); + } + + if (this.overlay && this.autoZIndex) { + ZIndexUtils.clear(this.overlay); + } + + this.destroyResponsiveStyleElement(); + this.clearTimePickerTimer(); + this.restoreOverlayAppend(); + this.onOverlayHide(); + } +} + +@NgModule({ + imports: [DatePicker, SharedModule], + exports: [DatePicker, SharedModule] +}) +export class DatePickerModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/datepicker/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/datepicker/public_api.ts new file mode 100644 index 000000000..7a208960d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/datepicker/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/datepicker/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/datepicker/public_api'; +export * from './datepicker'; +export * from './style/datepickerstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/datepicker/style/datepickerstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/datepicker/style/datepickerstyle.ts new file mode 100644 index 000000000..e78ae336d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/datepicker/style/datepickerstyle.ts @@ -0,0 +1,303 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/datepicker/style/datepickerstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as datepicker_style } from '../../../primeuix-temp/styles/src/datepicker/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` +${datepicker_style} + +/* For PrimeNG */ +.p-datepicker.ng-invalid.ng-dirty .p-inputtext { + border-color: dt('inputtext.invalid.border.color'); +} +`; + +const inlineStyles = { + root: () => ({ position: 'relative' }) +}; + +const classes = { + root: ({ instance }) => [ + 'p-datepicker p-component p-inputwrapper', + { + 'p-invalid': instance.invalid(), + 'p-datepicker-fluid': instance.hasFluid, + 'p-inputwrapper-filled': instance.$filled(), + 'p-variant-filled': instance.$variant() === 'filled', + 'p-inputwrapper-focus': instance.focus || instance.overlayVisible, + 'p-focus': instance.focus || instance.overlayVisible + } + ], + pcInputText: 'p-datepicker-input', + dropdown: 'p-datepicker-dropdown', + inputIconContainer: 'p-datepicker-input-icon-container', + inputIcon: 'p-datepicker-input-icon', + panel: ({ instance }) => [ + 'p-datepicker-panel p-component', + { + 'p-datepicker-panel p-component': true, + 'p-datepicker-panel-inline': instance.inline, + 'p-disabled': instance.$disabled(), + 'p-datepicker-timeonly': instance.timeOnly + } + ], + calendarContainer: 'p-datepicker-calendar-container', + calendar: 'p-datepicker-calendar', + header: 'p-datepicker-header', + pcPrevButton: 'p-datepicker-prev-button', + title: 'p-datepicker-title', + selectMonth: 'p-datepicker-select-month', + selectYear: 'p-datepicker-select-year', + decade: 'p-datepicker-decade', + pcNextButton: 'p-datepicker-next-button', + dayView: 'p-datepicker-day-view', + weekHeader: 'p-datepicker-weekheader p-disabled', + weekNumber: 'p-datepicker-weeknumber', + weekLabelContainer: 'p-datepicker-weeklabel-container p-disabled', + weekDayCell: 'p-datepicker-weekday-cell', + weekDay: 'p-datepicker-weekday', + dayCell: ({ date }) => [ + 'p-datepicker-day-cell', + { + 'p-datepicker-other-month': date.otherMonth, + 'p-datepicker-today': date.today + } + ], + day: ({ instance, date }) => { + let selectedDayClass = ''; + + if (instance.isRangeSelection() && instance.isSelected(date) && date.selectable) { + const startDate = instance.value[0]; + const endDate = instance.value[1]; + + const isStart = startDate && date.year === startDate.getFullYear() && date.month === startDate.getMonth() && date.day === startDate.getDate(); + const isEnd = endDate && date.year === endDate.getFullYear() && date.month === endDate.getMonth() && date.day === endDate.getDate(); + + selectedDayClass = isStart || isEnd ? 'p-datepicker-day-selected' : 'p-datepicker-day-selected-range'; + } + + return { + 'p-datepicker-day': true, + 'p-datepicker-day-selected': !instance.isRangeSelection() && instance.isSelected(date) && date.selectable, + 'p-disabled': instance.$disabled() || !date.selectable, + [selectedDayClass]: true + }; + }, + monthView: 'p-datepicker-month-view', + month: ({ instance, index }) => [ + 'p-datepicker-month', + { + 'p-datepicker-month-selected': instance.isMonthSelected(index), + 'p-disabled': instance.isMonthDisabled(index) + } + ], + yearView: 'p-datepicker-year-view', + year: ({ instance, year }) => [ + 'p-datepicker-year', + { + 'p-datepicker-year-selected': instance.isYearSelected(year), + 'p-disabled': instance.isYearDisabled(year) + } + ], + timePicker: 'p-datepicker-time-picker', + hourPicker: 'p-datepicker-hour-picker', + pcIncrementButton: 'p-datepicker-increment-button', + pcDecrementButton: 'p-datepicker-decrement-button', + separator: 'p-datepicker-separator', + minutePicker: 'p-datepicker-minute-picker', + secondPicker: 'p-datepicker-second-picker', + ampmPicker: 'p-datepicker-ampm-picker', + buttonbar: 'p-datepicker-buttonbar', + pcTodayButton: 'p-datepicker-today-button', + pcClearButton: 'p-datepicker-clear-button', + clearIcon: 'p-datepicker-clear-icon' +}; + +@Injectable() +export class DatePickerStyle extends BaseStyle { + name = 'datepicker'; + + style = style; + + classes = classes; + + inlineStyles = inlineStyles; +} + +/** + * + * DatePicker is a form component to work with dates. + * + * [Live Demo](https://www.primeng.org/datepicker/) + * + * @module datepickerstyle + * + */ +export enum DatePickerClasses { + /** + * Class name of the root element + */ + root = 'p-datepicker', + /** + * Class name of the input element + */ + pcInputText = 'p-datepicker-input', + /** + * Class name of the dropdown element + */ + dropdown = 'p-datepicker-dropdown', + /** + * Class name of the input icon container element + */ + inputIconContainer = 'p-datepicker-input-icon-container', + /** + * Class name of the input icon element + */ + inputIcon = 'p-datepicker-input-icon', + /** + * Class name of the panel element + */ + panel = 'p-datepicker-panel', + /** + * Class name of the calendar container element + */ + calendarContainer = 'p-datepicker-calendar-container', + /** + * Class name of the calendar element + */ + calendar = 'p-datepicker-calendar', + /** + * Class name of the header element + */ + header = 'p-datepicker-header', + /** + * Class name of the previous button element + */ + pcPrevButton = 'p-datepicker-prev-button', + /** + * Class name of the title element + */ + title = 'p-datepicker-title', + /** + * Class name of the select month element + */ + selectMonth = 'p-datepicker-select-month', + /** + * Class name of the select year element + */ + selectYear = 'p-datepicker-select-year', + /** + * Class name of the decade element + */ + decade = 'p-datepicker-decade', + /** + * Class name of the next button element + */ + pcNextButton = 'p-datepicker-next-button', + /** + * Class name of the day view element + */ + dayView = 'p-datepicker-day-view', + /** + * Class name of the week header element + */ + weekHeader = 'p-datepicker-weekheader', + /** + * Class name of the week number element + */ + weekNumber = 'p-datepicker-weeknumber', + /** + * Class name of the week label container element + */ + weekLabelContainer = 'p-datepicker-weeklabel-container', + /** + * Class name of the week day cell element + */ + weekDayCell = 'p-datepicker-weekday-cell', + /** + * Class name of the week day element + */ + weekDay = 'p-datepicker-weekday', + /** + * Class name of the day cell element + */ + dayCell = 'p-datepicker-day-cell', + /** + * Class name of the day element + */ + day = 'p-datepicker-day', + /** + * Class name of the month view element + */ + monthView = 'p-datepicker-month-view', + /** + * Class name of the month element + */ + month = 'p-datepicker-month', + /** + * Class name of the year view element + */ + yearView = 'p-datepicker-year-view', + /** + * Class name of the year element + */ + year = 'p-datepicker-year', + /** + * Class name of the time picker element + */ + timePicker = 'p-datepicker-time-picker', + /** + * Class name of the hour picker element + */ + hourPicker = 'p-datepicker-hour-picker', + /** + * Class name of the increment button element + */ + pcIncrementButton = 'p-datepicker-increment-button', + /** + * Class name of the decrement button element + */ + pcDecrementButton = 'p-datepicker-decrement-button', + /** + * Class name of the separator element + */ + separator = 'p-datepicker-separator', + /** + * Class name of the minute picker element + */ + minutePicker = 'p-datepicker-minute-picker', + /** + * Class name of the second picker element + */ + secondPicker = 'p-datepicker-second-picker', + /** + * Class name of the ampm picker element + */ + ampmPicker = 'p-datepicker-ampm-picker', + /** + * Class name of the buttonbar element + */ + buttonbar = 'p-datepicker-buttonbar', + /** + * Class name of the today button element + */ + pcTodayButton = 'p-datepicker-today-button', + /** + * Class name of the clear button element + */ + pcClearButton = 'p-datepicker-clear-button', + /** + * Class name of the clear icon + */ + clearIcon = 'p-datepicker-clear-icon' +} + +export interface DatePickerStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/dom/connectedoverlayscrollhandler.ts b/projects/cps-ui-kit/src/lib/primeng-temp/dom/connectedoverlayscrollhandler.ts new file mode 100644 index 000000000..2d80b548b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/dom/connectedoverlayscrollhandler.ts @@ -0,0 +1,45 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/dom/connectedoverlayscrollhandler.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { DomHandler } from './domhandler'; + +export class ConnectedOverlayScrollHandler { + element: any; + + listener: any; + + scrollableParents: any; + + constructor(element: any, listener: any = () => {}) { + this.element = element; + this.listener = listener; + } + + bindScrollListener() { + this.scrollableParents = DomHandler.getScrollableParents(this.element); + for (let i = 0; i < this.scrollableParents.length; i++) { + this.scrollableParents[i].addEventListener('scroll', this.listener); + } + } + + unbindScrollListener() { + if (this.scrollableParents) { + for (let i = 0; i < this.scrollableParents.length; i++) { + this.scrollableParents[i].removeEventListener('scroll', this.listener); + } + } + } + + destroy() { + this.unbindScrollListener(); + this.element = null; + this.listener = null; + this.scrollableParents = null; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/dom/domhandler.ts b/projects/cps-ui-kit/src/lib/primeng-temp/dom/domhandler.ts new file mode 100755 index 000000000..61e17940c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/dom/domhandler.ts @@ -0,0 +1,875 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/dom/domhandler.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { getCSSVariableByRegex } from '../../primeuix-temp/utils/src/index'; +/** + * @dynamic is for runtime initializing DomHandler.browser + * + * If delete below comment, we can see this error message: + * Metadata collected contains an error that will be reported at runtime: + * Only initialized variables and constants can be referenced + * because the value of this variable is needed by the template compiler. + */ +// @dynamic +export class DomHandler { + public static zindex: number = 1000; + + private static calculatedScrollbarWidth: number | null = null; + + private static calculatedScrollbarHeight: number | null = null; + + private static browser: any; + + public static addClass(element: any, className: string): void { + if (element && className) { + if (element.classList) element.classList.add(className); + else element.className += ' ' + className; + } + } + + public static addMultipleClasses(element: any, className: string): void { + if (element && className) { + if (element.classList) { + let styles: string[] = className.trim().split(' '); + for (let i = 0; i < styles.length; i++) { + element.classList.add(styles[i]); + } + } else { + let styles: string[] = className.split(' '); + for (let i = 0; i < styles.length; i++) { + element.className += ' ' + styles[i]; + } + } + } + } + + public static removeClass(element: any, className: string): void { + if (element && className) { + if (element.classList) element.classList.remove(className); + else element.className = element.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); + } + } + + public static removeMultipleClasses(element, classNames) { + if (element && classNames) { + [classNames] + .flat() + .filter(Boolean) + .forEach((cNames) => cNames.split(' ').forEach((className) => this.removeClass(element, className))); + } + } + + public static hasClass(element: any, className: string): boolean { + if (element && className) { + if (element.classList) return element.classList.contains(className); + else return new RegExp('(^| )' + className + '( |$)', 'gi').test(element.className); + } + + return false; + } + + public static siblings(element: any): any { + return Array.prototype.filter.call(element.parentNode.children, function (child) { + return child !== element; + }); + } + + public static find(element: any, selector: string): any[] { + return Array.from(element.querySelectorAll(selector)); + } + + public static findSingle(element: any, selector: string): any { + return this.isElement(element) ? element.querySelector(selector) : null; + } + + public static index(element: any): number { + let children = element.parentNode.childNodes; + let num = 0; + for (var i = 0; i < children.length; i++) { + if (children[i] == element) return num; + if (children[i].nodeType == 1) num++; + } + return -1; + } + + public static indexWithinGroup(element: any, attributeName: string): number { + let children = element.parentNode ? element.parentNode.childNodes : []; + let num = 0; + for (var i = 0; i < children.length; i++) { + if (children[i] == element) return num; + if (children[i].attributes && children[i].attributes[attributeName] && children[i].nodeType == 1) num++; + } + return -1; + } + + public static appendOverlay(overlay: any, target: any, appendTo: any = 'self') { + if (appendTo !== 'self' && overlay && target) { + this.appendChild(overlay, target); + } + } + + public static alignOverlay(overlay: any, target: any, appendTo: any = 'self', calculateMinWidth: boolean = true) { + if (overlay && target) { + if (calculateMinWidth) { + overlay.style.minWidth = `${DomHandler.getOuterWidth(target)}px`; + } + + if (appendTo === 'self') { + this.relativePosition(overlay, target); + } else { + this.absolutePosition(overlay, target); + } + } + } + + public static relativePosition(element: any, target: any, gutter: boolean = true): void { + const getClosestRelativeElement = (el) => { + if (!el) return; + + return getComputedStyle(el).getPropertyValue('position') === 'relative' ? el : getClosestRelativeElement(el.parentElement); + }; + + const elementDimensions = element.offsetParent ? { width: element.offsetWidth, height: element.offsetHeight } : this.getHiddenElementDimensions(element); + const targetHeight = target.offsetHeight; + const targetOffset = target.getBoundingClientRect(); + const windowScrollTop = this.getWindowScrollTop(); + const windowScrollLeft = this.getWindowScrollLeft(); + const viewport = this.getViewport(); + const relativeElement = getClosestRelativeElement(element); + const relativeElementOffset = relativeElement?.getBoundingClientRect() || { + top: -1 * windowScrollTop, + left: -1 * windowScrollLeft + }; + let top: number, + left: number, + origin: string = 'top'; + + if (targetOffset.top + targetHeight + elementDimensions.height > viewport.height) { + top = targetOffset.top - relativeElementOffset.top - elementDimensions.height; + origin = 'bottom'; + if (targetOffset.top + top < 0) { + top = -1 * targetOffset.top; + } + } else { + top = targetHeight + targetOffset.top - relativeElementOffset.top; + origin = 'top'; + } + + const horizontalOverflow = targetOffset.left + elementDimensions.width - viewport.width; + const targetLeftOffsetInSpaceOfRelativeElement = targetOffset.left - relativeElementOffset.left; + if (elementDimensions.width > viewport.width) { + // element wider then viewport and cannot fit on screen (align at left side of viewport) + left = (targetOffset.left - relativeElementOffset.left) * -1; + } else if (horizontalOverflow > 0) { + // element wider then viewport but can be fit on screen (align at right side of viewport) + left = targetLeftOffsetInSpaceOfRelativeElement - horizontalOverflow; + } else { + // element fits on screen (align with target) + left = targetOffset.left - relativeElementOffset.left; + } + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.transformOrigin = origin; + + if (gutter) { + const gutterValue = getCSSVariableByRegex(/-anchor-gutter$/)?.value; + + element.style.marginTop = origin === 'bottom' ? `calc(${gutterValue ?? '2px'} * -1)` : (gutterValue ?? ''); + } + } + + public static absolutePosition(element: any, target: any, gutter: boolean = true): void { + const elementDimensions = element.offsetParent ? { width: element.offsetWidth, height: element.offsetHeight } : this.getHiddenElementDimensions(element); + const elementOuterHeight = elementDimensions.height; + const elementOuterWidth = elementDimensions.width; + const targetOuterHeight = target.offsetHeight; + const targetOuterWidth = target.offsetWidth; + const targetOffset = target.getBoundingClientRect(); + const windowScrollTop = this.getWindowScrollTop(); + const windowScrollLeft = this.getWindowScrollLeft(); + const viewport = this.getViewport(); + let top: number, left: number; + + if (targetOffset.top + targetOuterHeight + elementOuterHeight > viewport.height) { + top = targetOffset.top + windowScrollTop - elementOuterHeight; + element.style.transformOrigin = 'bottom'; + + if (top < 0) { + top = windowScrollTop; + } + } else { + top = targetOuterHeight + targetOffset.top + windowScrollTop; + element.style.transformOrigin = 'top'; + } + + if (targetOffset.left + elementOuterWidth > viewport.width) left = Math.max(0, targetOffset.left + windowScrollLeft + targetOuterWidth - elementOuterWidth); + else left = targetOffset.left + windowScrollLeft; + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + gutter && (element.style.marginTop = origin === 'bottom' ? 'calc(var(--p-anchor-gutter) * -1)' : 'calc(var(--p-anchor-gutter))'); + } + + static getParents(element: any, parents: any = []): any { + return element['parentNode'] === null ? parents : this.getParents(element.parentNode, parents.concat([element.parentNode])); + } + + static getScrollableParents(element: any) { + let scrollableParents: any[] = []; + + if (element) { + let parents = this.getParents(element); + const overflowRegex = /(auto|scroll)/; + const overflowCheck = (node: any) => { + let styleDeclaration = window['getComputedStyle'](node, null); + return overflowRegex.test(styleDeclaration.getPropertyValue('overflow')) || overflowRegex.test(styleDeclaration.getPropertyValue('overflowX')) || overflowRegex.test(styleDeclaration.getPropertyValue('overflowY')); + }; + + for (let parent of parents) { + let scrollSelectors = parent.nodeType === 1 && parent.dataset['scrollselectors']; + if (scrollSelectors) { + let selectors = scrollSelectors.split(','); + for (let selector of selectors) { + let el = this.findSingle(parent, selector); + if (el && overflowCheck(el)) { + scrollableParents.push(el); + } + } + } + + if (parent.nodeType !== 9 && overflowCheck(parent)) { + scrollableParents.push(parent); + } + } + } + + return scrollableParents; + } + + public static getHiddenElementOuterHeight(element: any): number { + element.style.visibility = 'hidden'; + element.style.display = 'block'; + let elementHeight = element.offsetHeight; + element.style.display = 'none'; + element.style.visibility = 'visible'; + + return elementHeight; + } + + public static getHiddenElementOuterWidth(element: any): number { + element.style.visibility = 'hidden'; + element.style.display = 'block'; + let elementWidth = element.offsetWidth; + element.style.display = 'none'; + element.style.visibility = 'visible'; + + return elementWidth; + } + + public static getHiddenElementDimensions(element: any): any { + let dimensions: any = {}; + element.style.visibility = 'hidden'; + element.style.display = 'block'; + dimensions.width = element.offsetWidth; + dimensions.height = element.offsetHeight; + element.style.display = 'none'; + element.style.visibility = 'visible'; + + return dimensions; + } + + public static scrollInView(container, item) { + let borderTopValue: string = getComputedStyle(container).getPropertyValue('borderTopWidth'); + let borderTop: number = borderTopValue ? parseFloat(borderTopValue) : 0; + let paddingTopValue: string = getComputedStyle(container).getPropertyValue('paddingTop'); + let paddingTop: number = paddingTopValue ? parseFloat(paddingTopValue) : 0; + let containerRect = container.getBoundingClientRect(); + let itemRect = item.getBoundingClientRect(); + let offset = itemRect.top + document.body.scrollTop - (containerRect.top + document.body.scrollTop) - borderTop - paddingTop; + let scroll = container.scrollTop; + let elementHeight = container.clientHeight; + let itemHeight = this.getOuterHeight(item); + + if (offset < 0) { + container.scrollTop = scroll + offset; + } else if (offset + itemHeight > elementHeight) { + container.scrollTop = scroll + offset - elementHeight + itemHeight; + } + } + + public static fadeIn(element, duration: number): void { + element.style.opacity = 0; + + let last = +new Date(); + let opacity = 0; + let tick = function () { + opacity = +element.style.opacity.replace(',', '.') + (new Date().getTime() - last) / duration; + element.style.opacity = opacity; + last = +new Date(); + + if (+opacity < 1) { + if (window.requestAnimationFrame) window.requestAnimationFrame(tick); + else setTimeout(tick, 16); + } + }; + + tick(); + } + + public static fadeOut(element, ms) { + var opacity = 1, + interval = 50, + duration = ms, + gap = interval / duration; + + let fading = setInterval(() => { + opacity = opacity - gap; + + if (opacity <= 0) { + opacity = 0; + clearInterval(fading); + } + + element.style.opacity = opacity; + }, interval); + } + + public static getWindowScrollTop(): number { + let doc = document.documentElement; + return (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0); + } + + public static getWindowScrollLeft(): number { + let doc = document.documentElement; + return (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0); + } + + public static matches(element, selector: string): boolean { + var p = Element.prototype; + var f = + p['matches'] || + p.webkitMatchesSelector || + p['mozMatchesSelector'] || + p['msMatchesSelector'] || + function (s) { + return [].indexOf.call(document.querySelectorAll(s), this) !== -1; + }; + return f.call(element, selector); + } + + public static getOuterWidth(el, margin?) { + let width = el.offsetWidth; + + if (margin) { + let style = getComputedStyle(el); + width += parseFloat(style.marginLeft) + parseFloat(style.marginRight); + } + + return width; + } + + public static getHorizontalPadding(el) { + let style = getComputedStyle(el); + return parseFloat(style.paddingLeft) + parseFloat(style.paddingRight); + } + + public static getHorizontalMargin(el) { + let style = getComputedStyle(el); + return parseFloat(style.marginLeft) + parseFloat(style.marginRight); + } + + public static innerWidth(el) { + let width = el.offsetWidth; + let style = getComputedStyle(el); + + width += parseFloat(style.paddingLeft) + parseFloat(style.paddingRight); + return width; + } + + public static width(el) { + let width = el.offsetWidth; + let style = getComputedStyle(el); + + width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight); + return width; + } + + public static getInnerHeight(el) { + let height = el.offsetHeight; + let style = getComputedStyle(el); + + height += parseFloat(style.paddingTop) + parseFloat(style.paddingBottom); + return height; + } + + public static getOuterHeight(el, margin?) { + let height = el.offsetHeight; + + if (margin) { + let style = getComputedStyle(el); + height += parseFloat(style.marginTop) + parseFloat(style.marginBottom); + } + + return height; + } + + public static getHeight(el): number { + let height = el.offsetHeight; + let style = getComputedStyle(el); + + height -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom) + parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth); + + return height; + } + + public static getWidth(el): number { + let width = el.offsetWidth; + let style = getComputedStyle(el); + + width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) + parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth); + + return width; + } + + public static getViewport(): any { + let win = window, + d = document, + e = d.documentElement, + g = d.getElementsByTagName('body')[0], + w = win.innerWidth || e.clientWidth || g.clientWidth, + h = win.innerHeight || e.clientHeight || g.clientHeight; + + return { width: w, height: h }; + } + + public static getOffset(el) { + var rect = el.getBoundingClientRect(); + + return { + top: rect.top + (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0), + left: rect.left + (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0) + }; + } + + public static replaceElementWith(element: any, replacementElement: any): any { + let parentNode = element.parentNode; + if (!parentNode) throw `Can't replace element`; + return parentNode.replaceChild(replacementElement, element); + } + + public static getUserAgent(): string | undefined { + if (navigator && this.isClient()) { + return navigator.userAgent; + } + } + + public static isIE() { + var ua = window.navigator.userAgent; + + var msie = ua.indexOf('MSIE '); + if (msie > 0) { + // IE 10 or older => return version number + return true; + } + + var trident = ua.indexOf('Trident/'); + if (trident > 0) { + // IE 11 => return version number + var rv = ua.indexOf('rv:'); + return true; + } + + var edge = ua.indexOf('Edge/'); + if (edge > 0) { + // Edge (IE 12+) => return version number + return true; + } + + // other browser + return false; + } + + public static isIOS() { + return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window['MSStream']; + } + + public static isAndroid() { + return /(android)/i.test(navigator.userAgent); + } + + public static isTouchDevice() { + return 'ontouchstart' in window || navigator.maxTouchPoints > 0; + } + + public static appendChild(element: any, target: any) { + if (this.isElement(target)) target.appendChild(element); + else if (target && target.el && target.el.nativeElement) target.el.nativeElement.appendChild(element); + else throw 'Cannot append ' + target + ' to ' + element; + } + + public static removeChild(element: any, target: any) { + if (this.isElement(target)) target.removeChild(element); + else if (target.el && target.el.nativeElement) target.el.nativeElement.removeChild(element); + else throw 'Cannot remove ' + element + ' from ' + target; + } + + public static removeElement(element: Element) { + if (!('remove' in Element.prototype)) element.parentNode?.removeChild(element); + else element.remove(); + } + + public static isElement(obj: any) { + return typeof HTMLElement === 'object' ? obj instanceof HTMLElement : obj && typeof obj === 'object' && obj !== null && obj.nodeType === 1 && typeof obj.nodeName === 'string'; + } + + public static calculateScrollbarWidth(el?: HTMLElement): number { + if (el) { + let style = getComputedStyle(el); + return el.offsetWidth - el.clientWidth - parseFloat(style.borderLeftWidth) - parseFloat(style.borderRightWidth); + } else { + if (this.calculatedScrollbarWidth !== null) return this.calculatedScrollbarWidth; + + let scrollDiv = document.createElement('div'); + scrollDiv.className = 'p-scrollbar-measure'; + document.body.appendChild(scrollDiv); + + let scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + + this.calculatedScrollbarWidth = scrollbarWidth; + + return scrollbarWidth; + } + } + + public static calculateScrollbarHeight(): number { + if (this.calculatedScrollbarHeight !== null) return this.calculatedScrollbarHeight; + + let scrollDiv = document.createElement('div'); + scrollDiv.className = 'p-scrollbar-measure'; + document.body.appendChild(scrollDiv); + + let scrollbarHeight = scrollDiv.offsetHeight - scrollDiv.clientHeight; + document.body.removeChild(scrollDiv); + + this.calculatedScrollbarWidth = scrollbarHeight; + + return scrollbarHeight; + } + + public static invokeElementMethod(element: any, methodName: string, args?: any[]): void { + (element as any)[methodName].apply(element, args); + } + + public static clearSelection(): void { + if (window.getSelection && window.getSelection()) { + if (window.getSelection()?.empty) { + window.getSelection()?.empty(); + } else if (window.getSelection()?.removeAllRanges && (window.getSelection()?.rangeCount || 0) > 0 && (window.getSelection()?.getRangeAt(0)?.getClientRects()?.length || 0) > 0) { + window.getSelection()?.removeAllRanges(); + } + } else if (document['selection'] && document['selection'].empty) { + try { + document['selection'].empty(); + } catch (error) { + //ignore IE bug + } + } + } + + public static getBrowser() { + if (!this.browser) { + let matched = this.resolveUserAgent(); + this.browser = {}; + + if (matched.browser) { + this.browser[matched.browser] = true; + this.browser['version'] = matched.version; + } + + if (this.browser['chrome']) { + this.browser['webkit'] = true; + } else if (this.browser['webkit']) { + this.browser['safari'] = true; + } + } + + return this.browser; + } + + public static resolveUserAgent() { + let ua = navigator.userAgent.toLowerCase(); + let match = + /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || (ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua)) || []; + + return { + browser: match[1] || '', + version: match[2] || '0' + }; + } + + public static isInteger(value): boolean { + if (Number.isInteger) { + return Number.isInteger(value); + } else { + return typeof value === 'number' && isFinite(value) && Math.floor(value) === value; + } + } + + public static isHidden(element: HTMLElement): boolean { + return !element || element.offsetParent === null; + } + + public static isVisible(element: HTMLElement) { + return element && element.offsetParent != null; + } + + public static isExist(element: HTMLElement) { + return element !== null && typeof element !== 'undefined' && element.nodeName && element.parentNode; + } + + public static focus(element: HTMLElement, options?: FocusOptions): void { + element && document.activeElement !== element && element.focus(options); + } + + public static getFocusableSelectorString(selector = ''): string { + return `button:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + [href][clientHeight][clientWidth]:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + input:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + select:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + textarea:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + [tabIndex]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + [contenteditable]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + .p-inputtext:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + .p-button:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}`; + } + + public static getFocusableElements(element, selector = ''): any[] { + let focusableElements = this.find(element, this.getFocusableSelectorString(selector)); + + let visibleFocusableElements: any[] = []; + + for (let focusableElement of focusableElements) { + const computedStyle = getComputedStyle(focusableElement); + if (this.isVisible(focusableElement) && computedStyle.display != 'none' && computedStyle.visibility != 'hidden') visibleFocusableElements.push(focusableElement); + } + + return visibleFocusableElements; + } + + public static getFocusableElement(element, selector = ''): any | null { + let focusableElement = this.findSingle(element, this.getFocusableSelectorString(selector)); + + if (focusableElement) { + const computedStyle = getComputedStyle(focusableElement); + if (this.isVisible(focusableElement) && computedStyle.display != 'none' && computedStyle.visibility != 'hidden') return focusableElement; + } + + return null; + } + + public static getFirstFocusableElement(element, selector = '') { + const focusableElements = this.getFocusableElements(element, selector); + + return focusableElements.length > 0 ? focusableElements[0] : null; + } + + public static getLastFocusableElement(element, selector) { + const focusableElements = this.getFocusableElements(element, selector); + + return focusableElements.length > 0 ? focusableElements[focusableElements.length - 1] : null; + } + + public static getNextFocusableElement(element: HTMLElement, reverse = false) { + const focusableElements = DomHandler.getFocusableElements(element); + let index = 0; + if (focusableElements && focusableElements.length > 0) { + const focusedIndex = focusableElements.indexOf(focusableElements[0].ownerDocument.activeElement); + + if (reverse) { + if (focusedIndex == -1 || focusedIndex === 0) { + index = focusableElements.length - 1; + } else { + index = focusedIndex - 1; + } + } else if (focusedIndex != -1 && focusedIndex !== focusableElements.length - 1) { + index = focusedIndex + 1; + } + } + + return focusableElements[index]; + } + + static generateZIndex() { + this.zindex = this.zindex || 999; + return ++this.zindex; + } + + public static getSelection() { + if (window.getSelection) return window.getSelection()?.toString(); + else if (document.getSelection) return document.getSelection()?.toString(); + else if (document['selection']) return document['selection'].createRange().text; + + return null; + } + + public static getTargetElement(target: any, el?: HTMLElement) { + if (!target) return null; + + switch (target) { + case 'document': + return document; + case 'window': + return window; + case '@next': + return el?.nextElementSibling; + case '@prev': + return el?.previousElementSibling; + case '@parent': + return el?.parentElement; + case '@grandparent': + return el?.parentElement?.parentElement; + default: + const type = typeof target; + + if (type === 'string') { + return document.querySelector(target); + } else if (type === 'object' && target.hasOwnProperty('nativeElement')) { + return this.isExist(target.nativeElement) ? target.nativeElement : undefined; + } + + const isFunction = (obj: any) => !!(obj && obj.constructor && obj.call && obj.apply); + const element = isFunction(target) ? target() : target; + + return (element && element.nodeType === 9) || this.isExist(element) ? element : null; + } + } + + public static isClient() { + return !!(typeof window !== 'undefined' && window.document && window.document.createElement); + } + + public static getAttribute(element, name) { + if (element) { + const value = element.getAttribute(name); + + if (!isNaN(value)) { + return +value; + } + + if (value === 'true' || value === 'false') { + return value === 'true'; + } + + return value; + } + + return undefined; + } + + public static calculateBodyScrollbarWidth() { + return window.innerWidth - document.documentElement.offsetWidth; + } + + public static blockBodyScroll(className = 'p-overflow-hidden') { + document.body.style.setProperty('--scrollbar-width', this.calculateBodyScrollbarWidth() + 'px'); + this.addClass(document.body, className); + } + + public static unblockBodyScroll(className = 'p-overflow-hidden') { + document.body.style.removeProperty('--scrollbar-width'); + this.removeClass(document.body, className); + } + + public static createElement(type, attributes = {}, ...children) { + if (type) { + const element = document.createElement(type); + + this.setAttributes(element, attributes); + element.append(...children); + + return element; + } + + return undefined; + } + + public static setAttribute(element, attribute = '', value) { + if (this.isElement(element) && value !== null && value !== undefined) { + element.setAttribute(attribute, value); + } + } + + public static setAttributes(element, attributes = {}) { + if (this.isElement(element)) { + const computedStyles = (rule, value) => { + const styles = element?.$attrs?.[rule] ? [element?.$attrs?.[rule]] : []; + + return [value].flat().reduce((cv, v) => { + if (v !== null && v !== undefined) { + const type = typeof v; + + if (type === 'string' || type === 'number') { + cv.push(v); + } else if (type === 'object') { + const _cv = Array.isArray(v) + ? computedStyles(rule, v) + : Object.entries(v).map(([_k, _v]) => (rule === 'style' && (!!_v || _v === 0) ? `${_k.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}:${_v}` : !!_v ? _k : undefined)); + + cv = _cv.length ? cv.concat(_cv.filter((c) => !!c)) : cv; + } + } + + return cv; + }, styles); + }; + + Object.entries(attributes).forEach(([key, value]) => { + if (value !== undefined && value !== null) { + const matchedEvent = key.match(/^on(.+)/); + + if (matchedEvent) { + element.addEventListener(matchedEvent[1].toLowerCase(), value); + } else if (key === 'pBind') { + this.setAttributes(element, value); + } else { + value = key === 'class' ? [...new Set(computedStyles('class', value))].join(' ').trim() : key === 'style' ? computedStyles('style', value).join(';').trim() : value; + (element.$attrs = element.$attrs || {}) && (element.$attrs[key] = value); + element.setAttribute(key, value); + } + } + }); + } + } + + public static isFocusableElement(element, selector = '') { + return this.isElement(element) + ? element.matches(`button:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + [href][clientHeight][clientWidth]:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + input:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + select:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + textarea:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + [tabIndex]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + [contenteditable]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}`) + : false; + } +} + +import { $dt } from '../../primeuix-temp/styled/src/index'; +import * as utils from '../../primeuix-temp/utils/src/index'; + +// @todo: update this when we remove the old domhandler +export function blockBodyScroll() { + utils.blockBodyScroll({ variableName: $dt('scrollbar.width').name }); +} + +export function unblockBodyScroll() { + utils.unblockBodyScroll({ variableName: $dt('scrollbar.width').name }); +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/dom/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/dom/public_api.ts new file mode 100644 index 000000000..1cc2ca087 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/dom/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/dom/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './domhandler'; +export * from './connectedoverlayscrollhandler'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/fluid/fluid.ts b/projects/cps-ui-kit/src/lib/primeng-temp/fluid/fluid.ts new file mode 100755 index 000000000..02f08d745 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/fluid/fluid.ts @@ -0,0 +1,54 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/fluid/fluid.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { ChangeDetectionStrategy, Component, inject, InjectionToken, NgModule, ViewEncapsulation } from '@angular/core'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind } from '../bind/public_api'; +import { FluidPassThrough } from '../types/fluid/public_api'; +import { FluidStyle } from './style/fluidstyle'; + +const FLUID_INSTANCE = new InjectionToken('FLUID_INSTANCE'); + +/** + * Fluid is a layout component to make descendant components span full width of their container. + * @group Components + */ +@Component({ + selector: 'p-fluid', + template: ` `, + standalone: true, + imports: [CommonModule], + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + providers: [FluidStyle, { provide: FLUID_INSTANCE, useExisting: Fluid }, { provide: PARENT_INSTANCE, useExisting: Fluid }], + host: { + '[class]': "cx('root')" + }, + hostDirectives: [Bind] +}) +export class Fluid extends BaseComponent { + componentName = 'Fluid'; + + $pcFluid: Fluid | undefined = inject(FLUID_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + + _componentStyle = inject(FluidStyle); +} + +@NgModule({ + imports: [Fluid], + exports: [Fluid] +}) +export class FluidModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/fluid/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/fluid/public_api.ts new file mode 100644 index 000000000..640d0ec62 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/fluid/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/fluid/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/fluid/public_api'; +export * from './fluid'; +export * from './style/fluidstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/fluid/style/fluidstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/fluid/style/fluidstyle.ts new file mode 100644 index 000000000..480d4ca45 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/fluid/style/fluidstyle.ts @@ -0,0 +1,40 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/fluid/style/fluidstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { BaseStyle } from '../../base/public_api'; + +const classes = { + root: 'p-fluid' +}; + +@Injectable() +export class FluidStyle extends BaseStyle { + name = 'fluid'; + + classes = classes; +} + +/** + * + * Fluid is a layout component to make descendant components span full width of their container. + * + * [Live Demo](https://www.primeng.org/fluid/) + * + * @module fluidstyle + * + */ +export enum FluidClasses { + /** + * Class name of the root element + */ + root = 'p-fluid' +} + +export interface FluidStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/iconfield/iconfield.ts b/projects/cps-ui-kit/src/lib/primeng-temp/iconfield/iconfield.ts new file mode 100755 index 000000000..5a0751a1a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/iconfield/iconfield.ts @@ -0,0 +1,68 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/iconfield/iconfield.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { AfterViewChecked, ChangeDetectionStrategy, Component, inject, InjectionToken, Input, NgModule, ViewEncapsulation } from '@angular/core'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import { IconFieldPassThrough } from '../types/iconfield/public_api'; +import { IconFieldStyle } from './style/iconfieldstyle'; + +const ICONFIELD_INSTANCE = new InjectionToken('ICONFIELD_INSTANCE'); + +/** + * IconField wraps an input and an icon. + * @group Components + */ +@Component({ + selector: 'p-iconfield, p-iconField, p-icon-field', + standalone: true, + imports: [CommonModule, BindModule], + template: ` `, + providers: [IconFieldStyle, { provide: ICONFIELD_INSTANCE, useExisting: IconField }, { provide: PARENT_INSTANCE, useExisting: IconField }], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + host: { + '[class]': "cn(cx('root'), styleClass)" + }, + hostDirectives: [Bind] +}) +export class IconField extends BaseComponent implements AfterViewChecked { + componentName = 'IconField'; + + @Input() hostName: any = ''; + + _componentStyle = inject(IconFieldStyle); + + $pcIconField: IconField | undefined = inject(ICONFIELD_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + + /** + * Position of the icon. + * @group Props + */ + @Input() iconPosition: 'right' | 'left' = 'left'; + /** + * Style class of the component. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string; +} + +@NgModule({ + imports: [IconField], + exports: [IconField] +}) +export class IconFieldModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/iconfield/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/iconfield/public_api.ts new file mode 100644 index 000000000..6329cef28 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/iconfield/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/iconfield/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './iconfield'; +export * from './style/iconfieldstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/iconfield/style/iconfieldstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/iconfield/style/iconfieldstyle.ts new file mode 100644 index 000000000..76976fcf4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/iconfield/style/iconfieldstyle.ts @@ -0,0 +1,49 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/iconfield/style/iconfieldstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style } from '../../../primeuix-temp/styles/src/iconfield/index'; +import { BaseStyle } from '../../base/public_api'; + +const classes = { + root: ({ instance }) => [ + 'p-iconfield', + { + 'p-iconfield-left': instance.iconPosition == 'left', + 'p-iconfield-right': instance.iconPosition == 'right' + } + ] +}; + +@Injectable() +export class IconFieldStyle extends BaseStyle { + name = 'iconfield'; + + style = style; + + classes = classes; +} + +/** + * + * IconField wraps an input and an icon. + * + * [Live Demo](https://www.primeng.org/iconfield/) + * + * @module iconfieldstyle + * + */ +export enum IconFieldClasses { + /** + * Class name of the root element + */ + root = 'p-iconfield' +} + +export interface IconFieldStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleleft/angledoubleleft.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleleft/angledoubleleft.ts new file mode 100644 index 000000000..fad59d474 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleleft/angledoubleleft.ts @@ -0,0 +1,26 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angledoubleleft/angledoubleleft.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="angle-double-left"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class AngleDoubleLeftIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleleft/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleleft/public_api.ts new file mode 100644 index 000000000..bdb44807a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleleft/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angledoubleleft/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './angledoubleleft'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleright/angledoubleright.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleright/angledoubleright.ts new file mode 100644 index 000000000..8c753afbd --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleright/angledoubleright.ts @@ -0,0 +1,26 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angledoubleright/angledoubleright.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="angle-double-right"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class AngleDoubleRightIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleright/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleright/public_api.ts new file mode 100644 index 000000000..7c15d3e5f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledoubleright/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angledoubleright/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './angledoubleright'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledown/angledown.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledown/angledown.ts new file mode 100644 index 000000000..fcc4a8db6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledown/angledown.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angledown/angledown.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="angle-down"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class AngleDownIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledown/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledown/public_api.ts new file mode 100644 index 000000000..805698e2e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angledown/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angledown/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './angledown'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleleft/angleleft.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleleft/angleleft.ts new file mode 100644 index 000000000..964d40ca7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleleft/angleleft.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angleleft/angleleft.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="angle-left"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class AngleLeftIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleleft/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleleft/public_api.ts new file mode 100644 index 000000000..05b730044 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleleft/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angleleft/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './angleleft'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleright/angleright.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleright/angleright.ts new file mode 100644 index 000000000..17acc1c68 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleright/angleright.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angleright/angleright.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="angle-right"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class AngleRightIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleright/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleright/public_api.ts new file mode 100644 index 000000000..33e06c24d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleright/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angleright/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './angleright'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleup/angleup.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleup/angleup.ts new file mode 100644 index 000000000..d57f51712 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleup/angleup.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angleup/angleup.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="angle-up"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class AngleUpIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleup/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleup/public_api.ts new file mode 100644 index 000000000..6695a79c0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/angleup/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/angleup/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './angleup'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowdown/arrowdown.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowdown/arrowdown.ts new file mode 100644 index 000000000..ec76c9bed --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowdown/arrowdown.ts @@ -0,0 +1,40 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/arrowdown/arrowdown.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="arrow-down"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + ` +}) +export class ArrowDownIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowdown/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowdown/public_api.ts new file mode 100644 index 000000000..647f39a75 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowdown/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/arrowdown/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './arrowdown'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowup/arrowup.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowup/arrowup.ts new file mode 100644 index 000000000..e7f835691 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowup/arrowup.ts @@ -0,0 +1,40 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/arrowup/arrowup.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="arrow-up"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + ` +}) +export class ArrowUpIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowup/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowup/public_api.ts new file mode 100644 index 000000000..7edc40eca --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/arrowup/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/arrowup/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './arrowup'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/baseicon/baseicon.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/baseicon/baseicon.ts new file mode 100644 index 000000000..bf2d80a5e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/baseicon/baseicon.ts @@ -0,0 +1,40 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/baseicon/baseicon.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { booleanAttribute, ChangeDetectionStrategy, Component, inject, Input, ViewEncapsulation } from '@angular/core'; +import { cn } from '../../../primeuix-temp/utils/src/index'; +import { BaseComponent } from '../../basecomponent/public_api'; +import { BaseIconStyle } from './style/baseiconstyle'; + +@Component({ + template: ` `, + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + providers: [BaseIconStyle], + host: { + width: '14', + height: '14', + viewBox: '0 0 14 14', + fill: 'none', + xmlns: 'http://www.w3.org/2000/svg', + '[class]': 'getClassNames()' + } +}) +export class BaseIcon extends BaseComponent { + @Input({ transform: booleanAttribute }) spin: boolean = false; + + _componentStyle = inject(BaseIconStyle); + + getClassNames() { + return cn('p-icon', { + 'p-icon-spin': this.spin + }); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/baseicon/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/baseicon/public_api.ts new file mode 100644 index 000000000..7fc01d109 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/baseicon/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/baseicon/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './baseicon'; +export * from './style/baseiconstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/baseicon/style/baseiconstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/baseicon/style/baseiconstyle.ts new file mode 100644 index 000000000..c9e7bf595 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/baseicon/style/baseiconstyle.ts @@ -0,0 +1,68 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/baseicon/style/baseiconstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { BaseStyle } from '../../../base/public_api'; + +const css = /*css*/ ` +.p-icon { + display: inline-block; + vertical-align: baseline; + flex-shrink: 0; +} + +.p-icon-spin { + -webkit-animation: p-icon-spin 2s infinite linear; + animation: p-icon-spin 2s infinite linear; +} + +@-webkit-keyframes p-icon-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes p-icon-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +`; + +@Injectable({ + providedIn: 'root' +}) +export class BaseIconStyle extends BaseStyle { + name = 'baseicon'; + + css = css; +} +/** + * + * [Live Demo](https://www.primeng.org/) + * + * @module baseiconstyle + * + */ + +export enum BaseIconClasses { + root = 'p-icon' +} + +export interface BaseIconStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/blank/blank.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/blank/blank.ts new file mode 100644 index 000000000..984069b12 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/blank/blank.ts @@ -0,0 +1,19 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/blank/blank.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="blank"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` ` +}) +export class BlankIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/blank/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/blank/public_api.ts new file mode 100644 index 000000000..dcf2e1760 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/blank/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/blank/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './blank'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/calendar/calendar.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/calendar/calendar.ts new file mode 100644 index 000000000..304d50b3f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/calendar/calendar.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/calendar/calendar.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="calendar"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class CalendarIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/calendar/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/calendar/public_api.ts new file mode 100644 index 000000000..77fcdb722 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/calendar/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/calendar/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './calendar'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/check/check.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/check/check.ts new file mode 100644 index 000000000..35ba34522 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/check/check.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/check/check.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="check"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class CheckIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/check/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/check/public_api.ts new file mode 100644 index 000000000..a91ed3711 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/check/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/check/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './check'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevrondown/chevrondown.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevrondown/chevrondown.ts new file mode 100644 index 000000000..61fb4e029 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevrondown/chevrondown.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/chevrondown/chevrondown.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="chevron-down"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class ChevronDownIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevrondown/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevrondown/public_api.ts new file mode 100644 index 000000000..985ddfed5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevrondown/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/chevrondown/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './chevrondown'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronleft/chevronleft.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronleft/chevronleft.ts new file mode 100644 index 000000000..7352c925e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronleft/chevronleft.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/chevronleft/chevronleft.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="chevron-left"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class ChevronLeftIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronleft/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronleft/public_api.ts new file mode 100644 index 000000000..21f97c25c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronleft/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/chevronleft/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './chevronleft'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronright/chevronright.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronright/chevronright.ts new file mode 100644 index 000000000..37db0cf13 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronright/chevronright.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/chevronright/chevronright.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="chevron-right"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class ChevronRightIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronright/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronright/public_api.ts new file mode 100644 index 000000000..190d5c368 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronright/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/chevronright/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './chevronright'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronup/chevronup.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronup/chevronup.ts new file mode 100644 index 000000000..65d276198 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronup/chevronup.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/chevronup/chevronup.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="chevron-up"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class ChevronUpIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronup/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronup/public_api.ts new file mode 100644 index 000000000..fb93fbf11 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/chevronup/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/chevronup/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './chevronup'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/filter/filter.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/filter/filter.ts new file mode 100644 index 000000000..adf0e0df1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/filter/filter.ts @@ -0,0 +1,38 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/filter/filter.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="filter"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + ` +}) +export class FilterIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/filter/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/filter/public_api.ts new file mode 100644 index 000000000..5ef7c7484 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/filter/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/filter/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './filter'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/filterfill/filter.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/filterfill/filter.ts new file mode 100644 index 000000000..0bf1f9046 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/filterfill/filter.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/filterfill/filter.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="filter-fill"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class FilterFillIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/filterfill/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/filterfill/public_api.ts new file mode 100644 index 000000000..24c536e83 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/filterfill/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/filterfill/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './filter'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/minus/minus.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/minus/minus.ts new file mode 100644 index 000000000..a03d0c670 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/minus/minus.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/minus/minus.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="minus"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class MinusIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/minus/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/minus/public_api.ts new file mode 100644 index 000000000..be70051c9 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/minus/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/minus/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './minus'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/plus/plus.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/plus/plus.ts new file mode 100644 index 000000000..2e5752d7c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/plus/plus.ts @@ -0,0 +1,38 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/plus/plus.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="plus"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + ` +}) +export class PlusIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/plus/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/plus/public_api.ts new file mode 100644 index 000000000..b657dc523 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/plus/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/plus/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './plus'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/public_api.ts new file mode 100644 index 000000000..9bcd25918 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/public_api.ts @@ -0,0 +1,38 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +/** + * @file + * THIS FILE IS AUTO-GENERATED. PLEASE DO NOT MODIFY. + */ +export * from './angledoubleleft/public_api'; +export * from './angledoubleright/public_api'; +export * from './angledown/public_api'; +export * from './angleleft/public_api'; +export * from './angleright/public_api'; +export * from './angleup/public_api'; +export * from './arrowdown/public_api'; +export * from './arrowup/public_api'; +export * from './blank/public_api'; +export * from './calendar/public_api'; +export * from './check/public_api'; +export * from './chevrondown/public_api'; +export * from './chevronleft/public_api'; +export * from './chevronright/public_api'; +export * from './chevronup/public_api'; +export * from './filter/public_api'; +export * from './minus/public_api'; +export * from './plus/public_api'; +export * from './search/public_api'; +export * from './sortalt/public_api'; +export * from './sortamountdown/public_api'; +export * from './sortamountupalt/public_api'; +export * from './spinner/public_api'; +export * from './times/public_api'; +export * from './trash/public_api'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/search/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/search/public_api.ts new file mode 100644 index 000000000..5ee8b57da --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/search/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/search/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './search'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/search/search.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/search/search.ts new file mode 100644 index 000000000..0159a2d2f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/search/search.ts @@ -0,0 +1,40 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/search/search.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="search"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + ` +}) +export class SearchIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortalt/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortalt/public_api.ts new file mode 100644 index 000000000..3ca09e922 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortalt/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/sortalt/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './sortalt'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortalt/sortalt.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortalt/sortalt.ts new file mode 100644 index 000000000..699b4bfc2 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortalt/sortalt.ts @@ -0,0 +1,44 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/sortalt/sortalt.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="sort-alt"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + + + + ` +}) +export class SortAltIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountdown/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountdown/public_api.ts new file mode 100644 index 000000000..42e94083b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountdown/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/sortamountdown/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './sortamountdown'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountdown/sortamountdown.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountdown/sortamountdown.ts new file mode 100644 index 000000000..c2aa8eaf0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountdown/sortamountdown.ts @@ -0,0 +1,38 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/sortamountdown/sortamountdown.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="sort-amount-down"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + ` +}) +export class SortAmountDownIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountupalt/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountupalt/public_api.ts new file mode 100644 index 000000000..f28d18c54 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountupalt/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/sortamountupalt/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './sortamountupalt'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountupalt/sortamountupalt.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountupalt/sortamountupalt.ts new file mode 100644 index 000000000..705612c2d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/sortamountupalt/sortamountupalt.ts @@ -0,0 +1,38 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/sortamountupalt/sortamountupalt.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="sort-amount-up-alt"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + ` +}) +export class SortAmountUpAltIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/spinner/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/spinner/public_api.ts new file mode 100644 index 000000000..12466ab64 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/spinner/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/spinner/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './spinner'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/spinner/spinner.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/spinner/spinner.ts new file mode 100644 index 000000000..89b1be8b5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/spinner/spinner.ts @@ -0,0 +1,38 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/spinner/spinner.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="spinner"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + ` +}) +export class SpinnerIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/times/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/times/public_api.ts new file mode 100644 index 000000000..e83f07f3b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/times/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/times/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './times'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/times/times.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/times/times.ts new file mode 100644 index 000000000..61c39c318 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/times/times.ts @@ -0,0 +1,24 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/times/times.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="times"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + ` +}) +export class TimesIcon extends BaseIcon {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/trash/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/trash/public_api.ts new file mode 100644 index 000000000..05b20146f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/trash/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/trash/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './trash'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/icons/trash/trash.ts b/projects/cps-ui-kit/src/lib/primeng-temp/icons/trash/trash.ts new file mode 100644 index 000000000..eae5a66e8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/icons/trash/trash.ts @@ -0,0 +1,40 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/icons/trash/trash.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { uuid } from '../../../primeuix-temp/utils/src/index'; +import { BaseIcon } from '../baseicon/public_api'; + +@Component({ + selector: '[data-p-icon="trash"]', + standalone: true, + changeDetection: ChangeDetectionStrategy.Eager, + template: ` + + + + + + + + + ` +}) +export class TrashIcon extends BaseIcon { + pathId: string; + + onInit() { + this.pathId = 'url(#' + uuid() + ')'; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/inputicon/inputicon.ts b/projects/cps-ui-kit/src/lib/primeng-temp/inputicon/inputicon.ts new file mode 100755 index 000000000..d994bb653 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/inputicon/inputicon.ts @@ -0,0 +1,63 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/inputicon/inputicon.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { ChangeDetectionStrategy, Component, inject, InjectionToken, Input, NgModule, ViewEncapsulation } from '@angular/core'; +import { SharedModule } from '../api/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import { InputIconPassThrough } from '../types/inputicon/public_api'; +import { InputIconStyle } from './style/inputiconstyle'; + +const INPUTICON_INSTANCE = new InjectionToken('INPUTICON_INSTANCE'); + +/** + * InputIcon displays an icon. + * @group Components + */ +@Component({ + selector: 'p-inputicon, p-inputIcon', + standalone: true, + imports: [CommonModule, SharedModule, BindModule], + template: ``, + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [InputIconStyle, { provide: INPUTICON_INSTANCE, useExisting: InputIcon }, { provide: PARENT_INSTANCE, useExisting: InputIcon }], + hostDirectives: [Bind], + host: { + '[class]': "cn(cx('root'), styleClass)" + } +}) +export class InputIcon extends BaseComponent { + componentName = 'InputIcon'; + + @Input() hostName: any = ''; + /** + * Style class of the element. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + + _componentStyle = inject(InputIconStyle); + + $pcInputIcon: InputIcon | undefined = inject(INPUTICON_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } +} + +@NgModule({ + imports: [InputIcon, SharedModule], + exports: [InputIcon, SharedModule] +}) +export class InputIconModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/inputicon/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/inputicon/public_api.ts new file mode 100644 index 000000000..bd669a9b5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/inputicon/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/inputicon/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputicon'; +export * from './style/inputiconstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/inputicon/style/inputiconstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/inputicon/style/inputiconstyle.ts new file mode 100644 index 000000000..a4fade0f7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/inputicon/style/inputiconstyle.ts @@ -0,0 +1,22 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/inputicon/style/inputiconstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { BaseStyle } from '../../base/public_api'; + +const classes = { + root: 'p-inputicon' +}; + +@Injectable() +export class InputIconStyle extends BaseStyle { + name = 'inputicon'; + + classes = classes; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/inputnumber/inputnumber.ts b/projects/cps-ui-kit/src/lib/primeng-temp/inputnumber/inputnumber.ts new file mode 100644 index 000000000..3bdd89135 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/inputnumber/inputnumber.ts @@ -0,0 +1,1502 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/inputnumber/inputnumber.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { + booleanAttribute, + ChangeDetectionStrategy, + Component, + ContentChild, + ContentChildren, + ElementRef, + EventEmitter, + forwardRef, + inject, + InjectionToken, + Injector, + Input, + NgModule, + numberAttribute, + Output, + QueryList, + SimpleChanges, + TemplateRef, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { NG_VALUE_ACCESSOR, NgControl } from '@angular/forms'; +import { getSelection } from '../../primeuix-temp/utils/src/index'; +import { PrimeTemplate, SharedModule } from '../api/public_api'; +import { AutoFocus } from '../autofocus/public_api'; +import { PARENT_INSTANCE } from '../basecomponent/public_api'; +import { BaseInput } from '../baseinput/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import { AngleDownIcon, AngleUpIcon, TimesIcon } from '../icons/public_api'; +import { InputText } from '../inputtext/public_api'; +import { Nullable } from '../ts-helpers/public_api'; +import type { InputNumberInputEvent, InputNumberPassThrough } from '../types/inputnumber/public_api'; +import { InputNumberStyle } from './style/inputnumberstyle'; + +const INPUTNUMBER_INSTANCE = new InjectionToken('INPUTNUMBER_INSTANCE'); + +export const INPUTNUMBER_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => InputNumber), + multi: true +}; +/** + * InputNumber is an input component to provide numerical input. + * @group Components + */ +@Component({ + selector: 'p-inputNumber, p-inputnumber, p-input-number', + standalone: true, + imports: [CommonModule, InputText, AutoFocus, TimesIcon, AngleUpIcon, AngleDownIcon, SharedModule, BindModule], + template: ` + + + + + + + + + + + + + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [INPUTNUMBER_VALUE_ACCESSOR, InputNumberStyle, { provide: INPUTNUMBER_INSTANCE, useExisting: InputNumber }, { provide: PARENT_INSTANCE, useExisting: InputNumber }], + encapsulation: ViewEncapsulation.None, + host: { + '[class]': "cn(cx('root'), styleClass)", + '[attr.data-p]': 'dataP' + }, + hostDirectives: [Bind] +}) +export class InputNumber extends BaseInput { + componentName = 'InputNumber'; + + $pcInputNumber: InputNumber | undefined = inject(INPUTNUMBER_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + _componentStyle = inject(InputNumberStyle); + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + + /** + * Displays spinner buttons. + * @group Props + */ + @Input({ transform: booleanAttribute }) showButtons: boolean = false; + /** + * Whether to format the value. + * @group Props + */ + @Input({ transform: booleanAttribute }) format: boolean = true; + /** + * Layout of the buttons, valid values are "stacked" (default), "horizontal" and "vertical". + * @group Props + */ + @Input() buttonLayout: string = 'stacked'; + /** + * Identifier of the focus input to match a label defined for the component. + * @group Props + */ + @Input() inputId: string | undefined; + /** + * Style class of the component. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * Advisory information to display on input. + * @group Props + */ + @Input() placeholder: string | undefined; + /** + * Specifies tab order of the element. + * @group Props + */ + @Input({ transform: numberAttribute }) tabindex: number | undefined; + /** + * Title text of the input text. + * @group Props + */ + @Input() title: string | undefined; + /** + * Specifies one or more IDs in the DOM that labels the input field. + * @group Props + */ + @Input() ariaLabelledBy: string | undefined; + /** + * Specifies one or more IDs in the DOM that describes the input field. + * @group Props + */ + @Input() ariaDescribedBy: string | undefined; + /** + * Used to define a string that labels the input element. + * @group Props + */ + @Input() ariaLabel: string | undefined; + /** + * Used to indicate that user input is required on an element before a form can be submitted. + * @group Props + */ + @Input({ transform: booleanAttribute }) ariaRequired: boolean | undefined; + /** + * Used to define a string that autocomplete attribute the current element. + * @group Props + */ + @Input() autocomplete: string | undefined; + /** + * Style class of the increment button. + * @group Props + */ + @Input() incrementButtonClass: string | undefined; + /** + * Style class of the decrement button. + * @group Props + */ + @Input() decrementButtonClass: string | undefined; + /** + * Style class of the increment button. + * @group Props + */ + @Input() incrementButtonIcon: string | undefined; + /** + * Style class of the decrement button. + * @group Props + */ + @Input() decrementButtonIcon: string | undefined; + /** + * When present, it specifies that an input field is read-only. + * @group Props + */ + @Input({ transform: booleanAttribute }) readonly: boolean | undefined; + /** + * Determines whether the input field is empty. + * @group Props + */ + @Input({ transform: booleanAttribute }) allowEmpty: boolean = true; + /** + * Locale to be used in formatting. + * @group Props + */ + @Input() locale: string | undefined; + /** + * The locale matching algorithm to use. Possible values are "lookup" and "best fit"; the default is "best fit". See Locale Negotiation for details. + * @group Props + */ + @Input() localeMatcher: any; + /** + * Defines the behavior of the component, valid values are "decimal" and "currency". + * @group Props + */ + @Input() mode: string | any = 'decimal'; + /** + * The currency to use in currency formatting. Possible values are the ISO 4217 currency codes, such as "USD" for the US dollar, "EUR" for the euro, or "CNY" for the Chinese RMB. There is no default value; if the style is "currency", the currency property must be provided. + * @group Props + */ + @Input() currency: string | undefined; + /** + * How to display the currency in currency formatting. Possible values are "symbol" to use a localized currency symbol such as €, ü"code" to use the ISO currency code, "name" to use a localized currency name such as "dollar"; the default is "symbol". + * @group Props + */ + @Input() currencyDisplay: string | undefined | any; + /** + * Whether to use grouping separators, such as thousands separators or thousand/lakh/crore separators. + * @group Props + */ + @Input({ transform: booleanAttribute }) useGrouping: boolean = true; + /** + * The minimum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number and percent formatting is 0; the default for currency formatting is the number of minor unit digits provided by the ISO 4217 currency code list (2 if the list doesn't provide that information). + * @group Props + */ + @Input({ transform: (value: unknown) => numberAttribute(value, undefined) }) minFractionDigits: number | undefined; + /** + * The maximum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number formatting is the larger of minimumFractionDigits and 3; the default for currency formatting is the larger of minimumFractionDigits and the number of minor unit digits provided by the ISO 4217 currency code list (2 if the list doesn't provide that information). + * @group Props + */ + @Input({ transform: (value: unknown) => numberAttribute(value, undefined) }) maxFractionDigits: number | undefined; + /** + * Text to display before the value. + * @group Props + */ + @Input() prefix: string | undefined; + /** + * Text to display after the value. + * @group Props + */ + @Input() suffix: string | undefined; + /** + * Inline style of the input field. + * @group Props + */ + @Input() inputStyle: any; + /** + * Style class of the input field. + * @group Props + */ + @Input() inputStyleClass: string | undefined; + /** + * When enabled, a clear icon is displayed to clear the value. + * @group Props + */ + @Input({ transform: booleanAttribute }) showClear: boolean = false; + /** + * When present, it specifies that the component should automatically get focus on load. + * @group Props + */ + @Input({ transform: booleanAttribute }) autofocus: boolean | undefined; + /** + * Callback to invoke on input. + * @param {InputNumberInputEvent} event - Custom input event. + * @group Emits + */ + @Output() onInput: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the component receives focus. + * @param {Event} event - Browser event. + * @group Emits + */ + @Output() onFocus: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the component loses focus. + * @param {Event} event - Browser event. + * @group Emits + */ + @Output() onBlur: EventEmitter = new EventEmitter(); + /** + * Callback to invoke on input key press. + * @param {KeyboardEvent} event - Keyboard event. + * @group Emits + */ + @Output() onKeyDown: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when clear token is clicked. + * @group Emits + */ + @Output() onClear: EventEmitter = new EventEmitter(); + + /** + * Custom clear icon template. + * @group Templates + */ + @ContentChild('clearicon', { descendants: false }) clearIconTemplate: Nullable>; + /** + * Custom increment button icon template. + * @group Templates + */ + @ContentChild('incrementbuttonicon', { descendants: false }) incrementButtonIconTemplate: Nullable>; + + /** + * Custom decrement button icon template. + * @group Templates + */ + @ContentChild('decrementbuttonicon', { descendants: false }) decrementButtonIconTemplate: Nullable>; + + @ContentChildren(PrimeTemplate) templates!: QueryList; + + @ViewChild('input') input!: ElementRef; + + _clearIconTemplate: TemplateRef | undefined; + + _incrementButtonIconTemplate: TemplateRef | undefined; + + _decrementButtonIconTemplate: TemplateRef | undefined; + + value: Nullable; + + focused: Nullable; + + initialized: Nullable; + + groupChar: string = ''; + + prefixChar: string = ''; + + suffixChar: string = ''; + + isSpecialChar: Nullable; + + timer: any; + + lastValue: Nullable; + + _numeral: any; + + numberFormat: any; + + _decimal: any; + + _decimalChar: string = ''; + + _group: any; + + _minusSign: any; + + _currency: Nullable; + + _prefix: Nullable; + + _suffix: Nullable; + + _index: number | any; + + private ngControl: NgControl | null = null; + + constructor(public readonly injector: Injector) { + super(); + } + + onChanges(simpleChange: SimpleChanges) { + const props = ['locale', 'localeMatcher', 'mode', 'currency', 'currencyDisplay', 'useGrouping', 'minFractionDigits', 'maxFractionDigits', 'prefix', 'suffix']; + if (props.some((p) => !!simpleChange[p])) { + this.updateConstructParser(); + } + } + + onInit() { + this.ngControl = this.injector.get(NgControl, null, { optional: true }); + + this.constructParser(); + + this.initialized = true; + } + + onAfterContentInit() { + this.templates.forEach((item) => { + switch (item.getType()) { + case 'clearicon': + this._clearIconTemplate = item.template; + break; + + case 'incrementbuttonicon': + this._incrementButtonIconTemplate = item.template; + break; + + case 'decrementbuttonicon': + this._decrementButtonIconTemplate = item.template; + break; + } + }); + } + + getOptions() { + // Validate fraction digits according to Intl.NumberFormat specifications + // Handle potential NaN, Infinity, or invalid values + const validateFractionDigits = (value: number | undefined, min: number, max: number) => { + if (value == null || isNaN(value) || !isFinite(value)) { + return undefined; + } + return Math.max(min, Math.min(max, Math.floor(value))); + }; + + const minFractionDigits = validateFractionDigits(this.minFractionDigits, 0, 20); + const maxFractionDigits = validateFractionDigits(this.maxFractionDigits, 0, 100); + + // Ensure minFractionDigits <= maxFractionDigits + const validatedMinFractionDigits = minFractionDigits != null && maxFractionDigits != null && minFractionDigits > maxFractionDigits ? maxFractionDigits : minFractionDigits; + + return { + localeMatcher: this.localeMatcher, + style: this.mode, + currency: this.currency, + currencyDisplay: this.currencyDisplay, + useGrouping: this.useGrouping, + minimumFractionDigits: validatedMinFractionDigits, + maximumFractionDigits: maxFractionDigits + }; + } + + constructParser() { + const options = this.getOptions(); + // Remove any properties with undefined or invalid values to let Intl.NumberFormat use defaults + const cleanOptions = Object.fromEntries(Object.entries(options).filter(([_key, value]) => value !== undefined)); + this.numberFormat = new Intl.NumberFormat(this.locale, cleanOptions); + const numerals = [...new Intl.NumberFormat(this.locale, { useGrouping: false }).format(9876543210)].reverse(); + const index = new Map(numerals.map((d, i) => [d, i])); + this._numeral = new RegExp(`[${numerals.join('')}]`, 'g'); + this._group = this.getGroupingExpression(); + this._minusSign = this.getMinusSignExpression(); + this._currency = this.getCurrencyExpression(); + this._decimal = this.getDecimalExpression(); + this._decimalChar = this.getDecimalChar(); + this._suffix = this.getSuffixExpression(); + this._prefix = this.getPrefixExpression(); + this._index = (d: any) => index.get(d); + } + + updateConstructParser() { + if (this.initialized) { + this.constructParser(); + } + } + + escapeRegExp(text: string): string { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + } + + getDecimalExpression(): RegExp { + const decimalChar = this.getDecimalChar(); + return new RegExp(`[${decimalChar}]`, 'g'); + } + getDecimalChar(): string { + const formatter = new Intl.NumberFormat(this.locale, { ...this.getOptions(), useGrouping: false }); + return formatter + .format(1.1) + .replace(this._currency as RegExp | string, '') + .trim() + .replace(this._numeral, ''); + } + + getGroupingExpression(): RegExp { + const formatter = new Intl.NumberFormat(this.locale, { useGrouping: true }); + this.groupChar = formatter.format(1000000).trim().replace(this._numeral, '').charAt(0); + return new RegExp(`[${this.groupChar}]`, 'g'); + } + + getMinusSignExpression(): RegExp { + const formatter = new Intl.NumberFormat(this.locale, { useGrouping: false }); + return new RegExp(`[${formatter.format(-1).trim().replace(this._numeral, '')}]`, 'g'); + } + + getCurrencyExpression(): RegExp { + if (this.currency) { + const formatter = new Intl.NumberFormat(this.locale, { + style: 'currency', + currency: this.currency, + currencyDisplay: this.currencyDisplay, + minimumFractionDigits: 0, + maximumFractionDigits: 0 + }); + return new RegExp(`[${formatter.format(1).replace(/\s/g, '').replace(this._numeral, '').replace(this._group, '')}]`, 'g'); + } + + return new RegExp(`[]`, 'g'); + } + + getPrefixExpression(): RegExp { + if (this.prefix) { + this.prefixChar = this.prefix; + } else { + const formatter = new Intl.NumberFormat(this.locale, { + style: this.mode, + currency: this.currency, + currencyDisplay: this.currencyDisplay + }); + this.prefixChar = formatter.format(1).split('1')[0]; + } + + return new RegExp(`${this.escapeRegExp(this.prefixChar || '')}`, 'g'); + } + + getSuffixExpression(): RegExp { + if (this.suffix) { + this.suffixChar = this.suffix; + } else { + const formatter = new Intl.NumberFormat(this.locale, { + style: this.mode, + currency: this.currency, + currencyDisplay: this.currencyDisplay, + minimumFractionDigits: 0, + maximumFractionDigits: 0 + }); + this.suffixChar = formatter.format(1).split('1')[1]; + } + + return new RegExp(`${this.escapeRegExp(this.suffixChar || '')}`, 'g'); + } + + formatValue(value: any) { + if (value != null) { + if (value === '-') { + // Minus sign + return value; + } + + if (this.format) { + let formatter = new Intl.NumberFormat(this.locale, this.getOptions()); + let formattedValue = formatter.format(value); + + if (this.prefix && value != this.prefix) { + formattedValue = this.prefix + formattedValue; + } + + if (this.suffix && value != this.suffix) { + formattedValue = formattedValue + this.suffix; + } + + return formattedValue; + } + + return value.toString(); + } + + return ''; + } + + parseValue(text: any) { + const suffixRegex = this._suffix ? new RegExp(this._suffix, '') : /(?:)/; + const prefixRegex = this._prefix ? new RegExp(this._prefix, '') : /(?:)/; + const currencyRegex = this._currency ? new RegExp(this._currency as RegExp | string, '') : /(?:)/; + + let filteredText = text + .replace(suffixRegex, '') + .replace(prefixRegex, '') + .trim() + .replace(/\s/g, '') + .replace(currencyRegex, '') + .replace(this._group, '') + .replace(this._minusSign, '-') + .replace(this._decimal, '.') + .replace(this._numeral, this._index); + + if (filteredText) { + if (filteredText === '-') + // Minus sign + return filteredText; + + let parsedValue = +filteredText; + return isNaN(parsedValue) ? null : parsedValue; + } + + return null; + } + + repeat(event: Event, interval: number | null, dir: number) { + if (this.readonly) { + return; + } + + let i = interval || 500; + + this.clearTimer(); + this.timer = setTimeout(() => { + this.repeat(event, 40, dir); + }, i); + + this.spin(event, dir); + } + + spin(event: Event, dir: number) { + let step = (this.step() ?? 1) * dir; + let currentValue = this.parseValue(this.input?.nativeElement.value) || 0; + let newValue = this.validateValue((currentValue as number) + step); + const max = this.maxlength(); + if (max && max < this.formatValue(newValue).length) { + return; + } + + this.updateInput(newValue, null, 'spin', null); + this.updateModel(event, newValue); + + this.handleOnInput(event, currentValue, newValue); + } + + clear() { + this.value = null; + this.onModelChange(this.value); + this.onClear.emit(); + } + + onUpButtonMouseDown(event: MouseEvent) { + if (event.button === 2) { + this.clearTimer(); + return; + } + + if (!this.$disabled()) { + this.input?.nativeElement.focus(); + this.repeat(event, null, 1); + event.preventDefault(); + } + } + + onUpButtonMouseUp() { + if (!this.$disabled()) { + this.clearTimer(); + } + } + + onUpButtonMouseLeave() { + if (!this.$disabled()) { + this.clearTimer(); + } + } + + onUpButtonKeyDown(event: KeyboardEvent) { + if (event.keyCode === 32 || event.keyCode === 13) { + this.repeat(event, null, 1); + } + } + + onUpButtonKeyUp() { + if (!this.$disabled()) { + this.clearTimer(); + } + } + + onDownButtonMouseDown(event: MouseEvent) { + if (event.button === 2) { + this.clearTimer(); + return; + } + if (!this.$disabled()) { + this.input?.nativeElement.focus(); + this.repeat(event, null, -1); + event.preventDefault(); + } + } + + onDownButtonMouseUp() { + if (!this.$disabled()) { + this.clearTimer(); + } + } + + onDownButtonMouseLeave() { + if (!this.$disabled()) { + this.clearTimer(); + } + } + + onDownButtonKeyUp() { + if (!this.$disabled()) { + this.clearTimer(); + } + } + + onDownButtonKeyDown(event: KeyboardEvent) { + if (event.keyCode === 32 || event.keyCode === 13) { + this.repeat(event, null, -1); + } + } + + onUserInput(event: Event) { + if (this.readonly) { + return; + } + + if (this.isSpecialChar) { + (event.target as HTMLInputElement).value = this.lastValue as string; + } + this.isSpecialChar = false; + } + + onInputKeyDown(event: KeyboardEvent) { + if (this.readonly) { + return; + } + + this.lastValue = (event.target as HTMLInputElement).value; + if ((event as KeyboardEvent).shiftKey || (event as KeyboardEvent).altKey) { + this.isSpecialChar = true; + return; + } + + let selectionStart = (event.target as HTMLInputElement).selectionStart as number; + let selectionEnd = (event.target as HTMLInputElement).selectionEnd as number; + let inputValue = (event.target as HTMLInputElement).value as string; + let newValueStr: any = null; + + if (event.altKey) { + event.preventDefault(); + } + + switch (event.key) { + case 'ArrowUp': + this.spin(event, 1); + event.preventDefault(); + break; + + case 'ArrowDown': + this.spin(event, -1); + event.preventDefault(); + break; + + case 'ArrowLeft': + for (let index = selectionStart; index <= inputValue.length; index++) { + const previousCharIndex = index === 0 ? 0 : index - 1; + if (this.isNumeralChar(inputValue.charAt(previousCharIndex))) { + this.input.nativeElement.setSelectionRange(index, index); + break; + } + } + break; + + case 'ArrowRight': + for (let index = selectionEnd; index >= 0; index--) { + if (this.isNumeralChar(inputValue.charAt(index))) { + this.input.nativeElement.setSelectionRange(index, index); + break; + } + } + break; + + case 'Tab': + case 'Enter': + newValueStr = this.validateValue(this.parseValue(this.input.nativeElement.value)); + this.input.nativeElement.value = this.formatValue(newValueStr); + this.input.nativeElement.setAttribute('aria-valuenow', newValueStr); + this.updateModel(event, newValueStr); + break; + + case 'Backspace': { + event.preventDefault(); + + if (selectionStart === selectionEnd) { + if ((selectionStart == 1 && this.prefix) || (selectionStart == inputValue.length && this.suffix)) { + break; + } + + const deleteChar = inputValue.charAt(selectionStart - 1); + const { decimalCharIndex, decimalCharIndexWithoutPrefix } = this.getDecimalCharIndexes(inputValue); + + if (this.isNumeralChar(deleteChar)) { + const decimalLength = this.getDecimalLength(inputValue); + + if (this._group.test(deleteChar)) { + this._group.lastIndex = 0; + newValueStr = inputValue.slice(0, selectionStart - 2) + inputValue.slice(selectionStart - 1); + } else if (this._decimal.test(deleteChar)) { + this._decimal.lastIndex = 0; + + if (decimalLength) { + this.input?.nativeElement.setSelectionRange(selectionStart - 1, selectionStart - 1); + } else { + newValueStr = inputValue.slice(0, selectionStart - 1) + inputValue.slice(selectionStart); + } + } else if (decimalCharIndex > 0 && selectionStart > decimalCharIndex) { + const insertedText = this.isDecimalMode() && (this.minFractionDigits || 0) < decimalLength ? '' : '0'; + newValueStr = inputValue.slice(0, selectionStart - 1) + insertedText + inputValue.slice(selectionStart); + } else if (decimalCharIndexWithoutPrefix === 1) { + newValueStr = inputValue.slice(0, selectionStart - 1) + '0' + inputValue.slice(selectionStart); + newValueStr = (this.parseValue(newValueStr) as number) > 0 ? newValueStr : ''; + } else { + newValueStr = inputValue.slice(0, selectionStart - 1) + inputValue.slice(selectionStart); + } + } else if (this.mode === 'currency' && this._currency && deleteChar.search(this._currency as RegExp) != -1) { + newValueStr = inputValue.slice(1); + } + + this.updateValue(event, newValueStr, null, 'delete-single'); + } else { + newValueStr = this.deleteRange(inputValue, selectionStart, selectionEnd); + this.updateValue(event, newValueStr, null, 'delete-range'); + } + + break; + } + + case 'Delete': + event.preventDefault(); + + if (selectionStart === selectionEnd) { + if ((selectionStart == 0 && this.prefix) || (selectionStart == inputValue.length - 1 && this.suffix)) { + break; + } + const deleteChar = inputValue.charAt(selectionStart); + const { decimalCharIndex, decimalCharIndexWithoutPrefix } = this.getDecimalCharIndexes(inputValue); + + if (this.isNumeralChar(deleteChar)) { + const decimalLength = this.getDecimalLength(inputValue); + + if (this._group.test(deleteChar)) { + this._group.lastIndex = 0; + newValueStr = inputValue.slice(0, selectionStart) + inputValue.slice(selectionStart + 2); + } else if (this._decimal.test(deleteChar)) { + this._decimal.lastIndex = 0; + + if (decimalLength) { + this.input?.nativeElement.setSelectionRange(selectionStart + 1, selectionStart + 1); + } else { + newValueStr = inputValue.slice(0, selectionStart) + inputValue.slice(selectionStart + 1); + } + } else if (decimalCharIndex > 0 && selectionStart > decimalCharIndex) { + const insertedText = this.isDecimalMode() && (this.minFractionDigits || 0) < decimalLength ? '' : '0'; + newValueStr = inputValue.slice(0, selectionStart) + insertedText + inputValue.slice(selectionStart + 1); + } else if (decimalCharIndexWithoutPrefix === 1) { + newValueStr = inputValue.slice(0, selectionStart) + '0' + inputValue.slice(selectionStart + 1); + newValueStr = (this.parseValue(newValueStr) as number) > 0 ? newValueStr : ''; + } else { + newValueStr = inputValue.slice(0, selectionStart) + inputValue.slice(selectionStart + 1); + } + } + + this.updateValue(event, newValueStr as string, null, 'delete-back-single'); + } else { + newValueStr = this.deleteRange(inputValue, selectionStart, selectionEnd); + this.updateValue(event, newValueStr, null, 'delete-range'); + } + break; + + case 'Home': + if (this.min()) { + this.updateModel(event, this.min()); + event.preventDefault(); + } + break; + + case 'End': + if (this.max()) { + this.updateModel(event, this.max()); + event.preventDefault(); + } + break; + + default: + break; + } + + this.onKeyDown.emit(event); + } + + onInputKeyPress(event: KeyboardEvent) { + if (this.readonly) { + return; + } + + let code = event.which || event.keyCode; + let char = String.fromCharCode(code); + let isDecimalSign = this.isDecimalSign(char); + const isMinusSign = this.isMinusSign(char); + + if (code != 13) { + event.preventDefault(); + } + if (!isDecimalSign && event.code === 'NumpadDecimal') { + isDecimalSign = true; + char = this._decimalChar; + code = char.charCodeAt(0); + } + const { value, selectionStart, selectionEnd } = this.input.nativeElement; + const newValue = this.parseValue(value + char); + const newValueStr = newValue != null ? newValue.toString() : ''; + const selectedValue = value.substring(selectionStart as number, selectionEnd as number); + const selectedValueParsed = this.parseValue(selectedValue); + const selectedValueStr = selectedValueParsed != null ? selectedValueParsed.toString() : ''; + + if (selectionStart !== selectionEnd && selectedValueStr.length > 0) { + this.insert(event, char, { isDecimalSign, isMinusSign }); + return; + } + + const max = this.maxlength(); + + if (max && newValueStr.length > max) { + return; + } + + if ((48 <= code && code <= 57) || isMinusSign || isDecimalSign) { + this.insert(event, char, { isDecimalSign, isMinusSign }); + } + } + + onPaste(event: ClipboardEvent) { + if (!this.$disabled() && !this.readonly) { + event.preventDefault(); + let data = (event.clipboardData || (this.document as any).defaultView['clipboardData']).getData('Text'); + if (this.inputId === 'integeronly' && /[^\d-]/.test(data)) { + return; + } + if (data) { + if (this.maxlength()) { + data = data.toString().substring(0, this.maxlength()); + } + + let filteredData = this.parseValue(data); + if (filteredData != null) { + this.insert(event, filteredData.toString()); + } + } + } + } + + allowMinusSign() { + const min = this.min(); + + return min == null || min < 0; + } + + isMinusSign(char: string) { + if (this._minusSign.test(char) || char === '-') { + this._minusSign.lastIndex = 0; + return true; + } + + return false; + } + + isDecimalSign(char: string) { + if (this._decimal.test(char)) { + this._decimal.lastIndex = 0; + return true; + } + + return false; + } + + isDecimalMode() { + return this.mode === 'decimal'; + } + + getDecimalCharIndexes(val: string) { + let decimalCharIndex = val.search(this._decimal); + this._decimal.lastIndex = 0; + + const filteredVal = val + .replace(this._prefix as RegExp, '') + .trim() + .replace(/\s/g, '') + .replace(this._currency as RegExp, ''); + const decimalCharIndexWithoutPrefix = filteredVal.search(this._decimal); + this._decimal.lastIndex = 0; + + return { decimalCharIndex, decimalCharIndexWithoutPrefix }; + } + + getCharIndexes(val: string) { + const decimalCharIndex = val.search(this._decimal); + this._decimal.lastIndex = 0; + const minusCharIndex = val.search(this._minusSign); + this._minusSign.lastIndex = 0; + const suffixCharIndex = val.search(this._suffix as RegExp); + (this._suffix as RegExp).lastIndex = 0; + const currencyCharIndex = val.search(this._currency as RegExp); + (this._currency as RegExp).lastIndex = 0; + + return { decimalCharIndex, minusCharIndex, suffixCharIndex, currencyCharIndex }; + } + + insert(event: Event, text: string, sign = { isDecimalSign: false, isMinusSign: false }) { + const minusCharIndexOnText = text.search(this._minusSign); + this._minusSign.lastIndex = 0; + if (!this.allowMinusSign() && minusCharIndexOnText !== -1) { + return; + } + + let selectionStart: any = this.input?.nativeElement.selectionStart; + let selectionEnd: any = this.input?.nativeElement.selectionEnd; + let inputValue = this.input?.nativeElement.value.trim(); + const { decimalCharIndex, minusCharIndex, suffixCharIndex, currencyCharIndex } = this.getCharIndexes(inputValue); + let newValueStr; + + if (sign.isMinusSign) { + if (selectionStart === 0) { + newValueStr = inputValue; + if (minusCharIndex === -1 || selectionEnd !== 0) { + newValueStr = this.insertText(inputValue, text, 0, selectionEnd); + } + + this.updateValue(event, newValueStr, text, 'insert'); + } + } else if (sign.isDecimalSign) { + if (decimalCharIndex > 0 && selectionStart === decimalCharIndex) { + this.updateValue(event, inputValue, text, 'insert'); + } else if (decimalCharIndex > selectionStart && decimalCharIndex < selectionEnd) { + newValueStr = this.insertText(inputValue, text, selectionStart, selectionEnd); + this.updateValue(event, newValueStr, text, 'insert'); + } else if (decimalCharIndex === -1 && this.maxFractionDigits) { + newValueStr = this.insertText(inputValue, text, selectionStart, selectionEnd); + this.updateValue(event, newValueStr, text, 'insert'); + } + } else { + const maxFractionDigits = this.numberFormat.resolvedOptions().maximumFractionDigits; + const operation = selectionStart !== selectionEnd ? 'range-insert' : 'insert'; + + if (decimalCharIndex > 0 && selectionStart > decimalCharIndex) { + if (selectionStart + text.length - (decimalCharIndex + 1) <= maxFractionDigits) { + const charIndex = currencyCharIndex >= selectionStart ? currencyCharIndex - 1 : suffixCharIndex >= selectionStart ? suffixCharIndex : inputValue.length; + + newValueStr = inputValue.slice(0, selectionStart) + text + inputValue.slice(selectionStart + text.length, charIndex) + inputValue.slice(charIndex); + this.updateValue(event, newValueStr, text, operation); + } + } else { + newValueStr = this.insertText(inputValue, text, selectionStart, selectionEnd); + this.updateValue(event, newValueStr, text, operation); + } + } + } + + insertText(value: string, text: string, start: number, end: number) { + let textSplit = text === '.' ? text : text.split('.'); + + if (textSplit.length === 2) { + const decimalCharIndex = value.slice(start, end).search(this._decimal); + this._decimal.lastIndex = 0; + return decimalCharIndex > 0 ? value.slice(0, start) + this.formatValue(text) + value.slice(end) : value || this.formatValue(text); + } else if (end - start === value.length) { + return this.formatValue(text); + } else if (start === 0) { + return text + value.slice(end); + } else if (end === value.length) { + return value.slice(0, start) + text; + } else { + return value.slice(0, start) + text + value.slice(end); + } + } + + deleteRange(value: string, start: number, end: number) { + let newValueStr; + + if (end - start === value.length) newValueStr = ''; + else if (start === 0) newValueStr = value.slice(end); + else if (end === value.length) newValueStr = value.slice(0, start); + else newValueStr = value.slice(0, start) + value.slice(end); + + return newValueStr; + } + + initCursor() { + let selectionStart: any = this.input?.nativeElement.selectionStart; + let selectionEnd: any = this.input?.nativeElement.selectionEnd; + let inputValue = this.input?.nativeElement.value; + let valueLength = inputValue.length; + let index: any = null; + + // remove prefix + let prefixLength = (this.prefixChar || '').length; + inputValue = inputValue.replace(this._prefix as RegExp, ''); + + // Will allow selecting whole prefix. But not a part of it. + // Negative values will trigger clauses after this to fix the cursor position. + if (selectionStart === selectionEnd || selectionStart !== 0 || selectionEnd < prefixLength) { + selectionStart -= prefixLength; + } + + let char = inputValue.charAt(selectionStart); + if (this.isNumeralChar(char)) { + return selectionStart + prefixLength; + } + + //left + let i = selectionStart - 1; + while (i >= 0) { + char = inputValue.charAt(i); + if (this.isNumeralChar(char)) { + index = i + prefixLength; + break; + } else { + i--; + } + } + + if (index !== null) { + this.input?.nativeElement.setSelectionRange(index + 1, index + 1); + } else { + i = selectionStart; + while (i < valueLength) { + char = inputValue.charAt(i); + if (this.isNumeralChar(char)) { + index = i + prefixLength; + break; + } else { + i++; + } + } + + if (index !== null) { + this.input?.nativeElement.setSelectionRange(index, index); + } + } + + return index || 0; + } + + onInputClick() { + const currentValue = this.input?.nativeElement.value; + + if (!this.readonly && currentValue !== getSelection()) { + this.initCursor(); + } + } + + isNumeralChar(char: string) { + if (char.length === 1 && (this._numeral.test(char) || this._decimal.test(char) || this._group.test(char) || this._minusSign.test(char))) { + this.resetRegex(); + return true; + } + + return false; + } + + resetRegex() { + this._numeral.lastIndex = 0; + this._decimal.lastIndex = 0; + this._group.lastIndex = 0; + this._minusSign.lastIndex = 0; + } + + updateValue(event: Event, valueStr: Nullable, insertedValueStr: Nullable, operation: Nullable) { + let currentValue = this.input?.nativeElement.value; + let newValue: any = null; + + if (valueStr != null) { + newValue = this.parseValue(valueStr); + newValue = !newValue && !this.allowEmpty ? 0 : newValue; + this.updateInput(newValue, insertedValueStr, operation, valueStr); + + this.handleOnInput(event, currentValue, newValue); + } + } + + handleOnInput(event: Event, currentValue: string, newValue: any) { + if (this.isValueChanged(currentValue, newValue)) { + (this.input as ElementRef).nativeElement.value = this.formatValue(newValue); + this.input?.nativeElement.setAttribute('aria-valuenow', newValue); + this.updateModel(event, newValue); + this.onInput.emit({ originalEvent: event, value: newValue, formattedValue: currentValue }); + } + } + + isValueChanged(currentValue: string, newValue: string) { + if (newValue === null && currentValue !== null) { + return true; + } + + if (newValue != null) { + let parsedCurrentValue = typeof currentValue === 'string' ? this.parseValue(currentValue) : currentValue; + return newValue !== parsedCurrentValue; + } + + return false; + } + + validateValue(value: number | string) { + if (value === '-' || value == null) { + return null; + } + const min = this.min(); + const max = this.max(); + + if (min != null && (value as number) < min) { + return this.min(); + } + + if (max != null && (value as number) > max) { + return max; + } + + return value; + } + + updateInput(value: any, insertedValueStr: Nullable, operation: Nullable, valueStr: Nullable) { + insertedValueStr = insertedValueStr || ''; + + let inputValue = this.input?.nativeElement.value; + let newValue = this.formatValue(value); + let currentLength = inputValue.length; + + if (newValue !== valueStr) { + newValue = this.concatValues(newValue, valueStr as string); + } + + if (currentLength === 0) { + this.input.nativeElement.value = newValue; + this.input.nativeElement.setSelectionRange(0, 0); + const index = this.initCursor(); + const selectionEnd = index + insertedValueStr.length; + this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); + } else { + let selectionStart: any = this.input.nativeElement.selectionStart; + let selectionEnd: any = this.input.nativeElement.selectionEnd; + const maxlength = this.maxlength(); + if (maxlength && newValue.length > maxlength) { + newValue = newValue.slice(0, maxlength); + selectionStart = Math.min(selectionStart, maxlength); + selectionEnd = Math.min(selectionEnd, maxlength); + } + + if (maxlength && maxlength < newValue.length) { + return; + } + + this.input.nativeElement.value = newValue; + let newLength = newValue.length; + + if (operation === 'range-insert') { + const startValue = this.parseValue((inputValue || '').slice(0, selectionStart)); + const startValueStr = startValue !== null ? startValue.toString() : ''; + const startExpr = startValueStr.split('').join(`(${this.groupChar})?`); + const sRegex = new RegExp(startExpr, 'g'); + sRegex.test(newValue); + + const tExpr = insertedValueStr.split('').join(`(${this.groupChar})?`); + const tRegex = new RegExp(tExpr, 'g'); + tRegex.test(newValue.slice(sRegex.lastIndex)); + + selectionEnd = sRegex.lastIndex + tRegex.lastIndex; + this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); + } else if (newLength === currentLength) { + if (operation === 'insert' || operation === 'delete-back-single') this.input.nativeElement.setSelectionRange(selectionEnd + 1, selectionEnd + 1); + else if (operation === 'delete-single') this.input.nativeElement.setSelectionRange(selectionEnd - 1, selectionEnd - 1); + else if (operation === 'delete-range' || operation === 'spin') this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); + } else if (operation === 'delete-back-single') { + let prevChar = inputValue.charAt(selectionEnd - 1); + let nextChar = inputValue.charAt(selectionEnd); + let diff = currentLength - newLength; + let isGroupChar = this._group.test(nextChar); + + if (isGroupChar && diff === 1) { + selectionEnd += 1; + } else if (!isGroupChar && this.isNumeralChar(prevChar)) { + selectionEnd += -1 * diff + 1; + } + + this._group.lastIndex = 0; + this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); + } else if (inputValue === '-' && operation === 'insert') { + this.input.nativeElement.setSelectionRange(0, 0); + const index = this.initCursor(); + const selectionEnd = index + insertedValueStr.length + 1; + this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); + } else { + selectionEnd = selectionEnd + (newLength - currentLength); + this.input.nativeElement.setSelectionRange(selectionEnd, selectionEnd); + } + } + + this.input.nativeElement.setAttribute('aria-valuenow', value); + } + + concatValues(val1: string, val2: string) { + if (val1 && val2) { + let decimalCharIndex = val2.search(this._decimal); + this._decimal.lastIndex = 0; + + if (this.suffixChar) { + return decimalCharIndex !== -1 ? val1.replace(this.suffixChar, '').split(this._decimal)[0] + val2.replace(this.suffixChar, '').slice(decimalCharIndex) + this.suffixChar : val1; + } else { + return decimalCharIndex !== -1 ? val1.split(this._decimal)[0] + val2.slice(decimalCharIndex) : val1; + } + } + return val1; + } + + getDecimalLength(value: string) { + if (value) { + const valueSplit = value.split(this._decimal); + + if (valueSplit.length === 2) { + return valueSplit[1] + .replace(this._suffix as RegExp, '') + .trim() + .replace(/\s/g, '') + .replace(this._currency as RegExp, '').length; + } + } + + return 0; + } + + onInputFocus(event: Event) { + this.focused = true; + this.onFocus.emit(event); + } + + onInputBlur(event: Event) { + this.focused = false; + + const newValueNumber = this.validateValue(this.parseValue(this.input.nativeElement.value)); + const newValueString: any = newValueNumber?.toString(); + this.input.nativeElement.value = this.formatValue(newValueString); + this.input.nativeElement.setAttribute('aria-valuenow', newValueString); + this.updateModel(event, newValueNumber); + this.onModelTouched(); + this.onBlur.emit(event); + } + + formattedValue() { + const val = !this.value && !this.allowEmpty ? 0 : this.value; + return this.formatValue(val); + } + + updateModel(event: Event, value: any) { + const isBlurUpdateOnMode = this.ngControl?.control?.updateOn === 'blur'; + + if (this.value !== value) { + this.value = value; + + if (!(isBlurUpdateOnMode && this.focused)) { + this.onModelChange(value); + } + } else if (isBlurUpdateOnMode) { + this.onModelChange(value); + } + } + + /** + * @override + * + * @see {@link BaseEditableHolder.writeControlValue} + * Writes the value to the control. + */ + writeControlValue(value: any, setModelValue: (value: any) => void): void { + this.value = value ? Number(value) : value; + setModelValue(value); + this.cd.markForCheck(); + } + + clearTimer() { + if (this.timer) { + clearInterval(this.timer); + } + } + + get dataP() { + return this.cn({ + invalid: this.invalid(), + disabled: this.$disabled(), + focus: this.focused, + fluid: this.hasFluid, + filled: this.$variant() === 'filled', + empty: !this.$filled(), + [this.size() as string]: this.size(), + [this.buttonLayout]: this.showButtons && this.buttonLayout + }); + } +} + +@NgModule({ + imports: [InputNumber, SharedModule], + exports: [InputNumber, SharedModule] +}) +export class InputNumberModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/inputnumber/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/inputnumber/public_api.ts new file mode 100644 index 000000000..3c6fd6b40 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/inputnumber/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/inputnumber/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputnumber'; +export * from '../types/inputnumber/public_api'; +export * from './style/inputnumberstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/inputnumber/style/inputnumberstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/inputnumber/style/inputnumberstyle.ts new file mode 100644 index 000000000..03f4643bc --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/inputnumber/style/inputnumberstyle.ts @@ -0,0 +1,113 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/inputnumber/style/inputnumberstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as inputnumber_style } from '../../../primeuix-temp/styles/src/inputnumber/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` + ${inputnumber_style} + + /* For PrimeNG */ + p-inputNumber.ng-invalid.ng-dirty > .p-inputtext, + p-input-number.ng-invalid.ng-dirty > .p-inputtext, + p-inputnumber.ng-invalid.ng-dirty > .p-inputtext { + border-color: dt('inputtext.invalid.border.color'); + } + + p-inputNumber.ng-invalid.ng-dirty > .p-inputtext:enabled:focus, + p-input-number.ng-invalid.ng-dirty > .p-inputtext:enabled:focus, + p-inputnumber.ng-invalid.ng-dirty > .p-inputtext:enabled:focus { + border-color: dt('inputtext.focus.border.color'); + } + + p-inputNumber.ng-invalid.ng-dirty > .p-inputtext::placeholder, + p-input-number.ng-invalid.ng-dirty > .p-inputtext::placeholder, + p-inputnumber.ng-invalid.ng-dirty > .p-inputtext::placeholder { + color: dt('inputtext.invalid.placeholder.color'); + } +`; + +const classes = { + root: ({ instance }) => [ + 'p-inputnumber p-component p-inputwrapper', + { + 'p-inputwrapper-filled': instance.$filled() || instance.allowEmpty === false, + 'p-inputwrapper-focus': instance.focused, + 'p-inputnumber-stacked': instance.showButtons && instance.buttonLayout === 'stacked', + 'p-inputnumber-horizontal': instance.showButtons && instance.buttonLayout === 'horizontal', + 'p-inputnumber-vertical': instance.showButtons && instance.buttonLayout === 'vertical', + 'p-inputnumber-fluid': instance.hasFluid, + 'p-invalid': instance.invalid() + } + ], + pcInputText: 'p-inputnumber-input', + buttonGroup: 'p-inputnumber-button-group', + incrementButton: ({ instance }) => [ + 'p-inputnumber-button p-inputnumber-increment-button', + { + 'p-disabled': instance.showButtons && instance.max() != null && instance.maxlength() + } + ], + decrementButton: ({ instance }) => [ + 'p-inputnumber-button p-inputnumber-decrement-button', + { + 'p-disabled': instance.showButtons && instance.min() != null && instance.minlength() + } + ], + clearIcon: 'p-inputnumber-clear-icon' +}; + +@Injectable() +export class InputNumberStyle extends BaseStyle { + name = 'inputnumber'; + + style = style; + + classes = classes; +} + +/** + * + * InputNumber is an input component to provide numerical input. + * + * [Live Demo](https://www.primeng.org/inputnumber/) + * + * @module inputnumberstyle + * + */ + +export enum InputNumberClasses { + /** + * Class name of the root element + */ + root = 'p-inputnumber', + /** + * Class name of the input element + */ + pcInputText = 'p-inputnumber-input', + /** + * Class name of the button group element + */ + buttonGroup = 'p-inputnumber-button-group', + /** + * Class name of the increment button element + */ + incrementButton = 'p-inputnumber-increment-button', + /** + * Class name of the decrement button element + */ + decrementButton = 'p-inputnumber-decrement-button', + /** + * Class name of the clear icon + */ + clearIcon = 'p-autocomplete-clear-icon' +} + +export interface InputNumberStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/inputtext/inputtext.ts b/projects/cps-ui-kit/src/lib/primeng-temp/inputtext/inputtext.ts new file mode 100755 index 000000000..6c7351bf6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/inputtext/inputtext.ts @@ -0,0 +1,144 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/inputtext/inputtext.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { booleanAttribute, computed, Directive, effect, HostListener, inject, InjectionToken, input, Input, NgModule } from '@angular/core'; +import { NgControl } from '@angular/forms'; +import { PARENT_INSTANCE } from '../basecomponent/public_api'; +import { BaseModelHolder } from '../basemodelholder/public_api'; +import { Bind } from '../bind/public_api'; +import { Fluid } from '../fluid/public_api'; +import { InputTextPassThrough } from '../types/inputtext/public_api'; +import { InputTextStyle } from './style/inputtextstyle'; + +const INPUTTEXT_INSTANCE = new InjectionToken('INPUTTEXT_INSTANCE'); + +/** + * InputText directive is an extension to standard input element with theming. + * @group Components + */ +@Directive({ + selector: '[pInputText]', + standalone: true, + host: { + '[class]': "cx('root')", + '[attr.data-p]': 'dataP' + }, + providers: [InputTextStyle, { provide: INPUTTEXT_INSTANCE, useExisting: InputText }, { provide: PARENT_INSTANCE, useExisting: InputText }], + hostDirectives: [Bind] +}) +export class InputText extends BaseModelHolder { + componentName = 'InputText'; + + @Input() hostName: any = ''; + + /** + * Used to pass attributes to DOM elements inside the InputText component. + * @defaultValue undefined + * @deprecated use pInputTextPT instead. + * @group Props + */ + ptInputText = input(); + /** + * Used to pass attributes to DOM elements inside the InputText component. + * @defaultValue undefined + * @group Props + */ + pInputTextPT = input(); + /** + * Indicates whether the component should be rendered without styles. + * @defaultValue undefined + * @group Props + */ + pInputTextUnstyled = input(); + + bindDirectiveInstance = inject(Bind, { self: true }); + + $pcInputText: InputText | undefined = inject(INPUTTEXT_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + ngControl = inject(NgControl, { optional: true, self: true }); + + pcFluid: Fluid | null = inject(Fluid, { optional: true, host: true, skipSelf: true }); + + /** + * Defines the size of the component. + * @group Props + */ + @Input('pSize') pSize: 'large' | 'small' | undefined; + /** + * Specifies the input variant of the component. + * @defaultValue undefined + * @group Props + */ + variant = input<'filled' | 'outlined' | undefined>(); + /** + * Spans 100% width of the container when enabled. + * @defaultValue undefined + * @group Props + */ + fluid = input(undefined, { transform: booleanAttribute }); + /** + * When present, it specifies that the component should have invalid state style. + * @defaultValue false + * @group Props + */ + invalid = input(undefined, { transform: booleanAttribute }); + + $variant = computed(() => this.variant() || this.config.inputStyle() || this.config.inputVariant()); + + _componentStyle = inject(InputTextStyle); + + constructor() { + super(); + effect(() => { + const pt = this.ptInputText() || this.pInputTextPT(); + pt && this.directivePT.set(pt); + }); + + effect(() => { + this.pInputTextUnstyled() && this.directiveUnstyled.set(this.pInputTextUnstyled()); + }); + } + + onAfterViewInit() { + this.writeModelValue(this.ngControl?.value ?? this.el.nativeElement.value); + this.cd.detectChanges(); + } + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('root')); + } + + onDoCheck() { + this.writeModelValue(this.ngControl?.value ?? this.el.nativeElement.value); + } + + @HostListener('input') + onInput() { + this.writeModelValue(this.ngControl?.value ?? this.el.nativeElement.value); + } + + get hasFluid() { + return this.fluid() ?? !!this.pcFluid; + } + + get dataP() { + return this.cn({ + invalid: this.invalid(), + fluid: this.hasFluid, + filled: this.$variant() === 'filled', + [this.pSize as string]: this.pSize + }); + } +} + +@NgModule({ + imports: [InputText], + exports: [InputText] +}) +export class InputTextModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/inputtext/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/inputtext/public_api.ts new file mode 100644 index 000000000..eba24d5e8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/inputtext/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/inputtext/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputtext'; +export * from './style/inputtextstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/inputtext/style/inputtextstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/inputtext/style/inputtextstyle.ts new file mode 100644 index 000000000..3d3c04991 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/inputtext/style/inputtextstyle.ts @@ -0,0 +1,66 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/inputtext/style/inputtextstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as inputtext_style } from '../../../primeuix-temp/styles/src/inputtext/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` + ${inputtext_style} + + /* For PrimeNG */ + .p-inputtext.ng-invalid.ng-dirty { + border-color: dt('inputtext.invalid.border.color'); + } + + .p-inputtext.ng-invalid.ng-dirty::placeholder { + color: dt('inputtext.invalid.placeholder.color'); + } +`; + +const classes = { + root: ({ instance }) => [ + 'p-inputtext p-component', + { + 'p-filled': instance.$filled(), + 'p-inputtext-sm': instance.pSize === 'small', + 'p-inputtext-lg': instance.pSize === 'large', + 'p-invalid': instance.invalid(), + 'p-variant-filled': instance.$variant() === 'filled', + 'p-inputtext-fluid': instance.hasFluid + } + ] +}; + +@Injectable() +export class InputTextStyle extends BaseStyle { + name = 'inputtext'; + + style = style; + + classes = classes; +} + +/** + * + * InputText renders a text field to enter data. + * + * [Live Demo](https://www.primeng.org/inputtext/) + * + * @module inputtextstyle + * + */ +export enum InputTextClasses { + /** + * The class of root element + */ + root = 'p-inputtext' +} + +export interface InputTextStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.component.ts b/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.component.ts new file mode 100644 index 000000000..ae264633c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.component.ts @@ -0,0 +1,361 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/motion/motion.component.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { afterRenderEffect, Component, computed, effect, inject, InjectionToken, input, output, signal, untracked, ChangeDetectionStrategy } from '@angular/core'; +import { type ClassNameOptions, createMotion, resolveDuration, type MotionEvent, type MotionInstance, type MotionOptions, type MotionPhase } from '../../primeuix-temp/motion/src/index'; +import { nextFrame } from '../../primeuix-temp/utils/src/index'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import type { MotionPassThrough } from '../types/motion/public_api'; +import { applyHiddenStyles, resetStyles } from './motion.utils'; +import { MotionStyle } from './style/motion.style'; + +const MOTION_INSTANCE = new InjectionToken('MOTION_INSTANCE'); + +/** + * Motion component is a container to apply motion effects to its content. + * @group Components + */ +@Component({ + selector: 'p-motion', + standalone: true, + imports: [CommonModule, BindModule], + template: ` + @if (rendered()) { + + } + `, + providers: [MotionStyle, { provide: MOTION_INSTANCE, useExisting: Motion }, { provide: PARENT_INSTANCE, useExisting: Motion }], + host: { + '[class]': "cx('root')" + }, + changeDetection: ChangeDetectionStrategy.Eager, + hostDirectives: [Bind] +}) +export class Motion extends BaseComponent { + $pcMotion: Motion | undefined = inject(MOTION_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + const options = this.options() as any; + const optionsAttrs = options?.root || {}; + this.bindDirectiveInstance.setAttrs({ ...this.ptms(['host', 'root']), ...optionsAttrs }); + } + + _componentStyle = inject(MotionStyle); + + /******************** Inputs ********************/ + + /** + * Whether the element is visible or not. + * @group Props + */ + visible = input(false); + /** + * Whether to mount the element on enter. + * @group Props + */ + mountOnEnter = input(true); + /** + * Whether to unmount the element on leave. + * @group Props + */ + unmountOnLeave = input(true); + /** + * The name of the motion. It can be a predefined motion name or a custom one. + * phases: + * [name]-enter + * [name]-enter-active + * [name]-enter-to + * [name]-leave + * [name]-leave-active + * [name]-leave-to + * @group Props + */ + name = input(undefined); + /** + * The type of the motion, valid values 'transition' and 'animation'. + * @group Props + */ + type = input(undefined); + /** + * Whether the motion is safe. + * @group Props + */ + safe = input(undefined); + /** + * Whether the motion is disabled. + * @group Props + */ + disabled = input(false); + /** + * Whether the motion should appear. + * @group Props + */ + appear = input(false); + /** + * Whether the motion should enter. + * @group Props + */ + enter = input(true); + /** + * Whether the motion should leave. + * @group Props + */ + leave = input(true); + /** + * The duration of the motion. + * @group Props + */ + duration = input(undefined); + /** + * The hide strategy of the motion, valid values 'display' and 'visibility'. + * @group Props + */ + hideStrategy = input<'display' | 'visibility'>('display'); + /** + * The enter from class of the motion. + * @group Props + */ + enterFromClass = input(undefined); + /** + * The enter to class of the motion. + * @group Props + */ + enterToClass = input(undefined); + /** + * The enter active class of the motion. + * @group Props + */ + enterActiveClass = input(undefined); + /** + * The leave from class of the motion. + * @group Props + */ + leaveFromClass = input(undefined); + /** + * The leave to class of the motion. + * @group Props + */ + leaveToClass = input(undefined); + /** + * The leave active class of the motion. + * @group Props + */ + leaveActiveClass = input(undefined); + + /******************** All Inputs ********************/ + + /** + * The motion options. + * @group Props + */ + options = input({}); + + /******************** Outputs ********************/ + + /** + * Callback fired before the enter transition/animation starts. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onBeforeEnter = output(); + /** + * Callback fired when the enter transition/animation starts. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onEnter = output(); + /** + * Callback fired after the enter transition/animation ends. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onAfterEnter = output(); + /** + * Callback fired when the enter transition/animation is cancelled. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onEnterCancelled = output(); + /** + * Callback fired before the leave transition/animation starts. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onBeforeLeave = output(); + /** + * Callback fired when the leave transition/animation starts. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onLeave = output(); + /** + * Callback fired after the leave transition/animation ends. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onAfterLeave = output(); + /** + * Callback fired when the leave transition/animation is cancelled. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onLeaveCancelled = output(); + + /******************** Computed ********************/ + + private motionOptions = computed(() => { + const options = this.options(); + + return { + name: options.name ?? this.name(), + type: options.type ?? this.type(), + safe: options.safe ?? this.safe(), + disabled: options.disabled ?? this.disabled(), + appear: false, + enter: options.enter ?? this.enter(), + leave: options.leave ?? this.leave(), + duration: options.duration ?? this.duration(), + enterClass: { + from: options.enterClass?.from ?? (!options.name ? this.enterFromClass() : undefined), + to: options.enterClass?.to ?? (!options.name ? this.enterToClass() : undefined), + active: options.enterClass?.active ?? (!options.name ? this.enterActiveClass() : undefined) + }, + leaveClass: { + from: options.leaveClass?.from ?? (!options.name ? this.leaveFromClass() : undefined), + to: options.leaveClass?.to ?? (!options.name ? this.leaveToClass() : undefined), + active: options.leaveClass?.active ?? (!options.name ? this.leaveActiveClass() : undefined) + }, + onBeforeEnter: options.onBeforeEnter ?? this.handleBeforeEnter, + onEnter: options.onEnter ?? this.handleEnter, + onAfterEnter: options.onAfterEnter ?? this.handleAfterEnter, + onEnterCancelled: options.onEnterCancelled ?? this.handleEnterCancelled, + onBeforeLeave: options.onBeforeLeave ?? this.handleBeforeLeave, + onLeave: options.onLeave ?? this.handleLeave, + onAfterLeave: options.onAfterLeave ?? this.handleAfterLeave, + onLeaveCancelled: options.onLeaveCancelled ?? this.handleLeaveCancelled + }; + }); + + private motion: MotionInstance | undefined; + private isInitialMount = true; + private cancelled = false; + private destroyed = false; + + rendered = signal(false); + + private readonly handleBeforeEnter = (event?: MotionEvent) => !this.destroyed && this.onBeforeEnter.emit(event); + private readonly handleEnter = (event?: MotionEvent) => !this.destroyed && this.onEnter.emit(event); + private readonly handleAfterEnter = (event?: MotionEvent) => !this.destroyed && this.onAfterEnter.emit(event); + private readonly handleEnterCancelled = (event?: MotionEvent) => !this.destroyed && this.onEnterCancelled.emit(event); + private readonly handleBeforeLeave = (event?: MotionEvent) => !this.destroyed && this.onBeforeLeave.emit(event); + private readonly handleLeave = (event?: MotionEvent) => !this.destroyed && this.onLeave.emit(event); + private readonly handleAfterLeave = (event?: MotionEvent) => !this.destroyed && this.onAfterLeave.emit(event); + private readonly handleLeaveCancelled = (event?: MotionEvent) => !this.destroyed && this.onLeaveCancelled.emit(event); + + constructor() { + super(); + + effect(() => { + const hideStrategy = this.hideStrategy(); + + if (this.isInitialMount) { + applyHiddenStyles(this.$el, hideStrategy); + this.rendered.set((this.visible() && this.mountOnEnter()) || !this.mountOnEnter()); + } else if (this.visible() && !this.rendered()) { + applyHiddenStyles(this.$el, hideStrategy); + this.rendered.set(true); + } + }); + + effect(() => { + if (!this.motion) { + this.motion = createMotion(this.$el, this.motionOptions()); + } else { + // @todo: Update motion options method to update options dynamically + //this.motion.update(this.$el, this.motionOptions()); + } + }); + + afterRenderEffect(async () => { + if (!this.$el) return; + + const shouldAppear = this.isInitialMount && this.visible() && this.appear(); + const hideStrategy = this.hideStrategy(); + + if (this.visible()) { + await nextFrame(); + resetStyles(this.$el, hideStrategy); + + if (shouldAppear || !this.isInitialMount) { + this.applyMotionDuration('enter'); + this.motion?.enter(); + } + } else if (!this.isInitialMount) { + await nextFrame(); + this.applyMotionDuration('leave'); + this.motion?.leave()?.then(async () => { + if (this.$el && !this.cancelled && !this.visible()) { + applyHiddenStyles(this.$el, hideStrategy); + + if (this.unmountOnLeave()) { + await nextFrame(); + if (!this.cancelled) { + this.rendered.set(false); + } + } + } + }); + } + + this.isInitialMount = false; + }); + } + + private applyMotionDuration(phase: MotionPhase): void { + const options = untracked(this.motionOptions); + const ms = resolveDuration(options.duration, phase); + + if (ms == null || !this.$el) return; + + const el = this.$el as HTMLElement; + const durationValue = `${ms}ms`; + + if (options.type === 'transition') { + el.style.transitionDuration = durationValue; + } else { + el.style.animationDuration = durationValue; + } + } + + onDestroy(): void { + this.destroyed = true; + this.cancelled = true; + + this.motion?.cancel(); + this.motion = undefined; + + resetStyles(this.$el, this.hideStrategy()); + + this.$el?.remove(); + + this.isInitialMount = true; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.directive.ts b/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.directive.ts new file mode 100644 index 000000000..b9ad77c7c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.directive.ts @@ -0,0 +1,305 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/motion/motion.directive.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { afterRenderEffect, computed, Directive, effect, inject, InjectionToken, input, output, untracked } from '@angular/core'; +import { createMotion, resolveDuration, type ClassNameOptions, type MotionEvent, type MotionInstance, type MotionOptions, type MotionPhase } from '../../primeuix-temp/motion/src/index'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { applyHiddenStyles, resetStyles } from './motion.utils'; +import { MotionStyle } from './style/motion.style'; + +const MOTION_DIRECTIVE_INSTANCE = new InjectionToken('MOTION_DIRECTIVE_INSTANCE'); + +/** + * Motion Directive is directive to apply motion effects to elements. + * @group Components + */ +@Directive({ + selector: '[pMotion]', + standalone: true, + providers: [MotionStyle, { provide: MOTION_DIRECTIVE_INSTANCE, useExisting: MotionDirective }, { provide: PARENT_INSTANCE, useExisting: MotionDirective }] +}) +export class MotionDirective extends BaseComponent { + $pcMotionDirective: MotionDirective | undefined = inject(MOTION_DIRECTIVE_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + /******************** Inputs ********************/ + + /** + * Whether the element is visible or not. + * @group Props + */ + visible = input(false, { alias: 'pMotion' }); + /** + * The name of the motion. It can be a predefined motion name or a custom one. + * phases: + * [name]-enter + * [name]-enter-active + * [name]-enter-to + * [name]-leave + * [name]-leave-active + * [name]-leave-to + * @group Props + */ + name = input(undefined, { alias: 'pMotionName' }); + /** + * The type of the motion, valid values 'transition' and 'animation'. + * @group Props + */ + type = input(undefined, { alias: 'pMotionType' }); + /** + * Whether the motion is safe. + * @group Props + */ + safe = input(undefined, { alias: 'pMotionSafe' }); + /** + * Whether the motion is disabled. + * @group Props + */ + disabled = input(false, { alias: 'pMotionDisabled' }); + /** + * Whether the motion should appear. + * @group Props + */ + appear = input(false, { alias: 'pMotionAppear' }); + /** + * Whether the motion should enter. + * @group Props + */ + enter = input(true, { alias: 'pMotionEnter' }); + /** + * Whether the motion should leave. + * @group Props + */ + leave = input(true, { alias: 'pMotionLeave' }); + /** + * The duration of the motion. + * @group Props + */ + duration = input(undefined, { alias: 'pMotionDuration' }); + /** + * The hide strategy of the motion, valid values 'display' and 'visibility'. + * @group Props + */ + hideStrategy = input<'display' | 'visibility'>('display', { alias: 'pMotionHideStrategy' }); + /** + * The enter from class of the motion. + * @group Props + */ + enterFromClass = input(undefined, { alias: 'pMotionEnterFromClass' }); + /** + * The enter to class of the motion. + * @group Props + */ + enterToClass = input(undefined, { alias: 'pMotionEnterToClass' }); + /** + * The enter active class of the motion. + * @group Props + */ + enterActiveClass = input(undefined, { alias: 'pMotionEnterActiveClass' }); + /** + * The leave from class of the motion. + * @group Props + */ + leaveFromClass = input(undefined, { alias: 'pMotionLeaveFromClass' }); + /** + * The leave to class of the motion. + * @group Props + */ + leaveToClass = input(undefined, { alias: 'pMotionLeaveToClass' }); + /** + * The leave active class of the motion. + * @group Props + */ + leaveActiveClass = input(undefined, { alias: 'pMotionLeaveActiveClass' }); + + /******************** All Inputs ********************/ + + /** + * The motion options. + * @group Props + */ + options = input({}, { alias: 'pMotionOptions' }); + + /******************** Outputs ********************/ + + /** + * Callback fired before the enter transition/animation starts. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onBeforeEnter = output({ alias: 'pMotionOnBeforeEnter' }); + /** + * Callback fired when the enter transition/animation starts. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onEnter = output({ alias: 'pMotionOnEnter' }); + /** + * Callback fired after the enter transition/animation ends. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onAfterEnter = output({ alias: 'pMotionOnAfterEnter' }); + /** + * Callback fired when the enter transition/animation is cancelled. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onEnterCancelled = output({ alias: 'pMotionOnEnterCancelled' }); + /** + * Callback fired before the leave transition/animation starts. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onBeforeLeave = output({ alias: 'pMotionOnBeforeLeave' }); + /** + * Callback fired when the leave transition/animation starts. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onLeave = output({ alias: 'pMotionOnLeave' }); + /** + * Callback fired after the leave transition/animation ends. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onAfterLeave = output({ alias: 'pMotionOnAfterLeave' }); + /** + * Callback fired when the leave transition/animation is cancelled. + * @param {MotionEvent} [event] - The event object containing details about the motion. + * @param {Element} event.element - The element being transitioned/animated. + * @group Emits + */ + onLeaveCancelled = output({ alias: 'pMotionOnLeaveCancelled' }); + + /******************** Computed ********************/ + + private motionOptions = computed(() => { + const options = this.options() ?? {}; + + return { + name: options.name ?? this.name(), + type: options.type ?? this.type(), + safe: options.safe ?? this.safe(), + disabled: options.disabled ?? this.disabled(), + appear: false, + enter: options.enter ?? this.enter(), + leave: options.leave ?? this.leave(), + duration: options.duration ?? this.duration(), + enterClass: { + from: options.enterClass?.from ?? (!options.name ? this.enterFromClass() : undefined), + to: options.enterClass?.to ?? (!options.name ? this.enterToClass() : undefined), + active: options.enterClass?.active ?? (!options.name ? this.enterActiveClass() : undefined) + }, + leaveClass: { + from: options.leaveClass?.from ?? (!options.name ? this.leaveFromClass() : undefined), + to: options.leaveClass?.to ?? (!options.name ? this.leaveToClass() : undefined), + active: options.leaveClass?.active ?? (!options.name ? this.leaveActiveClass() : undefined) + }, + onBeforeEnter: options.onBeforeEnter ?? this.handleBeforeEnter, + onEnter: options.onEnter ?? this.handleEnter, + onAfterEnter: options.onAfterEnter ?? this.handleAfterEnter, + onEnterCancelled: options.onEnterCancelled ?? this.handleEnterCancelled, + onBeforeLeave: options.onBeforeLeave ?? this.handleBeforeLeave, + onLeave: options.onLeave ?? this.handleLeave, + onAfterLeave: options.onAfterLeave ?? this.handleAfterLeave, + onLeaveCancelled: options.onLeaveCancelled ?? this.handleLeaveCancelled + }; + }); + + private motion: MotionInstance | undefined; + private isInitialMount = true; + private cancelled = false; + private destroyed = false; + + private readonly handleBeforeEnter = (event?: MotionEvent) => !this.destroyed && this.onBeforeEnter.emit(event); + private readonly handleEnter = (event?: MotionEvent) => !this.destroyed && this.onEnter.emit(event); + private readonly handleAfterEnter = (event?: MotionEvent) => !this.destroyed && this.onAfterEnter.emit(event); + private readonly handleEnterCancelled = (event?: MotionEvent) => !this.destroyed && this.onEnterCancelled.emit(event); + private readonly handleBeforeLeave = (event?: MotionEvent) => !this.destroyed && this.onBeforeLeave.emit(event); + private readonly handleLeave = (event?: MotionEvent) => !this.destroyed && this.onLeave.emit(event); + private readonly handleAfterLeave = (event?: MotionEvent) => !this.destroyed && this.onAfterLeave.emit(event); + private readonly handleLeaveCancelled = (event?: MotionEvent) => !this.destroyed && this.onLeaveCancelled.emit(event); + + constructor() { + super(); + + effect(() => { + if (!this.motion) { + this.motion = createMotion(this.$el, this.motionOptions()); + } else { + // @todo: Update motion options method to update options dynamically + //this.motion.update(this.$el, this.motionOptions()); + } + }); + + afterRenderEffect(() => { + if (!this.$el) return; + + const shouldAppear = this.isInitialMount && this.visible() && this.appear(); + const hideStrategy = this.hideStrategy(); + + if (this.visible()) { + resetStyles(this.$el, hideStrategy); + + if (shouldAppear || !this.isInitialMount) { + this.applyMotionDuration('enter'); + this.motion?.enter(); + } + } else if (!this.isInitialMount) { + this.applyMotionDuration('leave'); + this.motion?.leave()?.then(() => { + if (this.$el && !this.cancelled && !this.visible()) { + applyHiddenStyles(this.$el, hideStrategy); + } + }); + } else { + applyHiddenStyles(this.$el, hideStrategy); + } + + this.isInitialMount = false; + }); + } + + private applyMotionDuration(phase: MotionPhase): void { + const options = untracked(this.motionOptions); + const ms = resolveDuration(options.duration, phase); + + if (ms == null || !this.$el) return; + + const el = this.$el as HTMLElement; + const durationValue = `${ms}ms`; + + if (options.type === 'transition') { + el.style.transitionDuration = durationValue; + } else { + el.style.animationDuration = durationValue; + } + } + + onDestroy(): void { + this.destroyed = true; + this.cancelled = true; + + this.motion?.cancel(); + this.motion = undefined; + + resetStyles(this.$el, this.hideStrategy()); + + this.$el?.remove(); + + this.isInitialMount = true; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.module.ts b/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.module.ts new file mode 100644 index 000000000..e28828ed2 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.module.ts @@ -0,0 +1,21 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/motion/motion.module.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { NgModule } from '@angular/core'; +import { Motion } from './motion.component'; +import { MotionDirective } from './motion.directive'; + +export * from './motion.component'; +export * from './motion.directive'; + +@NgModule({ + imports: [Motion, MotionDirective], + exports: [Motion, MotionDirective] +}) +export class MotionModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.utils.ts b/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.utils.ts new file mode 100644 index 000000000..fc5dc9a3a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/motion/motion.utils.ts @@ -0,0 +1,53 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/motion/motion.utils.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +const originalStyles = new WeakMap(); + +export function applyHiddenStyles(element: HTMLElement, strategy: 'display' | 'visibility') { + if (!element) return; + + if (!originalStyles.has(element)) { + originalStyles.set(element, { + display: element.style.display, + visibility: element.style.visibility, + maxHeight: element.style.maxHeight, + overflow: element.style.overflow + }); + } + + switch (strategy) { + case 'display': + element.style.display = 'none'; + break; + case 'visibility': + element.style.visibility = 'hidden'; + element.style.maxHeight = '0'; + element.style.overflow = 'hidden'; + break; + } +} + +export function resetStyles(element: HTMLElement, strategy: 'display' | 'visibility') { + if (!element) return; + + const original = originalStyles.get(element) ?? element.style; + + switch (strategy) { + case 'display': + element.style.display = original?.display || ''; + break; + case 'visibility': + element.style.visibility = original?.visibility || ''; + element.style.maxHeight = original?.maxHeight || ''; + element.style.overflow = original?.overflow || ''; + break; + } + + originalStyles.delete(element); +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/motion/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/motion/public_api.ts new file mode 100644 index 000000000..cdb2aa026 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/motion/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/motion/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './motion.module'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/motion/style/motion.style.ts b/projects/cps-ui-kit/src/lib/primeng-temp/motion/style/motion.style.ts new file mode 100644 index 000000000..d24253727 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/motion/style/motion.style.ts @@ -0,0 +1,48 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/motion/style/motion.style.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` + .p-motion { + display: block; + } +`; + +const classes = { + root: 'p-motion' +}; + +@Injectable() +export class MotionStyle extends BaseStyle { + name = 'motion'; + + style = style; + + classes = classes; +} + +/** + * + * Motion and MotionDirective provide an easy way to add motion effects to Angular applications. + * + * [Live Demo](https://www.primeng.org/motion) + * + * @module motionstyle + * + */ +export enum MotionClasses { + /** + * Class name of the root element + */ + root = 'p-motion' +} + +export interface MotionStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/overlay/overlay.ts b/projects/cps-ui-kit/src/lib/primeng-temp/overlay/overlay.ts new file mode 100644 index 000000000..ee260bd46 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/overlay/overlay.ts @@ -0,0 +1,761 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/overlay/overlay.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule, isPlatformBrowser } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + computed, + ContentChild, + ContentChildren, + ElementRef, + EventEmitter, + inject, + InjectionToken, + input, + Input, + NgModule, + NgZone, + Output, + QueryList, + signal, + TemplateRef, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { MotionEvent, MotionOptions } from '../../primeuix-temp/motion/src/index'; +import { absolutePosition, addClass, appendChild, focus, getOuterWidth, getTargetElement, isTouchDevice, relativePosition, removeClass } from '../../primeuix-temp/utils/src/index'; +import { OverlayModeType, OverlayOnBeforeHideEvent, OverlayOnBeforeShowEvent, OverlayOnHideEvent, OverlayOnShowEvent, OverlayOptions, OverlayService, PrimeTemplate, ResponsiveOverlayOptions, SharedModule } from '../api/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind } from '../bind/public_api'; +import { ConnectedOverlayScrollHandler } from '../dom/public_api'; +import { MotionModule } from '../motion/public_api'; +import { Subscription } from 'rxjs'; +import { VoidListener } from '../ts-helpers/public_api'; +import { ObjectUtils, ZIndexUtils } from '../utils/public_api'; +import { OverlayContentTemplateContext } from '../types/overlay/public_api'; +import { OverlayStyle } from './style/overlaystyle'; + +const OVERLAY_INSTANCE = new InjectionToken('OVERLAY_INSTANCE'); + +/** + * This API allows overlay components to be controlled from the PrimeNG. In this way, all overlay components in the application can have the same behavior. + * @group Components + */ +@Component({ + selector: 'p-overlay', + standalone: true, + imports: [CommonModule, SharedModule, Bind, MotionModule], + hostDirectives: [Bind], + template: ` + @if (inline()) { + + + } @else { +
+ +
+ + +
+
+
+ } + `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + providers: [OverlayStyle, { provide: OVERLAY_INSTANCE, useExisting: Overlay }, { provide: PARENT_INSTANCE, useExisting: Overlay }] +}) +export class Overlay extends BaseComponent { + componentName = 'Overlay'; + + $pcOverlay: Overlay | undefined = inject(OVERLAY_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + @Input() hostName: string = ''; + + /** + * The visible property is an input that determines the visibility of the component. + * @defaultValue false + * @group Props + */ + @Input() get visible(): boolean { + return this._visible; + } + set visible(value: boolean) { + this._visible = value; + + if (this._visible && !this.modalVisible) { + this.modalVisible = true; + } + } + /** + * The mode property is an input that determines the overlay mode type or string. + * @defaultValue null + * @group Props + */ + @Input() get mode(): OverlayModeType | string { + return this._mode || this.overlayOptions?.mode; + } + set mode(value: OverlayModeType | string) { + this._mode = value; + } + /** + * The style property is an input that determines the style object for the component. + * @defaultValue null + * @group Props + */ + @Input() get style(): { [klass: string]: any } | null | undefined { + return ObjectUtils.merge(this._style, this.modal ? this.overlayResponsiveOptions?.style : this.overlayOptions?.style); + } + set style(value: { [klass: string]: any } | null | undefined) { + this._style = value; + } + /** + * The styleClass property is an input that determines the CSS class(es) for the component. + * @defaultValue null + * @group Props + */ + @Input() get styleClass(): string { + return ObjectUtils.merge(this._styleClass, this.modal ? this.overlayResponsiveOptions?.styleClass : this.overlayOptions?.styleClass); + } + set styleClass(value: string) { + this._styleClass = value; + } + /** + * The contentStyle property is an input that determines the style object for the content of the component. + * @defaultValue null + * @group Props + */ + @Input() get contentStyle(): { [klass: string]: any } | null | undefined { + return ObjectUtils.merge(this._contentStyle, this.modal ? this.overlayResponsiveOptions?.contentStyle : this.overlayOptions?.contentStyle); + } + set contentStyle(value: { [klass: string]: any } | null | undefined) { + this._contentStyle = value; + } + /** + * The contentStyleClass property is an input that determines the CSS class(es) for the content of the component. + * @defaultValue null + * @group Props + */ + @Input() get contentStyleClass(): string { + return ObjectUtils.merge(this._contentStyleClass, this.modal ? this.overlayResponsiveOptions?.contentStyleClass : this.overlayOptions?.contentStyleClass); + } + set contentStyleClass(value: string) { + this._contentStyleClass = value; + } + /** + * The target property is an input that specifies the target element or selector for the component. + * @defaultValue null + * @group Props + */ + @Input() get target(): string | null | undefined { + const value = this._target || this.overlayOptions?.target; + return value === undefined ? '@prev' : value; + } + set target(value: string | null | undefined) { + this._target = value; + } + /** + * The autoZIndex determines whether to automatically manage layering. Its default value is 'false'. + * @defaultValue false + * @group Props + */ + @Input() get autoZIndex(): boolean { + const value = this._autoZIndex || this.overlayOptions?.autoZIndex; + return value === undefined ? true : value; + } + set autoZIndex(value: boolean) { + this._autoZIndex = value; + } + /** + * The baseZIndex is base zIndex value to use in layering. + * @defaultValue null + * @group Props + */ + @Input() get baseZIndex(): number { + const value = this._baseZIndex || this.overlayOptions?.baseZIndex; + return value === undefined ? 0 : value; + } + set baseZIndex(value: number) { + this._baseZIndex = value; + } + /** + * Transition options of the show or hide animation. + * @defaultValue .12s cubic-bezier(0, 0, 0.2, 1) + * @group Props + * @deprecated since v21.0.0. Use `motionOptions` instead. + */ + @Input() get showTransitionOptions(): string { + const value = this._showTransitionOptions || this.overlayOptions?.showTransitionOptions; + return value === undefined ? '.12s cubic-bezier(0, 0, 0.2, 1)' : value; + } + set showTransitionOptions(value: string) { + this._showTransitionOptions = value; + } + /** + * The hideTransitionOptions property is an input that determines the CSS transition options for hiding the component. + * @defaultValue .1s linear + * @group Props + * @deprecated since v21.0.0. Use `motionOptions` instead. + */ + @Input() get hideTransitionOptions(): string { + const value = this._hideTransitionOptions || this.overlayOptions?.hideTransitionOptions; + return value === undefined ? '.1s linear' : value; + } + set hideTransitionOptions(value: string) { + this._hideTransitionOptions = value; + } + /** + * The listener property is an input that specifies the listener object for the component. + * @defaultValue null + * @group Props + */ + @Input() get listener(): any { + return this._listener || this.overlayOptions?.listener; + } + set listener(value: any) { + this._listener = value; + } + /** + * It is the option used to determine in which mode it should appear according to the given media or breakpoint. + * @defaultValue null + * @group Props + */ + @Input() get responsive(): ResponsiveOverlayOptions | undefined { + return this._responsive || this.overlayOptions?.responsive; + } + set responsive(val: ResponsiveOverlayOptions | undefined) { + this._responsive = val; + } + /** + * The options property is an input that specifies the overlay options for the component. + * @defaultValue null + * @group Props + */ + @Input() get options(): OverlayOptions | undefined { + return this._options; + } + set options(val: OverlayOptions | undefined) { + this._options = val; + } + /** + * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). + * @defaultValue 'self' + * @group Props + */ + appendTo = input | 'self' | 'body' | null | undefined | any>(undefined); + /** + * Specifies whether the overlay should be rendered inline within the current component's template. + * @defaultValue false + * @group Props + */ + inline = input(false); + /** + * The motion options. + * @group Props + */ + motionOptions = input(undefined); + + computedMotionOptions = computed(() => { + return { + ...this.ptm('motion'), + ...(this.motionOptions() || this.overlayOptions?.motionOptions) + }; + }); + /** + * This EventEmitter is used to notify changes in the visibility state of a component. + * @param {Boolean} boolean - Value of visibility as boolean. + * @group Emits + */ + @Output() visibleChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke before the overlay is shown. + * @param {OverlayOnBeforeShowEvent} event - Custom overlay before show event. + * @group Emits + */ + @Output() onBeforeShow: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the overlay is shown. + * @param {OverlayOnShowEvent} event - Custom overlay show event. + * @group Emits + */ + @Output() onShow: EventEmitter = new EventEmitter(); + /** + * Callback to invoke before the overlay is hidden. + * @param {OverlayOnBeforeHideEvent} event - Custom overlay before hide event. + * @group Emits + */ + @Output() onBeforeHide: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the overlay is hidden + * @param {OverlayOnHideEvent} event - Custom hide event. + * @group Emits + */ + @Output() onHide: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the animation is started. + * @param {AnimationEvent} event - Animation event. + * @group Emits + * @deprecated since v21.0.0. Use onOverlayBeforeEnter and onOverlayBeforeLeave instead. + */ + @Output() onAnimationStart: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the animation is done. + * @param {AnimationEvent} event - Animation event. + * @group Emits + * @deprecated since v21.0.0. Use onOverlayAfterEnter and onOverlayAfterLeave instead. + */ + @Output() onAnimationDone: EventEmitter = new EventEmitter(); + /** + * Callback to invoke before the overlay enters. + * @param {MotionEvent} event - Event before enter. + * @group Emits + */ + @Output() onBeforeEnter: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the overlay enters. + * @param {MotionEvent} event - Event on enter. + * @group Emits + */ + @Output() onEnter: EventEmitter = new EventEmitter(); + /** + * Callback to invoke after the overlay has entered. + * @param {MotionEvent} event - Event after enter. + * @group Emits + */ + @Output() onAfterEnter: EventEmitter = new EventEmitter(); + /** + * Callback to invoke before the overlay leaves. + * @param {MotionEvent} event - Event before leave. + * @group Emits + */ + @Output() onBeforeLeave: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the overlay leaves. + * @param {MotionEvent} event - Event on leave. + * @group Emits + */ + @Output() onLeave: EventEmitter = new EventEmitter(); + /** + * Callback to invoke after the overlay has left. + * @param {MotionEvent} event - Event after leave. + * @group Emits + */ + @Output() onAfterLeave: EventEmitter = new EventEmitter(); + + @ViewChild('overlay') overlayViewChild: ElementRef | undefined; + + @ViewChild('content') contentViewChild: ElementRef | undefined; + /** + * Content template of the component. + * @param {OverlayContentTemplateContext} context - content context. + * @see {@link OverlayContentTemplateContext} + * @group Templates + */ + @ContentChild('content', { descendants: false }) contentTemplate: TemplateRef | undefined; + + @ContentChildren(PrimeTemplate) templates: QueryList | undefined; + + hostAttrSelector = input(); + + $appendTo = computed(() => this.appendTo() || this.config.overlayAppendTo()); + + _contentTemplate: TemplateRef | undefined; + + _visible: boolean = false; + + _mode: OverlayModeType | string; + + _style: { [klass: string]: any } | null | undefined; + + _styleClass: string | undefined; + + _contentStyle: { [klass: string]: any } | null | undefined; + + _contentStyleClass: string | undefined; + + _target: any; + + _autoZIndex: boolean | undefined; + + _baseZIndex: number | undefined; + + _showTransitionOptions: string | undefined; + + _hideTransitionOptions: string | undefined; + + _listener: any; + + _responsive: ResponsiveOverlayOptions | undefined; + + _options: OverlayOptions | undefined; + + modalVisible: boolean = false; + + isOverlayClicked: boolean = false; + + isOverlayContentClicked: boolean = false; + + scrollHandler: any; + + documentClickListener: any; + + documentResizeListener: any; + + _componentStyle = inject(OverlayStyle); + + bindDirectiveInstance = inject(Bind, { self: true }); + + private documentKeyboardListener: VoidListener; + + private parentDragSubscription: Subscription | null = null; + + private window: Window | null; + + protected transformOptions: any = { + default: 'scaleY(0.8)', + center: 'scale(0.7)', + top: 'translate3d(0px, -100%, 0px)', + 'top-start': 'translate3d(0px, -100%, 0px)', + 'top-end': 'translate3d(0px, -100%, 0px)', + bottom: 'translate3d(0px, 100%, 0px)', + 'bottom-start': 'translate3d(0px, 100%, 0px)', + 'bottom-end': 'translate3d(0px, 100%, 0px)', + left: 'translate3d(-100%, 0px, 0px)', + 'left-start': 'translate3d(-100%, 0px, 0px)', + 'left-end': 'translate3d(-100%, 0px, 0px)', + right: 'translate3d(100%, 0px, 0px)', + 'right-start': 'translate3d(100%, 0px, 0px)', + 'right-end': 'translate3d(100%, 0px, 0px)' + }; + + get modal() { + if (isPlatformBrowser(this.platformId)) { + return this.mode === 'modal' || (this.overlayResponsiveOptions && this.document.defaultView?.matchMedia(this.overlayResponsiveOptions.media?.replace('@media', '') || `(max-width: ${this.overlayResponsiveOptions.breakpoint})`).matches); + } + } + + get overlayMode() { + return this.mode || (this.modal ? 'modal' : 'overlay'); + } + + get overlayOptions(): OverlayOptions { + return { ...this.config?.overlayOptions, ...this.options }; // TODO: Improve performance + } + + get overlayResponsiveOptions(): ResponsiveOverlayOptions { + return { ...this.overlayOptions?.responsive, ...this.responsive }; // TODO: Improve performance + } + + get overlayResponsiveDirection() { + return this.overlayResponsiveOptions?.direction || 'center'; + } + + get overlayEl() { + return this.overlayViewChild?.nativeElement; + } + + get contentEl() { + return this.contentViewChild?.nativeElement; + } + + get targetEl() { + return getTargetElement(this.target, this.el?.nativeElement); + } + + constructor( + public overlayService: OverlayService, + private zone: NgZone + ) { + super(); + } + + onAfterContentInit() { + this.templates?.forEach((item) => { + switch (item.getType()) { + case 'content': + this._contentTemplate = item.template; + break; + // TODO: new template types may be added. + default: + this._contentTemplate = item.template; + break; + } + }); + } + + onAfterViewChecked() { + this.bindDirectiveInstance.setAttrs(this.ptm('host')); + } + + show(overlay?: HTMLElement, isFocus: boolean = false) { + this.onVisibleChange(true); + this.handleEvents('onShow', { overlay: overlay || this.overlayEl, target: this.targetEl, mode: this.overlayMode }); + + isFocus && focus(this.targetEl); + this.modal && addClass(this.document?.body, 'p-overflow-hidden'); + } + + hide(overlay?: HTMLElement, isFocus: boolean = false) { + if (!this.visible) { + return; + } else { + this.onVisibleChange(false); + this.handleEvents('onHide', { overlay: overlay || this.overlayEl, target: this.targetEl, mode: this.overlayMode }); + isFocus && focus(this.targetEl as any); + this.modal && removeClass(this.document?.body, 'p-overflow-hidden'); + } + } + + onVisibleChange(visible: boolean) { + this._visible = visible; + this.visibleChange.emit(visible); + } + + onOverlayClick() { + this.isOverlayClicked = true; + } + + onOverlayContentClick(event: MouseEvent) { + this.overlayService.add({ + originalEvent: event, + target: this.targetEl + }); + + this.isOverlayContentClicked = true; + } + + container = signal(undefined); + + onOverlayBeforeEnter(event: MotionEvent) { + this.handleEvents('onBeforeShow', { overlay: this.overlayEl, target: this.targetEl, mode: this.overlayMode }); + this.container.set(this.overlayEl || event.element); + this.show(this.overlayEl, true); + this.hostAttrSelector() && this.overlayEl && this.overlayEl.setAttribute(this.hostAttrSelector(), ''); + this.appendOverlay(); + this.alignOverlay(); + this.bindParentDragListener(); + this.setZIndex(); + + this.handleEvents('onBeforeEnter', event); + } + + onOverlayEnter(event: MotionEvent) { + this.handleEvents('onEnter', event); + } + + onOverlayAfterEnter(event: MotionEvent) { + this.bindListeners(); + this.handleEvents('onAfterEnter', event); + } + + onOverlayBeforeLeave(event: MotionEvent) { + this.handleEvents('onBeforeHide', { overlay: this.overlayEl, target: this.targetEl, mode: this.overlayMode }); + this.handleEvents('onBeforeLeave', event); + } + + onOverlayLeave(event: MotionEvent) { + this.handleEvents('onLeave', event); + } + + onOverlayAfterLeave(event: MotionEvent) { + this.hide(this.overlayEl, true); + this.container.set(null); + this.unbindListeners(); + this.appendOverlay(); + ZIndexUtils.clear(this.overlayEl); + this.modalVisible = false; + this.cd.markForCheck(); + this.handleEvents('onAfterLeave', event); + } + + handleEvents(name: string, params: any) { + (this as any)[name].emit(params); + this.options && (this.options as any)[name] && (this.options as any)[name](params); + this.config?.overlayOptions && (this.config?.overlayOptions as any)[name] && (this.config?.overlayOptions as any)[name](params); + } + + setZIndex() { + if (this.autoZIndex) { + ZIndexUtils.set(this.overlayMode, this.overlayEl, this.baseZIndex + this.config?.zIndex[this.overlayMode]); + } + } + + appendOverlay() { + if (this.$appendTo() && this.$appendTo() !== 'self') { + if (this.$appendTo() === 'body') { + appendChild(this.document.body, this.overlayEl); + } else { + appendChild(this.$appendTo(), this.overlayEl); + } + } + } + + alignOverlay() { + if (!this.modal) { + if (this.overlayEl && this.targetEl) { + this.overlayEl.style.minWidth = getOuterWidth(this.targetEl) + 'px'; + if (this.$appendTo() === 'self') { + relativePosition(this.overlayEl, this.targetEl); + } else { + absolutePosition(this.overlayEl, this.targetEl); + } + } + } + } + + bindListeners() { + this.bindScrollListener(); + this.bindDocumentClickListener(); + this.bindDocumentResizeListener(); + this.bindDocumentKeyboardListener(); + } + + unbindListeners() { + this.unbindScrollListener(); + this.unbindDocumentClickListener(); + this.unbindDocumentResizeListener(); + this.unbindDocumentKeyboardListener(); + this.unbindParentDragListener(); + } + + bindParentDragListener() { + if (!this.parentDragSubscription && this.$appendTo() !== 'self' && this.targetEl) { + this.parentDragSubscription = this.overlayService.parentDragObservable.subscribe((container: Element) => { + if (container.contains(this.targetEl)) { + this.hide(this.overlayEl, true); + } + }); + } + } + + unbindParentDragListener() { + if (this.parentDragSubscription) { + this.parentDragSubscription.unsubscribe(); + this.parentDragSubscription = null; + } + } + + bindScrollListener() { + if (!this.scrollHandler) { + this.scrollHandler = new ConnectedOverlayScrollHandler(this.targetEl, (event: any) => { + const valid = this.listener ? this.listener(event, { type: 'scroll', mode: this.overlayMode, valid: true }) : true; + + valid && this.hide(event, true); + }); + } + + this.scrollHandler.bindScrollListener(); + } + + unbindScrollListener() { + if (this.scrollHandler) { + this.scrollHandler.unbindScrollListener(); + } + } + + bindDocumentClickListener() { + if (!this.documentClickListener) { + this.documentClickListener = this.renderer.listen(this.document, 'click', (event) => { + const isTargetClicked = this.targetEl && ((this.targetEl as any).isSameNode(event.target) || (!this.isOverlayClicked && (this.targetEl as any).contains(event.target))); + const isOutsideClicked = !isTargetClicked && !this.isOverlayContentClicked; + const valid = this.listener ? this.listener(event, { type: 'outside', mode: this.overlayMode, valid: event.which !== 3 && isOutsideClicked }) : isOutsideClicked; + + valid && this.hide(event); + this.isOverlayClicked = this.isOverlayContentClicked = false; + }); + } + } + + unbindDocumentClickListener() { + if (this.documentClickListener) { + this.documentClickListener(); + this.documentClickListener = null; + } + } + + bindDocumentResizeListener() { + if (!this.documentResizeListener) { + this.documentResizeListener = this.renderer.listen(this.document.defaultView, 'resize', (event) => { + const valid = this.listener ? this.listener(event, { type: 'resize', mode: this.overlayMode, valid: !isTouchDevice() }) : !isTouchDevice(); + + valid && this.hide(event, true); + }); + } + } + + unbindDocumentResizeListener() { + if (this.documentResizeListener) { + this.documentResizeListener(); + this.documentResizeListener = null; + } + } + + bindDocumentKeyboardListener(): void { + if (this.documentKeyboardListener) { + return; + } + + this.zone.runOutsideAngular(() => { + this.documentKeyboardListener = this.renderer.listen(this.document.defaultView, 'keydown', (event) => { + if (this.overlayOptions.hideOnEscape === false || event.code !== 'Escape') { + return; + } + + const valid = this.listener ? this.listener(event, { type: 'keydown', mode: this.overlayMode, valid: !isTouchDevice() }) : !isTouchDevice(); + + if (valid) { + this.zone.run(() => { + this.hide(event, true); + }); + } + }); + }); + } + + unbindDocumentKeyboardListener(): void { + if (this.documentKeyboardListener) { + this.documentKeyboardListener(); + this.documentKeyboardListener = null; + } + } + + onDestroy() { + this.hide(this.overlayEl, true); + + if (this.overlayEl && this.$appendTo() !== 'self') { + this.renderer.appendChild(this.el.nativeElement, this.overlayEl); + ZIndexUtils.clear(this.overlayEl); + } + + if (this.scrollHandler) { + this.scrollHandler.destroy(); + this.scrollHandler = null; + } + + this.unbindListeners(); + } +} + +@NgModule({ + imports: [Overlay, SharedModule], + exports: [Overlay, SharedModule] +}) +export class OverlayModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/overlay/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/overlay/public_api.ts new file mode 100644 index 000000000..d54d31507 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/overlay/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/overlay/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './overlay'; +export * from './style/overlaystyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/overlay/style/overlaystyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/overlay/style/overlaystyle.ts new file mode 100644 index 000000000..71fd1e5f7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/overlay/style/overlaystyle.ts @@ -0,0 +1,135 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/overlay/style/overlaystyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { BaseStyle } from '../../base/public_api'; + +const inlineStyles = { + root: () => ({ position: 'absolute', top: '0' }) +}; + +const style = /*css*/ ` +.p-overlay-modal { + display: flex; + align-items: center; + justify-content: center; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.p-overlay-content { + transform-origin: inherit; + will-change: transform; +} + +/* Github Issue #18560 */ +.p-component-overlay.p-component { + position: relative; +} + +.p-overlay-modal > .p-overlay-content { + z-index: 1; + width: 90%; +} + +/* Position */ +/* top */ +.p-overlay-top { + align-items: flex-start; +} +.p-overlay-top-start { + align-items: flex-start; + justify-content: flex-start; +} +.p-overlay-top-end { + align-items: flex-start; + justify-content: flex-end; +} + +/* bottom */ +.p-overlay-bottom { + align-items: flex-end; +} +.p-overlay-bottom-start { + align-items: flex-end; + justify-content: flex-start; +} +.p-overlay-bottom-end { + align-items: flex-end; + justify-content: flex-end; +} + +/* left */ +.p-overlay-left { + justify-content: flex-start; +} +.p-overlay-left-start { + justify-content: flex-start; + align-items: flex-start; +} +.p-overlay-left-end { + justify-content: flex-start; + align-items: flex-end; +} + +/* right */ +.p-overlay-right { + justify-content: flex-end; +} +.p-overlay-right-start { + justify-content: flex-end; + align-items: flex-start; +} +.p-overlay-right-end { + justify-content: flex-end; + align-items: flex-end; +} + +.p-overlay-content ~ .p-overlay-content { + display: none; +} +`; + +const classes = { + host: 'p-overlay-host', + root: ({ instance }: { instance: any }) => [ + 'p-overlay p-component', + { + 'p-overlay-modal p-overlay-mask p-overlay-mask-enter-active': instance.modal, + 'p-overlay-center': instance.modal && instance.overlayResponsiveDirection === 'center', + 'p-overlay-top': instance.modal && instance.overlayResponsiveDirection === 'top', + 'p-overlay-top-start': instance.modal && instance.overlayResponsiveDirection === 'top-start', + 'p-overlay-top-end': instance.modal && instance.overlayResponsiveDirection === 'top-end', + 'p-overlay-bottom': instance.modal && instance.overlayResponsiveDirection === 'bottom', + 'p-overlay-bottom-start': instance.modal && instance.overlayResponsiveDirection === 'bottom-start', + 'p-overlay-bottom-end': instance.modal && instance.overlayResponsiveDirection === 'bottom-end', + 'p-overlay-left': instance.modal && instance.overlayResponsiveDirection === 'left', + 'p-overlay-left-start': instance.modal && instance.overlayResponsiveDirection === 'left-start', + 'p-overlay-left-end': instance.modal && instance.overlayResponsiveDirection === 'left-end', + 'p-overlay-right': instance.modal && instance.overlayResponsiveDirection === 'right', + 'p-overlay-right-start': instance.modal && instance.overlayResponsiveDirection === 'right-start', + 'p-overlay-right-end': instance.modal && instance.overlayResponsiveDirection === 'right-end' + } + ], + content: 'p-overlay-content' +}; + +@Injectable() +export class OverlayStyle extends BaseStyle { + name = 'overlay'; + + style = style; + + classes = classes; + + inlineStyles = inlineStyles; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/paginator/paginator.ts b/projects/cps-ui-kit/src/lib/primeng-temp/paginator/paginator.ts new file mode 100755 index 000000000..a38f45221 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/paginator/paginator.ts @@ -0,0 +1,607 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/paginator/paginator.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { + AfterContentInit, + booleanAttribute, + ChangeDetectionStrategy, + Component, + computed, + ContentChild, + ContentChildren, + ElementRef, + EventEmitter, + HostBinding, + inject, + InjectionToken, + input, + Input, + NgModule, + numberAttribute, + OnChanges, + OnInit, + Output, + QueryList, + SimpleChanges, + TemplateRef, + ViewEncapsulation +} from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Aria, PrimeTemplate, SelectItem, SharedModule } from '../api/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind } from '../bind/public_api'; +import { Select, SelectChangeEvent } from '../select/public_api'; +import { AngleDoubleLeftIcon, AngleDoubleRightIcon, AngleLeftIcon, AngleRightIcon } from '../icons/public_api'; +import { InputNumber } from '../inputnumber/public_api'; +import { Ripple } from '../ripple/public_api'; +import { Nullable } from '../ts-helpers/public_api'; +import { PaginatorDropdownItemTemplateContext, PaginatorPassThrough, PaginatorState, PaginatorTemplateContext } from '../types/paginator/public_api'; +import { PaginatorStyle } from './style/paginatorstyle'; + +const PAGINATOR_INSTANCE = new InjectionToken('PAGINATOR_INSTANCE'); + +/** + * Paginator is a generic component to display content in paged format. + * @group Components + */ +@Component({ + selector: 'p-paginator', + standalone: true, + imports: [CommonModule, Select, InputNumber, FormsModule, Ripple, AngleDoubleLeftIcon, AngleDoubleRightIcon, AngleLeftIcon, AngleRightIcon, SharedModule, Bind], + template: ` +
+ +
+ {{ currentPageReport }} + + + + + + + {{ currentPageReport }} + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + providers: [PaginatorStyle, { provide: PAGINATOR_INSTANCE, useExisting: Paginator }, { provide: PARENT_INSTANCE, useExisting: Paginator }], + host: { + '[class]': "cn(cx('paginator'), styleClass)" + }, + hostDirectives: [Bind] +}) +export class Paginator extends BaseComponent { + componentName = 'Paginator'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + $pcPaginator: Paginator | undefined = inject(PAGINATOR_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + /** + * Number of page links to display. + * @group Props + */ + @Input({ transform: numberAttribute }) pageLinkSize: number = 5; + /** + * Style class of the component. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * Whether to show it even there is only one page. + * @group Props + */ + @Input({ transform: booleanAttribute }) alwaysShow: boolean = true; + /** + * Target element to attach the dropdown overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). + * @deprecated since v20.0.0. Use `appendTo` instead. + * @group Props + */ + @Input() dropdownAppendTo: HTMLElement | ElementRef | TemplateRef | string | null | undefined | any; + /** + * Template instance to inject into the left side of the paginator. + * @param {PaginatorTemplateContext} context - Paginator template context. + * @see {@link PaginatorTemplateContext} + * @group Props + */ + @Input() templateLeft: TemplateRef | undefined; + /** + * Template instance to inject into the right side of the paginator. + * @param {PaginatorTemplateContext} context - Paginator template context. + * @see {@link PaginatorTemplateContext} + * @group Props + */ + @Input() templateRight: TemplateRef | undefined; + /** + * Dropdown height of the viewport in pixels, a scrollbar is defined if height of list exceeds this value. + * @group Props + */ + @Input() dropdownScrollHeight: string = '200px'; + /** + * Template of the current page report element. Available placeholders are {currentPage},{totalPages},{rows},{first},{last} and {totalRecords} + * @group Props + */ + @Input() currentPageReportTemplate: string = '{currentPage} of {totalPages}'; + /** + * Whether to display current page report. + * @group Props + */ + @Input({ transform: booleanAttribute }) showCurrentPageReport: boolean | undefined; + /** + * When enabled, icons are displayed on paginator to go first and last page. + * @group Props + */ + @Input({ transform: booleanAttribute }) showFirstLastIcon: boolean = true; + /** + * Number of total records. + * @group Props + */ + @Input({ transform: numberAttribute }) totalRecords: number = 0; + /** + * Data count to display per page. + * @group Props + */ + @Input({ transform: numberAttribute }) rows: number = 0; + /** + * Array of integer/object values to display inside rows per page dropdown. A object that have 'showAll' key can be added to it to show all data. Exp; [10,20,30,{showAll:'All'}] + * @group Props + */ + @Input() rowsPerPageOptions: any[] | undefined; + /** + * Whether to display a dropdown to navigate to any page. + * @group Props + */ + @Input({ transform: booleanAttribute }) showJumpToPageDropdown: boolean | undefined; + /** + * Whether to display a input to navigate to any page. + * @group Props + */ + @Input({ transform: booleanAttribute }) showJumpToPageInput: boolean | undefined; + /** + * Template instance to inject into the jump to page dropdown item inside in the paginator. + * @param {PaginatorDropdownItemTemplateContext} context - dropdown item context. + * @see {@link PaginatorDropdownItemTemplateContext} + * @group Props + */ + @Input() jumpToPageItemTemplate: TemplateRef | undefined; + /** + * Whether to show page links. + * @group Props + */ + @Input({ transform: booleanAttribute }) showPageLinks: boolean = true; + /** + * Locale to be used in formatting. + * @group Props + */ + @Input() locale: string | undefined; + /** + * Template instance to inject into the rows per page dropdown item inside in the paginator. + * @param {PaginatorDropdownItemTemplateContext} context - dropdown item context. + * @see {@link PaginatorDropdownItemTemplateContext} + * @group Props + */ + @Input() dropdownItemTemplate: TemplateRef | undefined; + + /** + * Zero-relative number of the first row to be displayed. + * @group Props + */ + @Input() get first(): number { + return this._first; + } + + set first(val: number) { + this._first = val; + } + /** + * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). + * @defaultValue 'self' + * @group Props + */ + appendTo = input | 'self' | 'body' | null | undefined | any>(undefined); + /** + * Callback to invoke when page changes, the event object contains information about the new state. + * @param {PaginatorState} event - Paginator state. + * @group Emits + */ + @Output() onPageChange: EventEmitter = new EventEmitter(); + + /** + * Template for the dropdown icon. + * @group Templates + */ + @ContentChild('dropdownicon', { descendants: false }) dropdownIconTemplate: Nullable>; + + /** + * Template for the first page link icon. + * @group Templates + */ + @ContentChild('firstpagelinkicon', { descendants: false }) firstPageLinkIconTemplate: Nullable>; + + /** + * Template for the previous page link icon. + * @group Templates + */ + @ContentChild('previouspagelinkicon', { descendants: false }) previousPageLinkIconTemplate: Nullable>; + + /** + * Template for the last page link icon. + * @group Templates + */ + @ContentChild('lastpagelinkicon', { descendants: false }) lastPageLinkIconTemplate: Nullable>; + + /** + * Template for the next page link icon. + * @group Templates + */ + @ContentChild('nextpagelinkicon', { descendants: false }) nextPageLinkIconTemplate: Nullable>; + + @ContentChildren(PrimeTemplate) templates: Nullable>; + + _dropdownIconTemplate: TemplateRef | undefined; + + _firstPageLinkIconTemplate: TemplateRef | undefined; + + _previousPageLinkIconTemplate: TemplateRef | undefined; + + _lastPageLinkIconTemplate: TemplateRef | undefined; + + _nextPageLinkIconTemplate: TemplateRef | undefined; + + pageLinks: number[] | undefined; + + pageItems: SelectItem[] | undefined; + + rowsPerPageItems: SelectItem[] | undefined; + + paginatorState: any; + + _first: number = 0; + + _page: number = 0; + + _componentStyle = inject(PaginatorStyle); + + $appendTo = computed(() => this.appendTo() || this.config.overlayAppendTo()); + + @HostBinding('style.display') get display(): string | null { + return this.alwaysShow || (this.pageLinks && this.pageLinks.length > 1) ? null : 'none'; + } + + constructor() { + super(); + } + + onInit() { + this.updatePaginatorState(); + } + + onAfterContentInit(): void { + (this.templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'dropdownicon': + this._dropdownIconTemplate = item.template; + break; + + case 'firstpagelinkicon': + this._firstPageLinkIconTemplate = item.template; + break; + + case 'previouspagelinkicon': + this._previousPageLinkIconTemplate = item.template; + break; + + case 'lastpagelinkicon': + this._lastPageLinkIconTemplate = item.template; + break; + + case 'nextpagelinkicon': + this._nextPageLinkIconTemplate = item.template; + break; + } + }); + } + + getAriaLabel(labelType: keyof Aria): string | undefined { + return this.config.translation.aria ? this.config.translation.aria[labelType] : undefined; + } + + getPageAriaLabel(value: number): string | undefined { + return this.config.translation.aria ? this.config.translation.aria.pageLabel?.replace(/{page}/g, `${value}`) : undefined; + } + + getLocalization(digit: number): string { + const numerals = [...new Intl.NumberFormat(this.locale, { useGrouping: false }).format(9876543210)].reverse(); + const index = new Map(numerals.map((d, i) => [i, d])); + if (digit > 9) { + const numbers = String(digit).split(''); + return numbers.map((number) => index.get(Number(number))).join(''); + } else { + return index.get(digit) as string; + } + } + + onChanges(simpleChange: SimpleChanges): void { + if (simpleChange.totalRecords) { + this.updatePageLinks(); + this.updatePaginatorState(); + this.updateFirst(); + this.updateRowsPerPageOptions(); + } + + if (simpleChange.first) { + this._first = simpleChange.first.currentValue; + this.updatePageLinks(); + this.updatePaginatorState(); + } + + if (simpleChange.rows) { + this.updatePageLinks(); + this.updatePaginatorState(); + } + + if (simpleChange.rowsPerPageOptions) { + this.updateRowsPerPageOptions(); + } + + if (simpleChange.pageLinkSize) { + this.updatePageLinks(); + } + } + + updateRowsPerPageOptions(): void { + if (this.rowsPerPageOptions) { + this.rowsPerPageItems = []; + let showAllItem: SelectItem | null = null; + + for (let opt of this.rowsPerPageOptions) { + if (typeof opt == 'object' && opt['showAll']) { + showAllItem = { label: opt['showAll'], value: this.totalRecords }; + } else { + this.rowsPerPageItems.push({ label: String(this.getLocalization(opt)), value: opt }); + } + } + + if (showAllItem) { + this.rowsPerPageItems.push(showAllItem); + } + } + } + + isFirstPage(): boolean { + return this.getPage() === 0; + } + + isLastPage(): boolean { + return this.getPage() === this.getPageCount() - 1; + } + + getPageCount(): number { + return Math.ceil(this.totalRecords / this.rows); + } + + calculatePageLinkBoundaries(): [number, number] { + let numberOfPages = this.getPageCount(), + visiblePages = Math.min(this.pageLinkSize, numberOfPages); + + //calculate range, keep current in middle if necessary + let start = Math.max(0, Math.ceil(this.getPage() - visiblePages / 2)), + end = Math.min(numberOfPages - 1, start + visiblePages - 1); + + //check when approaching to last page + var delta = this.pageLinkSize - (end - start + 1); + start = Math.max(0, start - delta); + + return [start, end]; + } + + updatePageLinks(): void { + this.pageLinks = []; + let boundaries = this.calculatePageLinkBoundaries(), + start = boundaries[0], + end = boundaries[1]; + + for (let i = start; i <= end; i++) { + this.pageLinks.push(i + 1); + } + + if (this.showJumpToPageDropdown) { + this.pageItems = []; + for (let i = 0; i < this.getPageCount(); i++) { + this.pageItems.push({ label: String(i + 1), value: i }); + } + } + } + + changePage(p: number): void { + var pc = this.getPageCount(); + + if (p >= 0 && p < pc) { + this._first = this.rows * p; + var state = { + page: p, + first: this.first, + rows: this.rows, + pageCount: pc + }; + this.updatePageLinks(); + + this.onPageChange.emit(state); + this.updatePaginatorState(); + } + } + + updateFirst(): void { + const page = this.getPage(); + if (page > 0 && this.totalRecords && this.first >= this.totalRecords) { + Promise.resolve(null).then(() => this.changePage(page - 1)); + } + } + + getPage(): number { + return Math.floor(this.first / this.rows); + } + + changePageToFirst(event: Event): void { + if (!this.isFirstPage()) { + this.changePage(0); + } + + event.preventDefault(); + } + + changePageToPrev(event: Event): void { + this.changePage(this.getPage() - 1); + event.preventDefault(); + } + + changePageToNext(event: Event): void { + this.changePage(this.getPage() + 1); + event.preventDefault(); + } + + changePageToLast(event: Event): void { + if (!this.isLastPage()) { + this.changePage(this.getPageCount() - 1); + } + + event.preventDefault(); + } + + onPageLinkClick(event: Event, page: number): void { + this.changePage(page); + event.preventDefault(); + } + + onRppChange(event: Event): void { + this.changePage(this.getPage()); + } + + onPageDropdownChange(event: SelectChangeEvent): void { + this.changePage(event.value); + } + + updatePaginatorState(): void { + this.paginatorState = { + page: this.getPage(), + pageCount: this.getPageCount(), + rows: this.rows, + first: this.first, + totalRecords: this.totalRecords + }; + } + + empty(): boolean { + return this.getPageCount() === 0; + } + + currentPage(): number { + return this.getPageCount() > 0 ? this.getPage() + 1 : 0; + } + + get currentPageReport(): string { + return this.currentPageReportTemplate + .replace('{currentPage}', String(this.currentPage())) + .replace('{totalPages}', String(this.getPageCount())) + .replace('{first}', String(this.totalRecords > 0 ? this._first + 1 : 0)) + .replace('{last}', String(Math.min(this._first + this.rows, this.totalRecords))) + .replace('{rows}', String(this.rows)) + .replace('{totalRecords}', String(this.totalRecords)); + } +} + +@NgModule({ + imports: [Paginator, SharedModule], + exports: [Paginator, SharedModule] +}) +export class PaginatorModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/paginator/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/paginator/public_api.ts new file mode 100644 index 000000000..69d423bab --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/paginator/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/paginator/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/paginator/public_api'; +export * from './paginator'; +export * from './style/paginatorstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/paginator/style/paginatorstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/paginator/style/paginatorstyle.ts new file mode 100644 index 000000000..27d62ead5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/paginator/style/paginatorstyle.ts @@ -0,0 +1,150 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/paginator/style/paginatorstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style } from '../../../primeuix-temp/styles/src/paginator/index'; +import { BaseStyle } from '../../base/public_api'; + +const classes = { + paginator: ({ instance }) => ['p-paginator p-component'], + content: 'p-paginator-content', + contentStart: 'p-paginator-content-start', + contentEnd: 'p-paginator-content-end', + first: ({ instance }) => [ + 'p-paginator-first', + { + 'p-disabled': instance.isFirstPage() || instance.empty() + } + ], + firstIcon: 'p-paginator-first-icon', + prev: ({ instance }) => [ + 'p-paginator-prev', + { + 'p-disabled': instance.isFirstPage() || instance.empty() + } + ], + prevIcon: 'p-paginator-prev-icon', + next: ({ instance }) => [ + 'p-paginator-next', + { + 'p-disabled': instance.isLastPage() || instance.empty() + } + ], + nextIcon: 'p-paginator-next-icon', + last: ({ instance }) => [ + 'p-paginator-last', + { + 'p-disabled': instance.isLastPage() || instance.empty() + } + ], + lastIcon: 'p-paginator-last-icon', + pages: 'p-paginator-pages', + page: ({ instance, pageLink }) => [ + 'p-paginator-page', + { + 'p-paginator-page-selected': pageLink - 1 == instance.getPage() + } + ], + current: 'p-paginator-current', + pcRowPerPageDropdown: 'p-paginator-rpp-dropdown', + pcJumpToPageDropdown: 'p-paginator-jtp-dropdown', + pcJumpToPageInput: 'p-paginator-jtp-input' +}; + +@Injectable() +export class PaginatorStyle extends BaseStyle { + name = 'paginator'; + + style = style; + + classes = classes; +} + +/** + * + * Paginator is a generic component to display content in paged format. + * + * [Live Demo](https://www.primeng.org/paginator) + * + * @module paginatorstyle + * + */ + +export enum PaginatorClasses { + /** + * Class name of the paginator element + */ + paginator = 'p-paginator', + /** + * Class name of the content start element + */ + contentStart = 'p-paginator-content-start', + /** + * Class name of the content end element + */ + contentEnd = 'p-paginator-content-end', + /** + * Class name of the first element + */ + first = 'p-paginator-first', + /** + * Class name of the first icon element + */ + firstIcon = 'p-paginator-first-icon', + /** + * Class name of the prev element + */ + prev = 'p-paginator-prev', + /** + * Class name of the prev icon element + */ + prevIcon = 'p-paginator-prev-icon', + /** + * Class name of the next element + */ + next = 'p-paginator-next', + /** + * Class name of the next icon element + */ + nextIcon = 'p-paginator-next-icon', + /** + * Class name of the last element + */ + last = 'p-paginator-last', + /** + * Class name of the last icon element + */ + lastIcon = 'p-paginator-last-icon', + /** + * Class name of the pages element + */ + pages = 'p-paginator-pages', + /** + * Class name of the page element + */ + page = 'p-paginator-page', + /** + * Class name of the current element + */ + current = 'p-paginator-current', + /** + * Class name of the row per page dropdown element + */ + pcRowPerPageDropdown = 'p-paginator-rpp-dropdown', + /** + * Class name of the jump to page dropdown element + */ + pcJumpToPageDropdown = 'p-paginator-jtp-dropdown', + /** + * Class name of the jump to page input element + */ + pcJumpToPageInput = 'p-paginator-jtp-input' +} + +export interface PaginatorStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/radiobutton/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/radiobutton/public_api.ts new file mode 100644 index 000000000..9743d79b7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/radiobutton/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/radiobutton/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/radiobutton/public_api'; +export * from './radiobutton'; +export * from './style/radiobuttonstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/radiobutton/radiobutton.ts b/projects/cps-ui-kit/src/lib/primeng-temp/radiobutton/radiobutton.ts new file mode 100755 index 000000000..4eb1f1547 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/radiobutton/radiobutton.ts @@ -0,0 +1,297 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/radiobutton/radiobutton.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { + booleanAttribute, + ChangeDetectionStrategy, + Component, + computed, + ElementRef, + EventEmitter, + forwardRef, + inject, + Injectable, + InjectionToken, + Injector, + input, + Input, + NgModule, + numberAttribute, + OnDestroy, + OnInit, + Output, + ViewChild +} from '@angular/core'; +import { NG_VALUE_ACCESSOR, NgControl } from '@angular/forms'; +import { SharedModule } from '../api/public_api'; +import { AutoFocus } from '../autofocus/public_api'; +import { PARENT_INSTANCE } from '../basecomponent/public_api'; +import { BaseEditableHolder } from '../baseeditableholder/public_api'; +import { Bind } from '../bind/public_api'; +import { BindModule } from '../bind/public_api'; +import { Nullable } from '../ts-helpers/public_api'; +import { RadioButtonPassThrough } from '../types/radiobutton/public_api'; +import type { RadioButtonClickEvent } from '../types/radiobutton/public_api'; +import { RadioButtonStyle } from './style/radiobuttonstyle'; + +const RADIOBUTTON_INSTANCE = new InjectionToken('RADIOBUTTON_INSTANCE'); + +export const RADIO_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RadioButton), + multi: true +}; + +@Injectable({ + providedIn: 'root' +}) +export class RadioControlRegistry { + private accessors: any[] = []; + + add(control: NgControl, accessor: RadioButton) { + this.accessors.push([control, accessor]); + } + + remove(accessor: RadioButton) { + this.accessors = this.accessors.filter((c) => { + return c[1] !== accessor; + }); + } + + select(accessor: RadioButton) { + this.accessors.forEach((c) => { + if (this.isSameGroup(c, accessor) && c[1] !== accessor) { + c[1].writeValue(accessor.value); + } + }); + } + + private isSameGroup(controlPair: [NgControl, RadioButton], accessor: RadioButton): boolean { + if (!controlPair[0].control) { + return false; + } + + return controlPair[0].control.root === (accessor as any).control.control.root && controlPair[1].name() === accessor.name(); + } +} +/** + * RadioButton is an extension to standard radio button element with theming. + * @group Components + */ +@Component({ + selector: 'p-radioButton, p-radiobutton, p-radio-button', + standalone: true, + imports: [CommonModule, AutoFocus, SharedModule, BindModule], + template: ` + +
+
+
+ `, + providers: [RADIO_VALUE_ACCESSOR, RadioButtonStyle, { provide: RADIOBUTTON_INSTANCE, useExisting: RadioButton }, { provide: PARENT_INSTANCE, useExisting: RadioButton }], + changeDetection: ChangeDetectionStrategy.OnPush, + host: { + '[class]': "cx('root')", + '[attr.data-p-disabled]': '$disabled()', + '[attr.data-p-checked]': 'checked', + '[attr.data-p]': 'dataP' + }, + hostDirectives: [Bind] +}) +export class RadioButton extends BaseEditableHolder { + componentName = 'RadioButton'; + + $pcRadioButton: RadioButton | undefined = inject(RADIOBUTTON_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + + /** + * Value of the radiobutton. + * @group Props + */ + @Input() value: any; + /** + * Index of the element in tabbing order. + * @group Props + */ + @Input({ transform: numberAttribute }) tabindex: number | undefined; + /** + * Identifier of the focus input to match a label defined for the component. + * @group Props + */ + @Input() inputId: string | undefined; + /** + * Establishes relationships between the component and label(s) where its value should be one or more element IDs. + * @group Props + */ + @Input() ariaLabelledBy: string | undefined; + /** + * Used to define a string that labels the input element. + * @group Props + */ + @Input() ariaLabel: string | undefined; + /** + * Style class of the component. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * When present, it specifies that the component should automatically get focus on load. + * @group Props + */ + @Input({ transform: booleanAttribute }) autofocus: boolean | undefined; + /** + * Allows to select a boolean value. + * @group Props + */ + @Input({ transform: booleanAttribute }) binary: boolean | undefined; + /** + * Specifies the input variant of the component. + * @defaultValue undefined + * @group Props + */ + variant = input<'filled' | 'outlined' | undefined>(); + /** + * Specifies the size of the component. + * @defaultValue undefined + * @group Props + */ + size = input<'large' | 'small' | undefined>(); + /** + * Callback to invoke on radio button click. + * @param {RadioButtonClickEvent} event - Custom click event. + * @group Emits + */ + @Output() onClick: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the receives focus. + * @param {Event} event - Browser event. + * @group Emits + */ + @Output() onFocus: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when the loses focus. + * @param {Event} event - Browser event. + * @group Emits + */ + @Output() onBlur: EventEmitter = new EventEmitter(); + + @ViewChild('input') inputViewChild!: ElementRef; + + $variant = computed(() => this.variant() || this.config.inputStyle() || this.config.inputVariant()); + + public checked: Nullable; + + public focused: Nullable; + + control: Nullable; + + _componentStyle = inject(RadioButtonStyle); + + injector = inject(Injector); + + registry = inject(RadioControlRegistry); + + onInit() { + this.control = this.injector.get(NgControl); + this.registry.add(this.control, this); + } + + onChange(event) { + if (!this.$disabled()) { + this.select(event); + } + } + + select(event: Event) { + if (!this.$disabled()) { + this.checked = true; + this.writeModelValue(this.checked); + this.onModelChange(this.value); + this.registry.select(this); + this.onClick.emit({ originalEvent: event, value: this.value }); + } + } + + onInputFocus(event: Event) { + this.focused = true; + this.onFocus.emit(event); + } + + onInputBlur(event: Event) { + this.focused = false; + this.onModelTouched(); + this.onBlur.emit(event); + } + + /** + * Applies focus to input field. + * @group Method + */ + public focus() { + this.inputViewChild.nativeElement.focus(); + } + + /** + * @override + * + * @see {@link BaseEditableHolder.writeControlValue} + * Writes the value to the control. + */ + writeControlValue(value: any, setModelValue: (value: any) => void): void { + this.checked = !this.binary ? value == this.value : !!value; + setModelValue(this.checked); + this.cd.markForCheck(); + } + + onDestroy() { + this.registry.remove(this); + } + + get dataP() { + return this.cn({ + invalid: this.invalid(), + checked: this.checked, + disabled: this.$disabled(), + filled: this.$variant() === 'filled', + [this.size() as string]: this.size() + }); + } +} + +@NgModule({ + imports: [RadioButton, SharedModule], + exports: [RadioButton, SharedModule] +}) +export class RadioButtonModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/radiobutton/style/radiobuttonstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/radiobutton/style/radiobuttonstyle.ts new file mode 100644 index 000000000..9188606b2 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/radiobutton/style/radiobuttonstyle.ts @@ -0,0 +1,79 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/radiobutton/style/radiobuttonstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as radiobutton_style } from '../../../primeuix-temp/styles/src/radiobutton/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` + ${radiobutton_style} + + /* For PrimeNG */ + p-radioButton.ng-invalid.ng-dirty .p-radiobutton-box, + p-radio-button.ng-invalid.ng-dirty .p-radiobutton-box, + p-radiobutton.ng-invalid.ng-dirty .p-radiobutton-box { + border-color: dt('radiobutton.invalid.border.color'); + } +`; + +const classes = { + root: ({ instance }) => [ + 'p-radiobutton p-component', + { + 'p-radiobutton-checked': instance.checked, + 'p-disabled': instance.$disabled(), + 'p-invalid': instance.invalid(), + 'p-variant-filled': instance.$variant() === 'filled', + 'p-radiobutton-sm p-inputfield-sm': instance.size() === 'small', + 'p-radiobutton-lg p-inputfield-lg': instance.size() === 'large' + } + ], + box: 'p-radiobutton-box', + input: 'p-radiobutton-input', + icon: 'p-radiobutton-icon' +}; + +@Injectable() +export class RadioButtonStyle extends BaseStyle { + name = 'radiobutton'; + + style = style; + + classes = classes; +} + +/** + * + * RadioButton is an extension to standard radio button element with theming. + * + * [Live Demo](https://www.primeng.org/radiobutton/) + * + * @module radiobuttonstyle + * + */ +export enum RadioButtonClasses { + /** + * Class name of the root element + */ + root = 'p-radiobutton', + /** + * Class name of the box element + */ + box = 'p-radiobutton-box', + /** + * Class name of the input element + */ + input = 'p-radiobutton-input', + /** + * Class name of the icon element + */ + icon = 'p-radiobutton-icon' +} + +export interface RadioButtonStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/ripple/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/ripple/public_api.ts new file mode 100644 index 000000000..81ea0fce7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/ripple/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/ripple/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './ripple'; +export * from './style/ripplestyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/ripple/ripple.ts b/projects/cps-ui-kit/src/lib/primeng-temp/ripple/ripple.ts new file mode 100644 index 000000000..f8f291614 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/ripple/ripple.ts @@ -0,0 +1,158 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/ripple/ripple.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { isPlatformBrowser } from '@angular/common'; +import { Directive, effect, inject, NgModule, NgZone } from '@angular/core'; +import { addClass, getHeight, getOffset, getOuterHeight, getOuterWidth, getWidth, removeClass, remove as utils_remove } from '../../primeuix-temp/utils/src/index'; +import { BaseComponent } from '../basecomponent/public_api'; +import { VoidListener } from '../ts-helpers/public_api'; +import { RippleStyle } from './style/ripplestyle'; + +/** + * Ripple directive adds ripple effect to the host element. + * @group Components + */ +@Directive({ + selector: '[pRipple]', + host: { + class: 'p-ripple' + }, + standalone: true, + providers: [RippleStyle] +}) +export class Ripple extends BaseComponent { + componentName = 'Ripple'; + + zone: NgZone = inject(NgZone); + + _componentStyle = inject(RippleStyle); + + animationListener: VoidListener; + + mouseDownListener: VoidListener; + + timeout: any; + + constructor() { + super(); + effect(() => { + if (isPlatformBrowser(this.platformId)) { + if (this.config.ripple()) { + this.zone.runOutsideAngular(() => { + this.create(); + this.mouseDownListener = this.renderer.listen(this.el.nativeElement, 'mousedown', this.onMouseDown.bind(this)); + }); + } else { + this.remove(); + } + } + }); + } + + onAfterViewInit() {} + + onMouseDown(event: MouseEvent) { + let ink = this.getInk(); + if (!ink || this.document.defaultView?.getComputedStyle(ink, null).display === 'none') { + return; + } + + !this.$unstyled() && removeClass(ink, 'p-ink-active'); + ink.setAttribute('data-p-ink-active', 'false'); + + if (!getHeight(ink) && !getWidth(ink)) { + let d = Math.max(getOuterWidth(this.el.nativeElement), getOuterHeight(this.el.nativeElement)); + ink.style.height = d + 'px'; + ink.style.width = d + 'px'; + } + + let offset = getOffset(this.el.nativeElement); + let x = event.pageX - offset.left + this.document.body.scrollTop - getWidth(ink) / 2; + let y = event.pageY - offset.top + this.document.body.scrollLeft - getHeight(ink) / 2; + + this.renderer.setStyle(ink, 'top', y + 'px'); + this.renderer.setStyle(ink, 'left', x + 'px'); + + !this.$unstyled() && addClass(ink, 'p-ink-active'); + ink.setAttribute('data-p-ink-active', 'true'); + + this.timeout = setTimeout(() => { + let ink = this.getInk(); + if (ink) { + !this.$unstyled() && removeClass(ink, 'p-ink-active'); + ink.setAttribute('data-p-ink-active', 'false'); + } + }, 401); + } + + getInk() { + const children = this.el.nativeElement.children; + for (let i = 0; i < children.length; i++) { + if (typeof children[i].className === 'string' && children[i].className.indexOf('p-ink') !== -1) { + return children[i]; + } + } + return null; + } + + resetInk() { + let ink = this.getInk(); + if (ink) { + !this.$unstyled() && removeClass(ink, 'p-ink-active'); + ink.setAttribute('data-p-ink-active', 'false'); + } + } + + onAnimationEnd(event: Event) { + if (this.timeout) { + clearTimeout(this.timeout); + } + + !this.$unstyled() && removeClass(event.currentTarget as any, 'p-ink-active'); + (event.currentTarget as any).setAttribute('data-p-ink-active', 'false'); + } + + create() { + let ink = this.renderer.createElement('span'); + this.renderer.addClass(ink, 'p-ink'); + this.renderer.appendChild(this.el.nativeElement, ink); + this.renderer.setAttribute(ink, 'data-p-ink', 'true'); + this.renderer.setAttribute(ink, 'data-p-ink-active', 'false'); + this.renderer.setAttribute(ink, 'aria-hidden', 'true'); + this.renderer.setAttribute(ink, 'role', 'presentation'); + + if (!this.animationListener) { + this.animationListener = this.renderer.listen(ink, 'animationend', this.onAnimationEnd.bind(this)); + } + } + + remove() { + let ink = this.getInk(); + if (ink) { + this.mouseDownListener && this.mouseDownListener(); + this.animationListener && this.animationListener(); + this.mouseDownListener = null; + this.animationListener = null; + + utils_remove(ink); + } + } + + onDestroy() { + if (this.config && this.config.ripple()) { + this.remove(); + } + } +} + +@NgModule({ + imports: [Ripple], + exports: [Ripple] +}) +export class RippleModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/ripple/style/ripplestyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/ripple/style/ripplestyle.ts new file mode 100644 index 000000000..310a6bec4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/ripple/style/ripplestyle.ts @@ -0,0 +1,65 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/ripple/style/ripplestyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as ripple_style } from '../../../primeuix-temp/styles/src/ripple/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` + ${ripple_style} + + /* For PrimeNG */ + .p-ripple { + overflow: hidden; + position: relative; + } + + .p-ripple-disabled .p-ink { + display: none !important; + } + + @keyframes ripple { + 100% { + opacity: 0; + transform: scale(2.5); + } + } +`; + +const classes = { + root: 'p-ink' +}; + +@Injectable() +export class RippleStyle extends BaseStyle { + name = 'ripple'; + + style = style; + + classes = classes; +} + +/** + * + * Ripple directive adds ripple effect to the host element. + * + * [Live Demo](https://www.primeng.org/ripple) + * + * @module ripplestyle + * + */ + +export enum RippleClasses { + /** + * Class name of the root element + */ + root = 'p-ink' +} + +export interface RippleStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/scroller/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/scroller/public_api.ts new file mode 100644 index 000000000..598bb18ae --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/scroller/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/scroller/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/scroller/public_api'; +export * from './scroller'; +export * from './style/scrollerstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/scroller/scroller.ts b/projects/cps-ui-kit/src/lib/primeng-temp/scroller/scroller.ts new file mode 100644 index 000000000..7fdb15591 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/scroller/scroller.ts @@ -0,0 +1,1256 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/scroller/scroller.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule, isPlatformBrowser } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + ContentChild, + ContentChildren, + ElementRef, + EventEmitter, + HostBinding, + inject, + InjectionToken, + Input, + NgModule, + NgZone, + Output, + QueryList, + SimpleChanges, + TemplateRef, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { findSingle, getHeight, getWidth, isTouchDevice, isVisible } from '../../primeuix-temp/utils/src/index'; +import { PrimeTemplate, ScrollerOptions, SharedModule } from '../api/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind } from '../bind/public_api'; +import { SpinnerIcon } from '../icons/public_api'; +import { Nullable, VoidListener } from '../ts-helpers/public_api'; +import { + ScrollerContentTemplateContext, + ScrollerItemTemplateContext, + ScrollerLazyLoadEvent, + ScrollerLoaderIconTemplateContext, + ScrollerLoaderTemplateContext, + ScrollerScrollEvent, + ScrollerScrollIndexChangeEvent, + ScrollerToType, + VirtualScrollerPassThrough +} from '../types/scroller/public_api'; +import { ScrollerStyle } from './style/scrollerstyle'; + +const SCROLLER_INSTANCE = new InjectionToken('SCROLLER_INSTANCE'); + +/** + * Scroller is a performance-approach to handle huge data efficiently. + * @group Components + */ +@Component({ + selector: 'p-scroller, p-virtualscroller, p-virtual-scroller, p-virtualScroller', + imports: [CommonModule, SpinnerIcon, SharedModule, Bind], + standalone: true, + template: ` + +
+ + + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + +
+
+
+ + + + + + + `, + changeDetection: ChangeDetectionStrategy.Eager, + encapsulation: ViewEncapsulation.None, + providers: [ScrollerStyle, { provide: SCROLLER_INSTANCE, useExisting: Scroller }, { provide: PARENT_INSTANCE, useExisting: Scroller }], + hostDirectives: [Bind] +}) +export class Scroller extends BaseComponent { + componentName = 'VirtualScroller'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + $pcScroller: Scroller | undefined = inject(SCROLLER_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + @Input() hostName = ''; + /** + * Unique identifier of the element. + * @group Props + */ + @Input() get id(): string | undefined { + return this._id; + } + set id(val: string | undefined) { + this._id = val; + } + /** + * Inline style of the component. + * @group Props + */ + @Input() get style(): any { + return this._style; + } + set style(val: any) { + this._style = val; + } + /** + * Style class of the element. + * @group Props + */ + @Input() get styleClass(): string | undefined { + return this._styleClass; + } + set styleClass(val: string | undefined) { + this._styleClass = val; + } + /** + * Index of the element in tabbing order. + * @group Props + */ + @Input() get tabindex() { + return this._tabindex; + } + set tabindex(val: number) { + this._tabindex = val; + } + /** + * An array of objects to display. + * @group Props + */ + @Input() get items(): any[] | undefined | null { + return this._items; + } + set items(val: any[] | undefined | null) { + this._items = val; + } + /** + * The height/width of item according to orientation. + * @group Props + */ + @Input() get itemSize(): number[] | number { + return this._itemSize; + } + set itemSize(val: number[] | number) { + this._itemSize = val; + } + /** + * Height of the scroll viewport. + * @group Props + */ + @Input() get scrollHeight(): string | undefined { + return this._scrollHeight; + } + set scrollHeight(val: string | undefined) { + this._scrollHeight = val; + } + /** + * Width of the scroll viewport. + * @group Props + */ + @Input() get scrollWidth(): string | undefined { + return this._scrollWidth; + } + set scrollWidth(val: string | undefined) { + this._scrollWidth = val; + } + /** + * The orientation of scrollbar. + * @group Props + */ + @Input() get orientation(): 'vertical' | 'horizontal' | 'both' { + return this._orientation; + } + set orientation(val: 'vertical' | 'horizontal' | 'both') { + this._orientation = val; + } + /** + * Used to specify how many items to load in each load method in lazy mode. + * @group Props + */ + @Input() get step(): number { + return this._step; + } + set step(val: number) { + this._step = val; + } + /** + * Delay in scroll before new data is loaded. + * @group Props + */ + @Input() get delay() { + return this._delay; + } + set delay(val: number) { + this._delay = val; + } + /** + * Delay after window's resize finishes. + * @group Props + */ + @Input() get resizeDelay() { + return this._resizeDelay; + } + set resizeDelay(val: number) { + this._resizeDelay = val; + } + /** + * Used to append each loaded item to top without removing any items from the DOM. Using very large data may cause the browser to crash. + * @group Props + */ + @Input() get appendOnly(): boolean { + return this._appendOnly; + } + set appendOnly(val: boolean) { + this._appendOnly = val; + } + /** + * Specifies whether the scroller should be displayed inline or not. + * @group Props + */ + @Input() get inline() { + return this._inline; + } + set inline(val: boolean) { + this._inline = val; + } + /** + * Defines if data is loaded and interacted with in lazy manner. + * @group Props + */ + @Input() get lazy() { + return this._lazy; + } + set lazy(val: boolean) { + this._lazy = val; + } + /** + * If disabled, the scroller feature is eliminated and the content is displayed directly. + * @group Props + */ + @Input() get disabled() { + return this._disabled; + } + set disabled(val: boolean) { + this._disabled = val; + } + /** + * Used to implement a custom loader instead of using the loader feature in the scroller. + * @group Props + */ + @Input() get loaderDisabled() { + return this._loaderDisabled; + } + set loaderDisabled(val: boolean) { + this._loaderDisabled = val; + } + /** + * Columns to display. + * @group Props + */ + @Input() get columns(): any[] | undefined | null { + return this._columns; + } + set columns(val: any[] | undefined | null) { + this._columns = val; + } + /** + * Used to implement a custom spacer instead of using the spacer feature in the scroller. + * @group Props + */ + @Input() get showSpacer() { + return this._showSpacer; + } + set showSpacer(val: boolean) { + this._showSpacer = val; + } + /** + * Defines whether to show loader. + * @group Props + */ + @Input() get showLoader() { + return this._showLoader; + } + set showLoader(val: boolean) { + this._showLoader = val; + } + /** + * Determines how many additional elements to add to the DOM outside of the view. According to the scrolls made up and down, extra items are added in a certain algorithm in the form of multiples of this number. Default value is half the number of items shown in the view. + * @group Props + */ + @Input() get numToleratedItems() { + return this._numToleratedItems; + } + set numToleratedItems(val: number) { + this._numToleratedItems = val; + } + /** + * Defines whether the data is loaded. + * @group Props + */ + @Input() get loading(): boolean | undefined { + return this._loading; + } + set loading(val: boolean | undefined) { + this._loading = val; + } + /** + * Defines whether to dynamically change the height or width of scrollable container. + * @group Props + */ + @Input() get autoSize(): boolean { + return this._autoSize; + } + set autoSize(val: boolean) { + this._autoSize = val; + } + /** + * Function to optimize the dom operations by delegating to ngForTrackBy, default algoritm checks for object identity. + * @group Props + */ + @Input() get trackBy(): Function { + return this._trackBy; + } + set trackBy(val: Function) { + this._trackBy = val; + } + /** + * Defines whether to use the scroller feature. The properties of scroller component can be used like an object in it. + * @group Props + */ + @Input() get options(): ScrollerOptions | undefined { + return this._options; + } + set options(val: ScrollerOptions | undefined) { + this._options = val; + + if (val && typeof val === 'object') { + Object.entries(val).forEach(([k, v]) => this[`_${k}`] !== v && (this[`_${k}`] = v)); + Object.entries(val).forEach(([k, v]) => this[`${k}`] !== v && (this[`${k}`] = v)); + } + } + /** + * Callback to invoke in lazy mode to load new data. + * @param {ScrollerLazyLoadEvent} event - Custom lazy load event. + * @group Emits + */ + @Output() onLazyLoad: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when scroll position changes. + * @param {ScrollerScrollEvent} event - Custom scroll event. + * @group Emits + */ + @Output() onScroll: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when scroll position and item's range in view changes. + * @param {ScrollerScrollEvent} event - Custom scroll index change event. + * @group Emits + */ + @Output() onScrollIndexChange: EventEmitter = new EventEmitter(); + + @ViewChild('element') elementViewChild: Nullable; + + @ViewChild('content') contentViewChild: Nullable; + + @HostBinding('style.height') height: string; + + _id: string | undefined; + + _style: { [klass: string]: any } | null | undefined; + + _styleClass: string | undefined; + + _tabindex: number = 0; + + _items: any[] | undefined | null; + + _itemSize: number | number[] = 0; + + _scrollHeight: string | undefined; + + _scrollWidth: string | undefined; + + _orientation: 'vertical' | 'horizontal' | 'both' = 'vertical'; + + _step: number = 0; + + _delay: number = 0; + + _resizeDelay: number = 10; + + _appendOnly: boolean = false; + + _inline: boolean = false; + + _lazy: boolean = false; + + _disabled: boolean = false; + + _loaderDisabled: boolean = false; + + _columns: any[] | undefined | null; + + _showSpacer: boolean = true; + + _showLoader: boolean = false; + + _numToleratedItems: any; + + _loading: boolean | undefined; + + _autoSize: boolean = false; + + _trackBy: any; + + _options: ScrollerOptions | undefined; + + d_loading: boolean = false; + + d_numToleratedItems: any; + + contentEl: any; + /** + * Content template of the component. + * @param {ScrollerContentTemplateContext} context - content context. + * @see {@link ScrollerContentTemplateContext} + * @group Templates + */ + @ContentChild('content', { descendants: false }) contentTemplate: Nullable>; + + /** + * Item template of the component. + * @param {ScrollerItemTemplateContext} context - item context. + * @see {@link ScrollerItemTemplateContext} + * @group Templates + */ + @ContentChild('item', { descendants: false }) itemTemplate: Nullable>; + + /** + * Loader template of the component. + * @param {ScrollerLoaderTemplateContext} context - loader context. + * @see {@link ScrollerLoaderTemplateContext} + * @group Templates + */ + @ContentChild('loader', { descendants: false }) loaderTemplate: Nullable>; + + /** + * Loader icon template of the component. + * @param {ScrollerLoaderIconTemplateContext} context - loader icon context. + * @see {@link ScrollerLoaderIconTemplateContext} + * @group Templates + */ + @ContentChild('loadericon', { descendants: false }) loaderIconTemplate: Nullable>; + + @ContentChildren(PrimeTemplate) templates: Nullable>; + + _contentTemplate: TemplateRef | undefined; + + _itemTemplate: TemplateRef | undefined; + + _loaderTemplate: TemplateRef | undefined; + + _loaderIconTemplate: TemplateRef | undefined; + + first: any = 0; + + last: any = 0; + + page: number = 0; + + isRangeChanged: boolean = false; + + numItemsInViewport: any = 0; + + lastScrollPos: any = 0; + + lazyLoadState: any = {}; + + loaderArr: any[] = []; + + spacerStyle: { [klass: string]: any } | null | undefined = {}; + + contentStyle: { [klass: string]: any } | null | undefined = {}; + + scrollTimeout: any; + + resizeTimeout: any; + + initialized: boolean = false; + + windowResizeListener: VoidListener; + + defaultWidth: number | undefined; + + defaultHeight: number | undefined; + + defaultContentWidth: number | undefined; + + defaultContentHeight: number | undefined; + + _contentStyleClass: any; + + get contentStyleClass() { + return this._contentStyleClass; + } + + set contentStyleClass(val) { + this._contentStyleClass = val; + } + + get vertical() { + return this._orientation === 'vertical'; + } + + get horizontal() { + return this._orientation === 'horizontal'; + } + + get both() { + return this._orientation === 'both'; + } + + get loadedItems() { + if (this._items && !this.d_loading) { + if (this.both) { + return this._items.slice(this._appendOnly ? 0 : this.first.rows, this.last.rows).map((item) => { + if (this._columns) { + return item; + } else if (Array.isArray(item)) { + return item.slice(this._appendOnly ? 0 : this.first.cols, this.last.cols); + } else { + return item; + } + }); + } else if (this.horizontal && this._columns) return this._items; + else return this._items.slice(this._appendOnly ? 0 : this.first, this.last); + } + + return []; + } + + get loadedRows() { + return this.d_loading ? (this._loaderDisabled ? this.loaderArr : []) : this.loadedItems; + } + + get loadedColumns() { + if (this._columns && (this.both || this.horizontal)) { + return this.d_loading && this._loaderDisabled ? (this.both ? this.loaderArr[0] : this.loaderArr) : this._columns.slice(this.both ? this.first.cols : this.first, this.both ? this.last.cols : this.last); + } + + return this._columns; + } + + _componentStyle = inject(ScrollerStyle); + + constructor(private zone: NgZone) { + super(); + } + + onInit() { + this.setInitialState(); + } + + onChanges(simpleChanges: SimpleChanges) { + let isLoadingChanged = false; + if (this.scrollHeight == '100%') { + this.height = '100%'; + } + if (simpleChanges.loading) { + const { previousValue, currentValue } = simpleChanges.loading; + + if (this.lazy && previousValue !== currentValue && currentValue !== this.d_loading) { + this.d_loading = currentValue; + isLoadingChanged = true; + } + } + + if (simpleChanges.orientation) { + this.lastScrollPos = this.both ? { top: 0, left: 0 } : 0; + } + + if (simpleChanges.numToleratedItems) { + const { previousValue, currentValue } = simpleChanges.numToleratedItems; + + if (previousValue !== currentValue && currentValue !== this.d_numToleratedItems) { + this.d_numToleratedItems = currentValue; + } + } + + if (simpleChanges.options) { + const { previousValue, currentValue } = simpleChanges.options; + + if (this.lazy && previousValue?.loading !== currentValue?.loading && currentValue?.loading !== this.d_loading) { + this.d_loading = currentValue.loading; + isLoadingChanged = true; + } + + if (previousValue?.numToleratedItems !== currentValue?.numToleratedItems && currentValue?.numToleratedItems !== this.d_numToleratedItems) { + this.d_numToleratedItems = currentValue.numToleratedItems; + } + } + + if (this.initialized) { + const isChanged = !isLoadingChanged && (simpleChanges.items?.previousValue?.length !== simpleChanges.items?.currentValue?.length || simpleChanges.itemSize || simpleChanges.scrollHeight || simpleChanges.scrollWidth); + + if (isChanged) { + this.init(); + } + } + } + + onAfterContentInit() { + (this.templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'content': + this._contentTemplate = item.template; + break; + + case 'item': + this._itemTemplate = item.template; + break; + + case 'loader': + this._loaderTemplate = item.template; + break; + + case 'loadericon': + this._loaderIconTemplate = item.template; + break; + + default: + this._itemTemplate = item.template; + break; + } + }); + } + + onAfterViewInit() { + Promise.resolve().then(() => { + this.viewInit(); + }); + } + + onAfterViewChecked() { + this.bindDirectiveInstance.setAttrs(this.ptm('host')); + if (!this.initialized) { + this.viewInit(); + } + } + + onDestroy() { + this.unbindResizeListener(); + + this.contentEl = null; + this.initialized = false; + } + + viewInit() { + if (isPlatformBrowser(this.platformId) && !this.initialized) { + if (isVisible(this.elementViewChild?.nativeElement)) { + this.setInitialState(); + this.setContentEl(this.contentEl); + this.init(); + + this.defaultWidth = getWidth(this.elementViewChild?.nativeElement); + this.defaultHeight = getHeight(this.elementViewChild?.nativeElement); + this.defaultContentWidth = getWidth(this.contentEl); + this.defaultContentHeight = getHeight(this.contentEl); + this.initialized = true; + } + } + } + + init() { + if (!this._disabled) { + this.bindResizeListener(); + + // wait for the next tick + setTimeout(() => { + this.setSpacerSize(); + this.setSize(); + this.calculateOptions(); + this.calculateAutoSize(); + this.cd.detectChanges(); + }, 1); + } + } + + setContentEl(el?: HTMLElement) { + this.contentEl = el || this.contentViewChild?.nativeElement || findSingle(this.elementViewChild?.nativeElement, '.p-virtualscroller-content'); + } + setInitialState() { + this.first = this.both ? { rows: 0, cols: 0 } : 0; + this.last = this.both ? { rows: 0, cols: 0 } : 0; + this.numItemsInViewport = this.both ? { rows: 0, cols: 0 } : 0; + this.lastScrollPos = this.both ? { top: 0, left: 0 } : 0; + if (this.d_loading === undefined || this.d_loading === false) { + this.d_loading = this._loading || false; + } + this.d_numToleratedItems = this._numToleratedItems; + this.loaderArr = this.loaderArr.length > 0 ? this.loaderArr : []; + } + + getElementRef() { + return this.elementViewChild; + } + + getPageByFirst(first?: any) { + return Math.floor(((first ?? this.first) + this.d_numToleratedItems * 4) / (this._step || 1)); + } + + isPageChanged(first?: any) { + return this._step ? this.page !== this.getPageByFirst(first ?? this.first) : true; + } + + scrollTo(options: ScrollToOptions) { + // this.lastScrollPos = this.both ? { top: 0, left: 0 } : 0; + this.elementViewChild?.nativeElement?.scrollTo(options); + } + + scrollToIndex(index: number | number[], behavior: ScrollBehavior = 'auto') { + const valid = this.both ? (index as number[]).every((i) => i > -1) : (index as number) > -1; + + if (valid) { + const first = this.first; + const { scrollTop = 0, scrollLeft = 0 } = this.elementViewChild?.nativeElement; + const { numToleratedItems } = this.calculateNumItems(); + const contentPos = this.getContentPosition(); + const itemSize = this.itemSize; + const calculateFirst = (_index = 0, _numT) => (_index <= _numT ? 0 : _index); + const calculateCoord = (_first, _size, _cpos) => _first * _size + _cpos; + const scrollTo = (left = 0, top = 0) => this.scrollTo({ left, top, behavior }); + let newFirst = this.both ? { rows: 0, cols: 0 } : 0; + let isRangeChanged = false, + isScrollChanged = false; + + if (this.both) { + newFirst = { + rows: calculateFirst(index[0], numToleratedItems[0]), + cols: calculateFirst(index[1], numToleratedItems[1]) + }; + scrollTo(calculateCoord(newFirst.cols, itemSize[1], contentPos.left), calculateCoord(newFirst.rows, itemSize[0], contentPos.top)); + isScrollChanged = this.lastScrollPos.top !== scrollTop || this.lastScrollPos.left !== scrollLeft; + isRangeChanged = newFirst.rows !== first.rows || newFirst.cols !== first.cols; + } else { + newFirst = calculateFirst(index as number, numToleratedItems); + this.horizontal ? scrollTo(calculateCoord(newFirst, itemSize, contentPos.left), scrollTop) : scrollTo(scrollLeft, calculateCoord(newFirst, itemSize, contentPos.top)); + isScrollChanged = this.lastScrollPos !== (this.horizontal ? scrollLeft : scrollTop); + isRangeChanged = newFirst !== first; + } + + this.isRangeChanged = isRangeChanged; + isScrollChanged && (this.first = newFirst); + } + } + + scrollInView(index: number, to: ScrollerToType, behavior: ScrollBehavior = 'auto') { + if (to) { + const { first, viewport } = this.getRenderedRange(); + const scrollTo = (left = 0, top = 0) => this.scrollTo({ left, top, behavior }); + const isToStart = to === 'to-start'; + const isToEnd = to === 'to-end'; + + if (isToStart) { + if (this.both) { + if (viewport.first.rows - first.rows > (index)[0]) { + scrollTo(viewport.first.cols * (this._itemSize)[1], (viewport.first.rows - 1) * (this._itemSize)[0]); + } else if (viewport.first.cols - first.cols > (index)[1]) { + scrollTo((viewport.first.cols - 1) * (this._itemSize)[1], viewport.first.rows * (this._itemSize)[0]); + } + } else { + if (viewport.first - first > index) { + const pos = (viewport.first - 1) * this._itemSize; + this.horizontal ? scrollTo(pos, 0) : scrollTo(0, pos); + } + } + } else if (isToEnd) { + if (this.both) { + if (viewport.last.rows - first.rows <= (index)[0] + 1) { + scrollTo(viewport.first.cols * (this._itemSize)[1], (viewport.first.rows + 1) * (this._itemSize)[0]); + } else if (viewport.last.cols - first.cols <= (index)[1] + 1) { + scrollTo((viewport.first.cols + 1) * (this._itemSize)[1], viewport.first.rows * (this._itemSize)[0]); + } + } else { + if (viewport.last - first <= index + 1) { + const pos = (viewport.first + 1) * this._itemSize; + this.horizontal ? scrollTo(pos, 0) : scrollTo(0, pos); + } + } + } + } else { + this.scrollToIndex(index, behavior); + } + } + + getRenderedRange() { + const calculateFirstInViewport = (_pos: number, _size: number) => (_size || _pos ? Math.floor(_pos / (_size || _pos)) : 0); + + let firstInViewport = this.first; + let lastInViewport: any = 0; + + if (this.elementViewChild?.nativeElement) { + const { scrollTop, scrollLeft } = this.elementViewChild.nativeElement; + + if (this.both) { + firstInViewport = { + rows: calculateFirstInViewport(scrollTop, (this._itemSize)[0]), + cols: calculateFirstInViewport(scrollLeft, (this._itemSize)[1]) + }; + lastInViewport = { + rows: firstInViewport.rows + this.numItemsInViewport.rows, + cols: firstInViewport.cols + this.numItemsInViewport.cols + }; + } else { + const scrollPos = this.horizontal ? scrollLeft : scrollTop; + firstInViewport = calculateFirstInViewport(scrollPos, this._itemSize); + lastInViewport = firstInViewport + this.numItemsInViewport; + } + } + + return { + first: this.first, + last: this.last, + viewport: { + first: firstInViewport, + last: lastInViewport + } + }; + } + + calculateNumItems() { + const contentPos = this.getContentPosition(); + const contentWidth = (this.elementViewChild?.nativeElement ? this.elementViewChild.nativeElement.offsetWidth - contentPos.left : 0) || 0; + const contentHeight = (this.elementViewChild?.nativeElement ? this.elementViewChild.nativeElement.offsetHeight - contentPos.top : 0) || 0; + const calculateNumItemsInViewport = (_contentSize: number, _itemSize: number) => (_itemSize || _contentSize ? Math.ceil(_contentSize / (_itemSize || _contentSize)) : 0); + const calculateNumToleratedItems = (_numItems: number) => Math.ceil(_numItems / 2); + const numItemsInViewport: any = this.both + ? { + rows: calculateNumItemsInViewport(contentHeight, (this._itemSize)[0]), + cols: calculateNumItemsInViewport(contentWidth, (this._itemSize)[1]) + } + : calculateNumItemsInViewport(this.horizontal ? contentWidth : contentHeight, this._itemSize); + + const numToleratedItems = this.d_numToleratedItems || (this.both ? [calculateNumToleratedItems(numItemsInViewport.rows), calculateNumToleratedItems(numItemsInViewport.cols)] : calculateNumToleratedItems(numItemsInViewport)); + + return { numItemsInViewport, numToleratedItems }; + } + + calculateOptions() { + const { numItemsInViewport, numToleratedItems } = this.calculateNumItems(); + const calculateLast = (_first: number, _num: number, _numT: number, _isCols: boolean = false) => this.getLast(_first + _num + (_first < _numT ? 2 : 3) * _numT, _isCols); + const first = this.first; + const last = this.both + ? { + rows: calculateLast(this.first.rows, numItemsInViewport.rows, numToleratedItems[0]), + cols: calculateLast(this.first.cols, numItemsInViewport.cols, numToleratedItems[1], true) + } + : calculateLast(this.first, numItemsInViewport, numToleratedItems); + + this.last = last; + this.numItemsInViewport = numItemsInViewport; + this.d_numToleratedItems = numToleratedItems; + + if (this._showLoader) { + this.loaderArr = this.both ? Array.from({ length: numItemsInViewport.rows }).map(() => Array.from({ length: numItemsInViewport.cols })) : Array.from({ length: numItemsInViewport }); + } + + if (this._lazy) { + Promise.resolve().then(() => { + this.lazyLoadState = { + first: this._step ? (this.both ? { rows: 0, cols: first.cols } : 0) : first, + last: Math.min(this._step ? this._step : this.last, (this._items).length) + }; + + this.handleEvents('onLazyLoad', this.lazyLoadState); + }); + } + } + + calculateAutoSize() { + if (this._autoSize && !this.d_loading) { + Promise.resolve().then(() => { + if (this.contentEl) { + this.contentEl.style.minHeight = this.contentEl.style.minWidth = 'auto'; + this.contentEl.style.position = 'relative'; + (this.elementViewChild).nativeElement.style.contain = 'none'; + + const [contentWidth, contentHeight] = [getWidth(this.contentEl), getHeight(this.contentEl)]; + contentWidth !== this.defaultContentWidth && ((this.elementViewChild).nativeElement.style.width = ''); + contentHeight !== this.defaultContentHeight && ((this.elementViewChild).nativeElement.style.height = ''); + + const [width, height] = [getWidth((this.elementViewChild).nativeElement), getHeight((this.elementViewChild).nativeElement)]; + (this.both || this.horizontal) && ((this.elementViewChild).nativeElement.style.width = width < this.defaultWidth ? width + 'px' : this._scrollWidth || this.defaultWidth + 'px'); + (this.both || this.vertical) && ((this.elementViewChild).nativeElement.style.height = height < this.defaultHeight ? height + 'px' : this._scrollHeight || this.defaultHeight + 'px'); + + this.contentEl.style.minHeight = this.contentEl.style.minWidth = ''; + this.contentEl.style.position = ''; + (this.elementViewChild).nativeElement.style.contain = ''; + } + }); + } + } + + getLast(last = 0, isCols = false) { + return this._items ? Math.min(isCols ? (this._columns || this._items[0]).length : this._items.length, last) : 0; + } + + getContentPosition() { + if (this.contentEl) { + const style = getComputedStyle(this.contentEl); + const left = parseFloat(style.paddingLeft) + Math.max(parseFloat(style.left) || 0, 0); + const right = parseFloat(style.paddingRight) + Math.max(parseFloat(style.right) || 0, 0); + const top = parseFloat(style.paddingTop) + Math.max(parseFloat(style.top) || 0, 0); + const bottom = parseFloat(style.paddingBottom) + Math.max(parseFloat(style.bottom) || 0, 0); + + return { left, right, top, bottom, x: left + right, y: top + bottom }; + } + + return { left: 0, right: 0, top: 0, bottom: 0, x: 0, y: 0 }; + } + + setSize() { + if (this.elementViewChild?.nativeElement) { + const nativeElement = this.elementViewChild.nativeElement; + const parentElement = nativeElement.parentElement?.parentElement; + + const elementWidth = nativeElement.offsetWidth; + const parentWidth = parentElement?.offsetWidth || 0; + const width = this._scrollWidth || `${elementWidth || parentWidth}px`; + + const elementHeight = nativeElement.offsetHeight; + const parentHeight = parentElement?.offsetHeight || 0; + const height = this._scrollHeight || `${elementHeight || parentHeight}px`; + + const setProp = (_name: string, _value: any) => (nativeElement.style[_name] = _value); + + if (this.both || this.horizontal) { + setProp('height', height); + setProp('width', width); + } else { + setProp('height', height); + } + } + } + + setSpacerSize() { + if (this._items) { + const contentPos = this.getContentPosition(); + const setProp = (_name: string, _value: any, _size: number, _cpos: number = 0) => + (this.spacerStyle = { + ...this.spacerStyle, + ...{ [`${_name}`]: (_value || []).length * _size + _cpos + 'px' } + }); + + if (this.both) { + setProp('height', this._items, (this._itemSize)[0], contentPos.y); + setProp('width', this._columns || this._items[1], (this._itemSize)[1], contentPos.x); + } else { + this.horizontal ? setProp('width', this._columns || this._items, this._itemSize, contentPos.x) : setProp('height', this._items, this._itemSize, contentPos.y); + } + } + } + + setContentPosition(pos: any) { + if (this.contentEl && !this._appendOnly) { + const first = pos ? pos.first : this.first; + const calculateTranslateVal = (_first: number, _size: number) => _first * _size; + const setTransform = (_x = 0, _y = 0) => (this.contentStyle = { ...this.contentStyle, ...{ transform: `translate3d(${_x}px, ${_y}px, 0)` } }); + + if (this.both) { + setTransform(calculateTranslateVal(first.cols, (this._itemSize)[1]), calculateTranslateVal(first.rows, (this._itemSize)[0])); + } else { + const translateVal = calculateTranslateVal(first, this._itemSize); + this.horizontal ? setTransform(translateVal, 0) : setTransform(0, translateVal); + } + } + } + + onScrollPositionChange(event: Event) { + const target = event.target; + if (!target) { + throw new Error('Event target is null'); + } + const contentPos = this.getContentPosition(); + const calculateScrollPos = (_pos: number, _cpos: number) => (_pos ? (_pos > _cpos ? _pos - _cpos : _pos) : 0); + const calculateCurrentIndex = (_pos: number, _size: number) => (_size || _pos ? Math.floor(_pos / (_size || _pos)) : 0); + const calculateTriggerIndex = (_currentIndex: number, _first: number, _last: number, _num: number, _numT: number, _isScrollDownOrRight: any) => { + return _currentIndex <= _numT ? _numT : _isScrollDownOrRight ? _last - _num - _numT : _first + _numT - 1; + }; + const calculateFirst = (_currentIndex: number, _triggerIndex: number, _first: number, _last: number, _num: number, _numT: number, _isScrollDownOrRight: any) => { + if (_currentIndex <= _numT) return 0; + else return Math.max(0, _isScrollDownOrRight ? (_currentIndex < _triggerIndex ? _first : _currentIndex - _numT) : _currentIndex > _triggerIndex ? _first : _currentIndex - 2 * _numT); + }; + const calculateLast = (_currentIndex: number, _first: number, _last: number, _num: number, _numT: number, _isCols = false) => { + let lastValue = _first + _num + 2 * _numT; + + if (_currentIndex >= _numT) { + lastValue += _numT + 1; + } + + return this.getLast(lastValue, _isCols); + }; + + const scrollTop = calculateScrollPos((target).scrollTop, contentPos.top); + const scrollLeft = calculateScrollPos((target).scrollLeft, contentPos.left); + + let newFirst = this.both ? { rows: 0, cols: 0 } : 0; + let newLast = this.last; + let isRangeChanged = false; + let newScrollPos = this.lastScrollPos; + + if (this.both) { + const isScrollDown = this.lastScrollPos.top <= scrollTop; + const isScrollRight = this.lastScrollPos.left <= scrollLeft; + + if (!this._appendOnly || (this._appendOnly && (isScrollDown || isScrollRight))) { + const currentIndex = { + rows: calculateCurrentIndex(scrollTop, (this._itemSize)[0]), + cols: calculateCurrentIndex(scrollLeft, (this._itemSize)[1]) + }; + const triggerIndex = { + rows: calculateTriggerIndex(currentIndex.rows, this.first.rows, this.last.rows, this.numItemsInViewport.rows, this.d_numToleratedItems[0], isScrollDown), + cols: calculateTriggerIndex(currentIndex.cols, this.first.cols, this.last.cols, this.numItemsInViewport.cols, this.d_numToleratedItems[1], isScrollRight) + }; + + newFirst = { + rows: calculateFirst(currentIndex.rows, triggerIndex.rows, this.first.rows, this.last.rows, this.numItemsInViewport.rows, this.d_numToleratedItems[0], isScrollDown), + cols: calculateFirst(currentIndex.cols, triggerIndex.cols, this.first.cols, this.last.cols, this.numItemsInViewport.cols, this.d_numToleratedItems[1], isScrollRight) + }; + newLast = { + rows: calculateLast(currentIndex.rows, newFirst.rows, this.last.rows, this.numItemsInViewport.rows, this.d_numToleratedItems[0]), + cols: calculateLast(currentIndex.cols, newFirst.cols, this.last.cols, this.numItemsInViewport.cols, this.d_numToleratedItems[1], true) + }; + + isRangeChanged = newFirst.rows !== this.first.rows || newLast.rows !== this.last.rows || newFirst.cols !== this.first.cols || newLast.cols !== this.last.cols || this.isRangeChanged; + newScrollPos = { top: scrollTop, left: scrollLeft }; + } + } else { + const scrollPos = this.horizontal ? scrollLeft : scrollTop; + const isScrollDownOrRight = this.lastScrollPos <= scrollPos; + + if (!this._appendOnly || (this._appendOnly && isScrollDownOrRight)) { + const currentIndex = calculateCurrentIndex(scrollPos, this._itemSize); + const triggerIndex = calculateTriggerIndex(currentIndex, this.first, this.last, this.numItemsInViewport, this.d_numToleratedItems, isScrollDownOrRight); + + newFirst = calculateFirst(currentIndex, triggerIndex, this.first, this.last, this.numItemsInViewport, this.d_numToleratedItems, isScrollDownOrRight); + newLast = calculateLast(currentIndex, newFirst, this.last, this.numItemsInViewport, this.d_numToleratedItems); + isRangeChanged = newFirst !== this.first || newLast !== this.last || this.isRangeChanged; + newScrollPos = scrollPos; + } + } + + return { + first: newFirst, + last: newLast, + isRangeChanged, + scrollPos: newScrollPos + }; + } + + onScrollChange(event: Event) { + const { first, last, isRangeChanged, scrollPos } = this.onScrollPositionChange(event); + + if (isRangeChanged) { + const newState = { first, last }; + + this.setContentPosition(newState); + + this.first = first; + this.last = last; + this.lastScrollPos = scrollPos; + + this.handleEvents('onScrollIndexChange', newState); + + if (this._lazy && this.isPageChanged(first)) { + const lazyLoadState = { + first: this._step ? Math.min(this.getPageByFirst(first) * this._step, (this._items).length - this._step) : first, + last: Math.min(this._step ? (this.getPageByFirst(first) + 1) * this._step : last, (this._items).length) + }; + const isLazyStateChanged = this.lazyLoadState.first !== lazyLoadState.first || this.lazyLoadState.last !== lazyLoadState.last; + + isLazyStateChanged && this.handleEvents('onLazyLoad', lazyLoadState); + this.lazyLoadState = lazyLoadState; + } + } + } + + onContainerScroll(event: Event) { + this.handleEvents('onScroll', { originalEvent: event }); + + if (this._delay) { + if (this.scrollTimeout) { + clearTimeout(this.scrollTimeout); + } + + if (!this.d_loading && this._showLoader) { + const { isRangeChanged } = this.onScrollPositionChange(event); + const changed = isRangeChanged || (this._step ? this.isPageChanged() : false); + + if (changed) { + this.d_loading = true; + + this.cd.detectChanges(); + } + } + + this.scrollTimeout = setTimeout(() => { + this.onScrollChange(event); + + if (this.d_loading && this._showLoader && (!this._lazy || this._loading === undefined)) { + this.d_loading = false; + this.page = this.getPageByFirst(); + } + this.cd.detectChanges(); + }, this._delay); + } else { + !this.d_loading && this.onScrollChange(event); + } + } + + bindResizeListener() { + if (isPlatformBrowser(this.platformId)) { + if (!this.windowResizeListener) { + this.zone.runOutsideAngular(() => { + const window = this.document.defaultView as Window; + const event = isTouchDevice() ? 'orientationchange' : 'resize'; + this.windowResizeListener = this.renderer.listen(window, event, this.onWindowResize.bind(this)); + }); + } + } + } + + unbindResizeListener() { + if (this.windowResizeListener) { + this.windowResizeListener(); + this.windowResizeListener = null; + } + } + + onWindowResize() { + if (this.resizeTimeout) { + clearTimeout(this.resizeTimeout); + } + + this.resizeTimeout = setTimeout(() => { + if (isVisible(this.elementViewChild?.nativeElement)) { + const [width, height] = [getWidth(this.elementViewChild?.nativeElement), getHeight(this.elementViewChild?.nativeElement)]; + const [isDiffWidth, isDiffHeight] = [width !== this.defaultWidth, height !== this.defaultHeight]; + const reinit = this.both ? isDiffWidth || isDiffHeight : this.horizontal ? isDiffWidth : this.vertical ? isDiffHeight : false; + + reinit && + this.zone.run(() => { + this.d_numToleratedItems = this._numToleratedItems; + this.defaultWidth = width; + this.defaultHeight = height; + this.defaultContentWidth = getWidth(this.contentEl); + this.defaultContentHeight = getHeight(this.contentEl); + + this.init(); + }); + } + }, this._resizeDelay); + } + + handleEvents(name: string, params: any) { + //@ts-ignore + return this.options && (this.options)[name] ? (this.options)[name](params) : this[name].emit(params); + } + + getContentOptions() { + return { + contentStyleClass: `p-virtualscroller-content ${this.d_loading ? 'p-virtualscroller-loading' : ''}`, + items: this.loadedItems, + getItemOptions: (index: number) => this.getOptions(index), + loading: this.d_loading, + getLoaderOptions: (index: number, options?: any) => this.getLoaderOptions(index, options), + itemSize: this._itemSize, + rows: this.loadedRows, + columns: this.loadedColumns, + spacerStyle: this.spacerStyle, + contentStyle: this.contentStyle, + vertical: this.vertical, + horizontal: this.horizontal, + both: this.both, + scrollTo: this.scrollTo.bind(this), + scrollToIndex: this.scrollToIndex.bind(this), + orientation: this._orientation, + scrollableElement: this.elementViewChild?.nativeElement + }; + } + + getOptions(renderedIndex: number) { + const count = (this._items || []).length; + const index = this.both ? this.first.rows + renderedIndex : this.first + renderedIndex; + + return { + index, + count, + first: index === 0, + last: index === count - 1, + even: index % 2 === 0, + odd: index % 2 !== 0 + }; + } + + getLoaderOptions(index: number, extOptions: any) { + const count = this.loaderArr.length; + + return { + index, + count, + first: index === 0, + last: index === count - 1, + even: index % 2 === 0, + odd: index % 2 !== 0, + loading: this.d_loading, + ...extOptions + }; + } +} + +@NgModule({ + imports: [Scroller, SharedModule], + exports: [Scroller, SharedModule] +}) +export class ScrollerModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/scroller/style/scrollerstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/scroller/style/scrollerstyle.ts new file mode 100644 index 000000000..25c0f6e29 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/scroller/style/scrollerstyle.ts @@ -0,0 +1,134 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/scroller/style/scrollerstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { BaseStyle } from '../../base/public_api'; + +const css = /*css*/ ` +.p-virtualscroller { + position: relative; + overflow: auto; + contain: strict; + transform: translateZ(0); + will-change: scroll-position; + outline: 0 none; +} + +.p-virtualscroller-content { + position: absolute; + top: 0; + left: 0; + min-height: 100%; + min-width: 100%; + will-change: transform; +} + +.p-virtualscroller-spacer { + position: absolute; + top: 0; + left: 0; + height: 1px; + width: 1px; + transform-origin: 0 0; + pointer-events: none; +} + +.p-virtualscroller-loader { + position: sticky; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: dt('virtualscroller.loader.mask.background'); + color: dt('virtualscroller.loader.mask.color'); +} + +.p-virtualscroller-loader-mask { + display: flex; + align-items: center; + justify-content: center; +} + +.p-virtualscroller-loading-icon { + font-size: dt('virtualscroller.loader.icon.size'); + width: dt('virtualscroller.loader.icon.size'); + height: dt('virtualscroller.loader.icon.size'); +} + +.p-virtualscroller-horizontal > .p-virtualscroller-content { + display: flex; +} + +.p-virtualscroller-inline .p-virtualscroller-content { + position: static; +} +`; + +const classes = { + root: ({ instance }) => [ + 'p-virtualscroller', + { + 'p-virtualscroller-inline': instance.inline, + 'p-virtualscroller-both p-both-scroll': instance.both, + 'p-virtualscroller-horizontal p-horizontal-scroll': instance.horizontal + } + ], + content: 'p-virtualscroller-content', + spacer: 'p-virtualscroller-spacer', + loader: ({ instance }) => [ + 'p-virtualscroller-loader', + { + 'p-virtualscroller-loader-mask': !instance.loaderTemplate + } + ], + loadingIcon: 'p-virtualscroller-loading-icon' +}; + +@Injectable() +export class ScrollerStyle extends BaseStyle { + name = 'virtualscroller'; + + css = css; + + classes = classes; +} + +/** + * + * VirtualScroller is a performant approach to handle huge data efficiently. + * + * [Live Demo](https://www.primeng.org/scroller/) + * + * @module scrollerstyle + * + */ +export enum ScrollerClasses { + /** + * Class name of the root element + */ + root = 'p-virtualscroller', + /** + * Class name of the content element + */ + content = 'p-virtualscroller-content', + /** + * Class name of the spacer element + */ + spacer = 'p-virtualscroller-spacer', + /** + * Class name of the loader element + */ + loader = 'p-virtualscroller-loader', + /** + * Class name of the loading icon element + */ + loadingIcon = 'p-virtualscroller-loading-icon' +} + +export interface ScrollerStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/select/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/select/public_api.ts new file mode 100644 index 000000000..bed222682 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/select/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/select/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/select/public_api'; +export * from './select'; +export * from './style/selectstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/select/select.ts b/projects/cps-ui-kit/src/lib/primeng-temp/select/select.ts new file mode 100755 index 000000000..78175bf86 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/select/select.ts @@ -0,0 +1,2026 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/select/select.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { + AfterViewChecked, + AfterViewInit, + booleanAttribute, + ChangeDetectionStrategy, + Component, + computed, + ContentChild, + ContentChildren, + effect, + ElementRef, + EventEmitter, + forwardRef, + inject, + InjectionToken, + input, + Input, + NgModule, + NgZone, + numberAttribute, + Output, + QueryList, + Signal, + signal, + TemplateRef, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { NG_VALUE_ACCESSOR } from '@angular/forms'; +import { MotionOptions } from '../../primeuix-temp/motion/src/index'; +import { deepEquals, equals, findLastIndex, findSingle, focus, getFirstFocusableElement, getFocusableElements, getLastFocusableElement, isEmpty, isNotEmpty, isPrintableCharacter, resolveFieldData, scrollInView, uuid } from '../../primeuix-temp/utils/src/index'; +import { FilterService, OverlayOptions, PrimeTemplate, ScrollerOptions, SharedModule, TranslationKeys } from '../api/public_api'; +import { AutoFocus } from '../autofocus/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { BaseInput } from '../baseinput/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import { unblockBodyScroll } from '../dom/public_api'; +import { IconField } from '../iconfield/public_api'; +import { BlankIcon, CheckIcon, ChevronDownIcon, SearchIcon, TimesIcon } from '../icons/public_api'; +import { InputIcon } from '../inputicon/public_api'; +import { InputText } from '../inputtext/public_api'; +import { Overlay } from '../overlay/public_api'; +import { Ripple } from '../ripple/public_api'; +import { Scroller } from '../scroller/public_api'; +import { Tooltip } from '../tooltip/public_api'; +import { Nullable } from '../ts-helpers/public_api'; +import { + SelectChangeEvent, + SelectFilterEvent, + SelectFilterOptions, + SelectFilterTemplateContext, + SelectGroupTemplateContext, + SelectIconTemplateContext, + SelectItemTemplateContext, + SelectLazyLoadEvent, + SelectLoaderTemplateContext, + SelectPassThrough, + SelectSelectedItemTemplateContext +} from '../types/select/public_api'; +import { SelectStyle } from './style/selectstyle'; + +const SELECT_INSTANCE = new InjectionToken + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
    + + +
  • + {{ getOptionGroupLabel(option.optionGroup) }} + +
  • +
    + + + +
    +
  • + @if (!emptyFilterTemplate && !_emptyFilterTemplate && !emptyTemplate) { + {{ emptyFilterMessageLabel }} + } @else { + + } +
  • +
  • + @if (!emptyTemplate && !_emptyTemplate) { + {{ emptyMessageLabel || emptyFilterMessageLabel }} + } @else { + + } +
  • +
+
+
+ + +
+
+
+ `, + host: { + '[class]': "cn(cx('root'), styleClass)", + '[attr.id]': 'id', + '[attr.data-p]': 'containerDataP', + '(click)': 'onContainerClick($event)' + }, + providers: [SELECT_VALUE_ACCESSOR, SelectStyle, { provide: SELECT_INSTANCE, useExisting: Select }, { provide: PARENT_INSTANCE, useExisting: Select }], + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + hostDirectives: [Bind] +}) +export class Select extends BaseInput implements AfterViewInit, AfterViewChecked { + componentName = 'Select'; + + bindDirectiveInstance = inject(Bind, { self: true }); + /** + * Unique identifier of the component + * @group Props + */ + @Input() id: string | undefined; + /** + * Height of the viewport in pixels, a scrollbar is defined if height of list exceeds this value. + * @group Props + */ + @Input() scrollHeight: string = '200px'; + /** + * When specified, displays an input field to filter the items on keyup. + * @group Props + */ + @Input({ transform: booleanAttribute }) filter: boolean | undefined; + /** + * Inline style of the overlay panel element. + * @group Props + */ + @Input() panelStyle: { [klass: string]: any } | null | undefined; + /** + * Style class of the element. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * Style class of the overlay panel element. + * @group Props + */ + @Input() panelStyleClass: string | undefined; + /** + * When present, it specifies that the component cannot be edited. + * @group Props + */ + @Input({ transform: booleanAttribute }) readonly: boolean | undefined; + /** + * When present, custom value instead of predefined options can be entered using the editable input field. + * @group Props + */ + @Input({ transform: booleanAttribute }) editable: boolean | undefined; + /** + * Index of the element in tabbing order. + * @group Props + */ + @Input({ transform: numberAttribute }) tabindex: number | undefined = 0; + /** + * Default text to display when no option is selected. + * @group Props + */ + @Input() set placeholder(val: string | undefined) { + this._placeholder.set(val); + } + get placeholder(): Signal { + return this._placeholder.asReadonly(); + } + /** + * Icon to display in loading state. + * @group Props + */ + @Input() loadingIcon: string | undefined; + /** + * Placeholder text to show when filter input is empty. + * @group Props + */ + @Input() filterPlaceholder: string | undefined; + /** + * Locale to use in filtering. The default locale is the host environment's current locale. + * @group Props + */ + @Input() filterLocale: string | undefined; + /** + * Identifier of the accessible input element. + * @group Props + */ + @Input() inputId: string | undefined; + /** + * A property to uniquely identify a value in options. + * @group Props + */ + @Input() dataKey: string | undefined; + /** + * When filtering is enabled, filterBy decides which field or fields (comma separated) to search against. + * @group Props + */ + @Input() filterBy: string | undefined; + /** + * Fields used when filtering the options, defaults to optionLabel. + * @group Props + */ + @Input() filterFields: any[] | undefined; + /** + * When present, it specifies that the component should automatically get focus on load. + * @group Props + */ + @Input({ transform: booleanAttribute }) autofocus: boolean | undefined; + /** + * Clears the filter value when hiding the select. + * @group Props + */ + @Input({ transform: booleanAttribute }) resetFilterOnHide: boolean = false; + /** + * Whether the selected option will be shown with a check mark. + * @group Props + */ + @Input({ transform: booleanAttribute }) checkmark: boolean = false; + /** + * Icon class of the select icon. + * @group Props + */ + @Input() dropdownIcon: string | undefined; + /** + * Whether the select is in loading state. + * @group Props + */ + @Input({ transform: booleanAttribute }) loading: boolean | undefined = false; + /** + * Name of the label field of an option. + * @group Props + */ + @Input() optionLabel: string | undefined; + /** + * Name of the value field of an option. + * @group Props + */ + @Input() optionValue: string | undefined; + /** + * Name of the disabled field of an option. + * @group Props + */ + @Input() optionDisabled: string | undefined; + /** + * Name of the label field of an option group. + * @group Props + */ + @Input() optionGroupLabel: string | undefined = 'label'; + /** + * Name of the options field of an option group. + * @group Props + */ + @Input() optionGroupChildren: string = 'items'; + /** + * Whether to display options as grouped when nested options are provided. + * @group Props + */ + @Input({ transform: booleanAttribute }) group: boolean | undefined; + /** + * When enabled, a clear icon is displayed to clear the value. + * @group Props + */ + @Input({ transform: booleanAttribute }) showClear: boolean | undefined; + /** + * Text to display when filtering does not return any results. Defaults to global value in i18n translation configuration. + * @group Props + */ + @Input() emptyFilterMessage: string = ''; + /** + * Text to display when there is no data. Defaults to global value in i18n translation configuration. + * @group Props + */ + @Input() emptyMessage: string = ''; + /** + * Defines if data is loaded and interacted with in lazy manner. + * @group Props + */ + @Input({ transform: booleanAttribute }) lazy: boolean = false; + /** + * Whether the data should be loaded on demand during scroll. + * @group Props + */ + @Input({ transform: booleanAttribute }) virtualScroll: boolean | undefined; + /** + * Height of an item in the list for VirtualScrolling. + * @group Props + */ + @Input({ transform: numberAttribute }) virtualScrollItemSize: number | undefined; + /** + * Whether to use the scroller feature. The properties of scroller component can be used like an object in it. + * @group Props + */ + @Input() virtualScrollOptions: ScrollerOptions | undefined; + /** + * Whether to use overlay API feature. The properties of overlay API can be used like an object in it. + * @group Props + */ + @Input() overlayOptions: OverlayOptions | undefined; + /** + * Defines a string that labels the filter input. + * @group Props + */ + @Input() ariaFilterLabel: string | undefined; + /** + * Used to define a aria label attribute the current element. + * @group Props + */ + @Input() ariaLabel: string | undefined; + /** + * Establishes relationships between the component and label(s) where its value should be one or more element IDs. + * @group Props + */ + @Input() ariaLabelledBy: string | undefined; + /** + * Defines how the items are filtered. + * @group Props + */ + @Input() filterMatchMode: 'contains' | 'startsWith' | 'endsWith' | 'equals' | 'notEquals' | 'in' | 'lt' | 'lte' | 'gt' | 'gte' = 'contains'; + /** + * Advisory information to display in a tooltip on hover. + * @group Props + */ + @Input() tooltip: string = ''; + /** + * Position of the tooltip. + * @group Props + */ + @Input() tooltipPosition: 'top' | 'left' | 'right' | 'bottom' = 'right'; + /** + * Type of CSS position. + * @group Props + */ + @Input() tooltipPositionStyle: string = 'absolute'; + /** + * Style class of the tooltip. + * @group Props + */ + @Input() tooltipStyleClass: string | undefined; + /** + * Fields used when filtering the options, defaults to optionLabel. + * @group Props + */ + @Input({ transform: booleanAttribute }) focusOnHover: boolean = true; + /** + * Determines if the option will be selected on focus. + * @group Props + */ + @Input({ transform: booleanAttribute }) selectOnFocus: boolean = false; + /** + * Whether to focus on the first visible or selected element when the overlay panel is shown. + * @group Props + */ + @Input({ transform: booleanAttribute }) autoOptionFocus: boolean = false; + /** + * Applies focus to the filter element when the overlay is shown. + * @group Props + */ + @Input({ transform: booleanAttribute }) autofocusFilter: boolean = true; + /** + * When specified, filter displays with this value. + * @group Props + */ + @Input() get filterValue(): string | undefined | null { + return this._filterValue(); + } + set filterValue(val: string | undefined | null) { + setTimeout(() => { + this._filterValue.set(val); + }); + } + /** + * An array of objects to display as the available options. + * @group Props + */ + @Input() get options(): any[] | null | undefined { + const options = this._options(); + return options; + } + set options(val: any[] | null | undefined) { + if (!deepEquals(val, this._options())) { + this._options.set(val); + } + } + /** + * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). + * @defaultValue 'self' + * @group Props + */ + appendTo = input | 'self' | 'body' | null | undefined | any>(undefined); + /** + * The motion options. + * @group Props + */ + motionOptions = input(undefined); + /** + * Callback to invoke when value of select changes. + * @param {SelectChangeEvent} event - custom change event. + * @group Emits + */ + @Output() onChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when data is filtered. + * @param {SelectFilterEvent} event - custom filter event. + * @group Emits + */ + @Output() onFilter: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when select gets focus. + * @param {Event} event - Browser event. + * @group Emits + */ + @Output() onFocus: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when select loses focus. + * @param {Event} event - Browser event. + * @group Emits + */ + @Output() onBlur: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when component is clicked. + * @param {MouseEvent} event - Mouse event. + * @group Emits + */ + @Output() onClick: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when select overlay gets visible. + * @param {AnimationEvent} event - Animation event. + * @group Emits + */ + @Output() onShow: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when select overlay gets hidden. + * @param {AnimationEvent} event - Animation event. + * @group Emits + */ + @Output() onHide: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when select clears the value. + * @param {Event} event - Browser event. + * @group Emits + */ + @Output() onClear: EventEmitter = new EventEmitter(); + /** + * Callback to invoke in lazy mode to load new data. + * @param {SelectLazyLoadEvent} event - Lazy load event. + * @group Emits + */ + @Output() onLazyLoad: EventEmitter = new EventEmitter(); + + _componentStyle = inject(SelectStyle); + + @ViewChild('filter') filterViewChild: Nullable; + + @ViewChild('focusInput') focusInputViewChild: Nullable; + + @ViewChild('editableInput') editableInputViewChild: Nullable; + + @ViewChild('items') itemsViewChild: Nullable; + + @ViewChild('scroller') scroller: Nullable; + + @ViewChild('overlay') overlayViewChild: Nullable; + + @ViewChild('firstHiddenFocusableEl') firstHiddenFocusableElementOnOverlay: Nullable; + + @ViewChild('lastHiddenFocusableEl') lastHiddenFocusableElementOnOverlay: Nullable; + + itemsWrapper: Nullable; + + $appendTo = computed(() => this.appendTo() || this.config.overlayAppendTo()); + + /** + * Custom item template. + * @group Templates + */ + @ContentChild('item', { descendants: false }) itemTemplate: Nullable>; + + /** + * Custom group template. + * @group Templates + */ + @ContentChild('group', { descendants: false }) groupTemplate: Nullable>; + + /** + * Custom loader template. + * @group Templates + */ + @ContentChild('loader', { descendants: false }) loaderTemplate: Nullable>; + + /** + * Custom selected item template. + * @group Templates + */ + @ContentChild('selectedItem', { descendants: false }) selectedItemTemplate: Nullable>; + + /** + * Custom header template. + * @group Templates + */ + @ContentChild('header', { descendants: false }) headerTemplate: Nullable>; + + /** + * Custom filter template. + * @group Templates + */ + @ContentChild('filter', { descendants: false }) filterTemplate: Nullable>; + + /** + * Custom footer template. + * @group Templates + */ + @ContentChild('footer', { descendants: false }) footerTemplate: Nullable>; + + /** + * Custom empty filter template. + * @group Templates + */ + @ContentChild('emptyfilter', { descendants: false }) emptyFilterTemplate: Nullable>; + + /** + * Custom empty template. + * @group Templates + */ + @ContentChild('empty', { descendants: false }) emptyTemplate: Nullable>; + + /** + * Custom dropdown icon template. + * @group Templates + */ + @ContentChild('dropdownicon', { descendants: false }) dropdownIconTemplate: Nullable>; + + /** + * Custom loading icon template. + * @group Templates + */ + @ContentChild('loadingicon', { descendants: false }) loadingIconTemplate: Nullable>; + + /** + * Custom clear icon template. + * @group Templates + */ + @ContentChild('clearicon', { descendants: false }) clearIconTemplate: Nullable>; + + /** + * Custom filter icon template. + * @group Templates + */ + @ContentChild('filtericon', { descendants: false }) filterIconTemplate: Nullable>; + + /** + * Custom on icon template. + * @group Templates + */ + @ContentChild('onicon', { descendants: false }) onIconTemplate: Nullable>; + + /** + * Custom off icon template. + * @group Templates + */ + @ContentChild('officon', { descendants: false }) offIconTemplate: Nullable>; + + /** + * Custom cancel icon template. + * @group Templates + */ + @ContentChild('cancelicon', { descendants: false }) cancelIconTemplate: Nullable>; + + @ContentChildren(PrimeTemplate) templates: QueryList | undefined; + + _itemTemplate: TemplateRef | undefined; + + _selectedItemTemplate: TemplateRef | undefined; + + _headerTemplate: TemplateRef | undefined; + + _filterTemplate: TemplateRef | undefined; + + _footerTemplate: TemplateRef | undefined; + + _emptyFilterTemplate: TemplateRef | undefined; + + _emptyTemplate: TemplateRef | undefined; + + _groupTemplate: TemplateRef | undefined; + + _loaderTemplate: TemplateRef | undefined; + + _dropdownIconTemplate: TemplateRef | undefined; + + _loadingIconTemplate: TemplateRef | undefined; + + _clearIconTemplate: TemplateRef | undefined; + + _filterIconTemplate: TemplateRef | undefined; + + _cancelIconTemplate: TemplateRef | undefined; + + _onIconTemplate: TemplateRef | undefined; + + _offIconTemplate: TemplateRef | undefined; + + filterOptions: SelectFilterOptions | undefined; + + _options = signal(null); + + _placeholder = signal(undefined); + + value: any; + + hover: Nullable; + + focused: Nullable; + + overlayVisible: Nullable; + + optionsChanged: Nullable; + + panel: Nullable; + + dimensionsUpdated: Nullable; + + hoveredItem: any; + + selectedOptionUpdated: Nullable; + + _filterValue = signal(null); + + searchValue: Nullable; + + searchIndex: Nullable; + + searchTimeout: any; + + previousSearchChar: Nullable; + + currentSearchChar: Nullable; + + preventModelTouched: Nullable; + + focusedOptionIndex = signal(-1); + + labelId: Nullable; + + listId: Nullable; + + clicked = signal(false); + + get emptyMessageLabel(): string { + return this.emptyMessage || this.config.getTranslation(TranslationKeys.EMPTY_MESSAGE); + } + + get emptyFilterMessageLabel(): string { + return this.emptyFilterMessage || this.config.getTranslation(TranslationKeys.EMPTY_FILTER_MESSAGE); + } + + get isVisibleClearIcon(): boolean | undefined { + return this.modelValue() != null && this.hasSelectedOption() && this.showClear && !this.$disabled(); + } + + get listLabel(): string { + return this.config.getTranslation(TranslationKeys.ARIA)['listLabel']; + } + + get focusedOptionId() { + return this.focusedOptionIndex() !== -1 ? `${this.id}_${this.focusedOptionIndex()}` : null; + } + + visibleOptions = computed(() => { + const options = this.getAllVisibleAndNonVisibleOptions(); + + if (this._filterValue()) { + const _filterBy = this.filterBy || this.optionLabel; + + const filteredOptions = + !_filterBy && !this.filterFields && !this.optionValue + ? this.options?.filter((option) => { + if (option.label) { + return option.label.toString().toLowerCase().indexOf(this._filterValue().toLowerCase().trim()) !== -1; + } + return option.toString().toLowerCase().indexOf(this._filterValue().toLowerCase().trim()) !== -1; + }) + : this.filterService.filter(options, this.searchFields(), this._filterValue().trim(), this.filterMatchMode, this.filterLocale); + + if (this.group) { + const optionGroups = this.options || []; + const filtered: any[] = []; + + optionGroups.forEach((group) => { + const groupChildren = this.getOptionGroupChildren(group); + const filteredItems = groupChildren.filter((item) => filteredOptions?.includes(item)); + + if (filteredItems.length > 0) + filtered.push({ + ...group, + [typeof this.optionGroupChildren === 'string' ? this.optionGroupChildren : 'items']: [...filteredItems] + }); + }); + + return this.flatOptions(filtered); + } + return filteredOptions; + } + + return options; + }); + + label = computed(() => { + // use getAllVisibleAndNonVisibleOptions verses just visible options + // this will find the selected option whether or not the user is currently filtering because the filtered (i.e. visible) options, are a subset of all the options + const options = this.getAllVisibleAndNonVisibleOptions(); + + // use isOptionEqualsModelValue for the use case where the dropdown is initalized with a disabled option + const selectedOptionIndex = options.findIndex((option) => { + const isEqual = this.isOptionValueEqualsModelValue(option); + return isEqual; + }); + + if (selectedOptionIndex !== -1) { + const selectedOption = options[selectedOptionIndex]; + // Always show the label for selected options, even if disabled + return this.getOptionLabel(selectedOption); + } + + return this.placeholder() || 'p-emptylabel'; + }); + + selectedOption: any; + + constructor( + public zone: NgZone, + public filterService: FilterService + ) { + super(); + effect(() => { + const modelValue = this.modelValue(); + const visibleOptions = this.visibleOptions(); + + if (visibleOptions && isNotEmpty(visibleOptions)) { + const selectedOptionIndex = this.findSelectedOptionIndex(); + + if (selectedOptionIndex !== -1 || modelValue === undefined || (typeof modelValue === 'string' && modelValue.length === 0) || this.isModelValueNotSet() || this.editable) { + this.selectedOption = visibleOptions[selectedOptionIndex]; + } else { + // If no valid selected option found but we have a model value, + // try to find the option including disabled ones for template display + const disabledSelectedIndex = visibleOptions.findIndex((option) => this.isSelected(option)); + if (disabledSelectedIndex !== -1) { + this.selectedOption = visibleOptions[disabledSelectedIndex]; + } + } + } + + if (isEmpty(visibleOptions) && (modelValue === undefined || this.isModelValueNotSet()) && isNotEmpty(this.selectedOption)) { + this.selectedOption = null; + } + + if (modelValue !== undefined && this.editable) { + this.updateEditableLabel(); + } + this.cd.markForCheck(); + }); + } + + private isModelValueNotSet(): boolean { + return this.modelValue() === null && !this.isOptionValueEqualsModelValue(this.selectedOption); + } + + private getAllVisibleAndNonVisibleOptions() { + return this.group ? this.flatOptions(this.options) : this.options || []; + } + + onInit() { + this.id = this.id || uuid('pn_id_'); + this.autoUpdateModel(); + + if (this.filterBy) { + this.filterOptions = { + filter: (value) => this.onFilterInputChange(value), + reset: () => this.resetFilter() + }; + } + } + + onAfterContentInit() { + (this.templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'item': + this._itemTemplate = item.template; + break; + + case 'selectedItem': + this._selectedItemTemplate = item.template; + break; + + case 'header': + this._headerTemplate = item.template; + break; + + case 'filter': + this._filterTemplate = item.template; + break; + + case 'footer': + this._footerTemplate = item.template; + break; + + case 'emptyfilter': + this._emptyFilterTemplate = item.template; + break; + + case 'empty': + this._emptyTemplate = item.template; + break; + + case 'group': + this._groupTemplate = item.template; + break; + + case 'loader': + this._loaderTemplate = item.template; + break; + + case 'dropdownicon': + this._dropdownIconTemplate = item.template; + break; + + case 'loadingicon': + this._loadingIconTemplate = item.template; + break; + + case 'clearicon': + this._clearIconTemplate = item.template; + break; + + case 'filtericon': + this._filterIconTemplate = item.template; + break; + + case 'cancelicon': + this._cancelIconTemplate = item.template; + break; + + case 'onicon': + this._onIconTemplate = item.template; + break; + + case 'officon': + this._offIconTemplate = item.template; + break; + + default: + this._itemTemplate = item.template; + break; + } + }); + } + + onAfterViewChecked() { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + + if (this.optionsChanged && this.overlayVisible) { + this.optionsChanged = false; + + this.zone.runOutsideAngular(() => { + setTimeout(() => { + if (this.overlayViewChild) { + this.overlayViewChild.alignOverlay(); + } + }, 1); + }); + } + + if (this.selectedOptionUpdated && this.itemsWrapper) { + let selectedItem = findSingle(this.overlayViewChild?.overlayViewChild?.nativeElement, 'li[data-p-selected="true"]'); + if (selectedItem) { + scrollInView(this.itemsWrapper, selectedItem); + } + this.selectedOptionUpdated = false; + } + } + + flatOptions(options) { + return (options || []).reduce((result, option, index) => { + result.push({ optionGroup: option, group: true, index }); + + const optionGroupChildren = this.getOptionGroupChildren(option); + + optionGroupChildren && optionGroupChildren.forEach((o) => result.push(o)); + + return result; + }, []); + } + + autoUpdateModel() { + if (this.selectOnFocus && this.autoOptionFocus && !this.hasSelectedOption()) { + this.focusedOptionIndex.set(this.findFirstFocusedOptionIndex()); + this.onOptionSelect(null, this.visibleOptions()[this.focusedOptionIndex()], false); + } + } + + onOptionSelect(event, option, isHide = true, preventChange = false) { + // Check if option is disabled before proceeding + if (this.isOptionDisabled(option)) { + return; + } + + if (!this.isSelected(option)) { + const value = this.getOptionValue(option); + this.updateModel(value, event); + this.focusedOptionIndex.set(this.findSelectedOptionIndex()); + preventChange === false && this.onChange.emit({ originalEvent: event, value: value }); + } + if (isHide) { + this.hide(true); + } + } + + onOptionMouseEnter(event, index) { + if (this.focusOnHover) { + this.changeFocusedOptionIndex(event, index); + } + } + + updateModel(value, event?) { + this.value = value; + this.onModelChange(value); + this.writeModelValue(value); + this.selectedOptionUpdated = true; + } + + allowModelChange() { + return !!this.modelValue() && !this.placeholder() && (this.modelValue() === undefined || this.modelValue() === null) && !this.editable && this.options && this.options.length; + } + + isSelected(option) { + return this.isOptionValueEqualsModelValue(option); + } + + private isOptionValueEqualsModelValue(option: any) { + // Don't check isValidOption here since we need to match disabled options too + return option !== undefined && option !== null && !this.isOptionGroup(option) && equals(this.modelValue(), this.getOptionValue(option), this.equalityKey()); + } + + onAfterViewInit() { + if (this.editable) { + this.updateEditableLabel(); + } + this.updatePlaceHolderForFloatingLabel(); + } + + updatePlaceHolderForFloatingLabel(): void { + const parentElement = this.el.nativeElement.parentElement; + const isInFloatingLabel = parentElement?.classList.contains('p-float-label'); + if (parentElement && isInFloatingLabel && !this.selectedOption) { + const label = parentElement.querySelector('label'); + if (label) { + this._placeholder.set(label.textContent); + } + } + } + + updateEditableLabel(): void { + if (this.editableInputViewChild) { + this.editableInputViewChild.nativeElement.value = this.getOptionLabel(this.selectedOption) || this.modelValue() || ''; + } + } + + clearEditableLabel(): void { + if (this.editableInputViewChild) { + this.editableInputViewChild.nativeElement.value = ''; + } + } + + getOptionIndex(index, scrollerOptions) { + return this.virtualScrollerDisabled ? index : scrollerOptions && scrollerOptions.getItemOptions(index)['index']; + } + + getOptionLabel(option: any) { + return this.optionLabel !== undefined && this.optionLabel !== null ? resolveFieldData(option, this.optionLabel) : option && option.label !== undefined ? option.label : option; + } + + getOptionValue(option: any) { + return this.optionValue && this.optionValue !== null ? resolveFieldData(option, this.optionValue) : !this.optionLabel && option && option.value !== undefined ? option.value : option; + } + + getPTItemOptions(option: any, itemOptions: any, index: number, key: string) { + return this.ptm(key, { + context: { + option, + index, + selected: this.isSelected(option), + focused: this.focusedOptionIndex() === this.getOptionIndex(index, itemOptions), + disabled: this.isOptionDisabled(option) + } + }); + } + + isSelectedOptionEmpty() { + return isEmpty(this.selectedOption); + } + + isOptionDisabled(option: any) { + return this.optionDisabled ? resolveFieldData(option, this.optionDisabled) : option && option.disabled !== undefined ? option.disabled : false; + } + + getOptionGroupLabel(optionGroup: any) { + return this.optionGroupLabel !== undefined && this.optionGroupLabel !== null ? resolveFieldData(optionGroup, this.optionGroupLabel) : optionGroup && optionGroup.label !== undefined ? optionGroup.label : optionGroup; + } + + getOptionGroupChildren(optionGroup: any) { + return this.optionGroupChildren !== undefined && this.optionGroupChildren !== null ? resolveFieldData(optionGroup, this.optionGroupChildren) : optionGroup.items; + } + + getAriaPosInset(index) { + return ( + (this.optionGroupLabel + ? index - + this.visibleOptions() + .slice(0, index) + .filter((option) => this.isOptionGroup(option)).length + : index) + 1 + ); + } + + get ariaSetSize() { + return this.visibleOptions().filter((option) => !this.isOptionGroup(option)).length; + } + + /** + * Callback to invoke on filter reset. + * @group Method + */ + public resetFilter(): void { + this._filterValue.set(null); + + if (this.filterViewChild && this.filterViewChild.nativeElement) { + this.filterViewChild.nativeElement.value = ''; + } + } + + onContainerClick(event: any) { + if (this.$disabled() || this.readonly || this.loading) { + return; + } + + if (event.target.tagName === 'INPUT' || event.target.getAttribute('data-pc-section') === 'clearicon' || event.target.closest('[data-pc-section="clearicon"]')) { + return; + } else if (!this.overlayViewChild || !this.overlayViewChild.el.nativeElement.contains(event.target)) { + this.overlayVisible ? this.hide(true) : this.show(true); + } + + this.focusInputViewChild?.nativeElement.focus({ preventScroll: true }); + this.onClick.emit(event); + this.clicked.set(true); + this.cd.detectChanges(); + } + + isEmpty() { + return !this._options() || (this.visibleOptions() && this.visibleOptions().length === 0); + } + + onEditableInput(event: Event) { + const value = (event.target as HTMLInputElement).value; + this.searchValue = ''; + const matched = this.searchOptions(event, value); + !matched && this.focusedOptionIndex.set(-1); + + this.onModelChange(value); + this.updateModel(value || null, event); + setTimeout(() => { + this.onChange.emit({ originalEvent: event, value: value }); + }, 1); + + !this.overlayVisible && isNotEmpty(value) && this.show(); + } + /** + * Displays the panel. + * @group Method + */ + public show(isFocus?) { + this.overlayVisible = true; + + this.focusedOptionIndex.set(this.focusedOptionIndex() !== -1 ? this.focusedOptionIndex() : this.autoOptionFocus ? this.findFirstFocusedOptionIndex() : this.editable ? -1 : this.findSelectedOptionIndex()); + + if (isFocus) { + focus(this.focusInputViewChild?.nativeElement); + } + + this.cd.markForCheck(); + } + + onOverlayBeforeEnter(event: any) { + this.itemsWrapper = findSingle(this.overlayViewChild?.overlayViewChild?.nativeElement, this.virtualScroll ? '[data-pc-name="virtualscroller"]' : '[data-pc-section="listcontainer"]'); + this.virtualScroll && this.scroller?.setContentEl(this.itemsViewChild?.nativeElement); + + if (this.options && this.options.length) { + if (this.virtualScroll) { + const selectedIndex = this.modelValue() ? this.focusedOptionIndex() : -1; + if (selectedIndex !== -1) { + setTimeout(() => { + this.scroller?.scrollToIndex(selectedIndex); + }, 10); + } + } else { + let selectedListItem = findSingle(this.itemsWrapper as HTMLElement, '[data-p-selected="true"]'); + if (selectedListItem) { + selectedListItem.scrollIntoView({ block: 'nearest', inline: 'nearest' }); + } + } + } + + if (this.filterViewChild && this.filterViewChild.nativeElement) { + this.preventModelTouched = true; + + if (this.autofocusFilter && !this.editable) { + this.filterViewChild.nativeElement.focus(); + } + } + this.onShow.emit(event); + } + + onOverlayAfterLeave(event: any) { + this.itemsWrapper = null; + this.onModelTouched(); + this.onHide.emit(event); + } + /** + * Hides the panel. + * @group Method + */ + public hide(isFocus?) { + this.overlayVisible = false; + this.focusedOptionIndex.set(-1); + this.clicked.set(false); + this.searchValue = ''; + + if (this.overlayOptions?.mode === 'modal') { + unblockBodyScroll(); + } + if (this.filter && this.resetFilterOnHide) { + this.resetFilter(); + } + if (isFocus) { + if (this.focusInputViewChild) { + focus(this.focusInputViewChild?.nativeElement); + } + if (this.editable && this.editableInputViewChild) { + focus(this.editableInputViewChild?.nativeElement); + } + } + this.cd.markForCheck(); + } + + onInputFocus(event: Event) { + if (this.$disabled()) { + // For ScreenReaders + return; + } + + this.focused = true; + const focusedOptionIndex = this.focusedOptionIndex() !== -1 ? this.focusedOptionIndex() : this.overlayVisible && this.autoOptionFocus ? this.findFirstFocusedOptionIndex() : -1; + this.focusedOptionIndex.set(focusedOptionIndex); + this.overlayVisible && this.scrollInView(this.focusedOptionIndex()); + + this.onFocus.emit(event); + } + + onInputBlur(event: Event) { + this.focused = false; + this.onBlur.emit(event); + + if (!this.preventModelTouched && !this.overlayVisible) { + this.onModelTouched(); + } + this.preventModelTouched = false; + } + + onKeyDown(event: KeyboardEvent, search: boolean = false) { + if (this.$disabled() || this.readonly || this.loading) { + return; + } + + switch (event.code) { + //down + case 'ArrowDown': + this.onArrowDownKey(event); + break; + + //up + case 'ArrowUp': + this.onArrowUpKey(event, this.editable); + break; + + case 'ArrowLeft': + case 'ArrowRight': + this.onArrowLeftKey(event, this.editable); + break; + + case 'Delete': + this.onDeleteKey(event); + break; + + case 'Home': + this.onHomeKey(event, this.editable); + break; + + case 'End': + this.onEndKey(event, this.editable); + break; + + case 'PageDown': + this.onPageDownKey(event); + break; + + case 'PageUp': + this.onPageUpKey(event); + break; + + //space + case 'Space': + this.onSpaceKey(event, search); + break; + + //enter + case 'Enter': + case 'NumpadEnter': + this.onEnterKey(event); + break; + + //escape and tab + case 'Escape': + this.onEscapeKey(event); + break; + + case 'Tab': + this.onTabKey(event); + break; + + case 'Backspace': + this.onBackspaceKey(event, this.editable); + break; + + case 'ShiftLeft': + case 'ShiftRight': + //NOOP + break; + + default: + if (!event.metaKey && isPrintableCharacter(event.key)) { + !this.overlayVisible && this.show(); + !this.editable && this.searchOptions(event, event.key); + } + + break; + } + + this.clicked.set(false); + } + + onFilterKeyDown(event) { + switch (event.code) { + case 'ArrowDown': + this.onArrowDownKey(event); + break; + + case 'ArrowUp': + this.onArrowUpKey(event, true); + break; + + case 'ArrowLeft': + case 'ArrowRight': + this.onArrowLeftKey(event, true); + break; + + case 'Home': + this.onHomeKey(event, true); + break; + + case 'End': + this.onEndKey(event, true); + break; + + case 'Enter': + case 'NumpadEnter': + this.onEnterKey(event, true); + break; + + case 'Escape': + this.onEscapeKey(event); + break; + + case 'Tab': + this.onTabKey(event, true); + break; + + default: + break; + } + } + + onFilterBlur(event) { + this.focusedOptionIndex.set(-1); + } + + onArrowDownKey(event: KeyboardEvent) { + if (!this.overlayVisible) { + this.show(); + this.editable && this.changeFocusedOptionIndex(event, this.findSelectedOptionIndex()); + } else { + const optionIndex = this.focusedOptionIndex() !== -1 ? this.findNextOptionIndex(this.focusedOptionIndex()) : this.clicked() ? this.findFirstOptionIndex() : this.findFirstFocusedOptionIndex(); + + this.changeFocusedOptionIndex(event, optionIndex); + } + // const optionIndex = this.focusedOptionIndex() !== -1 ? this.findNextOptionIndex(this.focusedOptionIndex()) : this.findFirstFocusedOptionIndex(); + // this.changeFocusedOptionIndex(event, optionIndex); + + // !this.overlayVisible && this.show(); + event.preventDefault(); + event.stopPropagation(); + } + + changeFocusedOptionIndex(event, index) { + if (this.focusedOptionIndex() !== index) { + this.focusedOptionIndex.set(index); + this.scrollInView(); + + if (this.selectOnFocus) { + const option = this.visibleOptions()[index]; + this.onOptionSelect(event, option, false); + } + } + } + + get virtualScrollerDisabled() { + return !this.virtualScroll; + } + + scrollInView(index = -1) { + const id = index !== -1 ? `${this.id}_${index}` : this.focusedOptionId; + + if (this.itemsViewChild && this.itemsViewChild.nativeElement) { + const element = findSingle(this.itemsViewChild.nativeElement, `li[id="${id}"]`); + if (element) { + element.scrollIntoView && element.scrollIntoView({ block: 'nearest', inline: 'nearest' }); + } else if (!this.virtualScrollerDisabled) { + setTimeout(() => { + this.virtualScroll && this.scroller?.scrollToIndex(index !== -1 ? index : this.focusedOptionIndex()); + }, 0); + } + } + } + + hasSelectedOption() { + return this.modelValue() !== undefined; + } + + isValidSelectedOption(option) { + return this.isValidOption(option) && this.isSelected(option); + } + + equalityKey() { + return this.optionValue ? undefined : this.dataKey; + } + + findFirstFocusedOptionIndex() { + const selectedIndex = this.findSelectedOptionIndex(); + return selectedIndex < 0 ? this.findFirstOptionIndex() : selectedIndex; + } + + findFirstOptionIndex() { + return this.visibleOptions().findIndex((option) => this.isValidOption(option)); + } + + findSelectedOptionIndex() { + return this.hasSelectedOption() ? this.visibleOptions().findIndex((option) => this.isValidSelectedOption(option)) : -1; + } + + findNextOptionIndex(index) { + const matchedOptionIndex = + index < this.visibleOptions().length - 1 + ? this.visibleOptions() + .slice(index + 1) + .findIndex((option) => this.isValidOption(option)) + : -1; + return matchedOptionIndex > -1 ? matchedOptionIndex + index + 1 : index; + } + + findPrevOptionIndex(index) { + const matchedOptionIndex = index > 0 ? findLastIndex(this.visibleOptions().slice(0, index), (option) => this.isValidOption(option)) : -1; + + return matchedOptionIndex > -1 ? matchedOptionIndex : index; + } + + findLastOptionIndex() { + return findLastIndex(this.visibleOptions(), (option) => this.isValidOption(option)); + } + + findLastFocusedOptionIndex() { + const selectedIndex = this.findSelectedOptionIndex(); + + return selectedIndex < 0 ? this.findLastOptionIndex() : selectedIndex; + } + + isValidOption(option) { + return option !== undefined && option !== null && !(this.isOptionDisabled(option) || this.isOptionGroup(option)); + } + + isOptionGroup(option) { + return this.optionGroupLabel !== undefined && this.optionGroupLabel !== null && option.optionGroup !== undefined && option.optionGroup !== null && option.group; + } + + onArrowUpKey(event: KeyboardEvent, pressedInInputText: boolean = false) { + if (event.altKey && !pressedInInputText) { + if (this.focusedOptionIndex() !== -1) { + const option = this.visibleOptions()[this.focusedOptionIndex()]; + this.onOptionSelect(event, option); + } + + this.overlayVisible && this.hide(); + } else { + const optionIndex = this.focusedOptionIndex() !== -1 ? this.findPrevOptionIndex(this.focusedOptionIndex()) : this.clicked() ? this.findLastOptionIndex() : this.findLastFocusedOptionIndex(); + + this.changeFocusedOptionIndex(event, optionIndex); + + !this.overlayVisible && this.show(); + } + event.preventDefault(); + event.stopPropagation(); + } + + onArrowLeftKey(event: KeyboardEvent, pressedInInputText: boolean = false) { + pressedInInputText && this.focusedOptionIndex.set(-1); + } + + onDeleteKey(event: KeyboardEvent) { + if (this.showClear) { + this.clear(event); + event.preventDefault(); + } + } + + onHomeKey(event: any, pressedInInputText: boolean = false) { + if (pressedInInputText && event.currentTarget && event.currentTarget.setSelectionRange) { + const target = event.currentTarget; + if (event.shiftKey) { + target.setSelectionRange(0, target.value.length); + } else { + target.setSelectionRange(0, 0); + this.focusedOptionIndex.set(-1); + } + } else { + this.changeFocusedOptionIndex(event, this.findFirstOptionIndex()); + + !this.overlayVisible && this.show(); + } + + event.preventDefault(); + } + + onEndKey(event: any, pressedInInputText = false) { + if (pressedInInputText && event.currentTarget && event.currentTarget.setSelectionRange) { + const target = event.currentTarget; + + if (event.shiftKey) { + target.setSelectionRange(0, target.value.length); + } else { + const len = target.value.length; + + target.setSelectionRange(len, len); + this.focusedOptionIndex.set(-1); + } + } else { + this.changeFocusedOptionIndex(event, this.findLastOptionIndex()); + + !this.overlayVisible && this.show(); + } + + event.preventDefault(); + } + + onPageDownKey(event: KeyboardEvent) { + this.scrollInView(this.visibleOptions().length - 1); + event.preventDefault(); + } + + onPageUpKey(event: KeyboardEvent) { + this.scrollInView(0); + event.preventDefault(); + } + + onSpaceKey(event: KeyboardEvent, pressedInInputText: boolean = false) { + !this.editable && !pressedInInputText && this.onEnterKey(event); + } + + onEnterKey(event, pressedInInput = false) { + if (!this.overlayVisible) { + this.focusedOptionIndex.set(-1); + this.onArrowDownKey(event); + } else { + if (this.focusedOptionIndex() !== -1) { + const option = this.visibleOptions()[this.focusedOptionIndex()]; + this.onOptionSelect(event, option); + } + + !pressedInInput && this.hide(); + } + + event.preventDefault(); + } + + onEscapeKey(event: KeyboardEvent) { + if (this.overlayVisible) { + this.hide(true); + event.preventDefault(); + event.stopPropagation(); + } + } + + onTabKey(event, pressedInInputText = false) { + if (!pressedInInputText) { + if (this.overlayVisible && this.hasFocusableElements()) { + focus(event.shiftKey ? this.lastHiddenFocusableElementOnOverlay?.nativeElement : this.firstHiddenFocusableElementOnOverlay?.nativeElement); + event.preventDefault(); + } else { + if (this.focusedOptionIndex() !== -1 && this.overlayVisible) { + const option = this.visibleOptions()[this.focusedOptionIndex()]; + this.onOptionSelect(event, option); + } + this.overlayVisible && this.hide(this.filter); + } + } + event.stopPropagation(); + } + + onFirstHiddenFocus(event) { + const focusableEl = event.relatedTarget === this.focusInputViewChild?.nativeElement ? getFirstFocusableElement(this.overlayViewChild?.el?.nativeElement, ':not([data-p-hidden-focusable="true"])') : this.focusInputViewChild?.nativeElement; + focus(focusableEl); + } + + onLastHiddenFocus(event) { + const focusableEl = + event.relatedTarget === this.focusInputViewChild?.nativeElement ? getLastFocusableElement(this.overlayViewChild?.overlayViewChild?.nativeElement, ':not([data-p-hidden-focusable="true"])') : this.focusInputViewChild?.nativeElement; + + focus(focusableEl); + } + + hasFocusableElements() { + return getFocusableElements(this.overlayViewChild?.overlayViewChild?.nativeElement, ':not([data-p-hidden-focusable="true"])').length > 0; + } + + onBackspaceKey(event: KeyboardEvent, pressedInInputText = false) { + if (pressedInInputText) { + !this.overlayVisible && this.show(); + } + } + + searchFields() { + return this.filterBy?.split(',') || this.filterFields || [this.optionLabel]; + } + + searchOptions(event, char) { + this.searchValue = (this.searchValue || '') + char; + + let optionIndex = -1; + let matched = false; + + optionIndex = this.visibleOptions().findIndex((option) => this.isOptionMatched(option)); + + if (optionIndex !== -1) { + matched = true; + } + + if (optionIndex === -1 && this.focusedOptionIndex() === -1) { + optionIndex = this.findFirstFocusedOptionIndex(); + } + + if (optionIndex !== -1) { + setTimeout(() => { + this.changeFocusedOptionIndex(event, optionIndex); + }); + } + + if (this.searchTimeout) { + clearTimeout(this.searchTimeout); + } + + this.searchTimeout = setTimeout(() => { + this.searchValue = ''; + this.searchTimeout = null; + }, 500); + + return matched; + } + + isOptionMatched(option) { + return this.isValidOption(option) && this.getOptionLabel(option).toString().toLocaleLowerCase(this.filterLocale).startsWith(this.searchValue?.toLocaleLowerCase(this.filterLocale)); + } + + onFilterInputChange(event: Event | any): void { + let value: string = (event.target as HTMLInputElement).value; + this._filterValue.set(value); + this.focusedOptionIndex.set(-1); + this.onFilter.emit({ originalEvent: event, filter: this._filterValue() }); + !this.virtualScrollerDisabled && this.scroller?.scrollToIndex(0); + setTimeout(() => { + this.overlayViewChild?.alignOverlay(); + }); + this.cd.markForCheck(); + } + + applyFocus(): void { + if (this.editable) (findSingle(this.el.nativeElement, '[data-pc-section="label"]') as any).focus(); + else focus(this.focusInputViewChild?.nativeElement); + } + /** + * Applies focus. + * @group Method + */ + public focus(): void { + this.applyFocus(); + } + /** + * Clears the model. + * @group Method + */ + public clear(event?: Event) { + this.updateModel(null, event); + this.clearEditableLabel(); + this.onModelTouched(); + this.onChange.emit({ originalEvent: event, value: this.value }); + this.onClear.emit(event); + this.resetFilter(); + } + + /** + * @override + * + * @see {@link BaseEditableHolder.writeControlValue} + * Writes the value to the control. + */ + writeControlValue(value: any, setModelValue: (value: any) => void): void { + if (this.filter) { + this.resetFilter(); + } + + this.value = value; + this.allowModelChange() && this.onModelChange(value); + setModelValue(this.value); + this.updateEditableLabel(); + this.cd.markForCheck(); + } + + get containerDataP() { + return this.cn({ + invalid: this.invalid(), + disabled: this.$disabled(), + focus: this.focused, + fluid: this.hasFluid, + filled: this.$variant() === 'filled', + [this.size() as string]: this.size() + }); + } + + get labelDataP() { + return this.cn({ + placeholder: this.label === this.placeholder, + clearable: this.showClear, + disabled: this.$disabled(), + [this.size() as string]: this.size(), + empty: !this.editable && !this.selectedItemTemplate && (!this.label?.() || this.label() === 'p-emptylabel' || this.label()?.length === 0) + }); + } + + get dropdownIconDataP() { + return this.cn({ + [this.size() as string]: this.size() + }); + } + + get overlayDataP() { + return this.cn({ + ['overlay-' + this.$appendTo()]: 'overlay-' + this.$appendTo() + }); + } +} + +@NgModule({ + imports: [Select, SharedModule], + exports: [Select, SharedModule] +}) +export class SelectModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/select/style/selectstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/select/style/selectstyle.ts new file mode 100644 index 000000000..3fc20f241 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/select/style/selectstyle.ts @@ -0,0 +1,173 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/select/style/selectstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as select_style } from '../../../primeuix-temp/styles/src/select/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` + ${select_style} + + /* For PrimeNG */ + .p-select-label.p-placeholder { + color: dt('select.placeholder.color'); + } + + .p-select.ng-invalid.ng-dirty { + border-color: dt('select.invalid.border.color'); + } + + .p-dropdown.ng-invalid.ng-dirty .p-dropdown-label.p-placeholder, + .p-select.ng-invalid.ng-dirty .p-select-label.p-placeholder { + color: dt('select.invalid.placeholder.color'); + } +`; + +const classes = { + root: ({ instance }) => [ + 'p-select p-component p-inputwrapper', + { + 'p-disabled': instance.$disabled(), + 'p-variant-filled': instance.$variant() === 'filled', + 'p-focus': instance.focused, + 'p-invalid': instance.invalid(), + 'p-inputwrapper-filled': instance.$filled(), + 'p-inputwrapper-focus': instance.focused || instance.overlayVisible, + 'p-select-open': instance.overlayVisible, + 'p-select-fluid': instance.hasFluid, + 'p-select-sm p-inputfield-sm': instance.size() === 'small', + 'p-select-lg p-inputfield-lg': instance.size() === 'large' + } + ], + label: ({ instance }) => [ + 'p-select-label', + { + 'p-placeholder': instance.placeholder() && instance.label() === instance.placeholder(), + 'p-select-label-empty': !instance.editable && !instance.selectedItemTemplate && (instance.label() === undefined || instance.label() === null || instance.label() === 'p-emptylabel' || instance.label().length === 0) + } + ], + clearIcon: 'p-select-clear-icon', + dropdown: 'p-select-dropdown', + loadingIcon: 'p-select-loading-icon', + dropdownIcon: 'p-select-dropdown-icon', + overlay: 'p-select-overlay p-component-overlay p-component', + header: 'p-select-header', + pcFilter: 'p-select-filter', + listContainer: 'p-select-list-container', + list: 'p-select-list', + optionGroup: 'p-select-option-group', + optionGroupLabel: 'p-select-option-group-label', + option: ({ instance }) => [ + 'p-select-option', + { + 'p-select-option-selected': instance.selected && !instance.checkmark, + 'p-disabled': instance.disabled, + 'p-focus': instance.focused + } + ], + optionLabel: 'p-select-option-label', + optionCheckIcon: 'p-select-option-check-icon', + optionBlankIcon: 'p-select-option-blank-icon', + emptyMessage: 'p-select-empty-message' +}; + +@Injectable() +export class SelectStyle extends BaseStyle { + name = 'select'; + + style = style; + + classes = classes; +} + +/** + * + * Select also known as Select, is used to choose an item from a collection of options. + * + * [Live Demo](https://www.primeng.org/select/) + * + * @module selectstyle + * + */ +export enum SelectClasses { + /** + * Class name of the root element + */ + root = 'p-select', + /** + * Class name of the label element + */ + label = 'p-select-label', + /** + * Class name of the clear icon element + */ + clearIcon = 'p-select-clear-icon', + /** + * Class name of the dropdown element + */ + dropdown = 'p-select-dropdown', + /** + * Class name of the loadingicon element + */ + loadingIcon = 'p-select-loading-icon', + /** + * Class name of the dropdown icon element + */ + dropdownIcon = 'p-select-dropdown-icon', + /** + * Class name of the overlay element + */ + overlay = 'p-select-overlay', + /** + * Class name of the header element + */ + header = 'p-select-header', + /** + * Class name of the filter element + */ + pcFilter = 'p-select-filter', + /** + * Class name of the list container element + */ + listContainer = 'p-select-list-container', + /** + * Class name of the list element + */ + list = 'p-select-list', + /** + * Class name of the option group element + */ + optionGroup = 'p-select-option-group', + /** + * Class name of the option group label element + */ + optionGroupLabel = 'p-select-option-group-label', + /** + * Class name of the option element + */ + option = 'p-select-option', + /** + * Class name of the option label element + */ + optionLabel = 'p-select-option-label', + /** + * Class name of the option check icon element + */ + optionCheckIcon = 'p-select-option-check-icon', + /** + * Class name of the option blank icon element + */ + optionBlankIcon = 'p-select-option-blank-icon', + /** + * Class name of the empty message element + */ + emptyMessage = 'p-select-empty-message' +} + +export interface SelectStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/selectbutton/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/selectbutton/public_api.ts new file mode 100644 index 000000000..81678f8f1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/selectbutton/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/selectbutton/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/selectbutton/public_api'; +export * from './selectbutton'; +export * from './style/selectbuttonstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/selectbutton/selectbutton.ts b/projects/cps-ui-kit/src/lib/primeng-temp/selectbutton/selectbutton.ts new file mode 100755 index 000000000..c7a6a833f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/selectbutton/selectbutton.ts @@ -0,0 +1,362 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/selectbutton/selectbutton.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { + AfterContentInit, + AfterViewChecked, + booleanAttribute, + ChangeDetectionStrategy, + Component, + ContentChild, + ContentChildren, + EventEmitter, + forwardRef, + inject, + InjectionToken, + input, + Input, + NgModule, + numberAttribute, + Output, + QueryList, + TemplateRef, + ViewEncapsulation +} from '@angular/core'; +import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { equals, resolveFieldData } from '../../primeuix-temp/utils/src/index'; +import { PrimeTemplate, SharedModule } from '../api/public_api'; +import { PARENT_INSTANCE } from '../basecomponent/public_api'; +import { BaseEditableHolder } from '../baseeditableholder/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import { ToggleButton } from '../togglebutton/public_api'; +import { SelectButtonChangeEvent, SelectButtonItemTemplateContext, SelectButtonOptionClickEvent, SelectButtonPassThrough } from '../types/selectbutton/public_api'; +import { SelectButtonStyle } from './style/selectbuttonstyle'; + +const SELECTBUTTON_INSTANCE = new InjectionToken('SELECTBUTTON_INSTANCE'); + +export const SELECTBUTTON_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => SelectButton), + multi: true +}; +/** + * SelectButton is used to choose single or multiple items from a list using buttons. + * @group Components + */ +@Component({ + selector: 'p-selectButton, p-selectbutton, p-select-button', + standalone: true, + imports: [ToggleButton, FormsModule, CommonModule, SharedModule, BindModule], + template: ` + @for (option of options; track getOptionLabel(option); let i = $index) { + + @if (itemTemplate || _itemTemplate) { + + + + } + + } + `, + providers: [SELECTBUTTON_VALUE_ACCESSOR, SelectButtonStyle, { provide: SELECTBUTTON_INSTANCE, useExisting: SelectButton }, { provide: PARENT_INSTANCE, useExisting: SelectButton }], + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + host: { + '[class]': "cx('root')", + '[attr.role]': '"group"', + '[attr.aria-labelledby]': 'ariaLabelledBy', + '[attr.data-p]': 'dataP' + }, + hostDirectives: [Bind] +}) +export class SelectButton extends BaseEditableHolder implements AfterViewChecked { + componentName = 'SelectButton'; + /** + * An array of selectitems to display as the available options. + * @group Props + */ + @Input() options: any[] | undefined; + /** + * Name of the label field of an option. + * @group Props + */ + @Input() optionLabel: string | undefined; + /** + * Name of the value field of an option. + * @group Props + */ + @Input() optionValue: string | undefined; + /** + * Name of the disabled field of an option. + * @group Props + */ + @Input() optionDisabled: string | undefined; + /** + * Whether selection can be cleared. + * @group Props + */ + get unselectable(): boolean { + return this._unselectable; + } + private _unselectable: boolean = false; + + @Input({ transform: booleanAttribute }) + set unselectable(value: boolean) { + this._unselectable = value; + this.allowEmpty = !value; + } + + /** + * Index of the element in tabbing order. + * @group Props + */ + @Input({ transform: numberAttribute }) tabindex: number = 0; + /** + * When specified, allows selecting multiple values. + * @group Props + */ + @Input({ transform: booleanAttribute }) multiple: boolean | undefined; + /** + * Whether selection can not be cleared. + * @group Props + */ + @Input({ transform: booleanAttribute }) allowEmpty: boolean = true; + /** + * Style class of the component. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * Establishes relationships between the component and label(s) where its value should be one or more element IDs. + * @group Props + */ + @Input() ariaLabelledBy: string | undefined; + /** + * A property to uniquely identify a value in options. + * @group Props + */ + @Input() dataKey: string | undefined; + /** + * When present, it specifies that the component should automatically get focus on load. + * @group Props + */ + @Input({ transform: booleanAttribute }) autofocus: boolean | undefined; + /** + * Specifies the size of the component. + * @defaultValue undefined + * @group Props + */ + size = input<'large' | 'small' | undefined>(); + /** + * Spans 100% width of the container when enabled. + * @defaultValue undefined + * @group Props + */ + fluid = input(undefined, { transform: booleanAttribute }); + /** + * Callback to invoke on input click. + * @param {SelectButtonOptionClickEvent} event - Custom click event. + * @group Emits + */ + @Output() onOptionClick: EventEmitter = new EventEmitter(); + /** + * Callback to invoke on selection change. + * @param {SelectButtonChangeEvent} event - Custom change event. + * @group Emits + */ + @Output() onChange: EventEmitter = new EventEmitter(); + /** + * Custom item template. + * @param {SelectButtonItemTemplateContext} context - item context. + * @see {@link SelectButtonItemTemplateContext} + * @group Templates + */ + @ContentChild('item', { descendants: false }) itemTemplate: TemplateRef | undefined; + + _itemTemplate: TemplateRef | undefined; + + get equalityKey() { + return this.optionValue ? null : this.dataKey; + } + + value: any; + + focusedIndex: number = 0; + + _componentStyle = inject(SelectButtonStyle); + + $pcSelectButton: SelectButton | undefined = inject(SELECTBUTTON_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + + getAllowEmpty() { + if (this.multiple) { + return this.allowEmpty || this.value?.length !== 1; + } + return this.allowEmpty; + } + + getOptionLabel(option: any) { + return this.optionLabel ? resolveFieldData(option, this.optionLabel) : option.label != undefined ? option.label : option; + } + + getOptionValue(option: any) { + return this.optionValue ? resolveFieldData(option, this.optionValue) : this.optionLabel || option.value === undefined ? option : option.value; + } + + isOptionDisabled(option: any) { + return this.optionDisabled ? resolveFieldData(option, this.optionDisabled) : option.disabled !== undefined ? option.disabled : false; + } + + onOptionSelect(event, option, index) { + if (this.$disabled() || this.isOptionDisabled(option)) { + return; + } + + let selected = this.isSelected(option); + + if (selected && this.unselectable) { + return; + } + + let optionValue = this.getOptionValue(option); + let newValue; + + if (this.multiple) { + if (selected) newValue = this.value.filter((val) => !equals(val, optionValue, this.equalityKey || undefined)); + else newValue = this.value ? [...this.value, optionValue] : [optionValue]; + } else { + if (selected && !this.allowEmpty) { + return; + } + newValue = selected ? null : optionValue; + } + + this.focusedIndex = index; + this.value = newValue; + this.writeModelValue(this.value); + this.onModelChange(this.value); + + this.onChange.emit({ + originalEvent: event, + value: this.value + }); + + this.onOptionClick.emit({ + originalEvent: event, + option: option, + index: index + }); + } + + changeTabIndexes(event, direction) { + let firstTabableChild, index; + + for (let i = 0; i <= this.el.nativeElement.children.length - 1; i++) { + if (this.el.nativeElement.children[i].getAttribute('tabindex') === '0') firstTabableChild = { elem: this.el.nativeElement.children[i], index: i }; + } + + if (direction === 'prev') { + if (firstTabableChild.index === 0) index = this.el.nativeElement.children.length - 1; + else index = firstTabableChild.index - 1; + } else { + if (firstTabableChild.index === this.el.nativeElement.children.length - 1) index = 0; + else index = firstTabableChild.index + 1; + } + + this.focusedIndex = index; + this.el.nativeElement.children[index].focus(); + } + + onFocus(event: Event, index: number) { + this.focusedIndex = index; + } + + onBlur() { + this.onModelTouched(); + } + + removeOption(option: any): void { + this.value = this.value.filter((val: any) => !equals(val, this.getOptionValue(option), this.dataKey)); + } + + isSelected(option: any) { + let selected = false; + const optionValue = this.getOptionValue(option); + + if (this.multiple) { + if (this.value && Array.isArray(this.value)) { + for (let val of this.value) { + if (equals(val, optionValue, this.dataKey)) { + selected = true; + break; + } + } + } + } else { + selected = equals(this.getOptionValue(option), this.value, this.equalityKey || undefined); + } + + return selected; + } + + @ContentChildren(PrimeTemplate) templates: QueryList | undefined; + + onAfterContentInit() { + (this.templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'item': + this._itemTemplate = item.template; + break; + } + }); + } + + /** + * @override + * + * @see {@link BaseEditableHolder.writeControlValue} + * Writes the value to the control. + */ + writeControlValue(value: any, setModelValue: (value: any) => void): void { + this.value = value; + setModelValue(this.value); + this.cd.markForCheck(); + } + + get dataP() { + return this.cn({ + invalid: this.invalid() + }); + } +} + +@NgModule({ + imports: [SelectButton, SharedModule], + exports: [SelectButton, SharedModule] +}) +export class SelectButtonModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/selectbutton/style/selectbuttonstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/selectbutton/style/selectbuttonstyle.ts new file mode 100644 index 000000000..7e402b9f5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/selectbutton/style/selectbuttonstyle.ts @@ -0,0 +1,59 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/selectbutton/style/selectbuttonstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as selectbutton_style } from '../../../primeuix-temp/styles/src/selectbutton/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` + ${selectbutton_style} + + /* For PrimeNG */ + .p-selectbutton.ng-invalid.ng-dirty { + outline: 1px solid dt('selectbutton.invalid.border.color'); + outline-offset: 0; + } +`; + +const classes = { + root: ({ instance }) => [ + 'p-selectbutton p-component', + { + 'p-invalid': instance.invalid(), + 'p-selectbutton-fluid': instance.fluid() + } + ] +}; + +@Injectable() +export class SelectButtonStyle extends BaseStyle { + name = 'selectbutton'; + + style = style; + + classes = classes; +} + +/** + * + * SelectButton is used to choose single or multiple items from a list using buttons. + * + * [Live Demo](https://www.primeng.org/selectbutton/) + * + * @module selectbuttonstyle + * + */ +export enum SelectButtonClasses { + /** + * Class name of the root element + */ + root = 'p-selectbutton' +} + +export interface SelectButtonStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/table/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/table/public_api.ts new file mode 100644 index 000000000..15d738f55 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/table/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/table/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/table/public_api'; +export * from './style/tablestyle'; +export * from './table'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/table/style/tablestyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/table/style/tablestyle.ts new file mode 100644 index 000000000..20ac2d76e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/table/style/tablestyle.ts @@ -0,0 +1,498 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/table/style/tablestyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as datatable_style } from '../../../primeuix-temp/styles/src/datatable/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` +${datatable_style} + +/* For PrimeNG */ +.p-datatable-scrollable-table > .p-datatable-thead { + top: 0; + z-index: 2; +} + +.p-datatable-scrollable-table > .p-datatable-frozen-tbody { + position: sticky; + z-index: 2; +} + +.p-datatable-scrollable-table > .p-datatable-frozen-tbody + .p-datatable-frozen-tbody { + z-index: 1; +} + +.p-datatable-mask.p-overlay-mask { + position: absolute; + display: flex; + align-items: center; + justify-content: center; + z-index: 3; +} + +.p-datatable-filter-overlay { + position: absolute; + background: dt('datatable.filter.overlay.select.background'); + color: dt('datatable.filter.overlay.select.color'); + border: 1px solid dt('datatable.filter.overlay.select.border.color'); + border-radius: dt('datatable.filter.overlay.select.border.radius'); + box-shadow: dt('datatable.filter.overlay.select.shadow'); + min-width: 12.5rem; +} + +.p-datatable-filter-rule { + border-bottom: 1px solid dt('datatable.filter.rule.border.color'); +} + +.p-datatable-filter-rule:last-child { + border-bottom: 0 none; +} + +.p-datatable-filter-add-rule-button, +.p-datatable-filter-remove-rule-button { + width: 100%; +} + +.p-datatable-filter-remove-button { + width: 100%; +} + +.p-datatable-thead > tr > th { + padding: dt('datatable.header.cell.padding'); + background: dt('datatable.header.cell.background'); + border-color: dt('datatable.header.cell.border.color'); + border-style: solid; + border-width: 0 0 1px 0; + color: dt('datatable.header.cell.color'); + font-weight: dt('datatable.column.title.font.weight'); + text-align: start; + transition: + background dt('datatable.transition.duration'), + color dt('datatable.transition.duration'), + border-color dt('datatable.transition.duration'), + outline-color dt('datatable.transition.duration'), + box-shadow dt('datatable.transition.duration'); +} + +.p-datatable-thead > tr > th p-columnfilter { + font-weight: normal; +} + +.p-datatable-thead > tr > th, +.p-datatable-sort-icon, +.p-datatable-sort-badge { + vertical-align: middle; +} + +.p-datatable-thead > tr > th.p-datatable-column-sorted { + background: dt('datatable.header.cell.selected.background'); + color: dt('datatable.header.cell.selected.color'); +} + +.p-datatable-thead > tr > th.p-datatable-column-sorted .p-datatable-sort-icon { + color: dt('datatable.header.cell.selected.color'); +} + +.p-datatable.p-datatable-striped .p-datatable-tbody > tr:nth-child(odd) { + background: dt('datatable.row.striped.background'); +} + +.p-datatable.p-datatable-striped .p-datatable-tbody > tr:nth-child(odd).p-datatable-row-selected { + background: dt('datatable.row.selected.background'); + color: dt('datatable.row.selected.color'); +} + +p-sortIcon, p-sort-icon, p-sorticon { + display: inline-flex; + align-items: center; + gap: dt('datatable.header.cell.gap'); +} + +.p-datatable .p-editable-column.p-cell-editing { + padding: 0; +} + +.p-datatable .p-editable-column.p-cell-editing p-celleditor { + display: block; + width: 100%; +} +`; + +const classes = { + root: ({ instance }) => [ + 'p-datatable p-component', + { + 'p-datatable-hoverable': instance.rowHover || instance.selectionMode, + 'p-datatable-resizable': instance.resizableColumns, + 'p-datatable-resizable-fit': instance.resizableColumns && instance.columnResizeMode === 'fit', + 'p-datatable-scrollable': instance.scrollable, + 'p-datatable-flex-scrollable': instance.scrollable && instance.scrollHeight === 'flex', + 'p-datatable-striped': instance.stripedRows, + 'p-datatable-gridlines': instance.showGridlines, + 'p-datatable-sm': instance.size === 'small', + 'p-datatable-lg': instance.size === 'large' + } + ], + mask: 'p-datatable-mask p-overlay-mask', + loadingIcon: 'p-datatable-loading-icon', + header: 'p-datatable-header', + pcPaginator: ({ instance }) => 'p-datatable-paginator-' + instance.paginatorPosition, + tableContainer: 'p-datatable-table-container', + table: ({ instance }) => [ + 'p-datatable-table', + { + 'p-datatable-scrollable-table': instance.scrollable, + 'p-datatable-resizable-table': instance.resizableColumns, + 'p-datatable-resizable-table-fit': instance.resizableColumns && instance.columnResizeMode === 'fit' + } + ], + thead: 'p-datatable-thead', + columnResizer: 'p-datatable-column-resizer', + columnHeaderContent: 'p-datatable-column-header-content', + columnTitle: 'p-datatable-column-title', + columnFooter: 'p-datatable-column-footer', + sortIcon: 'p-datatable-sort-icon', + pcSortBadge: 'p-datatable-sort-badge', + filter: ({ instance }) => ({ + 'p-datatable-filter': true, + 'p-datatable-inline-filter': instance.display === 'row', + 'p-datatable-popover-filter': instance.display === 'menu' + }), + filterElementContainer: 'p-datatable-filter-element-container', + pcColumnFilterButton: 'p-datatable-column-filter-button', + pcColumnFilterClearButton: 'p-datatable-column-filter-clear-button', + filterOverlay: ({ instance }) => ({ + 'p-datatable-filter-overlay p-component': true, + 'p-datatable-filter-overlay-popover': instance.display === 'menu' + }), + filterConstraintList: 'p-datatable-filter-constraint-list', + + filterConstraint: ({ selected }) => ({ + 'p-datatable-filter-constraint': true, + 'p-datatable-filter-constraint-selected': selected + }), + filterConstraintSeparator: 'p-datatable-filter-constraint-separator', + filterOperator: 'p-datatable-filter-operator', + pcFilterOperatorDropdown: 'p-datatable-filter-operator-dropdown', + filterRuleList: 'p-datatable-filter-rule-list', + filterRule: 'p-datatable-filter-rule', + pcFilterConstraintDropdown: 'p-datatable-filter-constraint-dropdown', + pcFilterRemoveRuleButton: 'p-datatable-filter-remove-rule-button', + pcFilterAddRuleButton: 'p-datatable-filter-add-rule-button', + filterButtonbar: 'p-datatable-filter-buttonbar', + pcFilterClearButton: 'p-datatable-filter-clear-button', + pcFilterApplyButton: 'p-datatable-filter-apply-button', + tbody: ({ instance }) => ({ + 'p-datatable-tbody': true, + 'p-datatable-frozen-tbody': instance.frozenValue || instance.frozenBodyTemplate, + 'p-virtualscroller-content': instance.virtualScroll + }), + rowGroupHeader: 'p-datatable-row-group-header', + rowToggleButton: 'p-datatable-row-toggle-button', + rowToggleIcon: 'p-datatable-row-toggle-icon', + rowExpansion: 'p-datatable-row-expansion', + rowGroupFooter: 'p-datatable-row-group-footer', + emptyMessage: 'p-datatable-empty-message', + bodyCell: ({ instance }) => ({ + 'p-datatable-frozen-column': instance.columnProp('frozen') + }), + reorderableRowHandle: 'p-datatable-reorderable-row-handle', + pcRowEditorInit: 'p-datatable-row-editor-init', + pcRowEditorSave: 'p-datatable-row-editor-save', + pcRowEditorCancel: 'p-datatable-row-editor-cancel', + tfoot: 'p-datatable-tfoot', + footerCell: ({ instance }) => ({ + 'p-datatable-frozen-column': instance.columnProp('frozen') + }), + virtualScrollerSpacer: 'p-datatable-virtualscroller-spacer', + footer: 'p-datatable-tfoot', + columnResizeIndicator: 'p-datatable-column-resize-indicator', + rowReorderIndicatorUp: 'p-datatable-row-reorder-indicator-up', + rowReorderIndicatorDown: 'p-datatable-row-reorder-indicator-down', + sortableColumn: ({ instance }) => ({ + 'p-datatable-sortable-column': instance.isEnabled(), + ' p-datatable-column-sorted': instance.sorted + }), + sortableColumnIcon: 'p-datatable-sort-icon', + sortableColumnBadge: 'p-sortable-column-badge', + selectableRow: ({ instance }) => ({ + 'p-datatable-selectable-row': instance.isEnabled(), + 'p-datatable-row-selected': instance.selected + }), + resizableColumn: 'p-datatable-resizable-column', + reorderableColumn: 'p-datatable-reorderable-column', + rowEditorCancel: 'p-datatable-row-editor-cancel', + frozenColumn: ({ instance }) => ({ + 'p-datatable-frozen-column': instance.frozen, + 'p-datatable-frozen-column-left': instance.alignFrozenLeft === 'left' + }), + contextMenuRowSelected: ({ instance }) => ({ + 'p-datatable-contextmenu-row-selected': instance.selected + }) +}; + +const inlineStyles = { + tableContainer: ({ instance }) => ({ + 'max-height': instance.virtualScroll ? '' : instance.scrollHeight, + overflow: 'auto' + }), + thead: { position: 'sticky' }, + tfoot: { position: 'sticky' }, + rowGroupHeader: ({ instance }) => ({ + top: instance.getFrozenRowGroupHeaderStickyPosition + }) +}; + +@Injectable() +export class TableStyle extends BaseStyle { + name = 'datatable'; + + style = style; + + classes = classes; + + inlineStyles = inlineStyles; +} + +/** + * + * DataTable displays data in tabular format. + * + * [Live Demo](https://www.primeng.org/table/) + * + * @module tablestyle + * + */ +export enum TableClasses { + /** + * Class name of the root element + */ + root = 'p-datatable', + /** + * Class name of the mask element + */ + mask = 'p-datatable-mask', + /** + * Class name of the loading icon element + */ + loadingIcon = 'p-datatable-loading-icon', + /** + * Class name of the header element + */ + header = 'p-datatable-header', + /** + * Class name of the paginator element + */ + pcPaginator = 'p-datatable-paginator-[position]', + /** + * Class name of the table container element + */ + tableContainer = 'p-datatable-table-container', + /** + * Class name of the table element + */ + table = 'p-datatable-table', + /** + * Class name of the thead element + */ + thead = 'p-datatable-thead', + /** + * Class name of the column resizer element + */ + columnResizer = 'p-datatable-column-resizer', + /** + * Class name of the column header content element + */ + columnHeaderContent = 'p-datatable-column-header-content', + /** + * Class name of the column title element + */ + columnTitle = 'p-datatable-column-title', + /** + * Class name of the sort icon element + */ + sortIcon = 'p-datatable-sort-icon', + /** + * Class name of the sort badge element + */ + pcSortBadge = 'p-datatable-sort-badge', + /** + * Class name of the filter element + */ + filter = 'p-datatable-filter', + /** + * Class name of the filter element container element + */ + filterElementContainer = 'p-datatable-filter-element-container', + /** + * Class name of the column filter button element + */ + pcColumnFilterButton = 'p-datatable-column-filter-button', + /** + * Class name of the column filter clear button element + */ + pcColumnFilterClearButton = 'p-datatable-column-filter-clear-button', + /** + * Class name of the filter overlay element + */ + filterOverlay = 'p-datatable-filter-overlay', + /** + * Class name of the filter constraint list element + */ + filterConstraintList = 'p-datatable-filter-constraint-list', + /** + * Class name of the filter constraint element + */ + filterConstraint = 'p-datatable-filter-constraint', + /** + * Class name of the filter constraint separator element + */ + filterConstraintSeparator = 'p-datatable-filter-constraint-separator', + /** + * Class name of the filter operator element + */ + filterOperator = 'p-datatable-filter-operator', + /** + * Class name of the filter operator dropdown element + */ + pcFilterOperatorDropdown = 'p-datatable-filter-operator-dropdown', + /** + * Class name of the filter rule list element + */ + filterRuleList = 'p-datatable-filter-rule-list', + /** + * Class name of the filter rule element + */ + filterRule = 'p-datatable-filter-rule', + /** + * Class name of the filter constraint dropdown element + */ + pcFilterConstraintDropdown = 'p-datatable-filter-constraint-dropdown', + /** + * Class name of the filter remove rule button element + */ + pcFilterRemoveRuleButton = 'p-datatable-filter-remove-rule-button', + /** + * Class name of the filter add rule button element + */ + pcFilterAddRuleButton = 'p-datatable-filter-add-rule-button', + /** + * Class name of the filter buttonbar element + */ + filterButtonbar = 'p-datatable-filter-buttonbar', + /** + * Class name of the filter clear button element + */ + pcFilterClearButton = 'p-datatable-filter-clear-button', + /** + * Class name of the filter apply button element + */ + pcFilterApplyButton = 'p-datatable-filter-apply-button', + /** + * Class name of the tbody element + */ + tbody = 'p-datatable-tbody', + /** + * Class name of the row group header element + */ + rowGroupHeader = 'p-datatable-row-group-header', + /** + * Class name of the row toggle button element + */ + rowToggleButton = 'p-datatable-row-toggle-button', + /** + * Class name of the row toggle icon element + */ + rowToggleIcon = 'p-datatable-row-toggle-icon', + /** + * Class name of the row expansion element + */ + rowExpansion = 'p-datatable-row-expansion', + /** + * Class name of the row group footer element + */ + rowGroupFooter = 'p-datatable-row-group-footer', + /** + * Class name of the empty message element + */ + emptyMessage = 'p-datatable-empty-message', + /** + * Class name of the reorderable row handle element + */ + reorderableRowHandle = 'p-datatable-reorderable-row-handle', + /** + * Class name of the row editor init element + */ + pcRowEditorInit = 'p-datatable-row-editor-init', + /** + * Class name of the row editor save element + */ + pcRowEditorSave = 'p-datatable-row-editor-save', + /** + * Class name of the row editor cancel element + */ + pcRowEditorCancel = 'p-datatable-row-editor-cancel', + /** + * Class name of the tfoot element + */ + tfoot = 'p-datatable-tfoot', + /** + * Class name of the virtual scroller spacer element + */ + virtualScrollerSpacer = 'p-datatable-virtualscroller-spacer', + /** + * Class name of the footer element + */ + footer = 'p-datatable-footer', + /** + * Class name of the column resize indicator element + */ + columnResizeIndicator = 'p-datatable-column-resize-indicator', + /** + * Class name of the row reorder indicator up element + */ + rowReorderIndicatorUp = 'p-datatable-row-reorder-indicator-up', + /** + * Class name of the row reorder indicator down element + */ + rowReorderIndicatorDown = 'p-datatable-row-reorder-indicator-down', + /** + * Class name of the sortable column element + */ + sortableColumn = 'p-datatable-sortable-column', + /** + * Class name of the sortable column icon element + */ + sortableColumnIcon = 'p-sortable-column-icon', + /** + * Class name of the sortable column badge element + */ + sortableColumnBadge = 'p-sortable-column-badge', + /** + * Class name of the selectable row element + */ + selectableRow = 'p-datatable-selectable-row', + /** + * Class name of the resizable column element + */ + resizableColumn = 'p-datatable-resizable-column', + /** + * Class name of the row editor cancel element + */ + rowEditorCancel = 'p-datatable-row-editor-cancel', + /** + * Class name of the frozen column element + */ + frozenColumn = 'p-datatable-frozen-column', + /** + * Class name of the contextmenu row selected element + */ + contextMenuRowSelected = 'p-datatable-contextmenu-row-selected' +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/table/table.ts b/projects/cps-ui-kit/src/lib/primeng-temp/table/table.ts new file mode 100644 index 000000000..6d18bac1c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/table/table.ts @@ -0,0 +1,6622 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/table/table.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule, isPlatformBrowser } from '@angular/common'; +import { + booleanAttribute, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + computed, + ContentChild, + ContentChildren, + Directive, + ElementRef, + EventEmitter, + HostListener, + inject, + Injectable, + InjectionToken, + input, + Input, + NgModule, + NgZone, + numberAttribute, + Optional, + Output, + QueryList, + signal, + SimpleChanges, + TemplateRef, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MotionEvent, MotionOptions } from '../../primeuix-temp/motion/src/index'; +import { absolutePosition, addStyle, appendChild, find, findSingle, getAttribute, isClickable, setAttribute } from '../../primeuix-temp/utils/src/index'; +import { BlockableUI, FilterMatchMode, FilterMetadata, FilterOperator, FilterService, LazyLoadMeta, OverlayService, PrimeTemplate, ScrollerOptions, SelectItem, SharedModule, SortMeta, TableState, TranslationKeys } from '../api/public_api'; +import { BadgeModule } from '../badge/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import { Button, ButtonModule } from '../button/public_api'; +import { CheckboxChangeEvent, CheckboxModule } from '../checkbox/public_api'; +import { DatePickerModule } from '../datepicker/public_api'; +import { ConnectedOverlayScrollHandler, DomHandler } from '../dom/public_api'; +import { ArrowDownIcon } from '../icons/arrowdown/public_api'; +import { ArrowUpIcon } from '../icons/arrowup/public_api'; +import { FilterIcon } from '../icons/filter/public_api'; +import { FilterFillIcon } from '../icons/filterfill/public_api'; +import { PlusIcon } from '../icons/plus/public_api'; +import { SortAltIcon } from '../icons/sortalt/public_api'; +import { SortAmountDownIcon } from '../icons/sortamountdown/public_api'; +import { SortAmountUpAltIcon } from '../icons/sortamountupalt/public_api'; +import { SpinnerIcon } from '../icons/spinner/public_api'; +import { TrashIcon } from '../icons/trash/public_api'; +import { InputNumberModule } from '../inputnumber/public_api'; +import { InputTextModule } from '../inputtext/public_api'; +import { MotionModule } from '../motion/public_api'; +import { PaginatorModule } from '../paginator/public_api'; +import { RadioButton, RadioButtonClickEvent, RadioButtonModule } from '../radiobutton/public_api'; +import { Scroller, ScrollerModule } from '../scroller/public_api'; +import { SelectModule } from '../select/public_api'; +import { SelectButtonModule } from '../selectbutton/public_api'; +import { Nullable, VoidListener } from '../ts-helpers/public_api'; +import { + ColumnFilterPassThrough, + ExportCSVOptions, + TableColResizeEvent, + TableColumnReorderEvent, + TableContextMenuSelectEvent, + TableEditCancelEvent, + TableEditCompleteEvent, + TableEditInitEvent, + TableFilterButtonPropsOptions, + TableFilterEvent, + TableHeaderCheckboxToggleEvent, + TableLazyLoadEvent, + TablePageEvent, + TablePassThrough, + TableRowCollapseEvent, + TableRowExpandEvent, + TableRowReorderEvent, + TableRowSelectEvent, + TableRowUnSelectEvent, + TableSelectAllChangeEvent +} from '../types/table/public_api'; +import { ObjectUtils, UniqueComponentId, ZIndexUtils } from '../utils/public_api'; +import { Subject, Subscription } from 'rxjs'; +import { TableStyle } from './style/tablestyle'; + +const TABLE_INSTANCE = new InjectionToken('TABLE_INSTANCE'); + +@Injectable() +export class TableService { + private sortSource = new Subject(); + private selectionSource = new Subject(); + private contextMenuSource = new Subject(); + private valueSource = new Subject(); + private columnsSource = new Subject(); + + sortSource$ = this.sortSource.asObservable(); + selectionSource$ = this.selectionSource.asObservable(); + contextMenuSource$ = this.contextMenuSource.asObservable(); + valueSource$ = this.valueSource.asObservable(); + columnsSource$ = this.columnsSource.asObservable(); + + onSort(sortMeta: SortMeta | SortMeta[] | null) { + this.sortSource.next(sortMeta); + } + + onSelectionChange() { + this.selectionSource.next(null); + } + + onContextMenu(data: any) { + this.contextMenuSource.next(data); + } + + onValueChange(value: any) { + this.valueSource.next(value); + } + + onColumnsChange(columns: any[]) { + this.columnsSource.next(columns); + } +} +/** + * Table displays data in tabular format. + * @group Components + */ +@Component({ + selector: 'p-table', + standalone: false, + template: ` +
+ + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + + + + + `, + providers: [TableService, TableStyle, { provide: TABLE_INSTANCE, useExisting: Table }, { provide: PARENT_INSTANCE, useExisting: Table }], + changeDetection: ChangeDetectionStrategy.Eager, + encapsulation: ViewEncapsulation.None, + host: { + '[class]': "cn(cx('root'), styleClass)", + '[attr.data-p]': 'dataP' + }, + hostDirectives: [Bind] +}) +export class Table extends BaseComponent implements BlockableUI { + componentName = 'DataTable'; + /** + * An array of objects to represent dynamic columns that are frozen. + * @group Props + */ + @Input() frozenColumns: any[] | undefined; + /** + * An array of objects to display as frozen. + * @group Props + */ + @Input() frozenValue: any[] | undefined; + /** + * Style class of the component. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * Inline style of the table. + * @group Props + */ + @Input() tableStyle: { [klass: string]: any } | null | undefined; + /** + * Style class of the table. + * @group Props + */ + @Input() tableStyleClass: string | undefined; + /** + * When specified as true, enables the pagination. + * @group Props + */ + @Input({ transform: booleanAttribute }) paginator: boolean | undefined; + /** + * Number of page links to display in paginator. + * @group Props + */ + @Input({ transform: numberAttribute }) pageLinks: number = 5; + /** + * Array of integer/object values to display inside rows per page dropdown of paginator + * @group Props + */ + @Input() rowsPerPageOptions: any[] | undefined; + /** + * Whether to show it even there is only one page. + * @group Props + */ + @Input({ transform: booleanAttribute }) alwaysShowPaginator: boolean = true; + /** + * Position of the paginator, options are "top", "bottom" or "both". + * @group Props + */ + @Input() paginatorPosition: 'top' | 'bottom' | 'both' = 'bottom'; + /** + * Custom style class for paginator + * @group Props + */ + @Input() paginatorStyleClass: string | undefined; + /** + * Target element to attach the paginator dropdown overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). + * @group Props + */ + @Input() paginatorDropdownAppendTo: HTMLElement | ElementRef | TemplateRef | string | null | undefined | any; + /** + * Paginator dropdown height of the viewport in pixels, a scrollbar is defined if height of list exceeds this value. + * @group Props + */ + @Input() paginatorDropdownScrollHeight: string = '200px'; + /** + * Template of the current page report element. Available placeholders are {currentPage},{totalPages},{rows},{first},{last} and {totalRecords} + * @group Props + */ + @Input() currentPageReportTemplate: string = '{currentPage} of {totalPages}'; + /** + * Whether to display current page report. + * @group Props + */ + @Input({ transform: booleanAttribute }) showCurrentPageReport: boolean | undefined; + /** + * Whether to display a dropdown to navigate to any page. + * @group Props + */ + @Input({ transform: booleanAttribute }) showJumpToPageDropdown: boolean | undefined; + /** + * Whether to display a input to navigate to any page. + * @group Props + */ + @Input({ transform: booleanAttribute }) showJumpToPageInput: boolean | undefined; + /** + * When enabled, icons are displayed on paginator to go first and last page. + * @group Props + */ + @Input({ transform: booleanAttribute }) showFirstLastIcon: boolean = true; + /** + * Whether to show page links. + * @group Props + */ + @Input({ transform: booleanAttribute }) showPageLinks: boolean = true; + /** + * Sort order to use when an unsorted column gets sorted by user interaction. + * @group Props + */ + @Input({ transform: numberAttribute }) defaultSortOrder: number = 1; + /** + * Defines whether sorting works on single column or on multiple columns. + * @group Props + */ + @Input() sortMode: 'single' | 'multiple' = 'single'; + /** + * When true, resets paginator to first page after sorting. Available only when sortMode is set to single. + * @group Props + */ + @Input({ transform: booleanAttribute }) resetPageOnSort: boolean = true; + /** + * Specifies the selection mode, valid values are "single" and "multiple". + * @group Props + */ + @Input() selectionMode: 'single' | 'multiple' | undefined | null; + /** + * When enabled with paginator and checkbox selection mode, the select all checkbox in the header will select all rows on the current page. + * @group Props + */ + @Input({ transform: booleanAttribute }) selectionPageOnly: boolean | undefined; + /** + * Selected row with a context menu. + * @group Props + */ + @Input() contextMenuSelection: any; + /** + * Callback to invoke on context menu selection change. + * @param {*} object - row data. + * @group Emits + */ + @Output() contextMenuSelectionChange: EventEmitter = new EventEmitter(); + /** + * Defines the behavior of context menu selection, in "separate" mode context menu updates contextMenuSelection property whereas in joint mode selection property is used instead so that when row selection is enabled, both row selection and context menu selection use the same property. + * @group Props + */ + @Input() contextMenuSelectionMode: string = 'separate'; + /** + * A property to uniquely identify a record in data. + * @group Props + */ + @Input() dataKey: string | undefined; + /** + * Defines whether metaKey should be considered for the selection. On touch enabled devices, metaKeySelection is turned off automatically. + * @group Props + */ + @Input({ transform: booleanAttribute }) metaKeySelection: boolean | undefined = false; + /** + * Defines if the row is selectable. + * @group Props + */ + @Input() rowSelectable: (row: { data: any; index: number }) => boolean | undefined; + /** + * Function to optimize the dom operations by delegating to ngForTrackBy, default algorithm checks for object identity. + * @group Props + */ + @Input() rowTrackBy: Function = (index: number, item: any) => item; + /** + * Defines if data is loaded and interacted with in lazy manner. + * @group Props + */ + @Input({ transform: booleanAttribute }) lazy: boolean = false; + /** + * Whether to call lazy loading on initialization. + * @group Props + */ + @Input({ transform: booleanAttribute }) lazyLoadOnInit: boolean = true; + /** + * Algorithm to define if a row is selected, valid values are "equals" that compares by reference and "deepEquals" that compares all fields. + * @group Props + */ + @Input() compareSelectionBy: 'equals' | 'deepEquals' = 'deepEquals'; + /** + * Character to use as the csv separator. + * @group Props + */ + @Input() csvSeparator: string = ','; + /** + * Name of the exported file. + * @group Props + */ + @Input() exportFilename: string = 'download'; + /** + * An array of FilterMetadata objects to provide external filters. + * @group Props + */ + @Input() filters: { [s: string]: FilterMetadata | FilterMetadata[] } = {}; + /** + * An array of fields as string to use in global filtering. + * @group Props + */ + @Input() globalFilterFields: string[] | undefined; + /** + * Delay in milliseconds before filtering the data. + * @group Props + */ + @Input({ transform: numberAttribute }) filterDelay: number = 300; + /** + * Locale to use in filtering. The default locale is the host environment's current locale. + * @group Props + */ + @Input() filterLocale: string | undefined; + /** + * Map instance to keep the expanded rows where key of the map is the data key of the row. + * @group Props + */ + @Input() expandedRowKeys: { [s: string]: boolean } = {}; + /** + * Map instance to keep the rows being edited where key of the map is the data key of the row. + * @group Props + */ + @Input() editingRowKeys: { [s: string]: boolean } = {}; + /** + * Whether multiple rows can be expanded at any time. Valid values are "multiple" and "single". + * @group Props + */ + @Input() rowExpandMode: 'multiple' | 'single' = 'multiple'; + /** + * Enables scrollable tables. + * @group Props + */ + @Input({ transform: booleanAttribute }) scrollable: boolean | undefined; + /** + * Type of the row grouping, valid values are "subheader" and "rowspan". + * @group Props + */ + @Input() rowGroupMode: 'subheader' | 'rowspan' | undefined; + /** + * Height of the scroll viewport in fixed pixels or the "flex" keyword for a dynamic size. + * @group Props + */ + @Input() scrollHeight: string | undefined; + /** + * Whether the data should be loaded on demand during scroll. + * @group Props + */ + @Input({ transform: booleanAttribute }) virtualScroll: boolean | undefined; + /** + * Height of a row to use in calculations of virtual scrolling. + * @group Props + */ + @Input({ transform: numberAttribute }) virtualScrollItemSize: number | undefined; + /** + * Whether to use the scroller feature. The properties of scroller component can be used like an object in it. + * @group Props + */ + @Input() virtualScrollOptions: ScrollerOptions | undefined; + /** + * Threshold in milliseconds to delay lazy loading during scrolling. + * @group Props + */ + @Input({ transform: numberAttribute }) virtualScrollDelay: number = 250; + /** + * Width of the frozen columns container. + * @group Props + */ + @Input() frozenWidth: string | undefined; + /** + * Local ng-template varilable of a ContextMenu. + * @group Props + */ + @Input() contextMenu: any; + /** + * When enabled, columns can be resized using drag and drop. + * @group Props + */ + @Input({ transform: booleanAttribute }) resizableColumns: boolean | undefined; + /** + * Defines whether the overall table width should change on column resize, valid values are "fit" and "expand". + * @group Props + */ + @Input() columnResizeMode: string = 'fit'; + /** + * When enabled, columns can be reordered using drag and drop. + * @group Props + */ + @Input({ transform: booleanAttribute }) reorderableColumns: boolean | undefined; + /** + * Displays a loader to indicate data load is in progress. + * @group Props + */ + @Input({ transform: booleanAttribute }) loading: boolean | undefined; + /** + * The icon to show while indicating data load is in progress. + * @group Props + */ + @Input() loadingIcon: string | undefined; + /** + * Whether to show the loading mask when loading property is true. + * @group Props + */ + @Input({ transform: booleanAttribute }) showLoader: boolean = true; + /** + * Adds hover effect to rows without the need for selectionMode. Note that tr elements that can be hovered need to have "p-selectable-row" class for rowHover to work. + * @group Props + */ + @Input({ transform: booleanAttribute }) rowHover: boolean | undefined; + /** + * Whether to use the default sorting or a custom one using sortFunction. + * @group Props + */ + @Input({ transform: booleanAttribute }) customSort: boolean | undefined; + /** + * Whether to use the initial sort badge or not. + * @group Props + */ + @Input({ transform: booleanAttribute }) showInitialSortBadge: boolean = true; + /** + * Export function. + * @group Props + */ + @Input() exportFunction: Function | undefined; + /** + * Custom export header of the column to be exported as CSV. + * @group Props + */ + @Input() exportHeader: string | undefined; + /** + * Unique identifier of a stateful table to use in state storage. + * @group Props + */ + @Input() stateKey: string | undefined; + /** + * Defines where a stateful table keeps its state, valid values are "session" for sessionStorage and "local" for localStorage. + * @group Props + */ + @Input() stateStorage: 'session' | 'local' = 'session'; + /** + * Defines the editing mode, valid values are "cell" and "row". + * @group Props + */ + @Input() editMode: 'cell' | 'row' = 'cell'; + /** + * Field name to use in row grouping. + * @group Props + */ + @Input() groupRowsBy: any; + /** + * Defines the size of the table. + * @group Props + */ + @Input() size: 'small' | 'large' | undefined; + /** + * Whether to show grid lines between cells. + * @group Props + */ + @Input({ transform: booleanAttribute }) showGridlines: boolean | undefined; + /** + * Whether to display rows with alternating colors. + * @group Props + */ + @Input({ transform: booleanAttribute }) stripedRows: boolean | undefined; + /** + * Order to sort when default row grouping is enabled. + * @group Props + */ + @Input({ transform: numberAttribute }) groupRowsByOrder: number = 1; + /** + * Defines the responsive mode, valid options are "stack" and "scroll". + * @deprecated since v20.0.0, always defaults to scroll, stack mode needs custom implementation + * @group Props + */ + @Input() responsiveLayout: string = 'scroll'; + /** + * The breakpoint to define the maximum width boundary when using stack responsive layout. + * @group Props + */ + @Input() breakpoint: string = '960px'; + /** + * Locale to be used in paginator formatting. + * @group Props + */ + @Input() paginatorLocale: string | undefined; + /** + * An array of objects to display. + * @group Props + */ + @Input() get value(): RowData[] { + return this._value; + } + set value(val: RowData[]) { + this._value = val; + } + /** + * An array of objects to represent dynamic columns. + * @group Props + */ + @Input() get columns(): any[] | undefined { + return this._columns; + } + set columns(cols: any[] | undefined) { + this._columns = cols; + } + /** + * Index of the first row to be displayed. + * @group Props + */ + @Input() get first(): number | null | undefined { + return this._first; + } + set first(val: number | null | undefined) { + this._first = val; + } + /** + * Number of rows to display per page. + * @group Props + */ + @Input() get rows(): number | undefined { + return this._rows; + } + set rows(val: number | undefined) { + this._rows = val; + } + /** + * Number of total records, defaults to length of value when not defined. + * @group Props + */ + @Input() totalRecords: number = 0; + + /** + * Name of the field to sort data by default. + * @group Props + */ + @Input() get sortField(): string | undefined | null { + return this._sortField; + } + set sortField(val: string | undefined | null) { + this._sortField = val; + } + /** + * Order to sort when default sorting is enabled. + * @group Props + */ + @Input() get sortOrder(): number { + return this._sortOrder; + } + set sortOrder(val: number) { + this._sortOrder = val; + } + /** + * An array of SortMeta objects to sort the data by default in multiple sort mode. + * @group Props + */ + @Input() get multiSortMeta(): SortMeta[] | undefined | null { + return this._multiSortMeta; + } + set multiSortMeta(val: SortMeta[] | undefined | null) { + this._multiSortMeta = val; + } + /** + * Selected row in single mode or an array of values in multiple mode. + * @group Props + */ + @Input() get selection(): any { + return this._selection; + } + set selection(val: any) { + this._selection = val; + } + /** + * Whether all data is selected. + * @group Props + */ + @Input() get selectAll(): boolean | null { + return this._selection; + } + set selectAll(val: boolean | null) { + this._selection = val; + } + /** + * Emits when the all of the items selected or unselected. + * @param {TableSelectAllChangeEvent} event - custom all selection change event. + * @group Emits + */ + @Output() selectAllChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke on selection changed. + * @param {any | null} value - selected data. + * @group Emits + */ + @Output() selectionChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a row is selected. + * @param {TableRowSelectEvent} event - custom select event. + * @group Emits + */ + @Output() onRowSelect: EventEmitter> = new EventEmitter>(); + /** + * Callback to invoke when a row is unselected. + * @param {TableRowUnSelectEvent} event - custom unselect event. + * @group Emits + */ + @Output() onRowUnselect: EventEmitter> = new EventEmitter>(); + /** + * Callback to invoke when pagination occurs. + * @param {TablePageEvent} event - custom pagination event. + * @group Emits + */ + @Output() onPage: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a column gets sorted. + * @param {Object} object - sort meta. + * @group Emits + */ + @Output() onSort: EventEmitter<{ multisortmeta: SortMeta[] } | any> = new EventEmitter<{ multisortmeta: SortMeta[] } | any>(); + /** + * Callback to invoke when data is filtered. + * @param {TableFilterEvent} event - custom filtering event. + * @group Emits + */ + @Output() onFilter: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when paging, sorting or filtering happens in lazy mode. + * @param {TableLazyLoadEvent} event - custom lazy loading event. + * @group Emits + */ + @Output() onLazyLoad: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a row is expanded. + * @param {TableRowExpandEvent} event - custom row expand event. + * @group Emits + */ + @Output() onRowExpand: EventEmitter> = new EventEmitter>(); + /** + * Callback to invoke when a row is collapsed. + * @param {TableRowCollapseEvent} event - custom row collapse event. + * @group Emits + */ + @Output() onRowCollapse: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a row is selected with right click. + * @param {TableContextMenuSelectEvent} event - custom context menu select event. + * @group Emits + */ + @Output() onContextMenuSelect: EventEmitter> = new EventEmitter>(); + /** + * Callback to invoke when a column is resized. + * @param {TableColResizeEvent} event - custom column resize event. + * @group Emits + */ + @Output() onColResize: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a column is reordered. + * @param {TableColumnReorderEvent} event - custom column reorder event. + * @group Emits + */ + @Output() onColReorder: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a row is reordered. + * @param {TableRowReorderEvent} event - custom row reorder event. + * @group Emits + */ + @Output() onRowReorder: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a cell switches to edit mode. + * @param {TableEditInitEvent} event - custom edit init event. + * @group Emits + */ + @Output() onEditInit: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when cell edit is completed. + * @param {TableEditCompleteEvent} event - custom edit complete event. + * @group Emits + */ + @Output() onEditComplete: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when cell edit is cancelled with escape key. + * @param {TableEditCancelEvent} event - custom edit cancel event. + * @group Emits + */ + @Output() onEditCancel: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when state of header checkbox changes. + * @param {TableHeaderCheckboxToggleEvent} event - custom header checkbox event. + * @group Emits + */ + @Output() + onHeaderCheckboxToggle: EventEmitter = new EventEmitter(); + /** + * A function to implement custom sorting, refer to sorting section for details. + * @param {any} any - sort meta. + * @group Emits + */ + @Output() sortFunction: EventEmitter = new EventEmitter(); + /** + * Callback to invoke on pagination. + * @param {number} number - first element. + * @group Emits + */ + @Output() firstChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke on rows change. + * @param {number} number - Row count. + * @group Emits + */ + @Output() rowsChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke table state is saved. + * @param {TableState} object - table state. + * @group Emits + */ + @Output() onStateSave: EventEmitter = new EventEmitter(); + /** + * Callback to invoke table state is restored. + * @param {TableState} object - table state. + * @group Emits + */ + @Output() onStateRestore: EventEmitter = new EventEmitter(); + + @ViewChild('resizeHelper') resizeHelperViewChild: Nullable; + + @ViewChild('reorderIndicatorUp') + reorderIndicatorUpViewChild: Nullable; + + @ViewChild('reorderIndicatorDown') + reorderIndicatorDownViewChild: Nullable; + + @ViewChild('wrapper') wrapperViewChild: Nullable; + + @ViewChild('table') tableViewChild: Nullable; + + @ViewChild('thead') tableHeaderViewChild: Nullable; + + @ViewChild('tfoot') tableFooterViewChild: Nullable; + + @ViewChild('scroller') scroller: Nullable; + + @ContentChildren(PrimeTemplate) _templates: Nullable>; + + _value: RowData[] = []; + + _columns: any[] | undefined; + + _totalRecords: number = 0; + + _first: number | null | undefined = 0; + + _rows: number | undefined; + + filteredValue: any[] | undefined | null; + + // @todo will be refactored later + @ContentChild('header', { descendants: false }) _headerTemplate: TemplateRef; + headerTemplate: Nullable>; + + @ContentChild('headergrouped', { descendants: false }) _headerGroupedTemplate: TemplateRef; + headerGroupedTemplate: Nullable>; + + @ContentChild('body', { descendants: false }) _bodyTemplate: TemplateRef; + bodyTemplate: Nullable>; + + @ContentChild('loadingbody', { descendants: false }) _loadingBodyTemplate: TemplateRef; + loadingBodyTemplate: Nullable>; + + @ContentChild('caption', { descendants: false }) _captionTemplate: TemplateRef; + captionTemplate: Nullable>; + + @ContentChild('footer', { descendants: false }) _footerTemplate: TemplateRef; + footerTemplate: Nullable>; + + @ContentChild('footergrouped', { descendants: false }) _footerGroupedTemplate: TemplateRef; + footerGroupedTemplate: Nullable>; + + @ContentChild('summary', { descendants: false }) _summaryTemplate: TemplateRef; + summaryTemplate: Nullable>; + + @ContentChild('colgroup', { descendants: false }) _colGroupTemplate: TemplateRef; + colGroupTemplate: Nullable>; + + @ContentChild('expandedrow', { descendants: false }) _expandedRowTemplate: TemplateRef; + expandedRowTemplate: Nullable>; + + @ContentChild('groupheader', { descendants: false }) _groupHeaderTemplate: TemplateRef; + groupHeaderTemplate: Nullable>; + + @ContentChild('groupfooter', { descendants: false }) _groupFooterTemplate: TemplateRef; + groupFooterTemplate: Nullable>; + + @ContentChild('frozenexpandedrow', { descendants: false }) _frozenExpandedRowTemplate: TemplateRef; + frozenExpandedRowTemplate: Nullable>; + + @ContentChild('frozenheader', { descendants: false }) _frozenHeaderTemplate: TemplateRef; + frozenHeaderTemplate: Nullable>; + + @ContentChild('frozenbody', { descendants: false }) _frozenBodyTemplate: TemplateRef; + frozenBodyTemplate: Nullable>; + + @ContentChild('frozenfooter', { descendants: false }) _frozenFooterTemplate: TemplateRef; + frozenFooterTemplate: Nullable>; + + @ContentChild('frozencolgroup', { descendants: false }) _frozenColGroupTemplate: TemplateRef; + frozenColGroupTemplate: Nullable>; + + @ContentChild('emptymessage', { descendants: false }) _emptyMessageTemplate: TemplateRef; + emptyMessageTemplate: Nullable>; + + @ContentChild('paginatorleft', { descendants: false }) _paginatorLeftTemplate: TemplateRef; + paginatorLeftTemplate: Nullable>; + + @ContentChild('paginatorright', { descendants: false }) _paginatorRightTemplate: TemplateRef; + paginatorRightTemplate: Nullable>; + + @ContentChild('paginatordropdownitem', { descendants: false }) _paginatorDropdownItemTemplate: TemplateRef; + paginatorDropdownItemTemplate: Nullable>; + + @ContentChild('loadingicon', { descendants: false }) _loadingIconTemplate: TemplateRef; + loadingIconTemplate: Nullable>; + + @ContentChild('reorderindicatorupicon', { descendants: false }) _reorderIndicatorUpIconTemplate: TemplateRef; + reorderIndicatorUpIconTemplate: Nullable>; + + @ContentChild('reorderindicatordownicon', { descendants: false }) _reorderIndicatorDownIconTemplate: TemplateRef; + reorderIndicatorDownIconTemplate: Nullable>; + + @ContentChild('sorticon', { descendants: false }) _sortIconTemplate: TemplateRef; + sortIconTemplate: Nullable>; + + @ContentChild('checkboxicon', { descendants: false }) _checkboxIconTemplate: TemplateRef; + checkboxIconTemplate: Nullable>; + + @ContentChild('headercheckboxicon', { descendants: false }) _headerCheckboxIconTemplate: TemplateRef; + headerCheckboxIconTemplate: Nullable>; + + @ContentChild('paginatordropdownicon', { descendants: false }) _paginatorDropdownIconTemplate: TemplateRef; + paginatorDropdownIconTemplate: Nullable>; + + @ContentChild('paginatorfirstpagelinkicon', { descendants: false }) _paginatorFirstPageLinkIconTemplate: TemplateRef; + paginatorFirstPageLinkIconTemplate: Nullable>; + + @ContentChild('paginatorlastpagelinkicon', { descendants: false }) _paginatorLastPageLinkIconTemplate: TemplateRef; + paginatorLastPageLinkIconTemplate: Nullable>; + + @ContentChild('paginatorpreviouspagelinkicon', { descendants: false }) _paginatorPreviousPageLinkIconTemplate: TemplateRef; + paginatorPreviousPageLinkIconTemplate: Nullable>; + + @ContentChild('paginatornextpagelinkicon', { descendants: false }) _paginatorNextPageLinkIconTemplate: TemplateRef; + paginatorNextPageLinkIconTemplate: Nullable>; + + selectionKeys: any = {}; + + lastResizerHelperX: number | undefined; + + reorderIconWidth: number | undefined; + + reorderIconHeight: number | undefined; + + draggedColumn: any; + + draggedRowIndex: number | undefined | null; + + droppedRowIndex: number | undefined | null; + + rowDragging: boolean | undefined | null; + + dropPosition: number | undefined | null; + + editingCell: Element | undefined | null; + + editingCellData: any; + + editingCellField: any; + + editingCellRowIndex: number | undefined | null; + + selfClick: boolean | undefined | null; + + documentEditListener: any; + + _multiSortMeta: SortMeta[] | undefined | null; + + _sortField: string | undefined | null; + + _sortOrder: number = 1; + + preventSelectionSetterPropagation: boolean | undefined; + + _selection: any; + + _selectAll: boolean | null = null; + + anchorRowIndex: number | undefined | null; + + rangeRowIndex: number | undefined; + + filterTimeout: any; + + initialized: boolean | undefined | null; + + rowTouched: boolean | undefined; + + restoringSort: boolean | undefined; + + restoringFilter: boolean | undefined; + + stateRestored: boolean | undefined; + + columnOrderStateRestored: boolean | undefined; + + columnWidthsState: string | undefined; + + tableWidthState: string | undefined; + + overlaySubscription: Subscription | undefined; + + resizeColumnElement: HTMLElement; + + columnResizing: boolean = false; + + rowGroupHeaderStyleObject: any = {}; + + id: string = UniqueComponentId(); + + styleElement: any; + + responsiveStyleElement: any; + + overlayService = inject(OverlayService); + + filterService = inject(FilterService); + + tableService = inject(TableService); + + zone = inject(NgZone); + + _componentStyle = inject(TableStyle); + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + + onInit() { + if (this.lazy && this.lazyLoadOnInit) { + if (!this.virtualScroll) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } + + if (this.restoringFilter) { + this.restoringFilter = false; + } + } + + if (this.responsiveLayout === 'stack') { + this.createResponsiveStyle(); + } + + this.initialized = true; + } + + onAfterContentInit() { + (this._templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'caption': + this.captionTemplate = item.template; + break; + + case 'header': + this.headerTemplate = item.template; + break; + + case 'headergrouped': + this.headerGroupedTemplate = item.template; + break; + + case 'body': + this.bodyTemplate = item.template; + break; + + case 'loadingbody': + this.loadingBodyTemplate = item.template; + break; + + case 'footer': + this.footerTemplate = item.template; + break; + + case 'footergrouped': + this.footerGroupedTemplate = item.template; + break; + + case 'summary': + this.summaryTemplate = item.template; + break; + + case 'colgroup': + this.colGroupTemplate = item.template; + break; + + case 'expandedrow': + this.expandedRowTemplate = item.template; + break; + + case 'groupheader': + this.groupHeaderTemplate = item.template; + break; + + case 'groupfooter': + this.groupFooterTemplate = item.template; + break; + + case 'frozenheader': + this.frozenHeaderTemplate = item.template; + break; + + case 'frozenbody': + this.frozenBodyTemplate = item.template; + break; + + case 'frozenfooter': + this.frozenFooterTemplate = item.template; + break; + + case 'frozencolgroup': + this.frozenColGroupTemplate = item.template; + break; + + case 'frozenexpandedrow': + this.frozenExpandedRowTemplate = item.template; + break; + + case 'emptymessage': + this.emptyMessageTemplate = item.template; + break; + + case 'paginatorleft': + this.paginatorLeftTemplate = item.template; + break; + + case 'paginatorright': + this.paginatorRightTemplate = item.template; + break; + + case 'paginatordropdownicon': + this.paginatorDropdownIconTemplate = item.template; + break; + + case 'paginatordropdownitem': + this.paginatorDropdownItemTemplate = item.template; + break; + + case 'paginatorfirstpagelinkicon': + this.paginatorFirstPageLinkIconTemplate = item.template; + break; + + case 'paginatorlastpagelinkicon': + this.paginatorLastPageLinkIconTemplate = item.template; + break; + + case 'paginatorpreviouspagelinkicon': + this.paginatorPreviousPageLinkIconTemplate = item.template; + break; + + case 'paginatornextpagelinkicon': + this.paginatorNextPageLinkIconTemplate = item.template; + break; + + case 'loadingicon': + this.loadingIconTemplate = item.template; + break; + + case 'reorderindicatorupicon': + this.reorderIndicatorUpIconTemplate = item.template; + break; + + case 'reorderindicatordownicon': + this.reorderIndicatorDownIconTemplate = item.template; + break; + + case 'sorticon': + this.sortIconTemplate = item.template; + break; + + case 'checkboxicon': + this.checkboxIconTemplate = item.template; + break; + + case 'headercheckboxicon': + this.headerCheckboxIconTemplate = item.template; + break; + } + }); + } + + onAfterViewInit() { + if (isPlatformBrowser(this.platformId)) { + if (this.isStateful() && this.resizableColumns) { + this.restoreColumnWidths(); + } + } + } + + onChanges(simpleChange: SimpleChanges) { + if (simpleChange.totalRecords && simpleChange.totalRecords.firstChange) { + this._totalRecords = simpleChange.totalRecords.currentValue; + } + + if (simpleChange.value) { + if (this.isStateful() && !this.stateRestored && isPlatformBrowser(this.platformId)) { + this.restoreState(); + } + + this._value = simpleChange.value.currentValue; + + if (!this.lazy) { + this.totalRecords = this._totalRecords === 0 && this._value ? this._value.length : (this._totalRecords ?? 0); + + if (this.sortMode == 'single' && (this.sortField || this.groupRowsBy)) this.sortSingle(); + else if (this.sortMode == 'multiple' && (this.multiSortMeta || this.groupRowsBy)) this.sortMultiple(); + else if (this.hasFilter()) + //sort already filters + this._filter(); + } + + this.tableService.onValueChange(simpleChange.value.currentValue); + } + + if (simpleChange.columns) { + if (!this.isStateful()) { + this._columns = simpleChange.columns.currentValue; + this.tableService.onColumnsChange(simpleChange.columns.currentValue); + } + + if (this._columns && this.isStateful() && this.reorderableColumns && !this.columnOrderStateRestored) { + this.restoreColumnOrder(); + + this.tableService.onColumnsChange(this._columns); + } + } + + if (simpleChange.sortField) { + this._sortField = simpleChange.sortField.currentValue; + + //avoid triggering lazy load prior to lazy initialization at onInit + if (!this.lazy || this.initialized) { + if (this.sortMode === 'single') { + this.sortSingle(); + } + } + } + + if (simpleChange.groupRowsBy) { + //avoid triggering lazy load prior to lazy initialization at onInit + if (!this.lazy || this.initialized) { + if (this.sortMode === 'single') { + this.sortSingle(); + } + } + } + + if (simpleChange.sortOrder) { + this._sortOrder = simpleChange.sortOrder.currentValue; + + //avoid triggering lazy load prior to lazy initialization at onInit + if (!this.lazy || this.initialized) { + if (this.sortMode === 'single') { + this.sortSingle(); + } + } + } + + if (simpleChange.groupRowsByOrder) { + //avoid triggering lazy load prior to lazy initialization at onInit + if (!this.lazy || this.initialized) { + if (this.sortMode === 'single') { + this.sortSingle(); + } + } + } + + if (simpleChange.multiSortMeta) { + this._multiSortMeta = simpleChange.multiSortMeta.currentValue; + if (this.sortMode === 'multiple' && (this.initialized || (!this.lazy && !this.virtualScroll))) { + this.sortMultiple(); + } + } + + if (simpleChange.selection) { + this._selection = simpleChange.selection.currentValue; + + if (!this.preventSelectionSetterPropagation) { + this.updateSelectionKeys(); + this.tableService.onSelectionChange(); + } + this.preventSelectionSetterPropagation = false; + } + + if (simpleChange.selectAll) { + this._selectAll = simpleChange.selectAll.currentValue; + + if (!this.preventSelectionSetterPropagation) { + this.updateSelectionKeys(); + this.tableService.onSelectionChange(); + + if (this.isStateful()) { + this.saveState(); + } + } + this.preventSelectionSetterPropagation = false; + } + } + + get processedData() { + return this.filteredValue || this.value || []; + } + + private _initialColWidths: number[]; + + dataToRender(data: any) { + const _data = data || this.processedData; + + if (_data && this.paginator) { + const first = this.lazy ? 0 : this.first; + return _data.slice(first, first + this.rows); + } + + return _data; + } + + updateSelectionKeys() { + if (this.dataKey && this._selection) { + this.selectionKeys = {}; + if (Array.isArray(this._selection)) { + for (let data of this._selection) { + this.selectionKeys[String(ObjectUtils.resolveFieldData(data, this.dataKey))] = 1; + } + } else { + this.selectionKeys[String(ObjectUtils.resolveFieldData(this._selection, this.dataKey))] = 1; + } + } + } + + onPageChange(event: TablePageEvent) { + this.first = event.first; + this.rows = event.rows; + + this.onPage.emit({ + first: this.first, + rows: this.rows + }); + + if (this.lazy) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } + + this.firstChange.emit(this.first); + this.rowsChange.emit(this.rows); + this.tableService.onValueChange(this.value); + + if (this.isStateful()) { + this.saveState(); + } + + this.anchorRowIndex = null; + + if (this.scrollable) { + this.resetScrollTop(); + } + } + + sort(event: any) { + let originalEvent = event.originalEvent; + + if (this.sortMode === 'single') { + this._sortOrder = this.sortField === event.field ? this.sortOrder * -1 : this.defaultSortOrder; + this._sortField = event.field; + + if (this.resetPageOnSort) { + this._first = 0; + this.firstChange.emit(this._first); + + if (this.scrollable) { + this.resetScrollTop(); + } + } + + this.sortSingle(); + } + if (this.sortMode === 'multiple') { + let metaKey = (originalEvent).metaKey || (originalEvent).ctrlKey; + let sortMeta = this.getSortMeta(event.field); + + if (sortMeta) { + if (!metaKey) { + this._multiSortMeta = [ + { + field: event.field, + order: sortMeta.order * -1 + } + ]; + + if (this.resetPageOnSort) { + this._first = 0; + this.firstChange.emit(this._first); + + if (this.scrollable) { + this.resetScrollTop(); + } + } + } else { + sortMeta.order = sortMeta.order * -1; + } + } else { + if (!metaKey || !this.multiSortMeta) { + this._multiSortMeta = []; + + if (this.resetPageOnSort) { + this._first = 0; + this.firstChange.emit(this._first); + } + } + (this._multiSortMeta).push({ + field: event.field, + order: this.defaultSortOrder + }); + } + + this.sortMultiple(); + } + + if (this.isStateful()) { + this.saveState(); + } + + this.anchorRowIndex = null; + } + + sortSingle() { + let field = this.sortField || this.groupRowsBy; + let order = this.sortField ? this.sortOrder : this.groupRowsByOrder; + if (this.groupRowsBy && this.sortField && this.groupRowsBy !== this.sortField) { + this._multiSortMeta = [this.getGroupRowsMeta(), { field: this.sortField, order: this.sortOrder }]; + this.sortMultiple(); + return; + } + + if (field && order) { + if (this.restoringSort) { + this.restoringSort = false; + } + + if (this.lazy) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } else if (this.value) { + if (this.customSort) { + this.sortFunction.emit({ + data: this.value, + mode: this.sortMode, + field: field, + order: order + }); + } else { + this.value.sort((data1, data2) => { + let value1 = ObjectUtils.resolveFieldData(data1, field); + let value2 = ObjectUtils.resolveFieldData(data2, field); + let result: any = null; + + if (value1 == null && value2 != null) result = -1; + else if (value1 != null && value2 == null) result = 1; + else if (value1 == null && value2 == null) result = 0; + else if (typeof value1 === 'string' && typeof value2 === 'string') result = value1.localeCompare(value2); + else result = value1 < value2 ? -1 : value1 > value2 ? 1 : 0; + + return order * (result || 0); + }); + + this._value = [...this.value]; + } + + if (this.hasFilter()) { + this._filter(); + } + } + + let sortMeta: SortMeta = { + field: field, + order: order + }; + + this.onSort.emit(sortMeta); + this.tableService.onSort(sortMeta); + } + } + + sortMultiple() { + if (this.groupRowsBy) { + if (!this._multiSortMeta) this._multiSortMeta = [this.getGroupRowsMeta()]; + else if ((this.multiSortMeta)[0].field !== this.groupRowsBy) this._multiSortMeta = [this.getGroupRowsMeta(), ...this._multiSortMeta]; + } + + if (this.multiSortMeta) { + if (this.lazy) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } else if (this.value) { + if (this.customSort) { + this.sortFunction.emit({ + data: this.value, + mode: this.sortMode, + multiSortMeta: this.multiSortMeta + }); + } else { + this.value.sort((data1, data2) => { + return this.multisortField(data1, data2, this.multiSortMeta, 0); + }); + + this._value = [...this.value]; + } + + if (this.hasFilter()) { + this._filter(); + } + } + + this.onSort.emit({ + multisortmeta: this.multiSortMeta + }); + this.tableService.onSort(this.multiSortMeta); + } + } + + multisortField(data1: any, data2: any, multiSortMeta: SortMeta[], index: number): any { + const value1 = ObjectUtils.resolveFieldData(data1, multiSortMeta[index].field); + const value2 = ObjectUtils.resolveFieldData(data2, multiSortMeta[index].field); + if (ObjectUtils.compare(value1, value2, this.filterLocale) === 0) { + return multiSortMeta.length - 1 > index ? this.multisortField(data1, data2, multiSortMeta, index + 1) : 0; + } + return this.compareValuesOnSort(value1, value2, multiSortMeta[index].order); + } + + compareValuesOnSort(value1: any, value2: any, order: any) { + return ObjectUtils.sort(value1, value2, order, this.filterLocale, this.sortOrder); + } + + getSortMeta(field: string) { + if (this.multiSortMeta && this.multiSortMeta.length) { + for (let i = 0; i < this.multiSortMeta.length; i++) { + if (this.multiSortMeta[i].field === field) { + return this.multiSortMeta[i]; + } + } + } + + return null; + } + + isSorted(field: string) { + if (this.sortMode === 'single') { + return this.sortField && this.sortField === field; + } else if (this.sortMode === 'multiple') { + let sorted = false; + if (this.multiSortMeta) { + for (let i = 0; i < this.multiSortMeta.length; i++) { + if (this.multiSortMeta[i].field == field) { + sorted = true; + break; + } + } + } + return sorted; + } + } + + handleRowClick(event: any) { + let target = event.originalEvent.target; + let targetNode = target.nodeName; + let parentNode = target.parentElement && target.parentElement.nodeName; + if (targetNode == 'INPUT' || targetNode == 'BUTTON' || targetNode == 'A' || parentNode == 'INPUT' || parentNode == 'BUTTON' || parentNode == 'A' || isClickable(event.originalEvent.target)) { + return; + } + + if (this.selectionMode) { + let rowData = event.rowData; + let rowIndex = event.rowIndex; + + this.preventSelectionSetterPropagation = true; + if (this.isMultipleSelectionMode() && event.originalEvent.shiftKey && this.anchorRowIndex != null) { + DomHandler.clearSelection(); + if (this.rangeRowIndex != null) { + this.clearSelectionRange(event.originalEvent); + } + + this.rangeRowIndex = rowIndex; + this.selectRange(event.originalEvent, rowIndex); + } else { + let selected = this.isSelected(rowData); + + if (!selected && !this.isRowSelectable(rowData, rowIndex)) { + return; + } + + let metaSelection = this.rowTouched ? false : this.metaKeySelection; + let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData, this.dataKey)) : null; + this.anchorRowIndex = rowIndex; + this.rangeRowIndex = rowIndex; + + if (metaSelection) { + let metaKey = event.originalEvent.metaKey || event.originalEvent.ctrlKey; + + if (selected && metaKey) { + if (this.isSingleSelectionMode()) { + this._selection = null; + this.selectionKeys = {}; + this.selectionChange.emit(null); + } else { + let selectionIndex = this.findIndexInSelection(rowData); + this._selection = this.selection.filter((val: any, i: number) => i != selectionIndex); + this.selectionChange.emit(this.selection); + if (dataKeyValue) { + delete this.selectionKeys[dataKeyValue]; + } + } + + this.onRowUnselect.emit({ + originalEvent: event.originalEvent, + data: rowData, + type: 'row' + }); + } else { + if (this.isSingleSelectionMode()) { + this._selection = rowData; + this.selectionChange.emit(rowData); + if (dataKeyValue) { + this.selectionKeys = {}; + this.selectionKeys[dataKeyValue] = 1; + } + } else if (this.isMultipleSelectionMode()) { + if (metaKey) { + this._selection = this.selection || []; + } else { + this._selection = []; + this.selectionKeys = {}; + } + + this._selection = [...this.selection, rowData]; + this.selectionChange.emit(this.selection); + if (dataKeyValue) { + this.selectionKeys[dataKeyValue] = 1; + } + } + + this.onRowSelect.emit({ + originalEvent: event.originalEvent, + data: rowData, + type: 'row', + index: rowIndex + }); + } + } else { + if (this.selectionMode === 'single') { + if (selected) { + this._selection = null; + this.selectionKeys = {}; + this.selectionChange.emit(this.selection); + this.onRowUnselect.emit({ + originalEvent: event.originalEvent, + data: rowData, + type: 'row', + index: rowIndex + }); + } else { + this._selection = rowData; + this.selectionChange.emit(this.selection); + this.onRowSelect.emit({ + originalEvent: event.originalEvent, + data: rowData, + type: 'row', + index: rowIndex + }); + if (dataKeyValue) { + this.selectionKeys = {}; + this.selectionKeys[dataKeyValue] = 1; + } + } + } else if (this.selectionMode === 'multiple') { + if (selected) { + let selectionIndex = this.findIndexInSelection(rowData); + this._selection = this.selection.filter((val: any, i: number) => i != selectionIndex); + this.selectionChange.emit(this.selection); + this.onRowUnselect.emit({ + originalEvent: event.originalEvent, + data: rowData, + type: 'row', + index: rowIndex + }); + if (dataKeyValue) { + delete this.selectionKeys[dataKeyValue]; + } + } else { + this._selection = this.selection ? [...this.selection, rowData] : [rowData]; + this.selectionChange.emit(this.selection); + this.onRowSelect.emit({ + originalEvent: event.originalEvent, + data: rowData, + type: 'row', + index: rowIndex + }); + if (dataKeyValue) { + this.selectionKeys[dataKeyValue] = 1; + } + } + } + } + } + + this.tableService.onSelectionChange(); + + if (this.isStateful()) { + this.saveState(); + } + } + + this.rowTouched = false; + } + + handleRowTouchEnd(event: Event) { + this.rowTouched = true; + } + + handleRowRightClick(event: any) { + if (this.contextMenu) { + const rowData = event.rowData; + const rowIndex = event.rowIndex; + + const showContextMenu = () => { + this.contextMenu.show(event.originalEvent); + this.contextMenu.hideCallback = () => { + this.contextMenuSelection = null; + this.contextMenuSelectionChange.emit(null); + this.tableService.onContextMenu(null); + }; + }; + + if (this.contextMenuSelectionMode === 'separate') { + this.contextMenuSelection = rowData; + this.contextMenuSelectionChange.emit(rowData); + this.tableService.onContextMenu(rowData); + showContextMenu(); + this.onContextMenuSelect.emit({ + originalEvent: event.originalEvent, + data: rowData, + index: event.rowIndex + }); + } else if (this.contextMenuSelectionMode === 'joint') { + this.preventSelectionSetterPropagation = true; + let selected = this.isSelected(rowData); + let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData, this.dataKey)) : null; + + if (!selected) { + if (!this.isRowSelectable(rowData, rowIndex)) { + return; + } + + if (this.isSingleSelectionMode()) { + this.selection = rowData; + this.selectionChange.emit(rowData); + + if (dataKeyValue) { + this.selectionKeys = {}; + this.selectionKeys[dataKeyValue] = 1; + } + } else if (this.isMultipleSelectionMode()) { + this._selection = this.selection ? [...this.selection, rowData] : [rowData]; + this.selectionChange.emit(this.selection); + + if (dataKeyValue) { + this.selectionKeys[dataKeyValue] = 1; + } + } + } + + // Also update contextMenuSelection in joint mode + this.contextMenuSelection = rowData; + this.contextMenuSelectionChange.emit(rowData); + this.tableService.onContextMenu(rowData); + + this.tableService.onSelectionChange(); + showContextMenu(); + this.onContextMenuSelect.emit({ + originalEvent: event, + data: rowData, + index: event.rowIndex + }); + } + } + } + + selectRange(event: MouseEvent | KeyboardEvent, rowIndex: number, isMetaKeySelection?: boolean | undefined) { + let rangeStart, rangeEnd; + + if (this.anchorRowIndex > rowIndex) { + rangeStart = rowIndex; + rangeEnd = this.anchorRowIndex; + } else if (this.anchorRowIndex < rowIndex) { + rangeStart = this.anchorRowIndex; + rangeEnd = rowIndex; + } else { + rangeStart = rowIndex; + rangeEnd = rowIndex; + } + + if (this.lazy && this.paginator) { + (rangeStart as number) -= this.first; + (rangeEnd as number) -= this.first; + } + + let rangeRowsData: RowData[] = []; + for (let i = rangeStart; i <= rangeEnd; i++) { + let rangeRowData = this.filteredValue ? this.filteredValue[i] : this.value[i]; + if (!this.isSelected(rangeRowData) && !isMetaKeySelection) { + if (!this.isRowSelectable(rangeRowData, rowIndex)) { + continue; + } + + rangeRowsData.push(rangeRowData); + this._selection = [...this.selection, rangeRowData]; + let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rangeRowData, this.dataKey)) : null; + if (dataKeyValue) { + this.selectionKeys[dataKeyValue] = 1; + } + } + } + this.selectionChange.emit(this.selection); + this.onRowSelect.emit({ + originalEvent: event, + data: rangeRowsData, + type: 'row' + }); + } + + clearSelectionRange(event: MouseEvent | KeyboardEvent) { + let rangeStart, rangeEnd; + let rangeRowIndex = this.rangeRowIndex; + let anchorRowIndex = this.anchorRowIndex; + + if (rangeRowIndex > anchorRowIndex) { + rangeStart = this.anchorRowIndex; + rangeEnd = this.rangeRowIndex; + } else if (rangeRowIndex < anchorRowIndex) { + rangeStart = this.rangeRowIndex; + rangeEnd = this.anchorRowIndex; + } else { + rangeStart = this.rangeRowIndex; + rangeEnd = this.rangeRowIndex; + } + + for (let i = rangeStart; i <= rangeEnd; i++) { + let rangeRowData = this.value[i]; + let selectionIndex = this.findIndexInSelection(rangeRowData); + this._selection = this.selection.filter((val: any, i: number) => i != selectionIndex); + let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rangeRowData, this.dataKey)) : null; + if (dataKeyValue) { + delete this.selectionKeys[dataKeyValue]; + } + this.onRowUnselect.emit({ + originalEvent: event, + data: rangeRowData, + type: 'row' + }); + } + } + + isSelected(rowData: any) { + if (rowData && this.selection) { + if (this.dataKey) { + return this.selectionKeys[ObjectUtils.resolveFieldData(rowData, this.dataKey)] !== undefined; + } else { + if (Array.isArray(this.selection)) return this.findIndexInSelection(rowData) > -1; + else return this.equals(rowData, this.selection); + } + } + + return false; + } + + findIndexInSelection(rowData: any) { + let index: number = -1; + if (this.selection && this.selection.length) { + for (let i = 0; i < this.selection.length; i++) { + if (this.equals(rowData, this.selection[i])) { + index = i; + break; + } + } + } + + return index; + } + + isRowSelectable(data: any, index: number) { + if (this.rowSelectable && !this.rowSelectable({ data, index })) { + return false; + } + + return true; + } + + toggleRowWithRadio(event: any, rowData: any) { + this.preventSelectionSetterPropagation = true; + + if (this.selection != rowData) { + if (!this.isRowSelectable(rowData, event.rowIndex)) { + return; + } + + this._selection = rowData; + this.selectionChange.emit(this.selection); + this.onRowSelect.emit({ + originalEvent: event.originalEvent, + index: event.rowIndex, + data: rowData, + type: 'radiobutton' + }); + + if (this.dataKey) { + this.selectionKeys = {}; + this.selectionKeys[String(ObjectUtils.resolveFieldData(rowData, this.dataKey))] = 1; + } + } else { + this._selection = null; + this.selectionChange.emit(this.selection); + this.onRowUnselect.emit({ + originalEvent: event.originalEvent, + index: event.rowIndex, + data: rowData, + type: 'radiobutton' + }); + } + + this.tableService.onSelectionChange(); + + if (this.isStateful()) { + this.saveState(); + } + } + + toggleRowWithCheckbox(event: { originalEvent: Event; rowIndex: number }, rowData: any) { + this.selection = this.selection || []; + let selected = this.isSelected(rowData); + let dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData, this.dataKey)) : null; + this.preventSelectionSetterPropagation = true; + + if (selected) { + let selectionIndex = this.findIndexInSelection(rowData); + this._selection = this.selection.filter((val: any, i: number) => i != selectionIndex); + this.selectionChange.emit(this.selection); + this.onRowUnselect.emit({ + originalEvent: event.originalEvent, + index: event.rowIndex, + data: rowData, + type: 'checkbox' + }); + if (dataKeyValue) { + delete this.selectionKeys[dataKeyValue]; + } + } else { + if (!this.isRowSelectable(rowData, event.rowIndex)) { + return; + } + + this._selection = this.selection ? [...this.selection, rowData] : [rowData]; + this.selectionChange.emit(this.selection); + this.onRowSelect.emit({ + originalEvent: event.originalEvent, + index: event.rowIndex, + data: rowData, + type: 'checkbox' + }); + if (dataKeyValue) { + this.selectionKeys[dataKeyValue] = 1; + } + } + + this.tableService.onSelectionChange(); + + if (this.isStateful()) { + this.saveState(); + } + } + + toggleRowsWithCheckbox({ originalEvent }: CheckboxChangeEvent, check: boolean) { + if (this._selectAll !== null) { + this.selectAllChange.emit({ originalEvent: originalEvent!, checked: check }); + } else { + const data = this.selectionPageOnly ? this.dataToRender(this.processedData) : this.processedData; + let selection = this.selectionPageOnly && this._selection ? this._selection.filter((s: any) => !data.some((d: any) => this.equals(s, d))) : []; + + if (check) { + selection = this.frozenValue ? [...selection, ...this.frozenValue, ...data] : [...selection, ...data]; + selection = this.rowSelectable ? selection.filter((data: any, index: number) => this.rowSelectable({ data, index })) : selection; + } + + this._selection = selection; + this.preventSelectionSetterPropagation = true; + this.updateSelectionKeys(); + this.selectionChange.emit(this._selection); + this.tableService.onSelectionChange(); + this.onHeaderCheckboxToggle.emit({ + originalEvent: originalEvent!, + checked: check + }); + + if (this.isStateful()) { + this.saveState(); + } + } + } + + equals(data1: any, data2: any) { + return this.compareSelectionBy === 'equals' ? data1 === data2 : ObjectUtils.equals(data1, data2, this.dataKey); + } + + /* Legacy Filtering for custom elements */ + filter(value: any, field: string, matchMode: string) { + if (this.filterTimeout) { + clearTimeout(this.filterTimeout); + } + if (!this.isFilterBlank(value)) { + this.filters[field] = { value: value, matchMode: matchMode }; + } else if (this.filters[field]) { + delete this.filters[field]; + } + + this.filterTimeout = setTimeout(() => { + this._filter(); + this.filterTimeout = null; + }, this.filterDelay); + + this.anchorRowIndex = null; + } + + filterGlobal(value: any, matchMode: string) { + this.filter(value, 'global', matchMode); + } + + isFilterBlank(filter: any): boolean { + if (filter !== null && filter !== undefined) { + if ((typeof filter === 'string' && filter.trim().length == 0) || (Array.isArray(filter) && filter.length == 0)) return true; + else return false; + } + return true; + } + + _filter() { + if (!this.restoringFilter) { + this.first = 0; + this.firstChange.emit(this.first); + } + + if (this.lazy) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } else { + if (!this.value) { + return; + } + if (!this.hasFilter()) { + this.filteredValue = null; + if (this.paginator) { + this.totalRecords = this._totalRecords === 0 && this.value ? this.value.length : this._totalRecords; + } + } else { + let globalFilterFieldsArray; + if (this.filters['global']) { + if (!this.columns && !this.globalFilterFields) throw new Error('Global filtering requires dynamic columns or globalFilterFields to be defined.'); + else globalFilterFieldsArray = this.globalFilterFields || this.columns; + } + + this.filteredValue = []; + + for (let i = 0; i < this.value.length; i++) { + let localMatch = true; + let globalMatch = false; + let localFiltered = false; + + for (let prop in this.filters) { + if (this.filters.hasOwnProperty(prop) && prop !== 'global') { + localFiltered = true; + let filterField = prop; + let filterMeta = this.filters[filterField]; + + if (Array.isArray(filterMeta)) { + for (let meta of filterMeta) { + localMatch = this.executeLocalFilter(filterField, this.value[i], meta); + + if ((meta.operator === FilterOperator.OR && localMatch) || (meta.operator === FilterOperator.AND && !localMatch)) { + break; + } + } + } else { + localMatch = this.executeLocalFilter(filterField, this.value[i], filterMeta); + } + + if (!localMatch) { + break; + } + } + } + + if (this.filters['global'] && !globalMatch && globalFilterFieldsArray) { + for (let j = 0; j < globalFilterFieldsArray.length; j++) { + let globalFilterField = globalFilterFieldsArray[j].field || globalFilterFieldsArray[j]; + globalMatch = (this.filterService).filters[(this.filters['global']).matchMode](ObjectUtils.resolveFieldData(this.value[i], globalFilterField), (this.filters['global']).value, this.filterLocale); + + if (globalMatch) { + break; + } + } + } + + let matches: boolean; + if (this.filters['global']) { + matches = localFiltered ? localFiltered && localMatch && globalMatch : globalMatch; + } else { + matches = localFiltered && localMatch; + } + + if (matches) { + this.filteredValue.push(this.value[i]); + } + } + + if (this.filteredValue.length === this.value.length) { + this.filteredValue = null; + } + + if (this.paginator) { + this.totalRecords = this.filteredValue ? this.filteredValue.length : this._totalRecords === 0 && this.value ? this.value.length : (this._totalRecords ?? 0); + } + } + } + + this.onFilter.emit({ + filters: <{ [s: string]: FilterMetadata | undefined }>this.filters, + filteredValue: this.filteredValue || this.value + }); + + this.tableService.onValueChange(this.value); + + if (this.isStateful() && !this.restoringFilter) { + this.saveState(); + } + + if (this.restoringFilter) { + this.restoringFilter = false; + } + + this.cd.markForCheck(); + + if (this.scrollable) { + this.resetScrollTop(); + } + } + + executeLocalFilter(field: string, rowData: any, filterMeta: FilterMetadata): boolean { + let filterValue = filterMeta.value; + let filterMatchMode = filterMeta.matchMode || FilterMatchMode.STARTS_WITH; + let dataFieldValue = ObjectUtils.resolveFieldData(rowData, field); + let filterConstraint = (this.filterService).filters[filterMatchMode]; + + return filterConstraint(dataFieldValue, filterValue, this.filterLocale); + } + + hasFilter() { + let empty = true; + for (let prop in this.filters) { + if (this.filters.hasOwnProperty(prop)) { + empty = false; + break; + } + } + + return !empty; + } + + createLazyLoadMetadata(): any { + return { + first: this.first, + rows: this.rows, + sortField: this.sortField, + sortOrder: this.sortOrder, + filters: this.filters, + globalFilter: this.filters && this.filters['global'] ? (this.filters['global']).value : null, + multiSortMeta: this.multiSortMeta, + forceUpdate: () => this.cd.detectChanges() + }; + } + + public clear() { + this._sortField = null; + this._sortOrder = this.defaultSortOrder; + this._multiSortMeta = null; + this.tableService.onSort(null); + + this.clearFilterValues(); + + this.filteredValue = null; + + this.first = 0; + this.firstChange.emit(this.first); + + if (this.lazy) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } else { + this.totalRecords = this._totalRecords === 0 && this._value ? this._value.length : (this._totalRecords ?? 0); + } + } + + clearFilterValues() { + for (const [, filterMetadata] of Object.entries(this.filters)) { + if (Array.isArray(filterMetadata)) { + for (let filter of filterMetadata) { + filter.value = null; + } + } else if (filterMetadata) { + filterMetadata.value = null; + } + } + } + + reset() { + this.clear(); + } + + getExportHeader(column: any) { + return column[this.exportHeader] || column.header || column.field; + } + /** + * Data export method. + * @param {ExportCSVOptions} object - Export options. + * @group Method + */ + public exportCSV(options?: ExportCSVOptions) { + let data; + let csv = ''; + let columns = this.columns; + + if (options && options.selectionOnly) { + data = this.selection || []; + } else if (options && options.allValues) { + data = this.value || []; + } else { + data = this.filteredValue || this.value; + + if (this.frozenValue) { + data = data ? [...this.frozenValue, ...data] : this.frozenValue; + } + } + + const exportableColumns: any[] = (columns).filter((column) => column.exportable !== false && column.field); + + //headers + csv += exportableColumns.map((column) => '"' + this.getExportHeader(column) + '"').join(this.csvSeparator); + + //body + const body = data + .map((record: any) => + exportableColumns + .map((column) => { + let cellData = ObjectUtils.resolveFieldData(record, column.field); + + if (cellData != null) { + if (this.exportFunction) { + cellData = this.exportFunction({ + data: cellData, + field: column.field + }); + } else cellData = String(cellData).replace(/"/g, '""'); + } else cellData = ''; + + return '"' + cellData + '"'; + }) + .join(this.csvSeparator) + ) + .join('\n'); + + if (body.length) { + csv += '\n' + body; + } + + let blob = new Blob([new Uint8Array([0xef, 0xbb, 0xbf]), csv], { + type: 'text/csv;charset=utf-8;' + }); + + let link = this.renderer.createElement('a'); + link.style.display = 'none'; + this.renderer.appendChild(this.document.body, link); + if (link.download !== undefined) { + link.setAttribute('href', URL.createObjectURL(blob)); + link.setAttribute('download', this.exportFilename + '.csv'); + link.click(); + } else { + csv = 'data:text/csv;charset=utf-8,' + csv; + this.document.defaultView?.open(encodeURI(csv)); + } + this.renderer.removeChild(this.document.body, link); + } + + onLazyItemLoad(event: LazyLoadMeta) { + this.onLazyLoad.emit({ + ...this.createLazyLoadMetadata(), + ...event, + rows: event.last - event.first + }); + } + /** + * Resets scroll to top. + * @group Method + */ + public resetScrollTop() { + if (this.virtualScroll) this.scrollToVirtualIndex(0); + else this.scrollTo({ top: 0 }); + } + /** + * Scrolls to given index when using virtual scroll. + * @param {number} index - index of the element. + * @group Method + */ + public scrollToVirtualIndex(index: number) { + this.scroller && this.scroller.scrollToIndex(index); + } + /** + * Scrolls to given index. + * @param {ScrollToOptions} options - scroll options. + * @group Method + */ + public scrollTo(options: any) { + if (this.virtualScroll) { + this.scroller?.scrollTo(options); + } else if (this.wrapperViewChild && this.wrapperViewChild.nativeElement) { + if (this.wrapperViewChild.nativeElement.scrollTo) { + this.wrapperViewChild.nativeElement.scrollTo(options); + } else { + this.wrapperViewChild.nativeElement.scrollLeft = options.left; + this.wrapperViewChild.nativeElement.scrollTop = options.top; + } + } + } + + updateEditingCell(cell: any, data: any, field: string, index: number) { + this.editingCell = cell; + this.editingCellData = data; + this.editingCellField = field; + this.editingCellRowIndex = index; + this.bindDocumentEditListener(); + } + + isEditingCellValid() { + return this.editingCell && DomHandler.find(this.editingCell, '.ng-invalid.ng-dirty').length === 0; + } + + bindDocumentEditListener() { + if (!this.documentEditListener) { + this.documentEditListener = this.renderer.listen(this.document, 'click', (event) => { + if (this.editingCell && !this.selfClick && this.isEditingCellValid()) { + !this.$unstyled() && DomHandler.removeClass(this.editingCell, 'p-cell-editing'); + setAttribute(this.editingCell as HTMLElement, 'data-p-cell-editing', 'false'); + this.editingCell = null; + this.onEditComplete.emit({ + field: this.editingCellField, + data: this.editingCellData, + originalEvent: event, + index: this.editingCellRowIndex + }); + this.editingCellField = null; + this.editingCellData = null; + this.editingCellRowIndex = null; + this.unbindDocumentEditListener(); + this.cd.markForCheck(); + + if (this.overlaySubscription) { + this.overlaySubscription.unsubscribe(); + } + } + + this.selfClick = false; + }); + } + } + + unbindDocumentEditListener() { + if (this.documentEditListener) { + this.documentEditListener(); + this.documentEditListener = null; + } + } + + initRowEdit(rowData: any) { + let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey)); + this.editingRowKeys[dataKeyValue] = true; + } + + saveRowEdit(rowData: any, rowElement: HTMLTableRowElement) { + if (DomHandler.find(rowElement, '.ng-invalid.ng-dirty').length === 0) { + let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey)); + delete this.editingRowKeys[dataKeyValue]; + } + } + + cancelRowEdit(rowData: any) { + let dataKeyValue = String(ObjectUtils.resolveFieldData(rowData, this.dataKey)); + delete this.editingRowKeys[dataKeyValue]; + } + + toggleRow(rowData: any, event?: Event) { + if (!this.dataKey && !this.groupRowsBy) { + throw new Error('dataKey or groupRowsBy must be defined to use row expansion'); + } + + let dataKeyValue = this.groupRowsBy ? String(ObjectUtils.resolveFieldData(rowData, this.groupRowsBy)) : String(ObjectUtils.resolveFieldData(rowData, this.dataKey)); + + if (this.expandedRowKeys[dataKeyValue] != null) { + delete this.expandedRowKeys[dataKeyValue]; + this.onRowCollapse.emit({ + originalEvent: event, + data: rowData + }); + } else { + if (this.rowExpandMode === 'single') { + this.expandedRowKeys = {}; + } + + this.expandedRowKeys[dataKeyValue] = true; + this.onRowExpand.emit({ + originalEvent: event, + data: rowData + }); + } + + if (event) { + event.preventDefault(); + } + + if (this.isStateful()) { + this.saveState(); + } + } + + isRowExpanded(rowData: any): boolean { + return this.groupRowsBy ? this.expandedRowKeys[String(ObjectUtils.resolveFieldData(rowData, this.groupRowsBy))] === true : this.expandedRowKeys[String(ObjectUtils.resolveFieldData(rowData, this.dataKey))] === true; + } + + isRowEditing(rowData: any): boolean { + return this.editingRowKeys[String(ObjectUtils.resolveFieldData(rowData, this.dataKey))] === true; + } + + isSingleSelectionMode() { + return this.selectionMode === 'single'; + } + + isMultipleSelectionMode() { + return this.selectionMode === 'multiple'; + } + + onColumnResizeBegin(event: any) { + let containerLeft = DomHandler.getOffset(this.el?.nativeElement).left; + this.resizeColumnElement = event.target.closest('th'); + this.columnResizing = true; + if (event.type == 'touchstart') { + this.lastResizerHelperX = event.changedTouches[0].clientX - containerLeft + this.el?.nativeElement.scrollLeft; + } else { + this.lastResizerHelperX = event.pageX - containerLeft + this.el?.nativeElement.scrollLeft; + } + this.onColumnResize(event); + event.preventDefault(); + } + + onColumnResize(event: any) { + let containerLeft = DomHandler.getOffset(this.el?.nativeElement).left; + !this.$unstyled() && DomHandler.addClass(this.el?.nativeElement, 'p-unselectable-text'); + (this.resizeHelperViewChild).nativeElement.style.height = this.el?.nativeElement.offsetHeight + 'px'; + (this.resizeHelperViewChild).nativeElement.style.top = 0 + 'px'; + if (event.type == 'touchmove') { + (this.resizeHelperViewChild).nativeElement.style.left = event.changedTouches[0].clientX - containerLeft + this.el?.nativeElement.scrollLeft + 'px'; + } else { + (this.resizeHelperViewChild).nativeElement.style.left = event.pageX - containerLeft + this.el?.nativeElement.scrollLeft + 'px'; + } + (this.resizeHelperViewChild).nativeElement.style.display = 'block'; + } + + onColumnResizeEnd() { + const isRTL = getComputedStyle(this.el?.nativeElement ?? document.documentElement).direction === 'rtl'; + const rawDelta = this.resizeHelperViewChild?.nativeElement.offsetLeft - this.lastResizerHelperX; + const delta = isRTL ? -rawDelta : rawDelta; + const columnWidth = this.resizeColumnElement.offsetWidth; + const newColumnWidth = columnWidth + delta; + const elementMinWidth = this.resizeColumnElement.style.minWidth.replace(/[^\d.]/g, ''); + const minWidth = elementMinWidth ? parseFloat(elementMinWidth) : 15; + + if (newColumnWidth >= minWidth) { + if (this.columnResizeMode === 'fit') { + const nextColumn = this.resizeColumnElement.nextElementSibling as HTMLElement; + const nextColumnWidth = nextColumn.offsetWidth - delta; + + if (newColumnWidth > 15 && nextColumnWidth > 15) { + this.resizeTableCells(newColumnWidth, nextColumnWidth); + } + } else if (this.columnResizeMode === 'expand') { + this._initialColWidths = this._totalTableWidth(); + const tableWidth = this.tableViewChild?.nativeElement.offsetWidth + delta; + + this.setResizeTableWidth(tableWidth + 'px'); + this.resizeTableCells(newColumnWidth, null); + } + + this.onColResize.emit({ + element: this.resizeColumnElement, + delta: delta + }); + + if (this.isStateful()) { + this.saveState(); + } + } + + (this.resizeHelperViewChild).nativeElement.style.display = 'none'; + DomHandler.removeClass(this.el?.nativeElement, 'p-unselectable-text'); + } + + private _totalTableWidth(): number[] { + let widths = []; + const tableHead = DomHandler.findSingle(this.el.nativeElement, '[data-pc-section="thead"]'); + let headers = DomHandler.find(tableHead, 'tr > th'); + headers.forEach((header) => (widths as any[]).push(DomHandler.getOuterWidth(header))); + + return widths; + } + + onColumnDragStart(event: any, columnElement: any) { + this.reorderIconWidth = DomHandler.getHiddenElementOuterWidth(this.reorderIndicatorUpViewChild?.nativeElement); + this.reorderIconHeight = DomHandler.getHiddenElementOuterHeight(this.reorderIndicatorDownViewChild?.nativeElement); + this.draggedColumn = columnElement; + event.dataTransfer.setData('text', 'b'); // For firefox + } + + onColumnDragEnter(event: any, dropHeader: any) { + if (this.reorderableColumns && this.draggedColumn && dropHeader) { + event.preventDefault(); + let containerOffset = DomHandler.getOffset(this.el?.nativeElement); + let dropHeaderOffset = DomHandler.getOffset(dropHeader); + + if (this.draggedColumn != dropHeader) { + let dragIndex = DomHandler.indexWithinGroup(this.draggedColumn, 'preorderablecolumn'); + let dropIndex = DomHandler.indexWithinGroup(dropHeader, 'preorderablecolumn'); + let targetLeft = dropHeaderOffset.left - containerOffset.left; + let targetTop = containerOffset.top - dropHeaderOffset.top; + let columnCenter = dropHeaderOffset.left + dropHeader.offsetWidth / 2; + + (this.reorderIndicatorUpViewChild).nativeElement.style.top = dropHeaderOffset.top - containerOffset.top - (this.reorderIconHeight - 1) + 'px'; + (this.reorderIndicatorDownViewChild).nativeElement.style.top = dropHeaderOffset.top - containerOffset.top + dropHeader.offsetHeight + 'px'; + + if (event.pageX > columnCenter) { + (this.reorderIndicatorUpViewChild).nativeElement.style.left = targetLeft + dropHeader.offsetWidth - Math.ceil(this.reorderIconWidth / 2) + 'px'; + (this.reorderIndicatorDownViewChild).nativeElement.style.left = targetLeft + dropHeader.offsetWidth - Math.ceil(this.reorderIconWidth / 2) + 'px'; + this.dropPosition = 1; + } else { + (this.reorderIndicatorUpViewChild).nativeElement.style.left = targetLeft - Math.ceil(this.reorderIconWidth / 2) + 'px'; + (this.reorderIndicatorDownViewChild).nativeElement.style.left = targetLeft - Math.ceil(this.reorderIconWidth / 2) + 'px'; + this.dropPosition = -1; + } + (this.reorderIndicatorUpViewChild).nativeElement.style.display = 'block'; + (this.reorderIndicatorDownViewChild).nativeElement.style.display = 'block'; + } else { + event.dataTransfer.dropEffect = 'none'; + } + } + } + + onColumnDragLeave(event: Event) { + if (this.reorderableColumns && this.draggedColumn) { + event.preventDefault(); + } + } + + onColumnDrop(event: Event, dropColumn: any) { + event.preventDefault(); + if (this.draggedColumn) { + let dragIndex = DomHandler.indexWithinGroup(this.draggedColumn, 'preorderablecolumn'); + let dropIndex = DomHandler.indexWithinGroup(dropColumn, 'preorderablecolumn'); + let allowDrop = dragIndex != dropIndex; + if (allowDrop && ((dropIndex - dragIndex == 1 && this.dropPosition === -1) || (dragIndex - dropIndex == 1 && this.dropPosition === 1))) { + allowDrop = false; + } + + if (allowDrop && dropIndex < dragIndex && this.dropPosition === 1) { + dropIndex = dropIndex + 1; + } + + if (allowDrop && dropIndex > dragIndex && this.dropPosition === -1) { + dropIndex = dropIndex - 1; + } + + if (allowDrop) { + ObjectUtils.reorderArray(this.columns, dragIndex, dropIndex); + + this.onColReorder.emit({ + dragIndex: dragIndex, + dropIndex: dropIndex, + columns: this.columns + }); + + if (this.isStateful()) { + this.zone.runOutsideAngular(() => { + setTimeout(() => { + this.saveState(); + }); + }); + } + } + + if (this.resizableColumns && this.resizeColumnElement) { + let width = this.columnResizeMode === 'expand' ? this._initialColWidths : this._totalTableWidth(); + ObjectUtils.reorderArray(width, dragIndex + 1, dropIndex + 1); + this.updateStyleElement(width, dragIndex, 0, 0); + } + + (this.reorderIndicatorUpViewChild).nativeElement.style.display = 'none'; + (this.reorderIndicatorDownViewChild).nativeElement.style.display = 'none'; + this.draggedColumn.draggable = false; + this.draggedColumn = null; + this.dropPosition = null; + } + } + + resizeTableCells(newColumnWidth: number, nextColumnWidth: number | null) { + let colIndex = DomHandler.index(this.resizeColumnElement); + let width = this.columnResizeMode === 'expand' ? this._initialColWidths : this._totalTableWidth(); + this.updateStyleElement(width, colIndex, newColumnWidth, nextColumnWidth); + } + + updateStyleElement(width: number[], colIndex: number, newColumnWidth: number, nextColumnWidth: number | null) { + this.destroyStyleElement(); + this.createStyleElement(); + + let innerHTML = ''; + width.forEach((width, index) => { + let colWidth = index === colIndex ? newColumnWidth : nextColumnWidth && index === colIndex + 1 ? nextColumnWidth : width; + let style = `width: ${colWidth}px !important; max-width: ${colWidth}px !important;`; + innerHTML += ` + #${this.id}-table > .p-datatable-thead > tr > th:nth-child(${index + 1}), + #${this.id}-table > .p-datatable-tbody > tr > td:nth-child(${index + 1}), + #${this.id}-table > .p-datatable-tfoot > tr > td:nth-child(${index + 1}) { + ${style} + } + `; + }); + this.renderer.setProperty(this.styleElement, 'innerHTML', innerHTML); + } + + onRowDragStart(event: any, index: number) { + this.rowDragging = true; + this.draggedRowIndex = index; + event.dataTransfer.setData('text', 'b'); // For firefox + } + + onRowDragOver(event: MouseEvent, index: number, rowElement: any) { + if (this.rowDragging && this.draggedRowIndex !== index) { + let rowY = DomHandler.getOffset(rowElement).top; + let pageY = event.pageY; + let rowMidY = rowY + DomHandler.getOuterHeight(rowElement) / 2; + let prevRowElement = rowElement.previousElementSibling; + + if (pageY < rowMidY) { + DomHandler.removeClass(rowElement, 'p-datatable-dragpoint-bottom'); + + this.droppedRowIndex = index; + if (prevRowElement && !this.$unstyled()) DomHandler.addClass(prevRowElement, 'p-datatable-dragpoint-bottom'); + else !this.$unstyled() && DomHandler.addClass(rowElement, 'p-datatable-dragpoint-top'); + } else { + if (prevRowElement && !this.$unstyled()) DomHandler.removeClass(prevRowElement, 'p-datatable-dragpoint-bottom'); + else !this.$unstyled() && DomHandler.addClass(rowElement, 'p-datatable-dragpoint-top'); + + this.droppedRowIndex = index + 1; + !this.$unstyled() && DomHandler.addClass(rowElement, 'p-datatable-dragpoint-bottom'); + } + } + } + + onRowDragLeave(event: Event, rowElement: any) { + let prevRowElement = rowElement.previousElementSibling; + if (prevRowElement) { + !this.$unstyled() && DomHandler.removeClass(prevRowElement, 'p-datatable-dragpoint-bottom'); + } + + !this.$unstyled() && DomHandler.removeClass(rowElement, 'p-datatable-dragpoint-bottom'); + !this.$unstyled() && DomHandler.removeClass(rowElement, 'p-datatable-dragpoint-top'); + } + + onRowDragEnd(event: Event) { + this.rowDragging = false; + this.draggedRowIndex = null; + this.droppedRowIndex = null; + } + + onRowDrop(event: Event, rowElement: any) { + if (this.droppedRowIndex != null) { + let dropIndex = this.draggedRowIndex > this.droppedRowIndex ? this.droppedRowIndex : this.droppedRowIndex === 0 ? 0 : this.droppedRowIndex - 1; + ObjectUtils.reorderArray(this.value, this.draggedRowIndex, dropIndex); + + if (this.virtualScroll) { + // TODO: Check + this._value = [...this._value]; + } + + this.onRowReorder.emit({ + dragIndex: this.draggedRowIndex, + dropIndex: dropIndex + }); + } + //cleanup + this.onRowDragLeave(event, rowElement); + this.onRowDragEnd(event); + } + + isEmpty() { + let data = this.filteredValue || this.value; + return data == null || data.length == 0; + } + + getBlockableElement(): HTMLElement { + return this.el.nativeElement.children[0]; + } + + getStorage() { + if (isPlatformBrowser(this.platformId)) { + switch (this.stateStorage) { + case 'local': + return window.localStorage; + + case 'session': + return window.sessionStorage; + + default: + throw new Error(this.stateStorage + ' is not a valid value for the state storage, supported values are "local" and "session".'); + } + } else { + throw new Error('Browser storage is not available in the server side.'); + } + } + + isStateful() { + return this.stateKey != null; + } + + saveState() { + const storage = this.getStorage(); + let state: TableState = {}; + + if (this.paginator) { + state.first = this.first; + state.rows = this.rows; + } + + if (this.sortField) { + state.sortField = this.sortField; + state.sortOrder = this.sortOrder; + } + + if (this.multiSortMeta) { + state.multiSortMeta = this.multiSortMeta; + } + + if (this.hasFilter()) { + state.filters = this.filters; + } + + if (this.resizableColumns) { + this.saveColumnWidths(state); + } + + if (this.reorderableColumns) { + this.saveColumnOrder(state); + } + + if (this.selection) { + state.selection = this.selection; + } + + if (Object.keys(this.expandedRowKeys).length) { + state.expandedRowKeys = this.expandedRowKeys; + } + + storage.setItem(this.stateKey, JSON.stringify(state)); + this.onStateSave.emit(state); + } + + clearState() { + const storage = this.getStorage(); + + if (this.stateKey) { + storage.removeItem(this.stateKey); + } + } + + restoreState() { + const storage = this.getStorage(); + const stateString = storage.getItem(this.stateKey); + const dateFormat = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/; + const reviver = function (key: any, value: any) { + if (typeof value === 'string' && dateFormat.test(value)) { + return new Date(value); + } + + return value; + }; + + if (stateString) { + let state: TableState = JSON.parse(stateString, reviver); + + if (this.paginator) { + if (this.first !== undefined) { + this.first = state.first; + this.firstChange.emit(this.first); + } + + if (this.rows !== undefined) { + this.rows = state.rows; + this.rowsChange.emit(this.rows); + } + } + + if (state.sortField) { + this.restoringSort = true; + this._sortField = state.sortField; + this._sortOrder = state.sortOrder; + } + + if (state.multiSortMeta) { + this.restoringSort = true; + this._multiSortMeta = state.multiSortMeta; + } + + if (state.filters) { + this.restoringFilter = true; + this.filters = state.filters; + } + + if (this.resizableColumns) { + this.columnWidthsState = state.columnWidths; + this.tableWidthState = state.tableWidth; + } + + // if (this.reorderableColumns) { + // this.restoreColumnOrder(); + // } + + if (state.expandedRowKeys) { + this.expandedRowKeys = state.expandedRowKeys; + } + + if (state.selection) { + Promise.resolve(null).then(() => this.selectionChange.emit(state.selection)); + } + + this.stateRestored = true; + + this.onStateRestore.emit(state); + } + } + + saveColumnWidths(state: any) { + let widths: any[] = []; + let headers: any[] = []; + + const container = this.el?.nativeElement; + + if (container) { + headers = DomHandler.find(container, '[data-pc-section="thead"] > tr > th'); + } + + headers.forEach((header) => (widths as any[]).push(DomHandler.getOuterWidth(header))); + state.columnWidths = widths.join(','); + + if (this.columnResizeMode === 'expand' && this.tableViewChild) { + state.tableWidth = DomHandler.getOuterWidth(this.tableViewChild.nativeElement); + } + } + + setResizeTableWidth(width: string) { + (this.tableViewChild).nativeElement.style.width = width; + (this.tableViewChild).nativeElement.style.minWidth = width; + } + + restoreColumnWidths() { + if (this.columnWidthsState) { + let widths = this.columnWidthsState.split(','); + + if (this.columnResizeMode === 'expand' && this.tableWidthState) { + this.setResizeTableWidth(this.tableWidthState + 'px'); + } + + if (ObjectUtils.isNotEmpty(widths)) { + this.createStyleElement(); + + let innerHTML = ''; + widths.forEach((width, index) => { + let style = `width: ${width}px !important; max-width: ${width}px !important`; + + innerHTML += ` + #${this.id}-table > .p-datatable-thead > tr > th:nth-child(${index + 1}), + #${this.id}-table > .p-datatable-tbody > tr > td:nth-child(${index + 1}), + #${this.id}-table > .p-datatable-tfoot > tr > td:nth-child(${index + 1}) { + ${style} + } + `; + }); + + this.styleElement.innerHTML = innerHTML; + } + } + } + + saveColumnOrder(state: any) { + if (this.columns) { + let columnOrder: string[] = []; + this.columns.map((column) => { + columnOrder.push(column.field || column.key); + }); + + state.columnOrder = columnOrder; + } + } + + restoreColumnOrder() { + const storage = this.getStorage(); + const stateString = storage.getItem(this.stateKey); + if (stateString) { + let state: TableState = JSON.parse(stateString); + let columnOrder = state.columnOrder; + + if (columnOrder) { + let reorderedColumns: any[] = []; + + columnOrder.map((key) => { + let col = this.findColumnByKey(key); + if (col) { + reorderedColumns.push(col); + } + }); + this.columnOrderStateRestored = true; + this.columns = reorderedColumns; + } + } + } + + findColumnByKey(key: any) { + if (this.columns) { + for (let col of this.columns) { + if (col.key === key || col.field === key) return col; + else continue; + } + } else { + return null; + } + } + + createStyleElement() { + this.styleElement = this.renderer.createElement('style'); + this.styleElement.type = 'text/css'; + DomHandler.setAttribute(this.styleElement, 'nonce', this.config?.csp()?.nonce); + this.renderer.appendChild(this.document.head, this.styleElement); + DomHandler.setAttribute(this.styleElement, 'nonce', this.config?.csp()?.nonce); + } + + getGroupRowsMeta() { + return { field: this.groupRowsBy, order: this.groupRowsByOrder }; + } + + createResponsiveStyle() { + if (isPlatformBrowser(this.platformId)) { + if (!this.responsiveStyleElement) { + this.responsiveStyleElement = this.renderer.createElement('style'); + this.responsiveStyleElement.type = 'text/css'; + DomHandler.setAttribute(this.responsiveStyleElement, 'nonce', this.config?.csp()?.nonce); + this.renderer.appendChild(this.document.head, this.responsiveStyleElement); + + let innerHTML = ` + @media screen and (max-width: ${this.breakpoint}) { + #${this.id}-table > .p-datatable-thead > tr > th, + #${this.id}-table > .p-datatable-tfoot > tr > td { + display: none !important; + } + + #${this.id}-table > .p-datatable-tbody > tr > td { + display: flex; + width: 100% !important; + align-items: center; + justify-content: space-between; + } + + #${this.id}-table > .p-datatable-tbody > tr > td:not(:last-child) { + border: 0 none; + } + + #${this.id}.p-datatable-gridlines > .p-datatable-table-container > .p-datatable-table > .p-datatable-tbody > tr > td:last-child { + border-top: 0; + border-right: 0; + border-left: 0; + } + + #${this.id}-table > .p-datatable-tbody > tr > td > .p-datatable-column-title { + display: block; + } + } + `; + this.renderer.setProperty(this.responsiveStyleElement, 'innerHTML', innerHTML); + DomHandler.setAttribute(this.responsiveStyleElement, 'nonce', this.config?.csp()?.nonce); + } + } + } + + destroyResponsiveStyle() { + if (this.responsiveStyleElement) { + this.renderer.removeChild(this.document.head, this.responsiveStyleElement); + this.responsiveStyleElement = null; + } + } + + destroyStyleElement() { + if (this.styleElement) { + this.renderer.removeChild(this.document.head, this.styleElement); + this.styleElement = null; + } + } + + ngAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + + onDestroy() { + this.unbindDocumentEditListener(); + this.editingCell = null; + this.initialized = null; + + this.destroyStyleElement(); + this.destroyResponsiveStyle(); + } + + get dataP() { + return this.cn({ + scrollable: this.scrollable, + 'flex-scrollable': this.scrollable && this.scrollHeight === 'flex', + [this.size as string]: this.size, + loading: this.loading, + empty: this.isEmpty() + }); + } +} + +@Component({ + selector: '[pTableBody]', + standalone: false, + template: ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `, + changeDetection: ChangeDetectionStrategy.Eager, + encapsulation: ViewEncapsulation.None, + host: { + '[attr.data-p]': 'dataP' + } +}) +export class TableBody extends BaseComponent { + hostName = 'Table'; + + @Input('pTableBody') columns: any[] | undefined; + + @Input('pTableBodyTemplate') template: Nullable>; + + @Input() get value(): any[] | undefined { + return this._value; + } + set value(val: any[] | undefined) { + this._value = val; + if (this.frozenRows) { + this.updateFrozenRowStickyPosition(); + } + + if (this.dataTable.scrollable && this.dataTable.rowGroupMode === 'subheader') { + this.updateFrozenRowGroupHeaderStickyPosition(); + } + } + + @Input({ transform: booleanAttribute }) frozen: boolean | undefined; + + @Input({ transform: booleanAttribute }) frozenRows: boolean | undefined; + + @Input() scrollerOptions: any; + + subscription: Subscription; + + _value: any[] | undefined; + + onAfterViewInit() { + if (this.frozenRows) { + this.updateFrozenRowStickyPosition(); + } + + if (this.dataTable.scrollable && this.dataTable.rowGroupMode === 'subheader') { + this.updateFrozenRowGroupHeaderStickyPosition(); + } + } + + constructor( + public dataTable: Table, + public tableService: TableService + ) { + super(); + this.subscription = this.dataTable.tableService.valueSource$.subscribe(() => { + if (this.dataTable.virtualScroll) { + this.cd.detectChanges(); + } + }); + } + + shouldRenderRowGroupHeader(value: any, rowData: any, i: number) { + let currentRowFieldData = ObjectUtils.resolveFieldData(rowData, this.dataTable?.groupRowsBy || ''); + let prevRowData = value[i - (this.dataTable?._first || 0) - 1]; + if (prevRowData) { + let previousRowFieldData = ObjectUtils.resolveFieldData(prevRowData, this.dataTable?.groupRowsBy || ''); + return currentRowFieldData !== previousRowFieldData; + } else { + return true; + } + } + + shouldRenderRowGroupFooter(value: any, rowData: any, i: number) { + let currentRowFieldData = ObjectUtils.resolveFieldData(rowData, this.dataTable?.groupRowsBy || ''); + let nextRowData = value[i - (this.dataTable?._first || 0) + 1]; + if (nextRowData) { + let nextRowFieldData = ObjectUtils.resolveFieldData(nextRowData, this.dataTable?.groupRowsBy || ''); + return currentRowFieldData !== nextRowFieldData; + } else { + return true; + } + } + + shouldRenderRowspan(value: any, rowData: any, i: number) { + let currentRowFieldData = ObjectUtils.resolveFieldData(rowData, this.dataTable?.groupRowsBy!); + let prevRowData = value[i - 1]; + if (prevRowData) { + let previousRowFieldData = ObjectUtils.resolveFieldData(prevRowData, this.dataTable?.groupRowsBy || ''); + return currentRowFieldData !== previousRowFieldData; + } else { + return true; + } + } + + calculateRowGroupSize(value: any, rowData: any, index: number) { + let currentRowFieldData = ObjectUtils.resolveFieldData(rowData, this.dataTable?.groupRowsBy!); + let nextRowFieldData = currentRowFieldData; + let groupRowSpan = 0; + + while (currentRowFieldData === nextRowFieldData) { + groupRowSpan++; + let nextRowData = value[++index]; + if (nextRowData) { + nextRowFieldData = ObjectUtils.resolveFieldData(nextRowData, this.dataTable?.groupRowsBy || ''); + } else { + break; + } + } + + return groupRowSpan === 1 ? null : groupRowSpan; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } + + updateFrozenRowStickyPosition() { + this.el.nativeElement.style.top = DomHandler.getOuterHeight(this.el.nativeElement.previousElementSibling) + 'px'; + } + + updateFrozenRowGroupHeaderStickyPosition() { + if (this.el.nativeElement.previousElementSibling) { + let tableHeaderHeight = DomHandler.getOuterHeight(this.el.nativeElement.previousElementSibling); + this.dataTable.rowGroupHeaderStyleObject.top = tableHeaderHeight + 'px'; + } + } + + getScrollerOption(option: any, options?: any) { + if (this.dataTable.virtualScroll) { + options = options || this.scrollerOptions; + return options ? options[option] : null; + } + + return null; + } + + getRowIndex(rowIndex: number) { + const index = this.dataTable.paginator ? this.dataTable.first + rowIndex : rowIndex; + const getItemOptions = this.getScrollerOption('getItemOptions'); + return getItemOptions ? getItemOptions(index).index : index; + } + + get dataP() { + return this.cn({ + hoverable: this.dataTable.rowHover || this.dataTable.selectionMode, + frozen: this.frozen + }); + } +} + +@Directive({ + selector: '[pRowGroupHeader]', + standalone: false, + host: { + '[class]': 'cx("rowGroupHeader")', + '[style]': 'sx("rowGroupHeader")' + }, + providers: [TableStyle] +}) +export class RowGroupHeader extends BaseComponent { + constructor(public dataTable: Table) { + super(); + } + + _componentStyle = inject(TableStyle); + + get getFrozenRowGroupHeaderStickyPosition() { + return this.dataTable.rowGroupHeaderStyleObject ? this.dataTable.rowGroupHeaderStyleObject.top : ''; + } +} + +@Directive({ + selector: '[pFrozenColumn]', + standalone: false, + host: { + '[class]': 'cx("frozenColumn")' + }, + providers: [TableStyle] +}) +export class FrozenColumn extends BaseComponent { + @Input() get frozen(): boolean { + return this._frozen; + } + + set frozen(val: boolean) { + this._frozen = val; + Promise.resolve(null).then(() => this.updateStickyPosition()); + } + + @Input() alignFrozen: string = 'left'; + + resizeListener: VoidListener; + + private resizeObserver?: ResizeObserver; + + _componentStyle = inject(TableStyle); + + onAfterViewInit() { + this.bindResizeListener(); + this.observeChanges(); + } + + bindResizeListener() { + if (isPlatformBrowser(this.platformId)) { + if (!this.resizeListener) { + this.resizeListener = this.renderer.listen(this.document.defaultView, 'resize', () => { + this.recalculateColumns(); + }); + } + } + } + + unbindResizeListener() { + if (this.resizeListener) { + this.resizeListener(); + this.resizeListener = null; + } + } + + observeChanges() { + if (isPlatformBrowser(this.platformId)) { + const resizeObserver = new ResizeObserver(() => { + this.recalculateColumns(); + }); + + resizeObserver.observe(this.el.nativeElement); + this.resizeObserver = resizeObserver; + } + } + + recalculateColumns() { + const siblings = DomHandler.siblings(this.el.nativeElement); + const index = DomHandler.index(this.el.nativeElement); + const time = (siblings.length - index + 1) * 50; + + setTimeout(() => { + this.updateStickyPosition(); + }, time); + } + + _frozen: boolean = true; + + updateStickyPosition() { + if (this._frozen) { + if (this.alignFrozen === 'right') { + let right = 0; + let sibling = this.el.nativeElement.nextElementSibling; + while (sibling) { + right += DomHandler.getOuterWidth(sibling); + sibling = sibling.nextElementSibling; + } + this.el.nativeElement.style.right = right + 'px'; + } else { + let left = 0; + let sibling = this.el.nativeElement.previousElementSibling; + while (sibling) { + left += DomHandler.getOuterWidth(sibling); + sibling = sibling.previousElementSibling; + } + this.el.nativeElement.style.left = left + 'px'; + } + + const filterRow = this.el.nativeElement?.parentElement?.nextElementSibling; + if (filterRow) { + let index = DomHandler.index(this.el.nativeElement); + if (filterRow.children && filterRow.children[index]) { + filterRow.children[index].style.left = this.el.nativeElement.style.left; + filterRow.children[index].style.right = this.el.nativeElement.style.right; + } + } + } + } + + onDestroy() { + this.unbindResizeListener(); + if (this.resizeObserver) { + this.resizeObserver.disconnect(); + } + } +} +@Directive({ + selector: '[pSortableColumn]', + standalone: false, + host: { + '[class]': "cx('sortableColumn')", + '[tabindex]': 'isEnabled() ? "0" : null', + role: 'columnheader', + '[attr.aria-sort]': 'sortOrder' + }, + providers: [TableStyle] +}) +export class SortableColumn extends BaseComponent { + @Input('pSortableColumn') field: string | undefined; + + @Input({ transform: booleanAttribute }) pSortableColumnDisabled: boolean | undefined; + + role = this.el.nativeElement?.tagName !== 'TH' ? 'columnheader' : null; + + sorted: boolean | undefined; + + sortOrder: string | undefined; + + subscription: Subscription | undefined; + + _componentStyle = inject(TableStyle); + + constructor(public dataTable: Table) { + super(); + if (this.isEnabled()) { + this.subscription = this.dataTable.tableService.sortSource$.subscribe((sortMeta) => { + this.updateSortState(); + }); + } + } + + onInit() { + if (this.isEnabled()) { + this.updateSortState(); + } + } + + updateSortState() { + let sorted = false; + let sortOrder = 0; + + if (this.dataTable.sortMode === 'single') { + sorted = this.dataTable.isSorted(this.field) as boolean; + sortOrder = this.dataTable.sortOrder; + } else if (this.dataTable.sortMode === 'multiple') { + const sortMeta = this.dataTable.getSortMeta(this.field); + sorted = !!sortMeta; + sortOrder = sortMeta ? sortMeta.order : 0; + } + + this.sorted = sorted; + this.sortOrder = sorted ? (sortOrder === 1 ? 'ascending' : 'descending') : 'none'; + } + + @HostListener('click', ['$event']) + onClick(event: MouseEvent) { + if (this.isEnabled() && !this.isFilterElement(event.target)) { + this.updateSortState(); + this.dataTable.sort({ + originalEvent: event, + field: this.field + }); + + DomHandler.clearSelection(); + } + } + + @HostListener('keydown.space', ['$any($event)']) + @HostListener('keydown.enter', ['$any($event)']) + onEnterKey(event: MouseEvent) { + this.onClick(event); + + event.preventDefault(); + } + + isEnabled() { + return this.pSortableColumnDisabled !== true; + } + + isFilterElement(element: HTMLElement) { + return this.isFilterElementIconOrButton(element) || this.isFilterElementIconOrButton(element?.parentElement?.parentElement!); + } + + private isFilterElementIconOrButton(element: HTMLElement) { + return getAttribute(element, '[data-pc-name="pccolumnfilterbutton"]') || getAttribute(element, '[data-pc-section="columnfilterbuttonicon"]'); + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Component({ + selector: 'p-sortIcon', + standalone: false, + template: ` + + + + + + + + + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + providers: [TableStyle] +}) +export class SortIcon extends BaseComponent { + @Input() field: string | undefined; + + subscription: Subscription | undefined; + + sortOrder: number | undefined; + + _componentStyle = inject(TableStyle); + + constructor( + public dataTable: Table, + public cd: ChangeDetectorRef + ) { + super(); + this.subscription = this.dataTable.tableService.sortSource$.subscribe((sortMeta) => { + this.updateSortState(); + }); + } + + onInit() { + this.updateSortState(); + } + + onClick(event: Event) { + event.preventDefault(); + } + + updateSortState() { + if (this.dataTable.sortMode === 'single') { + this.sortOrder = this.dataTable.isSorted(this.field) ? this.dataTable.sortOrder : 0; + } else if (this.dataTable.sortMode === 'multiple') { + let sortMeta = this.dataTable.getSortMeta(this.field); + this.sortOrder = sortMeta ? sortMeta.order : 0; + } + + this.cd.markForCheck(); + } + + getMultiSortMetaIndex() { + let multiSortMeta = this.dataTable._multiSortMeta; + let index = -1; + + if (multiSortMeta && this.dataTable.sortMode === 'multiple' && this.dataTable.showInitialSortBadge && multiSortMeta.length > 1) { + for (let i = 0; i < multiSortMeta.length; i++) { + let meta = multiSortMeta[i]; + if (meta.field === this.field || meta.field === this.field) { + index = i; + break; + } + } + } + + return index; + } + + getBadgeValue() { + let index = this.getMultiSortMetaIndex(); + + return (this.dataTable?.groupRowsBy || '') && index > -1 ? index : index + 1; + } + + isMultiSorted() { + return this.dataTable.sortMode === 'multiple' && this.getMultiSortMetaIndex() > -1; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Directive({ + selector: '[pSelectableRow]', + standalone: false, + host: { + '[class]': "cx('selectableRow')", + '[tabindex]': 'setRowTabIndex()', + '[attr.data-p-selectable-row]': 'true' + }, + providers: [TableStyle] +}) +export class SelectableRow extends BaseComponent { + @Input('pSelectableRow') data: any; + + @Input('pSelectableRowIndex') index: number | undefined; + + @Input({ transform: booleanAttribute }) pSelectableRowDisabled: boolean | undefined; + + selected: boolean | undefined; + + subscription: Subscription | undefined; + + _componentStyle = inject(TableStyle); + + constructor( + public dataTable: Table, + public tableService: TableService + ) { + super(); + if (this.isEnabled()) { + this.subscription = this.dataTable.tableService.selectionSource$.subscribe(() => { + this.selected = this.dataTable.isSelected(this.data); + }); + } + } + + setRowTabIndex() { + if (this.dataTable.selectionMode === 'single' || this.dataTable.selectionMode === 'multiple') { + return !this.dataTable.selection ? 0 : this.dataTable.anchorRowIndex === this.index ? 0 : -1; + } + } + + onInit() { + if (this.isEnabled()) { + this.selected = this.dataTable.isSelected(this.data); + } + } + + @HostListener('click', ['$event']) + onClick(event: Event) { + if (this.isEnabled()) { + this.dataTable.handleRowClick({ + originalEvent: event, + rowData: this.data, + rowIndex: this.index + }); + } + } + + @HostListener('touchend', ['$event']) + onTouchEnd(event: Event) { + if (this.isEnabled()) { + this.dataTable.handleRowTouchEnd(event); + } + } + + @HostListener('keydown', ['$event']) + onKeyDown(event: KeyboardEvent) { + switch (event.code) { + case 'ArrowDown': + this.onArrowDownKey(event); + break; + + case 'ArrowUp': + this.onArrowUpKey(event); + break; + + case 'Home': + this.onHomeKey(event); + break; + + case 'End': + this.onEndKey(event); + break; + + case 'Space': + this.onSpaceKey(event); + break; + + case 'Enter': + this.onEnterKey(event); + break; + + default: + if (event.code === 'KeyA' && (event.metaKey || event.ctrlKey) && this.dataTable.selectionMode === 'multiple') { + const data = this.dataTable.dataToRender(this.dataTable.processedData); + this.dataTable.selection = [...data]; + this.dataTable.selectRange(event, data.length - 1, true); + + event.preventDefault(); + } + break; + } + } + + onArrowDownKey(event: KeyboardEvent) { + if (!this.isEnabled()) { + return; + } + + const row = event.currentTarget; + const nextRow = this.findNextSelectableRow(row); + + if (nextRow) { + nextRow.focus(); + } + + event.preventDefault(); + } + + onArrowUpKey(event: KeyboardEvent) { + if (!this.isEnabled()) { + return; + } + + const row = event.currentTarget; + const prevRow = this.findPrevSelectableRow(row); + + if (prevRow) { + prevRow.focus(); + } + + event.preventDefault(); + } + + onEnterKey(event: KeyboardEvent) { + if (!this.isEnabled()) { + return; + } + + this.dataTable.handleRowClick({ + originalEvent: event, + rowData: this.data, + rowIndex: this.index + }); + } + + onEndKey(event: KeyboardEvent) { + const lastRow = this.findLastSelectableRow(); + lastRow && this.focusRowChange(this.el.nativeElement, lastRow); + + if (event.ctrlKey && event.shiftKey) { + const data = this.dataTable.dataToRender(this.dataTable.rows); + const lastSelectableRowIndex = DomHandler.getAttribute(lastRow, 'index'); + + this.dataTable.anchorRowIndex = lastSelectableRowIndex; + this.dataTable.selection = data.slice(this.index || 0, data.length); + this.dataTable.selectRange(event, this.index || 0); + } + event.preventDefault(); + } + + onHomeKey(event: KeyboardEvent) { + const firstRow = this.findFirstSelectableRow(); + + firstRow && this.focusRowChange(this.el.nativeElement, firstRow); + + if (event.ctrlKey && event.shiftKey) { + const data = this.dataTable.dataToRender(this.dataTable.rows); + const firstSelectableRowIndex = DomHandler.getAttribute(firstRow, 'index'); + + this.dataTable.anchorRowIndex = this.dataTable.anchorRowIndex || firstSelectableRowIndex || 0; + this.dataTable.selection = data.slice(0, (this.index || 0) + 1); + this.dataTable.selectRange(event, this.index || 0); + } + event.preventDefault(); + } + + onSpaceKey(event) { + const isInput = event.target instanceof HTMLInputElement || event.target instanceof HTMLSelectElement || event.target instanceof HTMLTextAreaElement; + if (isInput) { + return; + } else { + this.onEnterKey(event); + + if (event.shiftKey && this.dataTable.selection !== null) { + const data = this.dataTable.dataToRender(this.dataTable.rows); + let index; + + if (ObjectUtils.isNotEmpty(this.dataTable.selection) && this.dataTable.selection.length > 0) { + let firstSelectedRowIndex, lastSelectedRowIndex; + firstSelectedRowIndex = ObjectUtils.findIndexInList(this.dataTable.selection[0], data); + lastSelectedRowIndex = ObjectUtils.findIndexInList(this.dataTable.selection[this.dataTable.selection.length - 1], data); + + index = (this.index || 0) <= firstSelectedRowIndex ? lastSelectedRowIndex : firstSelectedRowIndex; + } else { + index = ObjectUtils.findIndexInList(this.dataTable.selection, data); + } + + this.dataTable.anchorRowIndex = index || 0; + this.dataTable.selection = index !== this.index ? data.slice(Math.min(index || 0, this.index || 0), Math.max(index || 0, this.index || 0) + 1) : [this.data]; + this.dataTable.selectRange(event, this.index || 0); + } + + event.preventDefault(); + } + } + + focusRowChange(firstFocusableRow, currentFocusedRow) { + firstFocusableRow.tabIndex = '-1'; + currentFocusedRow.tabIndex = '0'; + DomHandler.focus(currentFocusedRow); + } + + findLastSelectableRow() { + const rows = DomHandler.find(this.dataTable.el.nativeElement, '[data-p-selectable-row="true"]'); + + return rows ? rows[rows.length - 1] : null; + } + + findFirstSelectableRow() { + const firstRow = DomHandler.findSingle(this.dataTable.el.nativeElement, '[data-p-selectable-row="true"]'); + + return firstRow; + } + + findNextSelectableRow(row: HTMLTableRowElement): HTMLTableRowElement | null { + let nextRow = row.nextElementSibling; + + if (nextRow) { + if (find(nextRow, '[data-p-selectable-row="true"]')) return nextRow; + else return this.findNextSelectableRow(nextRow); + } else { + return null; + } + } + + findPrevSelectableRow(row: HTMLTableRowElement): HTMLTableRowElement | null { + let prevRow = row.previousElementSibling; + if (prevRow) { + if (find(prevRow, '[data-p-selectable-row="true"]')) return prevRow; + else return this.findPrevSelectableRow(prevRow); + } else { + return null; + } + } + + isEnabled() { + return this.pSelectableRowDisabled !== true; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Directive({ + selector: '[pSelectableRowDblClick]', + standalone: false, + host: { + '[class]': 'cx("selectableRow")' + }, + providers: [TableStyle] +}) +export class SelectableRowDblClick extends BaseComponent { + @Input('pSelectableRowDblClick') data: any; + + @Input('pSelectableRowIndex') index: number | undefined; + + @Input({ transform: booleanAttribute }) pSelectableRowDisabled: boolean | undefined; + + selected: boolean | undefined; + + subscription: Subscription | undefined; + + _componentStyle = inject(TableStyle); + + constructor( + public dataTable: Table, + public tableService: TableService + ) { + super(); + if (this.isEnabled()) { + this.subscription = this.dataTable.tableService.selectionSource$.subscribe(() => { + this.selected = this.dataTable.isSelected(this.data); + }); + } + } + + onInit() { + if (this.isEnabled()) { + this.selected = this.dataTable.isSelected(this.data); + } + } + + @HostListener('dblclick', ['$event']) + onClick(event: Event) { + if (this.isEnabled()) { + this.dataTable.handleRowClick({ + originalEvent: event, + rowData: this.data, + rowIndex: this.index + }); + } + } + + isEnabled() { + return this.pSelectableRowDisabled !== true; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Directive({ + selector: '[pContextMenuRow]', + standalone: false, + host: { + '[class]': 'cx("contextMenuRowSelected")', + '[attr.tabindex]': 'isEnabled() ? 0 : undefined' + }, + providers: [TableStyle] +}) +export class ContextMenuRow extends BaseComponent { + @Input('pContextMenuRow') data: any; + + @Input('pContextMenuRowIndex') index: number | undefined; + + @Input({ transform: booleanAttribute }) pContextMenuRowDisabled: boolean | undefined; + + selected: boolean | undefined; + + subscription: Subscription | undefined; + + _componentStyle = inject(TableStyle); + + constructor( + public dataTable: Table, + public tableService: TableService + ) { + super(); + if (this.isEnabled()) { + this.subscription = this.dataTable.tableService.contextMenuSource$.subscribe((data) => { + this.selected = data ? this.dataTable.equals(this.data, data) : false; + }); + } + } + + @HostListener('contextmenu', ['$event']) + onContextMenu(event: Event) { + if (this.isEnabled()) { + this.dataTable.handleRowRightClick({ + originalEvent: event, + rowData: this.data, + rowIndex: this.index + }); + + this.el.nativeElement.focus(); + event.preventDefault(); + } + } + + isEnabled() { + return this.pContextMenuRowDisabled !== true; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Directive({ + selector: '[pRowToggler]', + standalone: false +}) +export class RowToggler extends BaseComponent { + @Input('pRowToggler') data: any; + + @Input({ transform: booleanAttribute }) pRowTogglerDisabled: boolean | undefined; + + constructor(public dataTable: Table) { + super(); + } + + @HostListener('click', ['$event']) + onClick(event: Event) { + if (this.isEnabled()) { + this.dataTable.toggleRow(this.data, event); + event.preventDefault(); + } + } + + isEnabled() { + return this.pRowTogglerDisabled !== true; + } +} + +@Directive({ + selector: '[pResizableColumn]', + standalone: false, + host: { + '[class]': "cx('resizableColumn')" + }, + providers: [TableStyle] +}) +export class ResizableColumn extends BaseComponent { + @Input({ transform: booleanAttribute }) pResizableColumnDisabled: boolean | undefined; + + resizer: HTMLSpanElement | undefined; + + resizerMouseDownListener: VoidListener; + + resizerTouchStartListener: VoidListener; + + resizerTouchMoveListener: VoidListener; + + resizerTouchEndListener: VoidListener; + + documentMouseMoveListener: VoidListener; + + documentMouseUpListener: VoidListener; + + _componentStyle = inject(TableStyle); + + constructor( + public dataTable: Table, + public zone: NgZone + ) { + super(); + } + + onAfterViewInit() { + if (isPlatformBrowser(this.platformId)) { + if (this.isEnabled()) { + this.resizer = this.renderer.createElement('span'); + setAttribute(this.resizer as HTMLElement, 'data-pc-column-resizer', 'true'); + !this.$unstyled() && this.renderer.addClass(this.resizer, 'p-datatable-column-resizer'); + this.renderer.appendChild(this.el.nativeElement, this.resizer); + + this.zone.runOutsideAngular(() => { + this.resizerMouseDownListener = this.renderer.listen(this.resizer, 'mousedown', this.onMouseDown.bind(this)); + this.resizerTouchStartListener = this.renderer.listen(this.resizer, 'touchstart', this.onTouchStart.bind(this)); + }); + } + } + } + + bindDocumentEvents() { + this.zone.runOutsideAngular(() => { + this.documentMouseMoveListener = this.renderer.listen(this.document, 'mousemove', this.onDocumentMouseMove.bind(this)); + this.documentMouseUpListener = this.renderer.listen(this.document, 'mouseup', this.onDocumentMouseUp.bind(this)); + this.resizerTouchMoveListener = this.renderer.listen(this.resizer, 'touchmove', this.onTouchMove.bind(this)); + this.resizerTouchEndListener = this.renderer.listen(this.resizer, 'touchend', this.onTouchEnd.bind(this)); + }); + } + + unbindDocumentEvents() { + if (this.documentMouseMoveListener) { + this.documentMouseMoveListener(); + this.documentMouseMoveListener = null; + } + + if (this.documentMouseUpListener) { + this.documentMouseUpListener(); + this.documentMouseUpListener = null; + } + if (this.resizerTouchMoveListener) { + this.resizerTouchMoveListener(); + this.resizerTouchMoveListener = null; + } + + if (this.resizerTouchEndListener) { + this.resizerTouchEndListener(); + this.resizerTouchEndListener = null; + } + } + + onMouseDown(event: MouseEvent) { + this.dataTable.onColumnResizeBegin(event); + this.bindDocumentEvents(); + } + + onTouchStart(event: TouchEvent) { + this.dataTable.onColumnResizeBegin(event); + this.bindDocumentEvents(); + } + + onTouchMove(event: TouchEvent) { + this.dataTable.onColumnResize(event); + } + onDocumentMouseMove(event: MouseEvent) { + this.dataTable.onColumnResize(event); + } + + onDocumentMouseUp(event: MouseEvent) { + this.dataTable.onColumnResizeEnd(); + this.unbindDocumentEvents(); + } + + onTouchEnd(event: TouchEvent) { + this.dataTable.onColumnResizeEnd(); + this.unbindDocumentEvents(); + } + + isEnabled() { + return this.pResizableColumnDisabled !== true; + } + + onDestroy() { + if (this.resizerMouseDownListener) { + this.resizerMouseDownListener(); + this.resizerMouseDownListener = null; + } + + this.unbindDocumentEvents(); + } +} + +@Directive({ + selector: '[pReorderableColumn]', + standalone: false, + host: { + '[class]': "cx('reorderableColumn')" + }, + providers: [TableStyle] +}) +export class ReorderableColumn extends BaseComponent { + @Input({ transform: booleanAttribute }) pReorderableColumnDisabled: boolean | undefined; + + dragStartListener: VoidListener; + + dragOverListener: VoidListener; + + dragEnterListener: VoidListener; + + dragLeaveListener: VoidListener; + + mouseDownListener: VoidListener; + + _componentStyle = inject(TableStyle); + + constructor( + public dataTable: Table, + public el: ElementRef, + public zone: NgZone + ) { + super(); + } + + onAfterViewInit() { + if (this.isEnabled()) { + this.bindEvents(); + } + } + + bindEvents() { + if (isPlatformBrowser(this.platformId)) { + this.zone.runOutsideAngular(() => { + this.mouseDownListener = this.renderer.listen(this.el.nativeElement, 'mousedown', this.onMouseDown.bind(this)); + + this.dragStartListener = this.renderer.listen(this.el.nativeElement, 'dragstart', this.onDragStart.bind(this)); + + this.dragOverListener = this.renderer.listen(this.el.nativeElement, 'dragover', this.onDragOver.bind(this)); + + this.dragEnterListener = this.renderer.listen(this.el.nativeElement, 'dragenter', this.onDragEnter.bind(this)); + + this.dragLeaveListener = this.renderer.listen(this.el.nativeElement, 'dragleave', this.onDragLeave.bind(this)); + }); + } + } + + unbindEvents() { + if (this.mouseDownListener) { + this.mouseDownListener(); + this.mouseDownListener = null; + } + + if (this.dragStartListener) { + this.dragStartListener(); + this.dragStartListener = null; + } + + if (this.dragOverListener) { + this.dragOverListener(); + this.dragOverListener = null; + } + + if (this.dragEnterListener) { + this.dragEnterListener(); + this.dragEnterListener = null; + } + + if (this.dragLeaveListener) { + this.dragLeaveListener(); + this.dragLeaveListener = null; + } + } + + onMouseDown(event: any) { + if (event.target.nodeName === 'INPUT' || event.target.nodeName === 'TEXTAREA' || findSingle(event.target, '[data-pc-column-resizer="true"]')) this.el.nativeElement.draggable = false; + else this.el.nativeElement.draggable = true; + } + + onDragStart(event: any) { + this.dataTable.onColumnDragStart(event, this.el.nativeElement); + } + + onDragOver(event: any) { + event.preventDefault(); + } + + onDragEnter(event: any) { + this.dataTable.onColumnDragEnter(event, this.el.nativeElement); + } + + onDragLeave(event: any) { + this.dataTable.onColumnDragLeave(event); + } + + @HostListener('drop', ['$event']) + onDrop(event: any) { + if (this.isEnabled()) { + this.dataTable.onColumnDrop(event, this.el.nativeElement); + } + } + + isEnabled() { + return this.pReorderableColumnDisabled !== true; + } + + onDestroy() { + this.unbindEvents(); + } +} + +@Directive({ + selector: '[pEditableColumn]', + standalone: false, + host: { + '[attr.data-p-editable-column]': 'true' + } +}) +export class EditableColumn extends BaseComponent { + @Input('pEditableColumn') data: any; + + @Input('pEditableColumnField') field: any; + + @Input('pEditableColumnRowIndex') rowIndex: number | undefined; + + @Input({ transform: booleanAttribute }) pEditableColumnDisabled: boolean | undefined; + + @Input() pFocusCellSelector: string | undefined; + + overlayEventListener: any; + + constructor( + public dataTable: Table, + public zone: NgZone + ) { + super(); + } + + public onChanges(changes: SimpleChanges): void { + if (this.el.nativeElement && !changes.data?.firstChange) { + this.dataTable.updateEditingCell(this.el.nativeElement, this.data, this.field, this.rowIndex); + } + } + + onAfterViewInit() { + if (this.isEnabled()) { + !this.$unstyled() && DomHandler.addClass(this.el.nativeElement, 'p-editable-column'); + } + } + + @HostListener('click', ['$event']) + onClick(event: MouseEvent) { + if (this.isEnabled()) { + this.dataTable.selfClick = true; + + if (this.dataTable.editingCell) { + if (this.dataTable.editingCell !== this.el.nativeElement) { + if (!this.dataTable.isEditingCellValid()) { + return; + } + + this.closeEditingCell(true, event); + this.openCell(); + } + } else { + this.openCell(); + } + } + } + + openCell() { + this.dataTable.updateEditingCell(this.el.nativeElement, this.data, this.field, this.rowIndex); + !this.$unstyled() && DomHandler.addClass(this.el.nativeElement, 'p-cell-editing'); + setAttribute(this.el.nativeElement, 'data-p-cell-editing', 'true'); + + this.dataTable.onEditInit.emit({ + field: this.field, + data: this.data, + index: this.rowIndex + }); + this.zone.runOutsideAngular(() => { + setTimeout(() => { + let focusCellSelector = this.pFocusCellSelector || 'input, textarea, select'; + let focusableElement = DomHandler.findSingle(this.el.nativeElement, focusCellSelector); + + if (focusableElement) { + focusableElement.focus(); + } + }, 50); + }); + + this.overlayEventListener = (e: any) => { + if (this.el && this.el.nativeElement.contains(e.target)) { + this.dataTable.selfClick = true; + } + }; + + this.dataTable.overlaySubscription = this.dataTable.overlayService.clickObservable.subscribe(this.overlayEventListener); + } + + closeEditingCell(completed: any, event: Event) { + const eventData = { + field: this.dataTable.editingCellField, + data: this.dataTable.editingCellData, + originalEvent: event, + index: this.dataTable.editingCellRowIndex + }; + + if (completed) { + this.dataTable.onEditComplete.emit(eventData); + } else { + this.dataTable.onEditCancel.emit(eventData); + + this.dataTable.value.forEach((element) => { + if (element[this.dataTable.editingCellField] === this.data) { + element[this.dataTable.editingCellField] = this.dataTable.editingCellData; + } + }); + } + + !this.$unstyled() && DomHandler.removeClass(this.dataTable.editingCell, 'p-cell-editing'); + setAttribute(this.el.nativeElement, 'data-p-cell-editing', 'false'); + this.dataTable.editingCell = null; + this.dataTable.editingCellData = null; + this.dataTable.editingCellField = null; + this.dataTable.unbindDocumentEditListener(); + + if (this.dataTable.overlaySubscription) { + this.dataTable.overlaySubscription.unsubscribe(); + } + } + + @HostListener('keydown.enter', ['$any($event)']) + onEnterKeyDown(event: KeyboardEvent) { + if (this.isEnabled() && !event.shiftKey) { + if (this.dataTable.isEditingCellValid()) { + this.closeEditingCell(true, event); + } + + event.preventDefault(); + } + } + + @HostListener('keydown.tab', ['$any($event)']) + onTabKeyDown(event: KeyboardEvent) { + if (this.isEnabled()) { + if (this.dataTable.isEditingCellValid()) { + this.closeEditingCell(true, event); + } + + event.preventDefault(); + } + } + + @HostListener('keydown.escape', ['$any($event)']) + onEscapeKeyDown(event: KeyboardEvent) { + if (this.isEnabled()) { + if (this.dataTable.isEditingCellValid()) { + this.closeEditingCell(false, event); + } + + event.preventDefault(); + } + } + + @HostListener('keydown.tab', ['$any($event)']) + @HostListener('keydown.shift.tab', ['$any($event)']) + @HostListener('keydown.meta.tab', ['$any($event)']) + onShiftKeyDown(event: KeyboardEvent) { + if (this.isEnabled()) { + if (event.shiftKey) this.moveToPreviousCell(event); + else { + this.moveToNextCell(event); + } + } + } + @HostListener('keydown.arrowdown', ['$any($event)']) + onArrowDown(event: KeyboardEvent) { + if (this.isEnabled()) { + let currentCell = this.findCell(event.target); + if (currentCell) { + let cellIndex = DomHandler.index(currentCell); + let targetCell = this.findNextEditableColumnByIndex(currentCell, cellIndex); + + if (targetCell) { + if (this.dataTable.isEditingCellValid()) { + this.closeEditingCell(true, event); + } + + DomHandler.invokeElementMethod(event.target, 'blur'); + DomHandler.invokeElementMethod(targetCell, 'click'); + } + + event.preventDefault(); + } + } + } + + @HostListener('keydown.arrowup', ['$any($event)']) + onArrowUp(event: KeyboardEvent) { + if (this.isEnabled()) { + let currentCell = this.findCell(event.target); + if (currentCell) { + let cellIndex = DomHandler.index(currentCell); + let targetCell = this.findPrevEditableColumnByIndex(currentCell, cellIndex); + + if (targetCell) { + if (this.dataTable.isEditingCellValid()) { + this.closeEditingCell(true, event); + } + + DomHandler.invokeElementMethod(event.target, 'blur'); + DomHandler.invokeElementMethod(targetCell, 'click'); + } + + event.preventDefault(); + } + } + } + + @HostListener('keydown.arrowleft', ['$any($event)']) + onArrowLeft(event: KeyboardEvent) { + if (this.isEnabled()) { + this.moveToPreviousCell(event); + } + } + + @HostListener('keydown.arrowright', ['$any($event)']) + onArrowRight(event: KeyboardEvent) { + if (this.isEnabled()) { + this.moveToNextCell(event); + } + } + + findCell(element: any) { + if (element) { + let cell = element; + while (cell && !findSingle(cell as HTMLElement, '[data-p-cell-editing="true"]')) { + cell = cell.parentElement; + } + + return cell; + } else { + return null; + } + } + + moveToPreviousCell(event: KeyboardEvent) { + let currentCell = this.findCell(event.target); + if (currentCell) { + let targetCell = this.findPreviousEditableColumn(currentCell); + + if (targetCell) { + if (this.dataTable.isEditingCellValid()) { + this.closeEditingCell(true, event); + } + + DomHandler.invokeElementMethod(event.target, 'blur'); + DomHandler.invokeElementMethod(targetCell, 'click'); + event.preventDefault(); + } + } + } + + moveToNextCell(event: KeyboardEvent) { + let currentCell = this.findCell(event.target); + if (currentCell) { + let targetCell = this.findNextEditableColumn(currentCell); + + if (targetCell) { + if (this.dataTable.isEditingCellValid()) { + this.closeEditingCell(true, event); + } + + DomHandler.invokeElementMethod(event.target, 'blur'); + DomHandler.invokeElementMethod(targetCell, 'click'); + event.preventDefault(); + } else { + if (this.dataTable.isEditingCellValid()) { + this.closeEditingCell(true, event); + } + } + } + } + + findPreviousEditableColumn(cell: any): HTMLTableCellElement | null { + let prevCell = cell.previousElementSibling; + + if (!prevCell) { + let previousRow = cell.parentElement?.previousElementSibling; + if (previousRow) { + prevCell = previousRow.lastElementChild; + } + } + + if (prevCell) { + if (findSingle(prevCell, '[data-p-editable-column="true"]')) return prevCell; + else return this.findPreviousEditableColumn(prevCell); + } else { + return null; + } + } + + findNextEditableColumn(cell: any): HTMLTableCellElement | null { + let nextCell = cell.nextElementSibling; + + if (!nextCell) { + let nextRow = cell.parentElement?.nextElementSibling; + if (nextRow) { + nextCell = nextRow.firstElementChild; + } + } + + if (nextCell) { + if (findSingle(nextCell, '[data-p-editable-column="true"]')) return nextCell; + else return this.findNextEditableColumn(nextCell); + } else { + return null; + } + } + + findNextEditableColumnByIndex(cell: Element, index: number) { + let nextRow = cell.parentElement?.nextElementSibling; + + if (nextRow) { + let nextCell = nextRow.children[index]; + + if (nextCell && findSingle(nextCell, '[data-p-editable-column="true"]')) { + return nextCell; + } + + return null; + } else { + return null; + } + } + + findPrevEditableColumnByIndex(cell: Element, index: number) { + let prevRow = cell.parentElement?.previousElementSibling; + + if (prevRow) { + let prevCell = prevRow.children[index]; + + if (prevCell && findSingle(prevCell, '[data-p-editable-column="true"]')) { + return prevCell; + } + + return null; + } else { + return null; + } + } + + isEnabled() { + return this.pEditableColumnDisabled !== true; + } + + onDestroy() { + if (this.dataTable.overlaySubscription) { + this.dataTable.overlaySubscription.unsubscribe(); + } + } +} + +@Directive({ + selector: '[pEditableRow]', + standalone: false +}) +export class EditableRow extends BaseComponent { + @Input('pEditableRow') data: any; + + @Input({ transform: booleanAttribute }) pEditableRowDisabled: boolean | undefined; + + isEnabled() { + return this.pEditableRowDisabled !== true; + } +} + +@Directive({ + selector: '[pInitEditableRow]', + standalone: false, + host: { + class: 'p-datatable-row-editor-init' + } +}) +export class InitEditableRow extends BaseComponent { + constructor( + public dataTable: Table, + public editableRow: EditableRow + ) { + super(); + } + + @HostListener('click', ['$event']) + onClick(event: Event) { + this.dataTable.initRowEdit(this.editableRow.data); + event.preventDefault(); + } +} + +@Directive({ + selector: '[pSaveEditableRow]', + standalone: false, + host: { + class: 'p-datatable-row-editor-save' + } +}) +export class SaveEditableRow extends BaseComponent { + constructor( + public dataTable: Table, + public editableRow: EditableRow + ) { + super(); + } + + @HostListener('click', ['$event']) + onClick(event: Event) { + this.dataTable.saveRowEdit(this.editableRow.data, this.editableRow.el.nativeElement); + event.preventDefault(); + } +} + +@Directive({ + selector: '[pCancelEditableRow]', + standalone: false, + host: { + '[class]': "cx('rowEditorCancel')" + }, + providers: [TableStyle] +}) +export class CancelEditableRow extends BaseComponent { + constructor( + public dataTable: Table, + public editableRow: EditableRow + ) { + super(); + } + _componentStyle = inject(TableStyle); + @HostListener('click', ['$event']) + onClick(event: Event) { + this.dataTable.cancelRowEdit(this.editableRow.data); + event.preventDefault(); + } +} + +@Component({ + selector: 'p-cellEditor', + standalone: false, + template: ` + + + + + + + `, + changeDetection: ChangeDetectionStrategy.Eager, + encapsulation: ViewEncapsulation.None +}) +export class CellEditor extends BaseComponent { + @ContentChildren(PrimeTemplate) _templates: Nullable>; + + @ContentChild('input') _inputTemplate: TemplateRef; + + @ContentChild('output') _outputTemplate: TemplateRef; + + inputTemplate: Nullable>; + + outputTemplate: Nullable>; + + constructor( + public dataTable: Table, + @Optional() public editableColumn: EditableColumn, + @Optional() public editableRow: EditableRow + ) { + super(); + } + + onAfterContentInit() { + (this._templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'input': + this.inputTemplate = item.template; + break; + + case 'output': + this.outputTemplate = item.template; + break; + } + }); + } + + get editing(): boolean { + return ( + (this.dataTable.editingCell && this.editableColumn && this.dataTable.editingCell === this.editableColumn.el.nativeElement) || (this.editableRow && this.dataTable.editMode === 'row' && this.dataTable.isRowEditing(this.editableRow.data)) + ); + } +} + +@Component({ + selector: 'p-tableRadioButton', + standalone: false, + template: ` `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None +}) +export class TableRadioButton extends BaseComponent { + @Input() value: any; + + readonly disabled = input(undefined, { transform: booleanAttribute }); + readonly index = input(undefined, { transform: numberAttribute }); + readonly inputId = input(); + readonly name = input(); + + @Input() ariaLabel: string | undefined; + + @ViewChild('rb') inputViewChild: Nullable; + + checked: boolean | undefined; + + subscription: Subscription; + + constructor( + public dataTable: Table, + public cd: ChangeDetectorRef + ) { + super(); + this.subscription = this.dataTable.tableService.selectionSource$.subscribe(() => { + this.checked = this.dataTable.isSelected(this.value); + + this.ariaLabel = this.ariaLabel || (this.dataTable.config.translation.aria ? (this.checked ? this.dataTable.config.translation.aria.selectRow : this.dataTable.config.translation.aria.unselectRow) : undefined); + this.cd.markForCheck(); + }); + } + + onInit() { + this.checked = this.dataTable.isSelected(this.value); + } + + onClick(event: RadioButtonClickEvent) { + if (!this.disabled()) { + this.dataTable.toggleRowWithRadio( + { + originalEvent: event.originalEvent, + rowIndex: this.index() + }, + this.value + ); + + this.inputViewChild?.inputViewChild.nativeElement?.focus(); + } + DomHandler.clearSelection(); + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Component({ + selector: 'p-tableCheckbox', + standalone: false, + template: ` + + @if (dataTable.checkboxIconTemplate || dataTable._checkboxIconTemplate; as template) { + + + + } + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None +}) +export class TableCheckbox extends BaseComponent { + @Input() value: any; + + readonly disabled = input(undefined, { transform: booleanAttribute }); + readonly required = input(undefined, { transform: booleanAttribute }); + readonly index = input(undefined, { transform: numberAttribute }); + readonly inputId = input(); + readonly name = input(); + + @Input() ariaLabel: string | undefined; + + checked: boolean | undefined; + + subscription: Subscription; + + constructor( + public dataTable: Table, + public tableService: TableService + ) { + super(); + this.subscription = this.dataTable.tableService.selectionSource$.subscribe(() => { + this.checked = this.dataTable.isSelected(this.value); + this.ariaLabel = this.ariaLabel || (this.dataTable.config.translation.aria ? (this.checked ? this.dataTable.config.translation.aria.selectRow : this.dataTable.config.translation.aria.unselectRow) : undefined); + this.cd.markForCheck(); + }); + } + + onInit() { + this.checked = this.dataTable.isSelected(this.value); + } + + onClick({ originalEvent }: CheckboxChangeEvent) { + if (!this.disabled()) { + this.dataTable.toggleRowWithCheckbox( + { + originalEvent: originalEvent!, + rowIndex: this.index() || 0 + }, + this.value + ); + } + DomHandler.clearSelection(); + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Component({ + selector: 'p-tableHeaderCheckbox', + standalone: false, + template: ` + + @if (dataTable.headerCheckboxIconTemplate || dataTable._headerCheckboxIconTemplate; as template) { + + + + } + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + hostDirectives: [Bind] +}) +export class TableHeaderCheckbox extends BaseComponent { + hostName = 'Table'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('headerCheckbox')); + } + + readonly disabled = input(undefined, { transform: booleanAttribute }); + readonly inputId = input(); + readonly name = input(); + + @Input() ariaLabel: string | undefined; + + checked: boolean | undefined; + + selectionChangeSubscription: Subscription; + + valueChangeSubscription: Subscription; + + constructor( + public dataTable: Table, + public tableService: TableService + ) { + super(); + this.valueChangeSubscription = this.dataTable.tableService.valueSource$.subscribe(() => { + this.checked = this.updateCheckedState(); + this.ariaLabel = this.ariaLabel || (this.dataTable.config.translation.aria ? (this.checked ? this.dataTable.config.translation.aria.selectAll : this.dataTable.config.translation.aria.unselectAll) : undefined); + }); + + this.selectionChangeSubscription = this.dataTable.tableService.selectionSource$.subscribe(() => { + this.checked = this.updateCheckedState(); + }); + } + + onInit() { + this.checked = this.updateCheckedState(); + } + + onClick(event: CheckboxChangeEvent) { + if (!this.disabled()) { + if (this.dataTable.value && this.dataTable.value.length > 0) { + this.dataTable.toggleRowsWithCheckbox(event, this.checked || false); + } + } + + DomHandler.clearSelection(); + } + + isDisabled() { + return this.disabled() || !this.dataTable.value || !this.dataTable.value.length; + } + + onDestroy() { + if (this.selectionChangeSubscription) { + this.selectionChangeSubscription.unsubscribe(); + } + + if (this.valueChangeSubscription) { + this.valueChangeSubscription.unsubscribe(); + } + } + + updateCheckedState() { + this.cd.markForCheck(); + + if (this.dataTable._selectAll !== null) { + return this.dataTable._selectAll; + } else { + const data = this.dataTable.selectionPageOnly ? this.dataTable.dataToRender(this.dataTable.processedData) : this.dataTable.processedData; + const val = this.dataTable.frozenValue ? [...this.dataTable.frozenValue, ...data] : data; + const selectableVal = this.dataTable.rowSelectable ? val.filter((data: any, index: number) => this.dataTable.rowSelectable({ data, index })) : val; + + return ObjectUtils.isNotEmpty(selectableVal) && ObjectUtils.isNotEmpty(this.dataTable.selection) && selectableVal.every((v: any) => this.dataTable.selection.some((s: any) => this.dataTable.equals(v, s))); + } + } +} + +@Directive({ + selector: '[pReorderableRowHandle]', + standalone: false, + host: { + '[class]': "cx('reorderableRowHandle')" + }, + providers: [TableStyle], + hostDirectives: [Bind] +}) +export class ReorderableRowHandle extends BaseComponent { + hostName = 'Table'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('reorderableRowHandle')); + } + + _componentStyle = inject(TableStyle); + + constructor(public el: ElementRef) { + super(); + } + + onAfterViewInit() { + // DomHandler.addClass(this.el.nativeElement, 'p-datatable-reorderable-row-handle'); + } +} + +@Directive({ + selector: '[pReorderableRow]', + standalone: false, + hostDirectives: [Bind] +}) +export class ReorderableRow extends BaseComponent { + hostName = 'Table'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('reorderableRow')); + } + + @Input('pReorderableRow') index: number | undefined; + + @Input({ transform: booleanAttribute }) pReorderableRowDisabled: boolean | undefined; + + mouseDownListener: VoidListener; + + dragStartListener: VoidListener; + + dragEndListener: VoidListener; + + dragOverListener: VoidListener; + + dragLeaveListener: VoidListener; + + dropListener: VoidListener; + + constructor( + public dataTable: Table, + public zone: NgZone + ) { + super(); + } + + onAfterViewInit() { + if (this.isEnabled()) { + this.el.nativeElement.droppable = true; + this.bindEvents(); + } + } + + bindEvents() { + this.zone.runOutsideAngular(() => { + this.mouseDownListener = this.renderer.listen(this.el.nativeElement, 'mousedown', this.onMouseDown.bind(this)); + + this.dragStartListener = this.renderer.listen(this.el.nativeElement, 'dragstart', this.onDragStart.bind(this)); + + this.dragEndListener = this.renderer.listen(this.el.nativeElement, 'dragend', this.onDragEnd.bind(this)); + + this.dragOverListener = this.renderer.listen(this.el.nativeElement, 'dragover', this.onDragOver.bind(this)); + + this.dragLeaveListener = this.renderer.listen(this.el.nativeElement, 'dragleave', this.onDragLeave.bind(this)); + }); + } + + unbindEvents() { + if (this.mouseDownListener) { + this.mouseDownListener(); + this.mouseDownListener = null; + } + + if (this.dragStartListener) { + this.dragStartListener(); + this.dragStartListener = null; + } + + if (this.dragEndListener) { + this.dragEndListener(); + this.dragEndListener = null; + } + + if (this.dragOverListener) { + this.dragOverListener(); + this.dragOverListener = null; + } + + if (this.dragLeaveListener) { + this.dragLeaveListener(); + this.dragLeaveListener = null; + } + } + + onMouseDown(event: Event) { + const targetElement = event.target as HTMLElement; + const isHandleClicked = this.isHandleElement(targetElement); + this.el.nativeElement.draggable = isHandleClicked; + } + + isHandleElement(element: HTMLElement): boolean { + if (element?.classList.contains('p-datatable-reorderable-row-handle')) { + return true; + } + + if (element?.parentElement && !['TD', 'TR'].includes(element?.parentElement?.tagName)) { + return this.isHandleElement(element?.parentElement); + } + + return false; + } + + onDragStart(event: DragEvent) { + this.dataTable.onRowDragStart(event, this.index); + } + + onDragEnd(event: DragEvent) { + this.dataTable.onRowDragEnd(event); + this.el.nativeElement.draggable = false; + } + + onDragOver(event: DragEvent) { + this.dataTable.onRowDragOver(event, this.index, this.el.nativeElement); + event.preventDefault(); + } + + onDragLeave(event: DragEvent) { + this.dataTable.onRowDragLeave(event, this.el.nativeElement); + } + + isEnabled() { + return this.pReorderableRowDisabled !== true; + } + + @HostListener('drop', ['$event']) + onDrop(event: DragEvent) { + if (this.isEnabled() && this.dataTable.rowDragging) { + this.dataTable.onRowDrop(event, this.el.nativeElement); + } + + event.preventDefault(); + } + + onDestroy() { + this.unbindEvents(); + } +} +/** + * Column Filter Component. + * @group Components + */ +@Component({ + selector: 'p-columnFilter, p-column-filter, p-columnfilter', + standalone: false, + template: ` +
+ + + + + + + + + + + + + @if (renderOverlay()) { +
+ +
    +
  • + {{ matchMode.label }} +
  • +
  • +
  • + {{ noFilterLabel }} +
  • +
+ +
+ +
+
+
+ + +
+ + + + + + +
+
+
+ @if (isShowAddConstraint) { + + + + + + + } +
+ + +
+
+ +
+ } +
+ `, + providers: [TableStyle], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.Eager, + hostDirectives: [Bind] +}) +export class ColumnFilter extends BaseComponent { + hostName = 'Table'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + _componentStyle = inject(TableStyle); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('columnFilter')); + } + + ptmFilterConstraintOptions(matchMode) { + return { + context: { + highlighted: matchMode && this.isRowMatchModeSelected(matchMode.value) + } + }; + } + /** + * Property represented by the column. + * @group Props + */ + @Input() field: string | undefined; + /** + * Type of the input. + * @group Props + */ + @Input() type: string = 'text'; + /** + * Filter display. + * @group Props + */ + @Input() display: string = 'row'; + /** + * Decides whether to display filter menu popup. + * @group Props + */ + @Input({ transform: booleanAttribute }) showMenu: boolean = true; + /** + * Filter match mode. + * @group Props + */ + @Input() matchMode: string | undefined; + /** + * Filter operator. + * @defaultValue 'AND' + * @group Props + */ + @Input() operator: string = FilterOperator.AND; + /** + * Decides whether to display filter operator. + * @group Props + */ + @Input({ transform: booleanAttribute }) showOperator: boolean = true; + /** + * Decides whether to display clear filter button when display is menu. + * @defaultValue true + * @group Props + */ + @Input({ transform: booleanAttribute }) showClearButton: boolean = true; + /** + * Decides whether to display apply filter button when display is menu. + * @group Props + */ + @Input({ transform: booleanAttribute }) showApplyButton: boolean = true; + /** + * Decides whether to display filter match modes when display is menu. + * @group Props + */ + @Input({ transform: booleanAttribute }) showMatchModes: boolean = true; + /** + * Decides whether to display add filter button when display is menu. + * @group Props + */ + @Input({ transform: booleanAttribute }) showAddButton: boolean = true; + /** + * Decides whether to close popup on clear button click. + * @group Props + */ + @Input({ transform: booleanAttribute }) hideOnClear: boolean = true; + /** + * Filter placeholder. + * @group Props + */ + @Input() placeholder: string | undefined; + /** + * Filter match mode options. + * @group Props + */ + @Input() matchModeOptions: SelectItem[] | undefined; + /** + * Defines maximum amount of constraints. + * @group Props + */ + @Input({ transform: numberAttribute }) maxConstraints: number = 2; + /** + * Defines minimum fraction of digits. + * @group Props + */ + @Input({ transform: (value: unknown) => numberAttribute(value, undefined) }) + minFractionDigits: number | undefined; + /** + * Defines maximum fraction of digits. + * @group Props + */ + @Input({ transform: (value: unknown) => numberAttribute(value, undefined) }) + maxFractionDigits: number | undefined; + /** + * Defines prefix of the filter. + * @group Props + */ + @Input() prefix: string | undefined; + /** + * Defines suffix of the filter. + * @group Props + */ + @Input() suffix: string | undefined; + /** + * Defines filter locale. + * @group Props + */ + @Input() locale: string | undefined; + /** + * Defines filter locale matcher. + * @group Props + */ + @Input() localeMatcher: string | undefined; + /** + * Enables currency input. + * @group Props + */ + @Input() currency: string | undefined; + /** + * Defines the display of the currency input. + * @group Props + */ + @Input() currencyDisplay: string | undefined; + /** + * Default trigger to run filtering on built-in text and numeric filters, valid values are 'enter' and 'input'. + * @defaultValue enter + * @group Props + */ + @Input() filterOn: string | undefined = 'enter'; + /** + * Defines if filter grouping will be enabled. + * @group Props + */ + @Input({ transform: booleanAttribute }) useGrouping: boolean = true; + /** + * Defines the visibility of buttons. + * @group Props + */ + @Input({ transform: booleanAttribute }) showButtons: boolean = true; + /** + * Defines the aria-label of the form element. + * @group Props + */ + @Input() ariaLabel: string | undefined; + /** + * Used to pass all filter button property object + * @defaultValue { + filter: { severity: 'secondary', text: true, rounded: true }, + inline: { + clear: { severity: 'secondary', text: true, rounded: true } + }, + popover: { + addRule: { severity: 'info', text: true, size: 'small' }, + removeRule: { severity: 'danger', text: true, size: 'small' }, + apply: { size: 'small' }, + clear: { outlined: true, size: 'small' } + } + } + @group Props + */ + @Input() filterButtonProps: TableFilterButtonPropsOptions = { + filter: { severity: 'secondary', text: true, rounded: true }, + inline: { + clear: { severity: 'secondary', text: true, rounded: true } + }, + popover: { + addRule: { severity: 'info', text: true, size: 'small' }, + removeRule: { severity: 'danger', text: true, size: 'small' }, + apply: { size: 'small' }, + clear: { outlined: true, size: 'small' } + } + }; + motionOptions = input(undefined); + + computedMotionOptions = computed(() => { + return { + ...this.ptm('motion'), + ...this.motionOptions() + }; + }); + /** + * Callback to invoke on overlay is shown. + * @param {AnimationEvent} originalEvent - animation event. + * @group Emits + */ + @Output() onShow: EventEmitter<{ originalEvent: AnimationEvent }> = new EventEmitter<{ + originalEvent: AnimationEvent; + }>(); + /** + * Callback to invoke on overlay is hidden. + * @param {AnimationEvent} originalEvent - animation event. + * @group Emits + */ + @Output() onHide: EventEmitter<{ originalEvent: AnimationEvent }> = new EventEmitter<{ + originalEvent: AnimationEvent; + }>(); + + @ViewChild(Button, { static: false, read: ElementRef }) icon: ElementRef | undefined; + + @ViewChild('clearBtn') clearButtonViewChild: Nullable; + + @ContentChildren(PrimeTemplate) _templates: Nullable>; + + overlaySubscription: Subscription | undefined; + + renderOverlay = signal(false); + + /** + * Custom header template. + * @group Templates + */ + @ContentChild('header', { descendants: false }) headerTemplate: TemplateRef; + _headerTemplate: Nullable>; + + /** + * Custom filter template. + * @group Templates + */ + @ContentChild('filter', { descendants: false }) filterTemplate: TemplateRef; + _filterTemplate: Nullable>; + + /** + * Custom footer template. + * @group Templates + */ + @ContentChild('footer', { descendants: false }) footerTemplate: TemplateRef; + _footerTemplate: Nullable>; + /** + * Custom filter icon template. + * @group Templates + */ + @ContentChild('filtericon', { descendants: false }) filterIconTemplate: TemplateRef; + _filterIconTemplate: Nullable>; + + /** + * Custom remove rule button icon template. + * @group Templates + */ + @ContentChild('removeruleicon', { descendants: false }) removeRuleIconTemplate: TemplateRef; + _removeRuleIconTemplate: Nullable>; + + /** + * Custom add rule button icon template. + * @group Templates + */ + @ContentChild('addruleicon', { descendants: false }) addRuleIconTemplate: TemplateRef; + _addRuleIconTemplate: Nullable>; + + @ContentChild('clearfiltericon', { descendants: false }) clearFilterIconTemplate: TemplateRef; + _clearFilterIconTemplate: Nullable>; + + operatorOptions: any[] | undefined; + + overlayVisible: boolean | undefined; + + overlay: HTMLElement | undefined | null; + + scrollHandler: ConnectedOverlayScrollHandler | null | undefined; + + documentClickListener: VoidListener; + + documentResizeListener: VoidListener; + + matchModes: SelectItem[] | undefined; + + translationSubscription: Subscription | undefined; + + resetSubscription: Subscription | undefined; + + selfClick: boolean | undefined; + + overlayEventListener: any; + + overlayId: any; + + get fieldConstraints(): FilterMetadata[] | undefined | null { + return this.dataTable.filters ? this.dataTable.filters[this.field] : null; + } + + get showRemoveIcon(): boolean { + return this.fieldConstraints ? this.fieldConstraints.length > 1 : false; + } + + get showMenuButton(): boolean { + return this.showMenu && (this.display === 'row' ? this.type !== 'boolean' : true); + } + + get isShowOperator(): boolean { + return this.showOperator && this.type !== 'boolean'; + } + + get isShowAddConstraint(): boolean | undefined | null { + return this.showAddButton && this.type !== 'boolean' && this.fieldConstraints && this.fieldConstraints.length < this.maxConstraints; + } + + get showMenuButtonLabel() { + return this.config.getTranslation(TranslationKeys.SHOW_FILTER_MENU); + } + + get applyButtonLabel(): string { + return this.config.getTranslation(TranslationKeys.APPLY); + } + + get clearButtonLabel(): string { + return this.config.getTranslation(TranslationKeys.CLEAR); + } + + get addRuleButtonLabel(): string { + return this.config.getTranslation(TranslationKeys.ADD_RULE); + } + + get removeRuleButtonLabel(): string { + return this.config.getTranslation(TranslationKeys.REMOVE_RULE); + } + + get noFilterLabel(): string { + return this.config.getTranslation(TranslationKeys.NO_FILTER); + } + + get filterMenuButtonAriaLabel() { + return this.config?.translation ? (this.overlayVisible ? this.config?.translation?.aria?.hideFilterMenu : this.config?.translation?.aria?.showFilterMenu) : undefined; + } + + get removeRuleButtonAriaLabel() { + return this.config?.translation ? this.config?.translation?.removeRule : undefined; + } + + get filterOperatorAriaLabel() { + return this.config?.translation ? this.config?.translation?.aria?.filterOperator : undefined; + } + + get filterConstraintAriaLabel() { + return this.config?.translation ? this.config?.translation?.aria?.filterConstraint : undefined; + } + + dataTable = inject(Table); + + overlayService = inject(OverlayService); + + onInit() { + this.overlayId = UniqueComponentId(); + if (!this.dataTable.filters[this.field]) { + this.initFieldFilterConstraint(); + } + + this.translationSubscription = this.config.translationObserver.subscribe(() => { + this.generateMatchModeOptions(); + this.generateOperatorOptions(); + }); + + this.generateMatchModeOptions(); + this.generateOperatorOptions(); + } + + generateMatchModeOptions() { + this.matchModes = + this.matchModeOptions || + (this.config as any).filterMatchModeOptions[this.type]?.map((key: any) => { + return { + label: this.config.getTranslation(key), + value: key + }; + }); + } + + generateOperatorOptions() { + this.operatorOptions = [ + { + label: this.config.getTranslation(TranslationKeys.MATCH_ALL), + value: FilterOperator.AND + }, + { + label: this.config.getTranslation(TranslationKeys.MATCH_ANY), + value: FilterOperator.OR + } + ]; + } + + onAfterContentInit() { + (this._templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'header': + this._headerTemplate = item.template; + break; + + case 'filter': + this._filterTemplate = item.template; + break; + + case 'footer': + this._footerTemplate = item.template; + break; + + case 'filtericon': + this._filterIconTemplate = item.template; + break; + + case 'clearfiltericon': + this._clearFilterIconTemplate = item.template; + break; + + case 'removeruleicon': + this._removeRuleIconTemplate = item.template; + break; + + case 'addruleicon': + this._addRuleIconTemplate = item.template; + break; + + default: + this._filterTemplate = item.template; + break; + } + }); + } + + initFieldFilterConstraint() { + let defaultMatchMode = this.getDefaultMatchMode(); + this.dataTable.filters[this.field] = + this.display == 'row' + ? { value: null, matchMode: defaultMatchMode } + : [ + { + value: null, + matchMode: defaultMatchMode, + operator: this.operator + } + ]; + } + + onMenuMatchModeChange(value: any, filterMeta: FilterMetadata) { + filterMeta.matchMode = value; + + if (!this.showApplyButton) { + this.dataTable._filter(); + } + } + + onRowMatchModeChange(matchMode: string) { + const fieldFilter = this.dataTable.filters[this.field]; + fieldFilter.matchMode = matchMode; + + if (fieldFilter.value) { + this.dataTable._filter(); + } + + this.hide(); + } + + onRowMatchModeKeyDown(event: KeyboardEvent) { + let item = event.target; + + switch (event.key) { + case 'ArrowDown': + var nextItem = this.findNextItem(item); + if (nextItem) { + item.removeAttribute('tabindex'); + nextItem.tabIndex = '0'; + nextItem.focus(); + } + + event.preventDefault(); + break; + + case 'ArrowUp': + var prevItem = this.findPrevItem(item); + if (prevItem) { + item.removeAttribute('tabindex'); + prevItem.tabIndex = '0'; + prevItem.focus(); + } + + event.preventDefault(); + break; + } + } + + onRowClearItemClick() { + this.clearFilter(); + this.hide(); + } + + isRowMatchModeSelected(matchMode: string) { + return (this.dataTable.filters[this.field]).matchMode === matchMode; + } + + addConstraint() { + (this.dataTable.filters[this.field]).push({ + value: null, + matchMode: this.getDefaultMatchMode(), + operator: this.getDefaultOperator() + }); + DomHandler.focus(this.clearButtonViewChild?.nativeElement); + } + + removeConstraint(filterMeta: FilterMetadata) { + this.dataTable.filters[this.field] = (this.dataTable.filters[this.field]).filter((meta) => meta !== filterMeta); + if (!this.showApplyButton) { + this.dataTable._filter(); + } + DomHandler.focus(this.clearButtonViewChild?.nativeElement); + } + + onOperatorChange(value: any) { + (this.dataTable.filters[this.field]).forEach((filterMeta) => { + filterMeta.operator = value; + this.operator = value; + }); + + if (!this.showApplyButton) { + this.dataTable._filter(); + } + } + + toggleMenu(event: Event) { + this.overlayVisible = !this.overlayVisible; + this.renderOverlay.set(!this.renderOverlay()); + event.stopPropagation(); + } + + onToggleButtonKeyDown(event: KeyboardEvent) { + switch (event.key) { + case 'Escape': + case 'Tab': + this.overlayVisible = false; + break; + + case 'ArrowDown': + if (this.overlayVisible) { + let focusable = DomHandler.getFocusableElements(this.overlay); + if (focusable) { + focusable[0].focus(); + } + event.preventDefault(); + } else if (event.altKey) { + this.overlayVisible = true; + event.preventDefault(); + } + break; + case 'Enter': + this.toggleMenu(event); + event.preventDefault(); + break; + } + } + + onEscape() { + this.overlayVisible = false; + this.icon?.nativeElement.focus(); + } + + findNextItem(item: HTMLLIElement): any { + let nextItem = item.nextElementSibling; + + if (nextItem) return find(nextItem, '[data-pc-section="filterconstraintseparator"]') ? this.findNextItem(nextItem) : nextItem; + else return item.parentElement?.firstElementChild; + } + + findPrevItem(item: HTMLLIElement): any { + let prevItem = item.previousElementSibling; + + if (prevItem) return find(prevItem, '[data-pc-section="filterconstraintseparator"]') ? this.findPrevItem(prevItem) : prevItem; + else return item.parentElement?.lastElementChild; + } + + onContentClick() { + this.selfClick = true; + } + + onOverlayBeforeEnter(event: MotionEvent) { + this.overlay = event.element as HTMLElement; + if (this.overlay && this.overlay.parentElement !== this.document.body) { + const buttonEl = findSingle(this.el.nativeElement, '[data-pc-name="pccolumnfilterbutton"]'); + appendChild(this.document.body, this.overlay); + addStyle(this.overlay!, { position: 'absolute', top: '0' }); + absolutePosition(this.overlay, buttonEl); + ZIndexUtils.set('overlay', this.overlay, this.config.zIndex.overlay); + } + + this.bindDocumentClickListener(); + this.bindDocumentResizeListener(); + this.bindScrollListener(); + + this.overlayEventListener = (e: any) => { + if (this.overlay && this.overlay.contains(e.target)) { + this.selfClick = true; + } + }; + + this.overlaySubscription = this.overlayService.clickObservable.subscribe(this.overlayEventListener); + + this.onShow.emit({ originalEvent: event as any }); + this.focusOnFirstElement(); + } + + onOverlayAnimationAfterLeave(event: MotionEvent) { + this.restoreOverlayAppend(); + this.onOverlayHide(); + this.renderOverlay.set(false); + if (this.overlaySubscription) { + this.overlaySubscription.unsubscribe(); + } + ZIndexUtils.clear(this.overlay); + + this.onHide.emit({ originalEvent: event as any }); + } + + restoreOverlayAppend() { + if (this.overlay) { + this.el.nativeElement.appendChild(this.overlay!); + } + } + + focusOnFirstElement() { + if (this.overlay) { + DomHandler.focus(DomHandler.getFirstFocusableElement(this.overlay, '')); + } + } + + getDefaultMatchMode(): string { + if (this.matchMode) { + return this.matchMode; + } else { + if (this.type === 'text') return FilterMatchMode.STARTS_WITH; + else if (this.type === 'numeric') return FilterMatchMode.EQUALS; + else if (this.type === 'date') return FilterMatchMode.DATE_IS; + else return FilterMatchMode.CONTAINS; + } + } + + getDefaultOperator(): string | undefined { + return this.dataTable.filters ? (this.dataTable.filters[(this.field)])[0].operator : this.operator; + } + + hasRowFilter() { + return this.dataTable.filters[this.field] && !this.dataTable.isFilterBlank((this.dataTable.filters[this.field]).value); + } + + get hasFilter(): boolean { + let fieldFilter = this.dataTable.filters[this.field]; + if (fieldFilter) { + if (Array.isArray(fieldFilter)) return !this.dataTable.isFilterBlank((fieldFilter)[0].value); + else return !this.dataTable.isFilterBlank(fieldFilter.value); + } + + return false; + } + + isOutsideClicked(event: any): boolean { + return !( + findSingle((this.overlay as HTMLElement).nextElementSibling!, '[data-pc-section="filteroverlay"]') || + findSingle((this.overlay as HTMLElement).nextElementSibling!, '[data-pc-name="popover"]') || + this.overlay?.isSameNode(event.target) || + this.overlay?.contains(event.target) || + this.icon?.nativeElement.isSameNode(event.target) || + this.icon?.nativeElement.contains(event.target) || + findSingle(event.target, '[data-pc-name="pcaddrulebuttonlabel"]') || + findSingle(event.target.parentElement, '[data-pc-name="pcaddrulebuttonlabel"]') || + findSingle(event.target, '[data-pc-name="pcfilterremoverulebutton"]') || + findSingle(event.target.parentElement, '[data-pc-name="pcfilterremoverulebutton"]') + ); + } + + bindDocumentClickListener() { + if (!this.documentClickListener) { + const documentTarget: any = this.el ? this.el.nativeElement.ownerDocument : 'document'; + + this.documentClickListener = this.renderer.listen(documentTarget, 'mousedown', (event) => { + const dialogElements = document.querySelectorAll('[role="dialog"]'); + const targetIsColumnFilterMenuButton = event.target.closest('[data-pc-name="pccolumnfilterbutton"]'); + if (this.overlayVisible && this.isOutsideClicked(event) && (targetIsColumnFilterMenuButton || dialogElements?.length <= 1)) { + this.hide(); + } + + this.selfClick = false; + }); + } + } + + unbindDocumentClickListener() { + if (this.documentClickListener) { + this.documentClickListener(); + this.documentClickListener = null; + this.selfClick = false; + } + } + + bindDocumentResizeListener() { + if (!this.documentResizeListener) { + this.documentResizeListener = this.renderer.listen(this.document.defaultView, 'resize', (event) => { + if (this.overlayVisible && !DomHandler.isTouchDevice()) { + this.hide(); + } + }); + } + } + + unbindDocumentResizeListener() { + if (this.documentResizeListener) { + this.documentResizeListener(); + this.documentResizeListener = null; + } + } + + bindScrollListener() { + if (!this.scrollHandler) { + this.scrollHandler = new ConnectedOverlayScrollHandler(this.icon?.nativeElement, () => { + if (this.overlayVisible) { + this.hide(); + } + }); + } + + this.scrollHandler.bindScrollListener(); + } + + unbindScrollListener() { + if (this.scrollHandler) { + this.scrollHandler.unbindScrollListener(); + } + } + + hide() { + this.overlayVisible = false; + this.cd.markForCheck(); + } + + onOverlayHide() { + this.unbindDocumentClickListener(); + this.unbindDocumentResizeListener(); + this.unbindScrollListener(); + this.overlay = null; + } + + clearFilter() { + this.initFieldFilterConstraint(); + this.dataTable._filter(); + if (this.hideOnClear) this.hide(); + } + + applyFilter() { + this.dataTable._filter(); + this.hide(); + } + + onDestroy() { + if (this.overlay) { + this.restoreOverlayAppend(); + ZIndexUtils.clear(this.overlay); + this.onOverlayHide(); + } + + if (this.translationSubscription) { + this.translationSubscription.unsubscribe(); + } + + if (this.resetSubscription) { + this.resetSubscription.unsubscribe(); + } + + if (this.overlaySubscription) { + this.overlaySubscription.unsubscribe(); + } + } +} + +@Component({ + selector: 'p-columnFilterFormElement', + standalone: false, + template: ` + + + + + + + + + + + + + `, + providers: [TableStyle], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.Eager, + hostDirectives: [Bind] +}) +export class ColumnFilterFormElement extends BaseComponent { + hostName = 'Table'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + _componentStyle = inject(TableStyle); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('columnFilterFormElement')); + } + + @Input() field: string | undefined; + + @Input() type: string | undefined; + + @Input() filterConstraint: FilterMetadata | undefined; + + @Input() filterTemplate: Nullable>; + + @Input() placeholder: string | undefined; + + @Input({ transform: (value: unknown) => numberAttribute(value, undefined) }) + minFractionDigits: number | undefined; + + @Input({ transform: (value: unknown) => numberAttribute(value, undefined) }) + maxFractionDigits: number | undefined; + + @Input() prefix: string | undefined; + + @Input() suffix: string | undefined; + + @Input() locale: string | undefined; + + @Input() localeMatcher: string | undefined; + + @Input() currency: string | undefined; + + @Input() currencyDisplay: string | undefined; + + @Input({ transform: booleanAttribute }) useGrouping: boolean = true; + + @Input() ariaLabel: string | undefined; + + @Input() filterOn: string | undefined; + + get showButtons(): boolean { + return this.colFilter.showButtons; + } + + filterCallback: any; + + constructor( + public dataTable: Table, + private colFilter: ColumnFilter + ) { + super(); + } + + onInit() { + this.filterCallback = (value: any) => { + (this.filterConstraint).value = value; + this.dataTable._filter(); + }; + } + + onModelChange(value: any) { + (this.filterConstraint).value = value; + + if (this.type === 'date' || this.type === 'boolean' || ((this.type === 'text' || this.type === 'numeric') && this.filterOn === 'input') || !value) { + this.dataTable._filter(); + } + } + + onTextInputEnterKeyDown(event: KeyboardEvent) { + this.dataTable._filter(); + event.preventDefault(); + } + + onNumericInputKeyDown(event: KeyboardEvent) { + if (event.key === 'Enter') { + this.dataTable._filter(); + event.preventDefault(); + } + } +} + +@NgModule({ + imports: [ + CommonModule, + PaginatorModule, + InputTextModule, + SelectModule, + FormsModule, + ButtonModule, + SelectButtonModule, + DatePickerModule, + InputNumberModule, + BadgeModule, + CheckboxModule, + ScrollerModule, + ArrowDownIcon, + ArrowUpIcon, + SpinnerIcon, + SortAltIcon, + SortAmountUpAltIcon, + SortAmountDownIcon, + FilterIcon, + FilterFillIcon, + PlusIcon, + TrashIcon, + RadioButtonModule, + BindModule, + MotionModule + ], + exports: [ + Table, + SharedModule, + SortableColumn, + FrozenColumn, + RowGroupHeader, + SelectableRow, + RowToggler, + ContextMenuRow, + ResizableColumn, + ReorderableColumn, + EditableColumn, + CellEditor, + SortIcon, + TableRadioButton, + TableCheckbox, + TableHeaderCheckbox, + ReorderableRowHandle, + ReorderableRow, + SelectableRowDblClick, + EditableRow, + InitEditableRow, + SaveEditableRow, + CancelEditableRow, + ColumnFilter, + ColumnFilterFormElement, + ScrollerModule + ], + declarations: [ + Table, + SortableColumn, + FrozenColumn, + RowGroupHeader, + SelectableRow, + RowToggler, + ContextMenuRow, + ResizableColumn, + ReorderableColumn, + EditableColumn, + CellEditor, + TableBody, + SortIcon, + TableRadioButton, + TableCheckbox, + TableHeaderCheckbox, + ReorderableRowHandle, + ReorderableRow, + SelectableRowDblClick, + EditableRow, + InitEditableRow, + SaveEditableRow, + CancelEditableRow, + ColumnFilter, + ColumnFilterFormElement + ], + providers: [TableStyle] +}) +export class TableModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/togglebutton/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/togglebutton/public_api.ts new file mode 100644 index 000000000..94fd39d4a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/togglebutton/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/togglebutton/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/togglebutton/public_api'; +export * from './style/togglebuttonstyle'; +export * from './togglebutton'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/togglebutton/style/togglebuttonstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/togglebutton/style/togglebuttonstyle.ts new file mode 100644 index 000000000..5bcaa31fb --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/togglebutton/style/togglebuttonstyle.ts @@ -0,0 +1,87 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/togglebutton/style/togglebuttonstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style as togglebutton_style } from '../../../primeuix-temp/styles/src/togglebutton/index'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` + ${togglebutton_style} + + /* For PrimeNG (iconPos) */ + .p-togglebutton-icon-right { + order: 1; + } + + .p-togglebutton.ng-invalid.ng-dirty { + border-color: dt('togglebutton.invalid.border.color'); + } +`; + +const classes = { + root: ({ instance }) => [ + 'p-togglebutton p-component', + { + 'p-togglebutton-checked': instance.checked, + 'p-invalid': instance.invalid(), + 'p-disabled': instance.$disabled(), + 'p-togglebutton-sm p-inputfield-sm': instance.size === 'small', + 'p-togglebutton-lg p-inputfield-lg': instance.size === 'large', + 'p-togglebutton-fluid': instance.fluid() + } + ], + content: 'p-togglebutton-content', + icon: 'p-togglebutton-icon', + iconLeft: 'p-togglebutton-icon-left', + iconRight: 'p-togglebutton-icon-right', + label: 'p-togglebutton-label' +}; + +@Injectable() +export class ToggleButtonStyle extends BaseStyle { + name = 'togglebutton'; + + style = style; + + classes = classes; +} + +/** + * + * ToggleButton is used to select a boolean value using a button. + * + * [Live Demo](https://www.primeng.org/togglebutton/) + * + * @module togglebuttonstyle + * + */ +export enum ToggleButtonClasses { + /** + * Class name of the root element + */ + root = 'p-togglebutton', + /** + * Class name of the icon element + */ + icon = 'p-togglebutton-icon', + /** + * Class name of the left icon + */ + iconLeft = 'p-togglebutton-icon-left', + /** + * Class name of the right icon + */ + iconRight = 'p-togglebutton-icon-right', + /** + * Class name of the label element + */ + label = 'p-togglebutton-label' +} + +export interface ToggleButtonStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/togglebutton/togglebutton.ts b/projects/cps-ui-kit/src/lib/primeng-temp/togglebutton/togglebutton.ts new file mode 100755 index 000000000..6d46c01bc --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/togglebutton/togglebutton.ts @@ -0,0 +1,291 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/togglebutton/togglebutton.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { + booleanAttribute, + ChangeDetectionStrategy, + Component, + ContentChild, + ContentChildren, + EventEmitter, + forwardRef, + HostListener, + inject, + InjectionToken, + input, + Input, + NgModule, + numberAttribute, + Output, + QueryList, + TemplateRef +} from '@angular/core'; +import { NG_VALUE_ACCESSOR } from '@angular/forms'; +import { PrimeTemplate, SharedModule } from '../api/public_api'; +import { PARENT_INSTANCE } from '../basecomponent/public_api'; +import { BaseEditableHolder } from '../baseeditableholder/public_api'; +import { Bind } from '../bind/public_api'; +import { BindModule } from '../bind/public_api'; +import { Ripple } from '../ripple/public_api'; +import { Nullable } from '../ts-helpers/public_api'; +import { ToggleButtonChangeEvent, ToggleButtonContentTemplateContext, ToggleButtonIconTemplateContext, ToggleButtonPassThrough } from '../types/togglebutton/public_api'; +import { ToggleButtonStyle } from './style/togglebuttonstyle'; + +const TOGGLEBUTTON_INSTANCE = new InjectionToken('TOGGLEBUTTON_INSTANCE'); + +export const TOGGLEBUTTON_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ToggleButton), + multi: true +}; +/** + * ToggleButton is used to select a boolean value using a button. + * @group Components + */ +@Component({ + selector: 'p-toggleButton, p-togglebutton, p-toggle-button', + standalone: true, + imports: [CommonModule, SharedModule, BindModule], + hostDirectives: [{ directive: Ripple }, Bind], + host: { + '[class]': "cn(cx('root'), styleClass)", + '[attr.aria-labelledby]': 'ariaLabelledBy', + '[attr.aria-label]': 'ariaLabel', + '[attr.aria-pressed]': 'checked ? "true" : "false"', + '[attr.role]': '"button"', + '[attr.tabindex]': 'tabindex !== undefined ? tabindex : (!$disabled() ? 0 : -1)', + '[attr.data-pc-name]': "'togglebutton'", + '[attr.data-p-checked]': 'active', + '[attr.data-p-disabled]': '$disabled()', + '[attr.data-p]': 'dataP' + }, + template: ` + + @if (!contentTemplate) { + @if (!iconTemplate) { + @if (onIcon || offIcon) { + + } + } @else { + + } + {{ checked ? (hasOnLabel ? onLabel : ' ') : hasOffLabel ? offLabel : ' ' }} + } + `, + providers: [TOGGLEBUTTON_VALUE_ACCESSOR, ToggleButtonStyle, { provide: TOGGLEBUTTON_INSTANCE, useExisting: ToggleButton }, { provide: PARENT_INSTANCE, useExisting: ToggleButton }], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ToggleButton extends BaseEditableHolder { + componentName = 'ToggleButton'; + + $pcToggleButton: ToggleButton | undefined = inject(TOGGLEBUTTON_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + + @HostListener('keydown', ['$event']) + onKeyDown(event: KeyboardEvent) { + switch (event.code) { + case 'Enter': + this.toggle(event); + event.preventDefault(); + break; + case 'Space': + this.toggle(event); + event.preventDefault(); + break; + } + } + + @HostListener('click', ['$event']) + toggle(event: Event) { + if (!this.$disabled() && !(this.allowEmpty === false && this.checked)) { + this.checked = !this.checked; + this.writeModelValue(this.checked); + this.onModelChange(this.checked); + this.onModelTouched(); + this.onChange.emit({ + originalEvent: event, + checked: this.checked + }); + + this.cd.markForCheck(); + } + } + /** + * Label for the on state. + * @group Props + */ + @Input() onLabel: string = 'Yes'; + /** + * Label for the off state. + * @group Props + */ + @Input() offLabel: string = 'No'; + /** + * Icon for the on state. + * @group Props + */ + @Input() onIcon: string | undefined; + /** + * Icon for the off state. + * @group Props + */ + @Input() offIcon: string | undefined; + /** + * Defines a string that labels the input for accessibility. + * @group Props + */ + @Input() ariaLabel: string | undefined; + /** + * Establishes relationships between the component and label(s) where its value should be one or more element IDs. + * @group Props + */ + @Input() ariaLabelledBy: string | undefined; + /** + * Style class of the element. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * Identifier of the focus input to match a label defined for the component. + * @group Props + */ + @Input() inputId: string | undefined; + /** + * Index of the element in tabbing order. + * @group Props + */ + @Input({ transform: numberAttribute }) tabindex: number | undefined = 0; + /** + * Position of the icon. + * @group Props + */ + @Input() iconPos: 'left' | 'right' = 'left'; + /** + * When present, it specifies that the component should automatically get focus on load. + * @group Props + */ + @Input({ transform: booleanAttribute }) autofocus: boolean | undefined; + /** + * Defines the size of the component. + * @group Props + */ + @Input() size: 'large' | 'small' | undefined; + /** + * Whether selection can not be cleared. + * @group Props + */ + @Input() allowEmpty: boolean | undefined; + /** + * Spans 100% width of the container when enabled. + * @defaultValue undefined + * @group Props + */ + fluid = input(undefined, { transform: booleanAttribute }); + /** + * Callback to invoke on value change. + * @param {ToggleButtonChangeEvent} event - Custom change event. + * @group Emits + */ + @Output() onChange: EventEmitter = new EventEmitter(); + /** + * Custom icon template. + * @param {ToggleButtonIconTemplateContext} context - icon context. + * @see {@link ToggleButtonIconTemplateContext} + * @group Templates + */ + @ContentChild('icon', { descendants: false }) iconTemplate: Nullable>; + /** + * Custom content template. + * @param {ToggleButtonContentTemplateContext} context - content context. + * @see {@link ToggleButtonContentTemplateContext} + * @group Templates + */ + @ContentChild('content', { descendants: false }) contentTemplate: Nullable>; + + @ContentChildren(PrimeTemplate) templates!: QueryList; + + checked: boolean = false; + + onInit() { + if (this.checked === null || this.checked === undefined) { + this.checked = false; + } + } + + _componentStyle = inject(ToggleButtonStyle); + + onBlur() { + this.onModelTouched(); + } + + get hasOnLabel(): boolean { + return (this.onLabel && this.onLabel.length > 0) as boolean; + } + + get hasOffLabel(): boolean { + return (this.offLabel && this.offLabel.length > 0) as boolean; + } + + get active() { + return this.checked === true; + } + + _iconTemplate: TemplateRef | undefined; + + _contentTemplate: TemplateRef | undefined; + + onAfterContentInit() { + this.templates.forEach((item) => { + switch (item.getType()) { + case 'icon': + this._iconTemplate = item.template; + break; + case 'content': + this._contentTemplate = item.template; + break; + default: + this._contentTemplate = item.template; + break; + } + }); + } + + /** + * @override + * + * @see {@link BaseEditableHolder.writeControlValue} + * Writes the value to the control. + */ + writeControlValue(value: any, setModelValue: (value: any) => void): void { + this.checked = value; + setModelValue(value); + this.cd.markForCheck(); + } + + get dataP() { + return this.cn({ + checked: this.active, + invalid: this.invalid(), + [this.size as string]: this.size + }); + } +} + +@NgModule({ + imports: [ToggleButton, SharedModule], + exports: [ToggleButton, SharedModule] +}) +export class ToggleButtonModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/tooltip/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/tooltip/public_api.ts new file mode 100644 index 000000000..0b558553a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/tooltip/public_api.ts @@ -0,0 +1,11 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/tooltip/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './tooltip'; +export * from './style/tooltipstyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/tooltip/style/tooltipstyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/tooltip/style/tooltipstyle.ts new file mode 100644 index 000000000..e22bc2a09 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/tooltip/style/tooltipstyle.ts @@ -0,0 +1,53 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/tooltip/style/tooltipstyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style } from '../../../primeuix-temp/styles/src/tooltip/index'; +import { BaseStyle } from '../../base/public_api'; + +const classes = { + root: 'p-tooltip p-component', + arrow: 'p-tooltip-arrow', + text: 'p-tooltip-text' +}; + +@Injectable() +export class TooltipStyle extends BaseStyle { + name = 'tooltip'; + + style = style; + + classes = classes; +} + +/** + * + * Tooltip directive provides advisory information for a component. + * + * [Live Demo](https://www.primeng.org/tooltip) + * + * @module tooltipstyle + * + */ +export enum TooltipClasses { + /** + * Class name of the root element + */ + root = 'p-tooltip', + /** + * Class name of the arrow element + */ + arrow = 'p-tooltip-arrow', + /** + * Class name of the text element + */ + text = 'p-tooltip-text' +} + +export interface TooltipStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/tooltip/tooltip.ts b/projects/cps-ui-kit/src/lib/primeng-temp/tooltip/tooltip.ts new file mode 100755 index 000000000..47f67004c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/tooltip/tooltip.ts @@ -0,0 +1,864 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/tooltip/tooltip.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { isPlatformBrowser } from '@angular/common'; +import { booleanAttribute, computed, Directive, effect, ElementRef, inject, InjectionToken, input, Input, NgModule, NgZone, numberAttribute, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core'; +import { appendChild, createElement, fadeIn, findSingle, getOuterHeight, getOuterWidth, getViewport, getWindowScrollLeft, getWindowScrollTop, hasClass, removeChild, uuid } from '../../primeuix-temp/utils/src/index'; +import { TooltipOptions } from '../api/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { BindModule } from '../bind/public_api'; +import { ConnectedOverlayScrollHandler } from '../dom/public_api'; +import { Nullable } from '../ts-helpers/public_api'; +import { TooltipPassThroughOptions } from '../types/tooltip/public_api'; +import { ZIndexUtils } from '../utils/public_api'; +import { TooltipStyle } from './style/tooltipstyle'; +import type { TooltipPassThrough } from '../types/tooltip/public_api'; + +const TOOLTIP_INSTANCE = new InjectionToken('TOOLTIP_INSTANCE'); + +/** + * Tooltip directive provides advisory information for a component. + * @group Components + */ +@Directive({ + selector: '[pTooltip]', + standalone: true, + providers: [TooltipStyle, { provide: TOOLTIP_INSTANCE, useExisting: Tooltip }, { provide: PARENT_INSTANCE, useExisting: Tooltip }] +}) +export class Tooltip extends BaseComponent { + componentName = 'Tooltip'; + + $pcTooltip: Tooltip | undefined = inject(TOOLTIP_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + /** + * Position of the tooltip. + * @group Props + */ + @Input() tooltipPosition: 'right' | 'left' | 'top' | 'bottom' | string | undefined; + /** + * Event to show the tooltip. + * @group Props + */ + @Input() tooltipEvent: 'hover' | 'focus' | 'both' = 'hover'; + /** + * Type of CSS position. + * @group Props + */ + @Input() positionStyle: string | undefined; + /** + * Style class of the tooltip. + * @group Props + */ + @Input() tooltipStyleClass: string | undefined; + /** + * Whether the z-index should be managed automatically to always go on top or have a fixed value. + * @group Props + */ + @Input() tooltipZIndex: string | undefined; + /** + * By default the tooltip contents are rendered as text. Set to false to support html tags in the content. + * @group Props + */ + @Input({ transform: booleanAttribute }) escape: boolean = true; + /** + * Delay to show the tooltip in milliseconds. + * @group Props + */ + @Input({ transform: numberAttribute }) showDelay: number | undefined; + /** + * Delay to hide the tooltip in milliseconds. + * @group Props + */ + @Input({ transform: numberAttribute }) hideDelay: number | undefined; + /** + * Time to wait in milliseconds to hide the tooltip even it is active. + * @group Props + */ + @Input({ transform: numberAttribute }) life: number | undefined; + /** + * Specifies the additional vertical offset of the tooltip from its default position. + * @group Props + */ + @Input({ transform: numberAttribute }) positionTop: number | undefined; + /** + * Specifies the additional horizontal offset of the tooltip from its default position. + * @group Props + */ + @Input({ transform: numberAttribute }) positionLeft: number | undefined; + /** + * Whether to hide tooltip when hovering over tooltip content. + * @group Props + */ + @Input({ transform: booleanAttribute }) autoHide: boolean = true; + /** + * Automatically adjusts the element position when there is not enough space on the selected position. + * @group Props + */ + @Input({ transform: booleanAttribute }) fitContent: boolean = true; + /** + * Whether to hide tooltip on escape key press. + * @group Props + */ + @Input({ transform: booleanAttribute }) hideOnEscape: boolean = true; + /** + * Whether to show the tooltip only when the target text overflows (e.g., ellipsis is active). + * @group Props + */ + @Input({ transform: booleanAttribute }) showOnEllipsis: boolean = false; + /** + * Content of the tooltip. + * @group Props + */ + @Input('pTooltip') content: string | TemplateRef | undefined; + /** + * When present, it specifies that the component should be disabled. + * @defaultValue false + * @group Props + */ + @Input('tooltipDisabled') get disabled(): boolean { + return this._disabled as boolean; + } + set disabled(val: boolean) { + this._disabled = val; + this.deactivate(); + } + /** + * Specifies the tooltip configuration options for the component. + * @group Props + */ + @Input() tooltipOptions: TooltipOptions | undefined; + /** + * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). + * @defaultValue 'self' + * @group Props + */ + appendTo = input | 'self' | 'body' | null | undefined | any>(undefined); + + $appendTo = computed(() => this.appendTo() || this.config.overlayAppendTo()); + + _tooltipOptions = { + tooltipLabel: null, + tooltipPosition: 'right', + tooltipEvent: 'hover', + appendTo: 'body', + positionStyle: null, + tooltipStyleClass: null, + tooltipZIndex: 'auto', + escape: true, + disabled: null, + showDelay: null, + hideDelay: null, + positionTop: null, + positionLeft: null, + life: null, + autoHide: true, + hideOnEscape: true, + showOnEllipsis: false, + id: uuid('pn_id_') + '_tooltip' + }; + + _disabled: boolean | undefined; + + container: any; + + styleClass: string | undefined; + + tooltipText: any; + + rootPTClasses: string = ''; + + showTimeout: any; + + hideTimeout: any; + + active: boolean | undefined; + + mouseEnterListener: Nullable; + + mouseLeaveListener: Nullable; + + containerMouseleaveListener: Nullable; + + clickListener: Nullable; + + focusListener: Nullable; + + blurListener: Nullable; + + touchStartListener: Nullable; + + touchEndListener: Nullable; + + documentTouchListener: Nullable; + + documentEscapeListener: Nullable; + + scrollHandler: any; + + resizeListener: any; + + _componentStyle = inject(TooltipStyle); + + interactionInProgress = false; + + /** + * Used to pass attributes to DOM elements inside the Tooltip component. + * @defaultValue undefined + * @deprecated use pTooltipPT instead. + * @group Props + */ + ptTooltip = input(); + /** + * Used to pass attributes to DOM elements inside the Tooltip component. + * @defaultValue undefined + * @group Props + */ + pTooltipPT = input(); + /** + * Indicates whether the component should be rendered without styles. + * @defaultValue undefined + * @group Props + */ + pTooltipUnstyled = input(); + + constructor( + public zone: NgZone, + private viewContainer: ViewContainerRef + ) { + super(); + effect(() => { + const pt = this.ptTooltip() || this.pTooltipPT(); + pt && this.directivePT.set(pt); + }); + + effect(() => { + this.pTooltipUnstyled() && this.directiveUnstyled.set(this.pTooltipUnstyled()); + }); + } + + onAfterViewInit() { + if (isPlatformBrowser(this.platformId)) { + this.zone.runOutsideAngular(() => { + const tooltipEvent = this.getOption('tooltipEvent'); + + if (tooltipEvent === 'hover' || tooltipEvent === 'both') { + this.mouseEnterListener = this.onMouseEnter.bind(this); + this.mouseLeaveListener = this.onMouseLeave.bind(this); + this.clickListener = this.onInputClick.bind(this); + this.el.nativeElement.addEventListener('mouseenter', this.mouseEnterListener); + this.el.nativeElement.addEventListener('click', this.clickListener); + this.el.nativeElement.addEventListener('mouseleave', this.mouseLeaveListener); + + // Touch support + this.touchStartListener = this.onTouchStart.bind(this); + this.touchEndListener = this.onTouchEnd.bind(this); + this.el.nativeElement.addEventListener('touchstart', this.touchStartListener, { passive: true }); + this.el.nativeElement.addEventListener('touchend', this.touchEndListener, { passive: true }); + } + if (tooltipEvent === 'focus' || tooltipEvent === 'both') { + this.focusListener = this.onFocus.bind(this); + this.blurListener = this.onBlur.bind(this); + + let target = this.el.nativeElement.querySelector('.p-component'); + + if (!target) { + target = this.getTarget(this.el.nativeElement); + } + + target.addEventListener('focus', this.focusListener); + target.addEventListener('blur', this.blurListener); + } + }); + } + } + + onChanges(simpleChange: SimpleChanges) { + if (simpleChange.tooltipPosition) { + this.setOption({ tooltipPosition: simpleChange.tooltipPosition.currentValue }); + } + + if (simpleChange.tooltipEvent) { + this.setOption({ tooltipEvent: simpleChange.tooltipEvent.currentValue }); + } + + if (simpleChange.appendTo) { + this.setOption({ appendTo: simpleChange.appendTo.currentValue }); + } + + if (simpleChange.positionStyle) { + this.setOption({ positionStyle: simpleChange.positionStyle.currentValue }); + } + + if (simpleChange.tooltipStyleClass) { + this.setOption({ tooltipStyleClass: simpleChange.tooltipStyleClass.currentValue }); + } + + if (simpleChange.tooltipZIndex) { + this.setOption({ tooltipZIndex: simpleChange.tooltipZIndex.currentValue }); + } + + if (simpleChange.escape) { + this.setOption({ escape: simpleChange.escape.currentValue }); + } + + if (simpleChange.showDelay) { + this.setOption({ showDelay: simpleChange.showDelay.currentValue }); + } + + if (simpleChange.hideDelay) { + this.setOption({ hideDelay: simpleChange.hideDelay.currentValue }); + } + + if (simpleChange.life) { + this.setOption({ life: simpleChange.life.currentValue }); + } + + if (simpleChange.positionTop) { + this.setOption({ positionTop: simpleChange.positionTop.currentValue }); + } + + if (simpleChange.positionLeft) { + this.setOption({ positionLeft: simpleChange.positionLeft.currentValue }); + } + + if (simpleChange.disabled) { + this.setOption({ disabled: simpleChange.disabled.currentValue }); + } + + if (simpleChange.content) { + this.setOption({ tooltipLabel: simpleChange.content.currentValue }); + + if (this.active) { + if (simpleChange.content.currentValue) { + if (this.container && this.container.offsetParent) { + this.updateText(); + this.align(); + } else { + this.show(); + } + } else { + this.hide(); + } + } + } + + if (simpleChange.autoHide) { + this.setOption({ autoHide: simpleChange.autoHide.currentValue }); + } + + if (simpleChange.showOnEllipsis) { + this.setOption({ showOnEllipsis: simpleChange.showOnEllipsis.currentValue }); + } + + if (simpleChange.id) { + this.setOption({ id: simpleChange.id.currentValue }); + } + + if (simpleChange.tooltipOptions) { + this._tooltipOptions = { ...this._tooltipOptions, ...simpleChange.tooltipOptions.currentValue }; + this.deactivate(); + + if (this.active) { + if (this.getOption('tooltipLabel')) { + if (this.container && this.container.offsetParent) { + this.updateText(); + this.align(); + } else { + this.show(); + } + } else { + this.hide(); + } + } + } + } + + isAutoHide(): boolean { + return this.getOption('autoHide'); + } + + onMouseEnter(e: Event) { + if (!this.container && !this.showTimeout) { + this.activate(); + } + } + + onMouseLeave(e: MouseEvent) { + if (!this.isAutoHide()) { + const valid = hasClass(e.relatedTarget as any, 'p-tooltip') || hasClass(e.relatedTarget as any, 'p-tooltip-text') || hasClass(e.relatedTarget as any, 'p-tooltip-arrow'); + !valid && this.deactivate(); + } else { + this.deactivate(); + } + } + + onTouchStart(e: TouchEvent) { + if (!this.container && !this.showTimeout) { + this.activate(); + + if (!this.isAutoHide()) { + this.bindDocumentTouchListener(); + } + } + } + + onTouchEnd(e: TouchEvent) { + if (this.isAutoHide()) { + this.deactivate(); + } + } + + bindDocumentTouchListener() { + if (!this.documentTouchListener) { + this.documentTouchListener = this.renderer.listen('document', 'touchstart', (e: TouchEvent) => { + if (this.container && !this.container.contains(e.target) && !this.el.nativeElement.contains(e.target)) { + this.deactivate(); + this.unbindDocumentTouchListener(); + } + }); + } + } + + unbindDocumentTouchListener() { + if (this.documentTouchListener) { + this.documentTouchListener(); + this.documentTouchListener = null; + } + } + + onFocus(e: Event) { + this.activate(); + } + + onBlur(e: Event) { + this.deactivate(); + } + + onInputClick(e: Event) { + this.deactivate(); + } + + hasEllipsis(): boolean { + const el = this.el.nativeElement; + return el.offsetWidth < el.scrollWidth || el.offsetHeight < el.scrollHeight; + } + + activate() { + if (!this.interactionInProgress) { + if (this.getOption('showOnEllipsis') && !this.hasEllipsis()) { + return; + } + this.active = true; + this.clearHideTimeout(); + + if (this.getOption('showDelay')) + this.showTimeout = setTimeout(() => { + this.show(); + }, this.getOption('showDelay')); + else this.show(); + + if (this.getOption('life')) { + let duration = this.getOption('showDelay') ? this.getOption('life') + this.getOption('showDelay') : this.getOption('life'); + this.hideTimeout = setTimeout(() => { + this.hide(); + }, duration); + } + + if (this.getOption('hideOnEscape')) { + this.documentEscapeListener = this.renderer.listen('document', 'keydown.escape', () => { + this.deactivate(); + this.documentEscapeListener?.(); + }); + } + this.interactionInProgress = true; + } + } + + deactivate() { + this.interactionInProgress = false; + this.active = false; + this.clearShowTimeout(); + + if (this.getOption('hideDelay')) { + this.clearHideTimeout(); //life timeout + this.hideTimeout = setTimeout(() => { + this.hide(); + }, this.getOption('hideDelay')); + } else { + this.hide(); + } + + if (this.documentEscapeListener) { + this.documentEscapeListener(); + } + } + + create() { + if (this.container) { + this.clearHideTimeout(); + this.remove(); + } + + this.container = createElement('div', { class: this.cx('root'), 'p-bind': this.ptm('root'), 'data-pc-section': 'root' }); + this.container.setAttribute('role', 'tooltip'); + let tooltipArrow = createElement('div', { class: this.cx('arrow'), 'p-bind': this.ptm('arrow'), 'data-pc-section': 'arrow' }); + this.container.appendChild(tooltipArrow); + this.tooltipText = createElement('div', { class: this.cx('text'), 'p-bind': this.ptm('text'), 'data-pc-section': 'text' }); + + this.updateText(); + + if (this.getOption('positionStyle')) { + this.container.style.position = this.getOption('positionStyle'); + } + + this.container.appendChild(this.tooltipText); + + if (this.getOption('appendTo') === 'body') document.body.appendChild(this.container); + else if (this.getOption('appendTo') === 'target') appendChild(this.container, this.el.nativeElement); + else appendChild(this.getOption('appendTo'), this.container); + + this.container.style.display = 'none'; + + if (this.fitContent) { + this.container.style.width = 'fit-content'; + } + + if (this.isAutoHide()) { + this.container.style.pointerEvents = 'none'; + } else { + this.container.style.pointerEvents = 'unset'; + this.bindContainerMouseleaveListener(); + } + } + + bindContainerMouseleaveListener() { + if (!this.containerMouseleaveListener) { + const targetEl: any = this.container ?? this.container.nativeElement; + + this.containerMouseleaveListener = this.renderer.listen(targetEl, 'mouseleave', (e) => { + this.deactivate(); + }); + } + } + + unbindContainerMouseleaveListener() { + if (this.containerMouseleaveListener) { + this.bindContainerMouseleaveListener(); + this.containerMouseleaveListener = null; + } + } + + show() { + if (!this.getOption('tooltipLabel') || this.getOption('disabled')) { + return; + } + + this.create(); + + const nativeElement = this.el.nativeElement; + const pDialogWrapper = nativeElement.closest('p-dialog'); + + if (pDialogWrapper) { + setTimeout(() => { + this.container && (this.container.style.display = 'inline-block'); + this.container && this.align(); + }, 100); + } else { + this.container.style.display = 'inline-block'; + this.align(); + } + + fadeIn(this.container, 250); + + if (this.getOption('tooltipZIndex') === 'auto') ZIndexUtils.set('tooltip', this.container, this.config.zIndex.tooltip); + else this.container.style.zIndex = this.getOption('tooltipZIndex'); + + this.bindDocumentResizeListener(); + this.bindScrollListener(); + } + + hide() { + if (this.getOption('tooltipZIndex') === 'auto') { + ZIndexUtils.clear(this.container); + } + this.remove(); + } + + updateText() { + const content = this.getOption('tooltipLabel'); + if (content && typeof (content as TemplateRef).createEmbeddedView === 'function') { + const embeddedViewRef = this.viewContainer.createEmbeddedView(content); + embeddedViewRef.detectChanges(); + embeddedViewRef.rootNodes.forEach((node) => this.tooltipText.appendChild(node)); + } else if (this.getOption('escape')) { + this.tooltipText.innerHTML = ''; + this.tooltipText.appendChild(document.createTextNode(content)); + } else { + this.tooltipText.innerHTML = content; + } + } + + align() { + const position = this.getOption('tooltipPosition') as keyof typeof positionPriority; + + const positionPriority = { + top: [this.alignTop, this.alignBottom, this.alignRight, this.alignLeft], + bottom: [this.alignBottom, this.alignTop, this.alignRight, this.alignLeft], + left: [this.alignLeft, this.alignRight, this.alignTop, this.alignBottom], + right: [this.alignRight, this.alignLeft, this.alignTop, this.alignBottom] + }; + + const alignFns = positionPriority[position] || []; + for (let [index, alignmentFn] of alignFns.entries()) { + if (index === 0) alignmentFn.call(this); + else if (this.isOutOfBounds()) alignmentFn.call(this); + else break; + } + } + + getHostOffset() { + if (this.getOption('appendTo') === 'body' || this.getOption('appendTo') === 'target') { + let offset = this.el.nativeElement.getBoundingClientRect(); + let targetLeft = offset.left + getWindowScrollLeft(); + let targetTop = offset.top + getWindowScrollTop(); + + return { left: targetLeft, top: targetTop }; + } else { + return { left: 0, top: 0 }; + } + } + + private get activeElement(): HTMLElement { + return this.el.nativeElement.nodeName.startsWith('P-') ? (findSingle(this.el.nativeElement, '.p-component') as HTMLElement) : this.el.nativeElement; + } + + alignRight() { + this.preAlign('right'); + const el = this.activeElement; + const offsetLeft = getOuterWidth(el); + const offsetTop = (getOuterHeight(el) - getOuterHeight(this.container)) / 2; + this.alignTooltip(offsetLeft, offsetTop); + let arrowElement = this.getArrowElement(); + + arrowElement.style.top = '50%'; + arrowElement.style.right = null; + arrowElement.style.bottom = null; + arrowElement.style.left = '0'; + } + + alignLeft() { + this.preAlign('left'); + let arrowElement = this.getArrowElement(); + let offsetLeft = getOuterWidth(this.container); + let offsetTop = (getOuterHeight(this.el.nativeElement) - getOuterHeight(this.container)) / 2; + this.alignTooltip(-offsetLeft, offsetTop); + + arrowElement.style.top = '50%'; + arrowElement.style.right = '0'; + arrowElement.style.bottom = null; + arrowElement.style.left = null; + } + + alignTop() { + this.preAlign('top'); + let arrowElement = this.getArrowElement(); + let hostOffset = this.getHostOffset(); + let elementWidth = getOuterWidth(this.container); + + let offsetLeft = (getOuterWidth(this.el.nativeElement) - getOuterWidth(this.container)) / 2; + let offsetTop = getOuterHeight(this.container); + this.alignTooltip(offsetLeft, -offsetTop); + + let elementRelativeCenter = hostOffset.left - this.getHostOffset().left + elementWidth / 2; + arrowElement.style.top = null; + arrowElement.style.right = null; + arrowElement.style.bottom = '0'; + arrowElement.style.left = elementRelativeCenter + 'px'; + } + + getArrowElement(): any { + return findSingle(this.container, '[data-pc-section="arrow"]'); + } + + alignBottom() { + this.preAlign('bottom'); + let arrowElement = this.getArrowElement(); + let elementWidth = getOuterWidth(this.container); + let hostOffset = this.getHostOffset(); + let offsetLeft = (getOuterWidth(this.el.nativeElement) - getOuterWidth(this.container)) / 2; + let offsetTop = getOuterHeight(this.el.nativeElement); + this.alignTooltip(offsetLeft, offsetTop); + + let elementRelativeCenter = hostOffset.left - this.getHostOffset().left + elementWidth / 2; + + arrowElement.style.top = '0'; + arrowElement.style.right = null; + arrowElement.style.bottom = null; + arrowElement.style.left = elementRelativeCenter + 'px'; + } + + alignTooltip(offsetLeft, offsetTop) { + let hostOffset = this.getHostOffset(); + let left = hostOffset.left + offsetLeft; + let top = hostOffset.top + offsetTop; + this.container.style.left = left + this.getOption('positionLeft') + 'px'; + this.container.style.top = top + this.getOption('positionTop') + 'px'; + } + + setOption(option: any) { + this._tooltipOptions = { ...this._tooltipOptions, ...option }; + } + + getOption(option: string) { + return this._tooltipOptions[option as keyof typeof this.tooltipOptions]; + } + + getTarget(el: Element) { + return hasClass(el, 'p-inputwrapper') ? findSingle(el, 'input') : el; + } + + preAlign(position: string) { + this.container.style.left = -999 + 'px'; + this.container.style.top = -999 + 'px'; + this.container.className = this.cn(this.cx('root'), this.ptm('root')?.class, 'p-tooltip-' + position, this.getOption('tooltipStyleClass')); + } + + isOutOfBounds(): boolean { + let offset = this.container.getBoundingClientRect(); + let targetTop = offset.top; + let targetLeft = offset.left; + let width = getOuterWidth(this.container); + let height = getOuterHeight(this.container); + let viewport = getViewport(); + + return targetLeft + width > viewport.width || targetLeft < 0 || targetTop < 0 || targetTop + height > viewport.height; + } + + onWindowResize(e: Event) { + this.hide(); + } + + bindDocumentResizeListener() { + this.zone.runOutsideAngular(() => { + this.resizeListener = this.onWindowResize.bind(this); + window.addEventListener('resize', this.resizeListener); + }); + } + + unbindDocumentResizeListener() { + if (this.resizeListener) { + window.removeEventListener('resize', this.resizeListener); + this.resizeListener = null; + } + } + + bindScrollListener() { + if (!this.scrollHandler) { + this.scrollHandler = new ConnectedOverlayScrollHandler(this.el.nativeElement, () => { + if (this.container) { + this.hide(); + } + }); + } + + this.scrollHandler.bindScrollListener(); + } + + unbindScrollListener() { + if (this.scrollHandler) { + this.scrollHandler.unbindScrollListener(); + } + } + + unbindEvents() { + const tooltipEvent = this.getOption('tooltipEvent'); + + if (tooltipEvent === 'hover' || tooltipEvent === 'both') { + this.el.nativeElement.removeEventListener('mouseenter', this.mouseEnterListener); + this.el.nativeElement.removeEventListener('mouseleave', this.mouseLeaveListener); + this.el.nativeElement.removeEventListener('click', this.clickListener); + + // Touch support + this.el.nativeElement.removeEventListener('touchstart', this.touchStartListener); + this.el.nativeElement.removeEventListener('touchend', this.touchEndListener); + this.unbindDocumentTouchListener(); + } + if (tooltipEvent === 'focus' || tooltipEvent === 'both') { + let target = this.el.nativeElement.querySelector('.p-component'); + + if (!target) { + target = this.getTarget(this.el.nativeElement); + } + + target.removeEventListener('focus', this.focusListener); + target.removeEventListener('blur', this.blurListener); + } + this.unbindDocumentResizeListener(); + } + + remove() { + if (this.container && this.container.parentElement) { + if (this.getOption('appendTo') === 'body') document.body.removeChild(this.container); + else if (this.getOption('appendTo') === 'target') this.el.nativeElement.removeChild(this.container); + else removeChild(this.getOption('appendTo'), this.container); + } + + this.unbindDocumentResizeListener(); + this.unbindScrollListener(); + this.unbindContainerMouseleaveListener(); + this.unbindDocumentTouchListener(); + this.clearTimeouts(); + this.container = null; + this.scrollHandler = null; + } + + clearShowTimeout() { + if (this.showTimeout) { + clearTimeout(this.showTimeout); + this.showTimeout = null; + } + } + + clearHideTimeout() { + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout = null; + } + } + + clearTimeouts() { + this.clearShowTimeout(); + this.clearHideTimeout(); + } + + onDestroy() { + this.unbindEvents(); + + if (this.container) { + ZIndexUtils.clear(this.container); + } + + this.remove(); + + if (this.scrollHandler) { + this.scrollHandler.destroy(); + this.scrollHandler = null; + } + + if (this.documentEscapeListener) { + this.documentEscapeListener(); + } + } +} + +@NgModule({ + imports: [Tooltip, BindModule], + exports: [Tooltip, BindModule] +}) +export class TooltipModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/tree/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/tree/public_api.ts new file mode 100644 index 000000000..129ed6c17 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/tree/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/tree/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/tree/public_api'; +export * from './tree'; +export * from './style/treestyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/tree/style/treestyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/tree/style/treestyle.ts new file mode 100644 index 000000000..976a3fdde --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/tree/style/treestyle.ts @@ -0,0 +1,132 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/tree/style/treestyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { style } from '../../../primeuix-temp/styles/src/tree/index'; +import { BaseStyle } from '../../base/public_api'; + +const classes = { + root: ({ instance }) => [ + 'p-tree p-component', + { + 'p-tree-selectable': instance.selectionMode != null, + 'p-tree-loading': instance.loading, + 'p-tree-flex-scrollable': instance.scrollHeight === 'flex', + 'p-tree-node-dragover': instance.dragHover + } + ], + mask: 'p-tree-mask p-overlay-mask', + loadingIcon: 'p-tree-loading-icon', + pcFilterInput: 'p-tree-filter-input', + wrapper: 'p-tree-root', + rootChildren: 'p-tree-root-children', + node: ({ instance }) => ({ 'p-tree-node': true, 'p-tree-node-leaf': instance.isLeaf() }), + nodeContent: ({ instance }) => ({ + 'p-tree-node-content': true, + 'p-tree-node-selectable': instance.selectable, + 'p-tree-node-dragover': instance.isNodeDropActive(), + 'p-tree-node-selected': instance.selectionMode === 'checkbox' && instance.tree.highlightOnSelect ? instance.checked : instance.selected, + 'p-tree-node-contextmenu-selected': instance.isContextMenuSelected() + }), + nodeToggleButton: 'p-tree-node-toggle-button', + nodeToggleIcon: 'p-tree-node-toggle-icon', + nodeCheckbox: 'p-tree-node-checkbox', + nodeIcon: 'p-tree-node-icon', + nodeLabel: 'p-tree-node-label', + nodeChildren: 'p-tree-node-children', + emptyMessage: 'p-tree-empty-message', + dropPoint: 'p-tree-node-drop-point' +}; + +@Injectable() +export class TreeStyle extends BaseStyle { + name = 'tree'; + + style = style; + + classes = classes; +} + +/** + * + * Tree is used to display hierarchical data. + * + * [Live Demo](https://www.primeng.org/tree/) + * + * @module treestyle + * + */ +export enum TreeClasses { + /** + * Class name of the root element + */ + root = 'p-tree', + /** + * Class name of the mask element + */ + mask = 'p-tree-mask', + /** + * Class name of the loading icon element + */ + loadingIcon = 'p-tree-loading-icon', + /** + * Class name of the filter input element + */ + pcFilterInput = 'p-tree-filter-input', + /** + * Class name of the wrapper element + */ + wrapper = 'p-tree-root', + /** + * Class name of the root children element + */ + rootChildren = 'p-tree-root-children', + /** + * Class name of the node element + */ + node = 'p-tree-node', + /** + * Class name of the node content element + */ + nodeContent = 'p-tree-node-content', + /** + * Class name of the node toggle button element + */ + nodeToggleButton = 'p-tree-node-toggle-button', + /** + * Class name of the node toggle icon element + */ + nodeToggleIcon = 'p-tree-node-toggle-icon', + /** + * Class name of the node checkbox element + */ + nodeCheckbox = 'p-tree-node-checkbox', + /** + * Class name of the node icon element + */ + nodeIcon = 'p-tree-node-icon', + /** + * Class name of the node label element + */ + nodeLabel = 'p-tree-node-label', + /** + * Class name of the node children element + */ + nodeChildren = 'p-tree-node-children', + /** + * Class name of the empty message element + */ + emptyMessage = 'p-tree-empty-message', + /** + * Class name of the drop point element + */ + dropPoint = 'p-tree-node-droppoint' +} + +export interface TreeStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/tree/tree.ts b/projects/cps-ui-kit/src/lib/primeng-temp/tree/tree.ts new file mode 100755 index 000000000..9404163b3 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/tree/tree.ts @@ -0,0 +1,1957 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/tree/tree.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule } from '@angular/common'; +import { + booleanAttribute, + ChangeDetectionStrategy, + Component, + computed, + ContentChild, + ContentChildren, + ElementRef, + EventEmitter, + forwardRef, + HostListener, + inject, + InjectionToken, + Input, + model, + NgModule, + numberAttribute, + Optional, + Output, + QueryList, + signal, + SimpleChanges, + TemplateRef, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { find, findSingle, focus, getOuterHeight, getOuterWidth, removeAccents, resolveFieldData } from '../../primeuix-temp/utils/src/index'; +import { BlockableUI, PrimeTemplate, ScrollerOptions, SharedModule, TranslationKeys, TreeDragDropService, TreeNode } from '../api/public_api'; +import { AutoFocusModule } from '../autofocus/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import { Checkbox } from '../checkbox/public_api'; +import { IconField } from '../iconfield/public_api'; +import { ChevronDownIcon, ChevronRightIcon, SearchIcon, SpinnerIcon } from '../icons/public_api'; +import { InputIcon } from '../inputicon/public_api'; +import { InputText } from '../inputtext/public_api'; +import { Ripple } from '../ripple/public_api'; +import { Scroller } from '../scroller/public_api'; +import { Nullable } from '../ts-helpers/public_api'; +import { + TreeCheckboxIconTemplateContext, + TreeFilterEvent, + TreeFilterTemplateContext, + TreeLazyLoadEvent, + TreeLoaderTemplateContext, + TreeNodeCollapseEvent, + TreeNodeContextMenuSelectEvent, + TreeNodeDoubleClickEvent, + TreeNodeDropEvent, + TreeNodeExpandEvent, + TreeNodeSelectEvent, + TreeNodeUnSelectEvent, + TreePassThrough, + TreeScrollEvent, + TreeScrollIndexChangeEvent, + TreeTogglerIconTemplateContext +} from '../types/tree/public_api'; +import { Subscription } from 'rxjs'; +import { TreeStyle } from './style/treestyle'; + +const TREE_INSTANCE = new InjectionToken('TREE_INSTANCE'); +const TREENODE_INSTANCE = new InjectionToken('TREENODE_INSTANCE'); + +@Component({ + selector: 'p-treeNode', + standalone: true, + imports: [CommonModule, Ripple, Checkbox, FormsModule, ChevronRightIcon, ChevronDownIcon, SpinnerIcon, SharedModule, BindModule], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` + @if (node) { +
  • + @if (isPrevDropPointActive()) { +
    + } +
    + + + + + + + + + + + + + {{ node.label }} + + + + +
    + @if (isNextDropPointActive()) { +
    + } +
      + +
    +
  • + } + `, + encapsulation: ViewEncapsulation.None, + providers: [TreeStyle, { provide: TREENODE_INSTANCE, useExisting: UITreeNode }, { provide: PARENT_INSTANCE, useExisting: UITreeNode }] +}) +export class UITreeNode extends BaseComponent { + $pcTreeNode: UITreeNode | undefined = inject(TREENODE_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + static ICON_CLASS: string = 'p-tree-node-icon '; + + @Input() rowNode: any; + + @Input() node: TreeNode | undefined; + + @Input() parentNode: TreeNode | undefined; + + @Input({ transform: booleanAttribute }) root: boolean | undefined; + + @Input({ transform: numberAttribute }) index: number | undefined; + + @Input({ transform: booleanAttribute }) firstChild: boolean | undefined; + + @Input({ transform: booleanAttribute }) lastChild: boolean | undefined; + + @Input({ transform: numberAttribute }) level: number | undefined; + + @Input({ transform: numberAttribute }) indentation: number | undefined; + + @Input({ transform: numberAttribute }) itemSize: number | undefined; + + @Input() loadingMode: string; + + tree: Tree = inject(forwardRef(() => Tree)); + + timeout: any; + + isPrevDropPointHovered = signal(false); + + isNextDropPointHovered = signal(false); + + isNodeDropHovered = signal(false); + + isPrevDropPointActive = computed(() => this.isPrevDropPointHovered() && this.isDroppable()); + + isNextDropPointActive = computed(() => this.isNextDropPointHovered() && this.isDroppable()); + + isNodeDropActive = computed(() => this.isNodeDropHovered() && this.isNodeDroppable()); + + dropPosition = computed(() => (this.isPrevDropPointActive() ? -1 : this.isNextDropPointActive() ? 1 : 0)); + + _componentStyle = inject(TreeStyle); + + /** + * Computed signal that reactively tracks selection state. + */ + private _selected = computed(() => { + // Reading selection() makes this computed reactive to selection changes + this.tree.selection(); + return this.tree.isSelected(this.node); + }); + + /** + * Computed signal that reactively tracks context menu selection state. + */ + private _contextMenuSelected = computed(() => { + const selection = this.tree.contextMenuSelection(); + if (!selection || !this.node) { + return false; + } + return selection === this.node || (selection.key && selection.key === this.node.key); + }); + + get selected() { + return this.tree.selectionMode === 'single' || this.tree.selectionMode === 'multiple' ? this._selected() : undefined; + } + + get checked() { + return this.tree.selectionMode === 'checkbox' ? this._selected() : undefined; + } + + get nodeClass() { + return this.tree._componentStyle.classes.node({ instance: this }); + } + + get selectable() { + return this.node?.selectable === false ? false : this.tree?.selectionMode != null; + } + + get subNodes(): TreeNode[] | undefined { + return this.node?.parent ? this.node.parent.children : this.tree.value; + } + + getPTOptions(key: string) { + return this.ptm(key, { + context: { + node: this.node, + index: this.index, + expanded: this.node?.expanded, + selected: this.selected, + checked: this.checked, + partialChecked: this.node?.partialSelected, + leaf: this.isLeaf() + } + }); + } + + onInit() { + (this.node).parent = this.parentNode; + const nativeElement = this.tree.el.nativeElement; + const pDialogWrapper = nativeElement.closest('p-dialog'); + if (this.parentNode && !pDialogWrapper) { + this.setAllNodesTabIndexes(); + this.tree.syncNodeOption(this.node, []>this.tree.value, 'parent', this.tree.getNodeWithKey(this.parentNode.key, []>this.tree.value)); + } + } + + getIcon() { + let icon: string | undefined; + + if ((this.node).icon) icon = (this.node).icon as string; + else icon = (this.node).expanded && (this.node).children && (this.node).children?.length ? (this.node).expandedIcon : (this.node).collapsedIcon; + + return UITreeNode.ICON_CLASS + ' ' + icon + ' p-tree-node-icon'; + } + + isLeaf() { + return this.tree.isNodeLeaf(this.node); + } + + isSelected() { + return this._selected(); + } + + isContextMenuSelected() { + return this._contextMenuSelected(); + } + + isSameNode(event) { + return event.currentTarget && (event.currentTarget.isSameNode(event.target) || event.currentTarget.isSameNode(event.target.closest('[role="treeitem"]'))); + } + + isDraggable() { + return this.tree.draggableNodes; + } + + isDroppable() { + return this.tree.droppableNodes && this.tree.allowDrop(this.tree.dragNode, this.node, this.tree.dragNodeScope); + } + + isNodeDroppable() { + return (this.node)?.droppable !== false && this.isDroppable(); + } + + isNodeDraggable() { + return (this.node)?.draggable !== false && this.isDraggable(); + } + + toggle(event: Event) { + if ((this.node).expanded) this.collapse(event); + else this.expand(event); + + event.stopPropagation(); + } + + expand(event: Event) { + (this.node).expanded = true; + if (this.tree.virtualScroll) { + this.tree.updateSerializedValue(); + this.focusVirtualNode(); + } + this.tree.onNodeExpand.emit({ originalEvent: event, node: this.node }); + } + + collapse(event: Event) { + (this.node).expanded = false; + if (this.tree.virtualScroll) { + this.tree.updateSerializedValue(); + } + this.tree.onNodeCollapse.emit({ originalEvent: event, node: this.node }); + this.focusVirtualNode(); + } + + onNodeClick(event: MouseEvent) { + this.tree.onNodeClick(event, this.node); + } + + onNodeKeydown(event: KeyboardEvent) { + if (event.key === 'Enter') { + this.tree.onNodeClick(event, this.node); + } + } + + onNodeTouchEnd() { + this.tree.onNodeTouchEnd(); + } + + onNodeRightClick(event: MouseEvent) { + this.tree.onNodeRightClick(event, this.node); + } + + onNodeDblClick(event: MouseEvent) { + this.tree.onNodeDblClick(event, this.node); + } + + insertNodeOnDrop() { + const { dragNode, dragNodeIndex, dragNodeSubNodes } = this.tree; + + if (!this.node || dragNodeIndex == null || !dragNode || !dragNodeSubNodes) { + return; + } + + const position = this.dropPosition(); + const subNodes = this.subNodes || []; + const index = this.index || 0; + const dropIndex = dragNodeSubNodes === subNodes ? (dragNodeIndex > index ? index : index - 1) : index; + + dragNodeSubNodes.splice(dragNodeIndex, 1); + + if (position < 0) { + // insert before a Node + subNodes.splice(dropIndex, 0, dragNode); + } else if (position > 0) { + // insert after a Node + subNodes.splice(dropIndex + 1, 0, dragNode); + } else { + // insert as child of a Node + this.node.children = this.node.children || []; + this.node.children.push(dragNode); + } + + this.tree.dragDropService.stopDrag({ + node: dragNode, + subNodes, + index: dragNodeIndex + }); + } + + onNodeDrop(event: any) { + event.preventDefault(); + event.stopPropagation(); + + if (this.isDroppable()) { + const { dragNode } = this.tree; + const position = this.dropPosition(); + const isValidDrop = position !== 0 || (position === 0 && this.isNodeDroppable()); + + if (isValidDrop) { + if (this.tree.validateDrop) { + this.tree.onNodeDrop.emit({ + originalEvent: event, + dragNode: dragNode, + dropNode: this.node, + index: this.index, + accept: () => { + this.insertNodeOnDrop(); + } + }); + } else { + this.insertNodeOnDrop(); + this.tree.onNodeDrop.emit({ + originalEvent: event, + dragNode: dragNode, + dropNode: this.node, + index: this.index + }); + } + } + } + + this.isPrevDropPointHovered.set(false); + this.isNextDropPointHovered.set(false); + this.isNodeDropHovered.set(false); + } + + onNodeDragStart(event: any) { + if (this.isNodeDraggable()) { + event.dataTransfer.effectAllowed = 'all'; + event.dataTransfer?.setData('text', 'data'); + + const target = event.currentTarget as HTMLElement; + const dragEl = target.cloneNode(true) as HTMLElement; + const toggler = dragEl.querySelector('[data-pc-section="nodetogglebutton"]'); + const checkbox = dragEl.querySelector('[data-pc-name="pcnodecheckbox"]'); + + target.setAttribute('data-p-dragging', 'true'); + dragEl.style.width = getOuterWidth(target) + 'px'; + dragEl.style.height = getOuterHeight(target) + 'px'; + dragEl.setAttribute('data-pc-section', 'drag-image'); + toggler.style.visibility = 'hidden'; + checkbox?.remove(); + document.body.appendChild(dragEl); + + event.dataTransfer?.setDragImage(dragEl, 0, 0); + + setTimeout(() => document.body.removeChild(dragEl), 0); + + this.tree.dragDropService.startDrag({ + tree: this, + node: this.node, + subNodes: this.subNodes, + index: this.index, + scope: this.tree.draggableScope + }); + } else { + event.preventDefault(); + } + } + + onNodeDragOver(event: any) { + if (this.isDroppable()) { + event.dataTransfer.dropEffect = 'copy'; + + const nodeElement = event.currentTarget as HTMLElement; + const rect = nodeElement.getBoundingClientRect(); + const y = event.clientY - parseInt(rect.top as any); + + this.isPrevDropPointHovered.set(false); + this.isNextDropPointHovered.set(false); + this.isNodeDropHovered.set(false); + + if (y < rect.height * 0.25) { + this.isPrevDropPointHovered.set(true); + } else if (y > rect.height * 0.75) { + this.isNextDropPointHovered.set(true); + } else if (this.isNodeDroppable()) { + this.isNodeDropHovered.set(true); + } + } else { + event.dataTransfer.dropEffect = 'none'; + } + + if (this.tree.droppableNodes) { + event.preventDefault(); + event.stopPropagation(); + } + } + + onNodeDragLeave() { + this.isPrevDropPointHovered.set(false); + this.isNextDropPointHovered.set(false); + this.isNodeDropHovered.set(false); + } + + onNodeDragEnd(event: any) { + event.currentTarget?.removeAttribute('data-p-dragging'); + + this.tree.dragDropService.stopDrag({ + node: this.node, + subNodes: this.subNodes, + index: this.index + }); + } + + onKeyDown(event: KeyboardEvent) { + if (!this.isSameNode(event) || (this.tree.contextMenu && this.tree.contextMenu.containerViewChild?.nativeElement.style.display === 'block')) { + return; + } + + switch (event.code) { + //down arrow + case 'ArrowDown': + this.onArrowDown(event); + break; + + //up arrow + case 'ArrowUp': + this.onArrowUp(event); + break; + + //right arrow + case 'ArrowRight': + this.onArrowRight(event); + break; + + //left arrow + case 'ArrowLeft': + this.onArrowLeft(event); + break; + + //enter + case 'Enter': + case 'Space': + case 'NumpadEnter': + this.onEnter(event); + break; + //tab + case 'Tab': + this.setAllNodesTabIndexes(); + break; + + default: + //no op + break; + } + } + + onArrowUp(event: KeyboardEvent) { + const nodeElement = (event.target).getAttribute('data-pc-section') === 'nodetogglebutton' ? (event.target).closest('[role="treeitem"]') : (event.target).parentElement; + + if (nodeElement?.previousElementSibling) { + this.focusRowChange(nodeElement, nodeElement.previousElementSibling, this.findLastVisibleDescendant(nodeElement.previousElementSibling)); + } else { + let parentNodeElement = this.getParentNodeElement(nodeElement!); + + if (parentNodeElement) { + this.focusRowChange(nodeElement, parentNodeElement); + } + } + + event.preventDefault(); + } + + onArrowDown(event: KeyboardEvent) { + const nodeElement = (event.target).getAttribute('data-pc-section') === 'nodetogglebutton' ? (event.target).closest('[role="treeitem"]') : event.target; + const listElement = nodeElement?.children[1]; + + if (listElement && listElement.children.length > 0) { + this.focusRowChange(nodeElement, listElement.children[0]); + } else { + if (nodeElement?.parentElement?.nextElementSibling) { + this.focusRowChange(nodeElement, nodeElement.parentElement.nextElementSibling); + } else { + let nextSiblingAncestor = this.findNextSiblingOfAncestor(nodeElement?.parentElement!); + + if (nextSiblingAncestor) { + this.focusRowChange(nodeElement, nextSiblingAncestor); + } + } + } + event.preventDefault(); + } + + onArrowRight(event: KeyboardEvent) { + if (!this.node?.expanded && !this.tree.isNodeLeaf(this.node)) { + this.expand(event); + (event.currentTarget).tabIndex = -1; + + setTimeout(() => { + this.onArrowDown(event); + }, 1); + } + event.preventDefault(); + } + + onArrowLeft(event: KeyboardEvent) { + const nodeElement = (event.target).getAttribute('data-pc-section') === 'nodetogglebutton' ? (event.target).closest('[role="treeitem"]') : event.target; + + if (this.level === 0 && !this.node?.expanded) { + return false; + } + + if (this.node?.expanded) { + this.collapse(event); + return; + } + + let parentNodeElement = this.getParentNodeElement(nodeElement?.parentElement!); + + if (parentNodeElement) { + this.focusRowChange(event.currentTarget, parentNodeElement); + } + + event.preventDefault(); + } + + onEnter(event: KeyboardEvent) { + this.tree.onNodeClick(event, this.node); + this.setTabIndexForSelectionMode(event, this.tree.nodeTouched); + event.preventDefault(); + } + + setAllNodesTabIndexes() { + const nodes = find(this.tree.el.nativeElement, '[data-pc-section="node"]'); + + const hasSelectedNode = [...nodes].some((node) => node.getAttribute('aria-selected') === 'true' || node.getAttribute('aria-checked') === 'true'); + + [...nodes].forEach((node) => { + node.tabIndex = -1; + }); + + if (hasSelectedNode) { + const selectedNodes = [...nodes].filter((node) => node.getAttribute('aria-selected') === 'true' || node.getAttribute('aria-checked') === 'true'); + + selectedNodes[0].tabIndex = 0; + + return; + } + + if (nodes.length) { + ([...nodes][0] as any).tabIndex = 0; + } + } + + setTabIndexForSelectionMode(event, nodeTouched) { + if (this.tree.selectionMode !== null) { + const elements = [...find(this.tree.el.nativeElement, '[role="treeitem"]')]; + + event.currentTarget.tabIndex = nodeTouched === false ? -1 : 0; + + if (elements.every((element: any) => element.tabIndex === -1)) { + (elements[0] as any).tabIndex = 0; + } + } + } + + findNextSiblingOfAncestor(nodeElement: any): any { + let parentNodeElement = this.getParentNodeElement(nodeElement); + + if (parentNodeElement) { + if (parentNodeElement.nextElementSibling) return parentNodeElement.nextElementSibling; + else return this.findNextSiblingOfAncestor(parentNodeElement); + } else { + return null; + } + } + + findLastVisibleDescendant(nodeElement: any): any { + const listElement = Array.from(nodeElement.children).find((el: any) => el.getAttribute('data-pc-section') === 'node'); + const childrenListElement = listElement?.children[1]; + if (childrenListElement && childrenListElement.children.length > 0) { + const lastChildElement = childrenListElement.children[childrenListElement.children.length - 1]; + + return this.findLastVisibleDescendant(lastChildElement); + } else { + return nodeElement; + } + } + + getParentNodeElement(nodeElement: HTMLElement | Element) { + const parentNodeElement = nodeElement.parentElement?.parentElement?.parentElement; + + return parentNodeElement?.tagName === 'P-TREENODE' ? parentNodeElement : null; + } + + focusNode(element: any) { + (element.children[0] as HTMLElement).focus(); + } + + focusRowChange(firstFocusableRow, currentFocusedRow, lastVisibleDescendant?) { + firstFocusableRow.tabIndex = '-1'; + currentFocusedRow.children[0].tabIndex = '0'; + + this.focusNode(lastVisibleDescendant || currentFocusedRow); + } + + focusVirtualNode() { + this.timeout = setTimeout(() => { + let node = findSingle(this.tree?.contentViewChild?.nativeElement, `[data-id="${this.node?.key ?? this.node?.data}"]`); + focus(node); + }, 1); + } +} +/** + * Tree is used to display hierarchical data. + * @group Components + */ +@Component({ + selector: 'p-tree', + standalone: true, + imports: [CommonModule, Scroller, SharedModule, SearchIcon, SpinnerIcon, InputText, FormsModule, IconField, InputIcon, UITreeNode, AutoFocusModule, Bind], + template: ` +
    + + + + + + + +
    + + @if (filterTemplate || _filterTemplate) { + + } @else { + + + + + + + + + + } + + + + +
      + +
    +
    + + + + + +
    + +
    +
      + +
    +
    +
    +
    + +
    + @if (!emptyTemplate && !_emptyTemplate) { + {{ emptyMessageLabel }} + } @else { + + } +
    + + `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + providers: [TreeStyle, { provide: TREE_INSTANCE, useExisting: Tree }, { provide: PARENT_INSTANCE, useExisting: Tree }], + host: { + '[class]': "cn(cx('root'), styleClass)", + '[attr.data-p]': 'containerDataP' + }, + hostDirectives: [Bind] +}) +export class Tree extends BaseComponent implements BlockableUI { + componentName = 'Tree'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + $pcTree: Tree | undefined = inject(TREE_INSTANCE, { optional: true, skipSelf: true }) ?? undefined; + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + /** + * An array of treenodes. + * @group Props + */ + @Input() value: TreeNode | TreeNode[] | any[] | any; + /** + * Defines the selection mode. + * @group Props + */ + @Input() selectionMode: 'single' | 'multiple' | 'checkbox' | null | undefined; + /** + * Loading mode display. + * @group Props + */ + @Input() loadingMode: 'mask' | 'icon' = 'mask'; + /** + * A single treenode instance or an array to refer to the selections. + * @group Props + */ + selection = model | TreeNode[] | null | undefined>(null); + /** + * Style class of the component. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * Context menu instance. + * @group Props + */ + @Input() contextMenu: any; + /** + * Defines the behavior of context menu selection, in "separate" mode context menu updates contextMenuSelection property whereas in joint mode selection property is used instead so that when row selection is enabled, both row selection and context menu selection use the same property. + * @group Props + */ + @Input() contextMenuSelectionMode: 'separate' | 'joint' = 'joint'; + /** + * Selected node with a context menu. + * @group Props + */ + contextMenuSelection = model | null>(null); + /** + * Scope of the draggable nodes to match a droppableScope. + * @group Props + */ + @Input() draggableScope: any; + /** + * Scope of the droppable nodes to match a draggableScope. + * @group Props + */ + @Input() droppableScope: any; + /** + * Whether the nodes are draggable. + * @group Props + */ + @Input({ transform: booleanAttribute }) draggableNodes: boolean | undefined; + /** + * Whether the nodes are droppable. + * @group Props + */ + @Input({ transform: booleanAttribute }) droppableNodes: boolean | undefined; + /** + * Defines how multiple items can be selected, when true metaKey needs to be pressed to select or unselect an item and when set to false selection of each item can be toggled individually. On touch enabled devices, metaKeySelection is turned off automatically. + * @group Props + */ + @Input({ transform: booleanAttribute }) metaKeySelection: boolean = false; + /** + * Whether checkbox selections propagate to ancestor nodes. + * @group Props + */ + @Input({ transform: booleanAttribute }) propagateSelectionUp: boolean = true; + /** + * Whether checkbox selections propagate to descendant nodes. + * @group Props + */ + @Input({ transform: booleanAttribute }) propagateSelectionDown: boolean = true; + /** + * Displays a loader to indicate data load is in progress. + * @group Props + */ + @Input({ transform: booleanAttribute }) loading: boolean | undefined; + /** + * The icon to show while indicating data load is in progress. + * @group Props + */ + @Input() loadingIcon: string | undefined; + /** + * Text to display when there is no data. + * @group Props + */ + @Input() emptyMessage: string = ''; + /** + * Used to define a string that labels the tree. + * @group Props + */ + @Input() ariaLabel: string | undefined; + /** + * Defines a string that labels the toggler icon for accessibility. + * @group Props + */ + @Input() togglerAriaLabel: string | undefined; + /** + * Establishes relationships between the component and label(s) where its value should be one or more element IDs. + * @group Props + */ + @Input() ariaLabelledBy: string | undefined; + /** + * When enabled, drop can be accepted or rejected based on condition defined at onNodeDrop. + * @group Props + */ + @Input({ transform: booleanAttribute }) validateDrop: boolean | undefined; + /** + * When specified, displays an input field to filter the items. + * @group Props + */ + @Input({ transform: booleanAttribute }) filter: boolean | undefined; + /** + * Determines whether the filter input should be automatically focused when the component is rendered. + * @group Props + */ + @Input({ transform: booleanAttribute }) filterInputAutoFocus: boolean = false; + /** + * When filtering is enabled, filterBy decides which field or fields (comma separated) to search against. + * @group Props + */ + @Input() filterBy: string = 'label'; + /** + * Mode for filtering valid values are "lenient" and "strict". Default is lenient. + * @group Props + */ + @Input() filterMode: string = 'lenient'; + /** + * Mode for filtering valid values are "lenient" and "strict". Default is lenient. + * @group Props + */ + @Input() filterOptions: any; + /** + * Placeholder text to show when filter input is empty. + * @group Props + */ + @Input() filterPlaceholder: string | undefined; + /** + * Values after the tree nodes are filtered. + * @group Props + */ + @Input() filteredNodes: TreeNode[] | undefined | null; + /** + * Locale to use in filtering. The default locale is the host environment's current locale. + * @group Props + */ + @Input() filterLocale: string | undefined; + /** + * Height of the scrollable viewport. + * @group Props + */ + @Input() scrollHeight: string | undefined; + /** + * Defines if data is loaded and interacted with in lazy manner. + * @group Props + */ + @Input({ transform: booleanAttribute }) lazy: boolean = false; + /** + * Whether the data should be loaded on demand during scroll. + * @group Props + */ + @Input({ transform: booleanAttribute }) virtualScroll: boolean | undefined; + /** + * Height of an item in the list for VirtualScrolling. + * @group Props + */ + @Input({ transform: numberAttribute }) virtualScrollItemSize: number | undefined; + /** + * Whether to use the scroller feature. The properties of scroller component can be used like an object in it. + * @group Props + */ + @Input() virtualScrollOptions: ScrollerOptions | undefined; + /** + * Indentation factor for spacing of the nested node when virtual scrolling is enabled. + * @group Props + */ + @Input({ transform: numberAttribute }) indentation: number = 1.5; + /** + * Custom templates of the component. + * @group Props + */ + @Input() _templateMap: any; + /** + * Function to optimize the node list rendering, default algorithm checks for object identity. + * @group Props + */ + @Input() trackBy: Function = (index: number, item: any) => item; + /** + * Highlights the node on select. + * @group Props + */ + @Input({ transform: booleanAttribute }) highlightOnSelect: boolean = false; + /** + * Callback to invoke when a node is selected. + * @param {TreeNodeSelectEvent} event - Node select event. + * @group Emits + */ + @Output() onNodeSelect: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is unselected. + * @param {TreeNodeUnSelectEvent} event - Node unselect event. + * @group Emits + */ + @Output() onNodeUnselect: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is expanded. + * @param {TreeNodeExpandEvent} event - Node expand event. + * @group Emits + */ + @Output() onNodeExpand: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is collapsed. + * @param {TreeNodeCollapseEvent} event - Node collapse event. + * @group Emits + */ + @Output() onNodeCollapse: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is selected with right click. + * @param {onNodeContextMenuSelect} event - Node context menu select event. + * @group Emits + */ + @Output() onNodeContextMenuSelect: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is double clicked. + * @param {TreeNodeDoubleClickEvent} event - Node double click event. + * @group Emits + */ + @Output() onNodeDoubleClick: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is dropped. + * @param {TreeNodeDropEvent} event - Node drop event. + * @group Emits + */ + @Output() onNodeDrop: EventEmitter = new EventEmitter(); + /** + * Callback to invoke in lazy mode to load new data. + * @param {TreeLazyLoadEvent} event - Custom lazy load event. + * @group Emits + */ + @Output() onLazyLoad: EventEmitter = new EventEmitter(); + /** + * Callback to invoke in virtual scroll mode when scroll position changes. + * @param {TreeScrollEvent} event - Custom scroll event. + * @group Emits + */ + @Output() onScroll: EventEmitter = new EventEmitter(); + /** + * Callback to invoke in virtual scroll mode when scroll position and item's range in view changes. + * @param {TreeScrollIndexChangeEvent} event - Scroll index change event. + * @group Emits + */ + @Output() onScrollIndexChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when data is filtered. + * @param {TreeFilterEvent} event - Custom filter event. + * @group Emits + */ + @Output() onFilter: EventEmitter = new EventEmitter(); + /** + * Custom filter template. + * @param {TreeFilterTemplateContext} context - filter context. + * @see {@link TreeFilterTemplateContext} + * @group Templates + */ + @ContentChild('filter', { descendants: false }) filterTemplate: TemplateRef | undefined; + /** + * Custom node template. + * @group Templates + */ + @ContentChild('node', { descendants: false }) nodeTemplate: TemplateRef | undefined; + /** + * Custom header template. + * @group Templates + */ + @ContentChild('header', { descendants: false }) headerTemplate: TemplateRef | undefined; + /** + * Custom footer template. + * @group Templates + */ + @ContentChild('footer', { descendants: false }) footerTemplate: TemplateRef | undefined; + /** + * Custom loader template. + * @param {TreeLoaderTemplateContext} context - loader context. + * @see {@link TreeLoaderTemplateContext} + * @group Templates + */ + @ContentChild('loader', { descendants: false }) loaderTemplate: TemplateRef | undefined; + /** + * Custom empty message template. + * @group Templates + */ + @ContentChild('empty', { descendants: false }) emptyTemplate: TemplateRef | undefined; + /** + * Custom toggler icon template. + * @param {TreeTogglerIconTemplateContext} context - toggler icon context. + * @see {@link TreeTogglerIconTemplateContext} + * @group Templates + */ + @ContentChild('togglericon', { descendants: false }) togglerIconTemplate: TemplateRef | undefined; + /** + * Custom checkbox icon template. + * @param {TreeCheckboxIconTemplateContext} context - checkbox icon context. + * @see {@link TreeCheckboxIconTemplateContext} + * @group Templates + */ + @ContentChild('checkboxicon', { descendants: false }) checkboxIconTemplate: TemplateRef | undefined; + /** + * Custom loading icon template. + * @group Templates + */ + @ContentChild('loadingicon', { descendants: false }) loadingIconTemplate: TemplateRef | undefined; + /** + * Custom filter icon template. + * @group Templates + */ + @ContentChild('filtericon', { descendants: false }) filterIconTemplate: TemplateRef | undefined; + + @ViewChild('filter') filterViewChild: Nullable; + + @ViewChild('scroller') scroller: Nullable; + + @ViewChild('wrapper') wrapperViewChild: Nullable; + + @ViewChild('content') contentViewChild: Nullable; + + @ContentChildren(PrimeTemplate) private templates: QueryList | undefined; + + _headerTemplate: TemplateRef | undefined; + + _emptyTemplate: TemplateRef | undefined; + + _footerTemplate: TemplateRef | undefined; + + _loaderTemplate: TemplateRef | undefined; + + _togglerIconTemplate: TemplateRef | undefined; + + _checkboxIconTemplate: TemplateRef | undefined; + + _loadingIconTemplate: TemplateRef | undefined; + + _filterIconTemplate: TemplateRef | undefined; + + _filterTemplate: TemplateRef | undefined; + + onAfterContentInit() { + if ((this.templates as QueryList).length) { + this._templateMap = {}; + } + + (this.templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'header': + this._headerTemplate = item.template; + break; + + case 'empty': + this._emptyTemplate = item.template; + break; + + case 'footer': + this._footerTemplate = item.template; + break; + + case 'loader': + this._loaderTemplate = item.template; + break; + + case 'togglericon': + this._togglerIconTemplate = item.template; + break; + + case 'checkboxicon': + this._checkboxIconTemplate = item.template; + break; + + case 'loadingicon': + this._loadingIconTemplate = item.template; + break; + + case 'filtericon': + this._filterIconTemplate = item.template; + break; + + case 'filter': + this._filterTemplate = item.template; + break; + + default: + this._templateMap[item.name] = item.template; + break; + } + }); + } + + serializedValue: Nullable[]>; + + public nodeTouched: boolean | undefined | null; + + public dragNodeTree: Tree | undefined | null; + + public dragNode: TreeNode | undefined | null; + + public dragNodeSubNodes: TreeNode[] | undefined | null; + + public dragNodeIndex: number | undefined | null; + + public dragNodeScope: any; + + public dragHover: boolean | undefined | null; + + public dragStartSubscription: Subscription | undefined | null; + + public dragStopSubscription: Subscription | undefined | null; + + _componentStyle = inject(TreeStyle); + + @HostListener('drop', ['$event']) + handleDropEvent(event: DragEvent) { + this.onDrop(event); + } + + @HostListener('dragover', ['$event']) + handleDragOverEvent(event: DragEvent) { + this.onDragOver(event); + } + + @HostListener('dragenter') + handleDragEnterEvent() { + this.onDragEnter(); + } + + @HostListener('dragleave', ['$event']) + handleDragLeaveEvent(event: DragEvent) { + this.onDragLeave(event); + } + + constructor(@Optional() public dragDropService: TreeDragDropService) { + super(); + } + + onInit() { + if (this.filterBy) { + this.filterOptions = { + filter: (value) => this._filter(value), + reset: () => this.resetFilter() + }; + } + if (this.droppableNodes) { + this.dragStartSubscription = this.dragDropService.dragStart$.subscribe((event) => { + this.dragNodeTree = event.tree; + this.dragNode = event.node; + this.dragNodeSubNodes = event.subNodes; + this.dragNodeIndex = event.index; + this.dragNodeScope = event.scope; + }); + + this.dragStopSubscription = this.dragDropService.dragStop$.subscribe((event) => { + this.dragNodeTree = null; + this.dragNode = null; + this.dragNodeSubNodes = null; + this.dragNodeIndex = null; + this.dragNodeScope = null; + this.dragHover = false; + }); + } + } + + onChanges(simpleChange: SimpleChanges) { + if (simpleChange.value) { + this.updateSerializedValue(); + if (this.hasFilterActive()) { + this._filter(this.filterViewChild?.nativeElement?.value); + } + } + } + + get emptyMessageLabel(): string { + return this.emptyMessage || this.config.getTranslation(TranslationKeys.EMPTY_MESSAGE); + } + + updateSerializedValue() { + this.serializedValue = []; + this.serializeNodes(null, this.getRootNode(), 0, true); + } + + serializeNodes(parent: TreeNode | null, nodes: TreeNode[] | any, level: number, visible: boolean) { + if (nodes && nodes.length) { + for (let node of nodes) { + node.parent = parent; + const rowNode = { + node: node, + parent: parent, + level: level, + visible: visible && (parent ? parent.expanded : true) + }; + (this.serializedValue as TreeNode[]).push(rowNode); + + if (rowNode.visible && node.expanded) { + this.serializeNodes(node, node.children, level + 1, rowNode.visible); + } + } + } + } + + onNodeClick(event: Event, node: TreeNode) { + let eventTarget = event.target; + const section = eventTarget?.getAttribute?.('data-pc-section'); + if (section === 'nodetogglebutton' || section === 'nodetoggleicon') { + return; + } + + if (this.selectionMode) { + if (node.selectable === false) { + node.style = '--p-focus-ring-color: none;'; + return; + } else { + if (!node.style?.includes('--p-focus-ring-color')) { + node.style = node.style ? `${node.style}--p-focus-ring-color: var(--primary-color)` : '--p-focus-ring-color: var(--primary-color)'; + } + } + + if (this.hasFilteredNodes()) { + node = this.getNodeWithKey(node.key, []>this.filteredNodes) as TreeNode; + if (!node) { + return; + } + } + + let index = this.findIndexInSelection(node); + let selected = index >= 0; + const currentSelection = this.selection(); + + if (this.isCheckboxSelectionMode()) { + if (selected) { + if (this.propagateSelectionDown) this.propagateDown(node, false); + else this.selection.set((currentSelection as TreeNode[]).filter((_val: TreeNode, i: number) => i != index)); + + if (this.propagateSelectionUp && node.parent) { + this.propagateUp(node.parent, false); + } + + this.onNodeUnselect.emit({ originalEvent: event, node: node }); + } else { + if (this.propagateSelectionDown) this.propagateDown(node, true); + else this.selection.set([...((currentSelection as TreeNode[]) || []), node]); + + if (this.propagateSelectionUp && node.parent) { + this.propagateUp(node.parent, true); + } + + this.onNodeSelect.emit({ originalEvent: event, node: node }); + } + } else { + let metaSelection = this.nodeTouched ? false : this.metaKeySelection; + + if (metaSelection) { + let metaKey = (event).metaKey || (event).ctrlKey; + + if (selected && metaKey) { + if (this.isSingleSelectionMode()) { + this.selection.set(null); + } else { + this.selection.set((currentSelection as TreeNode[]).filter((_val: TreeNode, i: number) => i != index)); + } + + this.onNodeUnselect.emit({ originalEvent: event, node: node }); + } else { + if (this.isSingleSelectionMode()) { + this.selection.set(node); + } else if (this.isMultipleSelectionMode()) { + const base = !metaKey ? [] : (currentSelection as TreeNode[]) || []; + this.selection.set([...base, node]); + } + + this.onNodeSelect.emit({ originalEvent: event, node: node }); + } + } else { + if (this.isSingleSelectionMode()) { + if (selected) { + this.selection.set(null); + this.onNodeUnselect.emit({ originalEvent: event, node: node }); + } else { + this.selection.set(node); + setTimeout(() => { + this.onNodeSelect.emit({ originalEvent: event, node: node }); + }); + } + } else { + if (selected) { + this.selection.set((currentSelection as TreeNode[]).filter((_val: TreeNode, i: number) => i != index)); + this.onNodeUnselect.emit({ originalEvent: event, node: node }); + } else { + this.selection.set([...((currentSelection as TreeNode[]) || []), node]); + setTimeout(() => { + this.onNodeSelect.emit({ originalEvent: event, node: node }); + }); + } + } + } + } + } + + this.nodeTouched = false; + } + + onNodeTouchEnd() { + this.nodeTouched = true; + } + + onNodeRightClick(event: MouseEvent, node: TreeNode) { + if (this.contextMenu) { + let eventTarget = event.target; + const section = eventTarget.getAttribute('data-pc-section'); + + if (section === 'nodetogglebutton' || section === 'nodetoggleicon') { + return; + } + + let index = this.findIndexInSelection(node); + let isNodeSelected = index >= 0; + + const onContextMenuCallback = () => { + this.contextMenu.show(event); + this.contextMenu.hideCallback = () => { + this.contextMenuSelection.set(null); + }; + + this.onNodeContextMenuSelect.emit({ originalEvent: event, node: node }); + }; + + if (this.contextMenuSelectionMode === 'separate') { + // In 'separate' mode: Update contextMenuSelection with clicked node, don't modify selection + this.contextMenuSelection.set(node); + onContextMenuCallback(); + } else if (this.contextMenuSelectionMode === 'joint') { + // In 'joint' mode: Update only selection, don't touch contextMenuSelection + if (!isNodeSelected) { + if (this.isSingleSelectionMode()) { + this.selection.set(node); + } else { + this.selection.set([node]); + } + } + // If already selected, keep current selection as is + + onContextMenuCallback(); + } + } + } + + onNodeDblClick(event: MouseEvent, node: TreeNode) { + this.onNodeDoubleClick.emit({ originalEvent: event, node: node }); + } + + findIndexInSelection(node: TreeNode) { + let index: number = -1; + const currentSelection = this.selection(); + if (this.selectionMode && currentSelection) { + if (this.isSingleSelectionMode()) { + const sel = currentSelection as TreeNode; + let areNodesEqual = (sel.key && sel.key === node.key) || sel == node; + index = areNodesEqual ? 0 : -1; + } else { + const selArray = currentSelection as TreeNode[]; + for (let i = 0; i < selArray.length; i++) { + let selectedNode = selArray[i]; + let areNodesEqual = (selectedNode.key && selectedNode.key === node.key) || selectedNode == node; + if (areNodesEqual) { + index = i; + break; + } + } + } + } + + return index; + } + + syncNodeOption(node: TreeNode, parentNodes: TreeNode[], option: any, value?: any) { + // to synchronize the node option between the filtered nodes and the original nodes(this.value) + const _node = this.hasFilteredNodes() ? this.getNodeWithKey(node.key, parentNodes) : null; + if (_node) { + (_node)[option] = value || (node)[option]; + } + } + + hasFilteredNodes() { + return this.filter && this.filteredNodes && this.filteredNodes.length; + } + + hasFilterActive() { + return this.filter && this.filterViewChild?.nativeElement?.value.length > 0; + } + + getNodeWithKey(key: string, nodes: TreeNode[]): TreeNode | undefined { + for (let node of nodes) { + if (node.key === key) { + return node; + } + + if (node.children) { + let matchedNode = this.getNodeWithKey(key, node.children); + if (matchedNode) { + return matchedNode; + } + } + } + } + + propagateUp(node: TreeNode, select: boolean) { + if (node.children && node.children.length) { + let selectedCount: number = 0; + let childPartialSelected: boolean = false; + for (let child of node.children) { + if (this.isSelected(child)) { + selectedCount++; + } else if (child.partialSelected) { + childPartialSelected = true; + } + } + + const currentSelection = (this.selection() as TreeNode[]) || []; + if (select && selectedCount == node.children.length) { + this.selection.set([...currentSelection, node]); + node.partialSelected = false; + } else { + if (!select) { + let index = this.findIndexInSelection(node); + if (index >= 0) { + this.selection.set(currentSelection.filter((_val: TreeNode, i: number) => i != index)); + } + } + + if (childPartialSelected || (selectedCount > 0 && selectedCount != node.children.length)) node.partialSelected = true; + else node.partialSelected = false; + } + + this.syncNodeOption(node, []>this.filteredNodes, 'partialSelected'); + } + + let parent = node.parent; + if (parent) { + this.propagateUp(parent, select); + } + } + + propagateDown(node: TreeNode, select: boolean) { + let index = this.findIndexInSelection(node); + const currentSelection = (this.selection() as TreeNode[]) || []; + + if (select && index == -1) { + this.selection.set([...currentSelection, node]); + } else if (!select && index > -1) { + this.selection.set(currentSelection.filter((_val: TreeNode, i: number) => i != index)); + } + + node.partialSelected = false; + + this.syncNodeOption(node, []>this.filteredNodes, 'partialSelected'); + + if (node.children && node.children.length) { + for (let child of node.children) { + this.propagateDown(child, select); + } + } + } + + isSelected(node: TreeNode) { + return this.findIndexInSelection(node) != -1; + } + + isSingleSelectionMode() { + return this.selectionMode && this.selectionMode == 'single'; + } + + isMultipleSelectionMode() { + return this.selectionMode && this.selectionMode == 'multiple'; + } + + isCheckboxSelectionMode() { + return this.selectionMode && this.selectionMode == 'checkbox'; + } + + isNodeLeaf(node: TreeNode): boolean { + return node.leaf == false ? false : !(node.children && node.children.length); + } + + getRootNode() { + return this.filteredNodes ? this.filteredNodes : this.value; + } + + getTemplateForNode(node: TreeNode): TemplateRef | null { + if (this._templateMap) return node.type ? this._templateMap[node.type] : this._templateMap['default']; + else return null; + } + + onDragOver(event: DragEvent) { + if (this.droppableNodes && this.allowDrop(this.dragNode, null, this.dragNodeScope)) { + (event).dataTransfer.dropEffect = 'copy'; + event.preventDefault(); + } + } + + onDrop(event: DragEvent) { + if (this.droppableNodes) { + event.preventDefault(); + let dragNode = this.dragNode as TreeNode; + + if (this.isSameTreeScope(this.dragNodeScope)) { + return; + } + + if (this.allowDrop(dragNode, null, this.dragNodeScope)) { + let dragNodeIndex = this.dragNodeIndex; + this.value = this.value || []; + + if (this.validateDrop) { + this.onNodeDrop.emit({ + originalEvent: event, + dragNode: dragNode, + dropNode: null, + index: dragNodeIndex, + accept: () => { + this.processTreeDrop(dragNode, dragNodeIndex); + } + }); + } else { + this.onNodeDrop.emit({ + originalEvent: event, + dragNode: dragNode, + dropNode: null, + index: dragNodeIndex + }); + + this.processTreeDrop(dragNode, dragNodeIndex); + } + } + } + } + + processTreeDrop(dragNode: TreeNode, dragNodeIndex: number) { + ([]>this.dragNodeSubNodes).splice(dragNodeIndex, 1); + (this.value as TreeNode[]).push(dragNode); + this.dragDropService.stopDrag({ + node: dragNode + }); + } + + onDragEnter() { + if (this.droppableNodes && this.allowDrop(this.dragNode, null, this.dragNodeScope)) { + this.dragHover = true; + } + } + + onDragLeave(event: DragEvent) { + if (this.droppableNodes) { + let rect = (event.currentTarget as HTMLElement).getBoundingClientRect(); + if (event.x > parseInt(rect.left as any) + rect.width || event.x < parseInt(rect.left as any) || event.y > parseInt(rect.top as any) + rect.height || event.y < parseInt(rect.top as any)) { + this.dragHover = false; + } + } + } + + allowDrop(dragNode: TreeNode, dropNode: TreeNode | null, dragNodeScope: any): boolean { + if (!dragNode) { + //prevent random html elements to be dragged + return false; + } else if (this.isValidDragScope(dragNodeScope)) { + let allow: boolean = true; + if (dropNode) { + if (dragNode === dropNode) { + allow = false; + } else { + let parent = dropNode.parent; + while (parent != null) { + if (parent === dragNode) { + allow = false; + break; + } + parent = parent.parent; + } + } + } + + return allow; + } else { + return false; + } + } + + hasCommonScope(dragScope: any, dropScope: any): boolean { + if (typeof dropScope === 'string') { + if (typeof dragScope === 'string') return dropScope === dragScope; + else if (Array.isArray(dragScope)) return (>dragScope).indexOf(dropScope) != -1; + } else if (Array.isArray(dropScope)) { + if (typeof dragScope === 'string') { + return (>dropScope).indexOf(dragScope) != -1; + } else if (Array.isArray(dragScope)) { + for (let s of dropScope) { + for (let ds of dragScope) { + if (s === ds) { + return true; + } + } + } + } + } + return false; + } + + isSameTreeScope(dragScope: any): boolean { + return this.hasCommonScope(dragScope, this.draggableScope); + } + + isValidDragScope(dragScope: any): boolean { + let dropScope = this.droppableScope; + + if (dropScope) { + return this.hasCommonScope(dragScope, dropScope); + } else { + return true; + } + } + + public _filter(value: string) { + let filterValue = value; + if (filterValue === '') { + this.filteredNodes = null; + } else { + this.filteredNodes = []; + const searchFields: string[] = this.filterBy.split(','); + const filterText = removeAccents(filterValue).toLocaleLowerCase(this.filterLocale); + const isStrictMode = this.filterMode === 'strict'; + for (let node of []>this.value) { + let copyNode = { ...node }; + let paramsWithoutNode = { searchFields, filterText, isStrictMode }; + if ( + (isStrictMode && (this.findFilteredNodes(copyNode, paramsWithoutNode) || this.isFilterMatched(copyNode, paramsWithoutNode))) || + (!isStrictMode && (this.isFilterMatched(copyNode, paramsWithoutNode) || this.findFilteredNodes(copyNode, paramsWithoutNode))) + ) { + this.filteredNodes.push(copyNode); + } + } + } + + this.updateSerializedValue(); + this.onFilter.emit({ + filter: filterValue, + filteredValue: this.filteredNodes + }); + } + + /** + * Resets filter. + * @group Method + */ + public resetFilter() { + this.filteredNodes = null; + + if (this.filterViewChild && this.filterViewChild.nativeElement) { + this.filterViewChild.nativeElement.value = ''; + } + } + /** + * Scrolls to virtual index. + * @param {number} number - Index to be scrolled. + * @group Method + */ + public scrollToVirtualIndex(index: number) { + this.virtualScroll && this.scroller?.scrollToIndex(index); + } + /** + * Scrolls to virtual index. + * @param {ScrollToOptions} options - Scroll options. + * @group Method + */ + public scrollTo(options: any) { + if (this.virtualScroll) { + this.scroller?.scrollTo(options); + } else if (this.wrapperViewChild && this.wrapperViewChild.nativeElement) { + if (this.wrapperViewChild.nativeElement.scrollTo) { + this.wrapperViewChild.nativeElement.scrollTo(options); + } else { + this.wrapperViewChild.nativeElement.scrollLeft = options.left; + this.wrapperViewChild.nativeElement.scrollTop = options.top; + } + } + } + + findFilteredNodes(node: TreeNode, paramsWithoutNode: any) { + if (node) { + let matched = false; + if (node.children) { + let childNodes = [...node.children]; + node.children = []; + for (let childNode of childNodes) { + let copyChildNode = { ...childNode }; + if (this.isFilterMatched(copyChildNode, paramsWithoutNode)) { + matched = true; + node.children.push(copyChildNode); + } + } + } + + if (matched) { + node.expanded = true; + return true; + } + } + } + + isFilterMatched(node: TreeNode, params: any) { + let { searchFields, filterText, isStrictMode } = params; + let matched = false; + for (let field of searchFields) { + let fieldValue = removeAccents(String(resolveFieldData(node, field))).toLocaleLowerCase(this.filterLocale); + if (fieldValue.indexOf(filterText) > -1) { + matched = true; + } + } + + if (!matched || (isStrictMode && !this.isNodeLeaf(node))) { + matched = this.findFilteredNodes(node, { searchFields, filterText, isStrictMode }) || matched; + } + + return matched; + } + + getIndex(options: any, index: number) { + const getItemOptions = options['getItemOptions']; + return getItemOptions ? getItemOptions(index).index : index; + } + + getBlockableElement(): HTMLElement { + return this.el.nativeElement.children[0]; + } + + onDestroy() { + if (this.dragStartSubscription) { + this.dragStartSubscription.unsubscribe(); + } + + if (this.dragStopSubscription) { + this.dragStopSubscription.unsubscribe(); + } + } + + get containerDataP() { + return this.cn({ + loading: this.loading, + scrollable: this.scrollHeight === 'flex' + }); + } + + get wrapperDataP() { + return this.cn({ + scrollable: this.scrollHeight === 'flex' + }); + } +} +@NgModule({ + imports: [Tree, SharedModule], + exports: [Tree, SharedModule] +}) +export class TreeModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/treetable/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/treetable/public_api.ts new file mode 100644 index 000000000..ba70d0c39 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/treetable/public_api.ts @@ -0,0 +1,12 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/treetable/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from '../types/treetable/public_api'; +export * from './style/treetablestyle'; +export * from './treetable'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/treetable/style/treetablestyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/treetable/style/treetablestyle.ts new file mode 100644 index 000000000..47da5a67d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/treetable/style/treetablestyle.ts @@ -0,0 +1,753 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/treetable/style/treetablestyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { Injectable } from '@angular/core'; +import { BaseStyle } from '../../base/public_api'; + +const style = /*css*/ ` +/* For PrimeNG */ +.p-treetable { + position: relative; +} + +.p-treetable table { + border-collapse: collapse; + width: 100%; + table-layout: fixed; +} + +.p-treetable .p-sortable-column { + cursor: pointer; + user-select: none; +} + +.p-treetable .p-sortable-column .p-column-title, +.p-treetable .p-sortable-column .p-sortable-column-icon, +.p-treetable .p-sortable-column .p-sortable-column-badge { + vertical-align: middle; +} + +.p-treetable-sort-icon { + color: dt('treetable.sort.icon.color'); + font-size: dt('treetable.sort.icon.size'); + width: dt('treetable.sort.icon.size'); + height: dt('treetable.sort.icon.size'); + transition: color dt('treetable.transition.duration'); +} + +.p-treetable .p-sortable-column .p-sortable-column-badge { + display: inline-flex; + align-items: center; + justify-content: center; +} + +.p-treetable-auto-layout>.p-treetable-wrapper { + overflow-x: auto; +} + +.p-treetable-auto-layout>.p-treetable-wrapper>table { + table-layout: auto; +} + +.p-treetable-hoverable-rows .p-treetable-tbody>tr { + cursor: pointer; +} + +.p-treetable-toggler { + cursor: pointer; + user-select: none; + display: inline-flex; + align-items: center; + justify-content: center; + vertical-align: middle; + overflow: hidden; + position: relative; +} + + +/* Scrollable */ +.p-treetable-scrollable-wrapper { + position: relative; +} + +.p-treetable-scrollable-header, +.p-treetable-scrollable-footer { + overflow: hidden; + flex-shrink: 0; +} + +.p-treetable-scrollable-body { + overflow: auto; + position: relative; +} + +.p-treetable-virtual-table { + position: absolute; +} + +/* Frozen Columns */ +.p-treetable-frozen-view .p-treetable-scrollable-body { + overflow: hidden; +} + +.p-treetable-frozen-view>.p-treetable-scrollable-body>table>.p-treetable-tbody>tr>td:last-child { + border-right: 0 none; +} + +.p-treetable-unfrozen-view { + position: absolute; + top: 0; +} + +/* Flex Scrollable */ +.p-treetable-flex-scrollable { + display: flex; + flex-direction: column; + flex: 1; + height: 100%; +} + +.p-treetable-flex-scrollable .p-treetable-scrollable-wrapper, +.p-treetable-flex-scrollable .p-treetable-scrollable-view { + display: flex; + flex-direction: column; + flex: 1; + height: 100%; +} + +.p-treetable-flex-scrollable .p-treetable-virtual-scrollable-body { + flex: 1; +} + +/* Resizable */ +.p-treetable-resizable>.p-treetable-wrapper { + overflow-x: auto; +} + +.p-treetable-resizable .p-treetable-thead>tr>th, +.p-treetable-resizable .p-treetable-tfoot>tr>td, +.p-treetable-resizable .p-treetable-tbody>tr>td { + overflow: hidden; +} + +.p-treetable-resizable .p-resizable-column { + background-clip: padding-box; + position: relative; +} + +.p-treetable-resizable-fit .p-resizable-column:last-child .p-column-resizer { + display: none; +} + +.p-treetable .p-column-resizer { + display: block; + position: absolute; + top: 0; + right: 0; + margin: 0; + width: dt('treetable.column.resizer.width'); + height: 100%; + padding: 0px; + cursor: col-resize; + border: 1px solid transparent; +} + +.p-treetable .p-column-resizer-helper { + width: dt('treetable.resize.indicator.width'); + position: absolute; + z-index: 10; + display: none; + background: dt('treetable.resize.indicator.color'); +} + +.p-treetable .p-row-editor-init, +.p-treetable .p-row-editor-save, +.p-treetable .p-row-editor-cancel { + display: inline-flex; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; +} + + +/* Reorder */ +.p-treetable-reorder-indicator-up, +.p-treetable-reorder-indicator-down { + position: absolute; + display: none; +} + +[ttReorderableColumn] { + cursor: move; +} + +/* Loader */ +.p-treetable-mask { + position: absolute !important; + display: flex; + align-items: center; + justify-content: center; + z-index: 2; +} + +.p-treetable-loading-icon { + font-size: dt('treetable.loading.icon.size'); + width: dt('treetable.loading.icon.size'); + height: dt('treetable.loading.icon.size'); +} + +/* Virtual Scroll */ +.p-treetable .p-scroller-loading { + transform: none !important; + min-height: 0; + position: sticky; + top: 0; + left: 0; +} + +.p-treetable .p-paginator-top { + border-color: dt('treetable.paginator.top.border.color'); + border-style: solid; + border-width: dt('treetable.paginator.top.border.width'); +} + +.p-treetable .p-paginator-bottom { + border-color: dt('treetable.paginator.bottom.border.color'); + border-style: solid; + border-width: dt('treetable.paginator.bottom.border.width'); +} + +.p-treetable .p-treetable-header { + background: dt('treetable.header.background'); + color: dt('treetable.header.color'); + border-color: dt('treetable.header.border.color'); + border-style: solid; + border-width: dt('treetable.header.border.width'); + padding: dt('treetable.header.padding'); + font-weight: dt('treetable.column.title.font.weight'); +} + +.p-treetable .p-treetable-footer { + background: dt('treetable.footer.background'); + color: dt('treetable.footer.color'); + border-color: dt('treetable.footer.border.color'); + border-style: solid; + border-width: dt('treetable.footer.border.width'); + padding: dt('treetable.footer.padding'); + font-weight: dt('treetable.column.footer.font.weight'); +} + +.p-treetable .p-treetable-thead>tr>th { + padding: dt('treetable.header.cell.padding'); + background: dt('treetable.header.cell.background'); + border-color: dt('treetable.header.cell.border.color'); + border-style: solid; + border-width: 0 0 1px 0; + color: dt('treetable.header.cell.color'); + font-weight: dt('treetable.column.title.font.weight'); + text-align: start; + transition: background dt('treetable.transition.duration'), color dt('treetable.transition.duration'), border-color dt('treetable.transition.duration'), + outline-color dt('treetable.transition.duration'), box-shadow dt('treetable.transition.duration'); +} + +.p-treetable .p-treetable-tfoot>tr>td { + text-align: start; + padding: dt('treetable.footer.cell.padding'); + border-color: dt('treetable.footer.cell.border.color'); + border-style: solid; + border-width: 0 0 1px 0; + color: dt('treetable.footer.cell.color'); + background: dt('treetable.footer.cell.background'); + font-weight: dt('treetable.column.footer.font.weight'); +} + +.p-treetable .p-sortable-column { + cursor: pointer; + user-select: none; + outline-color: transparent; + vertical-align: middle; +} + +.p-treetable .p-sortable-column .p-sortable-column-icon { + color: dt('treetable.sort.icon.color'); + transition: color dt('treetable.transition.duration'); +} + + +.p-treetable .p-sortable-column:not(.p-treetable-column-sorted):hover { + background: dt('treetable.header.cell.hover.background'); + color: dt('treetable.header.cell.hover.color'); +} + +.p-treetable .p-sortable-column:not(.p-treetable-column-sorted):hover .p-treetable-sort-icon { + color: dt('treetable.sort.icon.hover.color'); +} + +.p-treetable .p-sortable-column.p-treetable-column-sorted { + background: dt('treetable.header.cell.selected.background'); + color: dt('treetable.header.cell.selected.color'); +} + +.p-treetable .p-sortable-column.p-treetable-column-sorted .p-treetable-sort-icon { + color: dt('treetable.header.cell.selected.color'); +} + +.p-treetable .p-sortable-column:focus-visible { + box-shadow: dt('treetable.header.cell.focus.ring.shadow'); + outline: dt('treetable.header.cell.focus.ring.width') dt('treetable.header.cell.focus.ring.style') dt('treetable.header.cell.focus.ring.color'); + outline-offset: dt('treetable.header.cell.focus.ring.offset'); +} + +.p-treetable-hoverable .p-treetable-selectable-row { + cursor: pointer; +} + +.p-treetable .p-treetable-tbody > tr { + outline-color: transparent; + background: dt('treetable.row.background'); + color: dt('treetable.row.color'); +} + +.p-treetable .p-treetable-tbody>tr>td { + text-align: start; + border-color: dt('treetable.body.cell.border.color'); + border-style: solid; + border-width: 0 0 1px 0; + padding: dt('treetable.body.cell.padding'); +} + +.p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler { + display: inline-flex; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; + width: dt('treetable.node.toggle.button.size'); + height: dt('treetable.node.toggle.button.size'); + color: dt('treetable.node.toggle.button.color'); + border: 0 none; + background: transparent; + cursor: pointer; + border-radius: dt('treetable.node.toggle.button.border.radius'); + transition: background dt('treetable.transition.duration'), color dt('treetable.transition.duration'), border-color dt('treetable.transition.duration'), + outline-color dt('treetable.transition.duration'), box-shadow dt('treetable.transition.duration'); + outline-color: transparent; + user-select: none; +} + +.p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:enabled:hover { + color: dt('treetable.node.toggle.button.hover.color'); + background: dt('treetable.node.toggle.button.hover.background'); +} + +.p-treetable .p-treetable-tbody>tr>tr.treetable-row-selected .p-treetable-toggler:hover { + background: dt('treetable.node.toggle.button.selected.hover.background'); + color: dt('treetable.node.toggle.button.selected.hover.color'); +} + +.p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:focus-visible { + box-shadow: dt('treetable.node.toggle.button.focus.ring.shadow'); + outline: dt('treetable.node.toggle.button.focus.ring.width') dt('treetable.node.toggle.button.focus.ring.style') dt('treetable.node.toggle.button.focus.ring.color'); + outline-offset: dt('treetable.node.toggle.button.focus.ring.offset'); +} + + +.p-treetable .p-treetable-tbody>tr.p-treetable-row-selected { + background: dt('treetable.row.selected.background'); + color: dt('treetable.row.selected.color'); +} + +.p-treetable-tbody > tr:focus-visible, +.p-treetable-tbody > tr.p-treetable-contextmenu-row-selected { + box-shadow: dt('treetable.row.focus.ring.shadow'); + outline: dt('treetable.row.focus.ring.width') dt('treetable.row.focus.ring.style') dt('treetable.row.focus.ring.color'); + outline-offset: dt('treetable.row.focus.ring.offset'); +} + +.p-treetable .p-treetable-tbody>tr.p-treetable-row-selected .p-treetable-toggler { + color: inherit; +} + +.p-treetable .p-treetable-tbody>tr.p-treetable-row-selected .p-treetable-toggler:hover { + background: dt('treetable.node.toggle.button.selected.hover.background'); + color: dt('treetable.node.toggle.button.selected.hover.color'); +} + +.p-treetable.p-treetable-hoverable-rows .p-treetable-tbody>tr:not(.p-treetable-row-selected):hover { + background: dt('treetable.row.hover.background'); + color: dt('treetable.row.hover.color'); +} + +.p-treetable-gridlines .p-treetable-header { + border-width: 1px 1px 0 1px; +} + +.p-treetable-gridlines .p-treetable-footer { + border-width: 0 1px 1px 1px; +} + +.p-treetable-gridlines .p-treetable-paginator-top { + border-width: 1px 1px 0 1px; +} + +.p-treetable-gridlines .p-treetable-paginator-bottom { + border-width: 0 1px 1px 1px; +} + +.p-treetable-gridlines .p-treetable-thead > tr > th { + border-width: 1px 0 1px 1px; +} + +.p-treetable-gridlines .p-treetable-thead > tr > th:last-child { + border-width: 1px; +} + +.p-treetable-gridlines .p-treetable-tbody > tr > td { + border-width: 1px 0 0 1px; +} + +.p-treetable-gridlines .p-treetable-tbody > tr > td:last-child { + border-width: 1px 1px 0 1px; +} + +.p-treetable-gridlines .p-treetable-tbody > tr:last-child > td { + border-width: 1px 0 1px 1px; +} + +.p-treetable-gridlines .p-treetable-tbody > tr:last-child > td:last-child { + border-width: 1px; +} + +.p-treetable-gridlines .p-treetable-tfoot > tr > td { + border-width: 1px 0 1px 1px; +} + +.p-treetable-gridlines .p-treetable-tfoot > tr > td:last-child { + border-width: 1px 1px 1px 1px; +} + +.p-treetable.p-treetable-gridlines .p-treetable-thead + .p-treetable-tfoot > tr > td { + border-width: 0 0 1px 1px; +} + +.p-treetable.p-treetable-gridlines .p-treetable-thead + .p-treetable-tfoot > tr > td:last-child { + border-width: 0 1px 1px 1px; +} + +.p-treetable.p-treetable-gridlines:has(.p-treetable-thead):has(.p-treetable-tbody) .p-treetable-tbody > tr > td { + border-width: 0 0 1px 1px; +} + +.p-treetable.p-treetable-gridlines:has(.p-treetable-thead):has(.p-treetable-tbody) .p-treetable-tbody > tr > td:last-child { + border-width: 0 1px 1px 1px; +} + +.p-treetable.p-treetable-gridlines:has(.p-treetable-tbody):has(.p-treetable-tfoot) .p-treetable-tbody > tr:last-child > td { + border-width: 0 0 0 1px; +} + +.p-treetable.p-treetable-gridlines:has(.p-treetable-tbody):has(.p-treetable-tfoot) .p-treetable-tbody > tr:last-child > td:last-child { + border-width: 0 1px 0 1px; +} + +.p-treetable.p-treetable-sm .p-treetable-header { + padding: 0.65625rem 0.875rem; +} + +.p-treetable.p-treetable-sm .p-treetable-thead>tr>th { + padding: 0.375rem 0.5rem; +} + +.p-treetable.p-treetable-sm .p-treetable-tbody>tr>td { + padding: 0.375rem 0.5rem; +} + +.p-treetable.p-treetable-sm .p-treetable-tfoot>tr>td { + padding: 0.375rem 0.5rem; +} + +.p-treetable.p-treetable-sm .p-treetable-footer { + padding: 0.375rem 0.5rem; +} + +.p-treetable.p-treetable-lg .p-treetable-header { + padding: 0.9375rem 1.25rem; +} + +.p-treetable.p-treetable-lg .p-treetable-thead>tr>th { + padding: 0.9375rem 1.25rem; +} + +.p-treetable.p-treetable-lg .p-treetable-tbody>tr>td { + padding: 0.9375rem 1.25rem; +} + +.p-treetable.p-treetable-lg .p-treetable-tfoot>tr>td { + padding: 0.9375rem 1.25rem; +} + +.p-treetable.p-treetable-lg .p-treetable-footer { + padding: 0.9375rem 1.25rem; +} + +p-treetabletoggler + p-treetablecheckbox .p-checkbox, +p-treetable-toggler + p-treetable-checkbox .p-checkbox, +p-tree-table-toggler + p-tree-table-checkbox .p-checkbox { + vertical-align: middle; +} + +p-treetabletoggler + p-treetablecheckbox + span, +p-treetable-toggler + p-treetable-checkbox + span, +p-tree-table-toggler + p-tree-table-checkbox + span { + vertical-align: middle; +} + +p-treetable-sort-icon { + display: inline-flex; + align-items: center; + gap: dt('treetable.header.cell.gap'); +} +`; + +const classes = { + root: ({ instance }) => [ + 'p-treetable p-component', + { + 'p-treetable-gridlines': instance.showGridlines, + 'p-treetable-hoverable-rows': instance.rowHover || instance.selectionMode === 'single' || instance.selectionMode === 'multiple', + 'p-treetable-auto-layout': instance.autoLayout, + 'p-treetable-resizable': instance.resizableColumns, + 'p-treetable-resizable-fit': instance.resizableColumns && instance.columnResizeMode === 'fit', + 'p-treetable-flex-scrollable': instance.scrollable && instance.scrollHeight === 'flex' + } + ], + loading: 'p-treetable-loading', + mask: 'p-treetable-mask p-overlay-mask', + loadingIcon: 'p-treetable-loading-icon', + header: 'p-treetable-header', + pcPaginator: ({ instance }) => ['p-treetable-paginator-' + instance.paginatorPosition, instance.paginatorStyleClass], + tableContainer: 'p-treetable-table-container', + table: ({ instance }) => ({ + 'p-treetable-table': true, + 'p-treetable-scrollable-table': instance.scrollable, + 'p-treetable-resizable-table': instance.resizableColumns, + 'p-treetable-resizable-table-fit': instance.resizableColumns && instance.columnResizeMode === 'fit' + }), + thead: 'p-treetable-thead', + sortableColumn: ({ instance }) => ({ + 'p-sortable-column': instance.isEnabled(), + 'p-treetable-column-sorted': instance.sorted + }), + sortableColumnIcon: 'p-treetable-sort-icon', + sortableColumnBadge: 'p-sortable-column-badge', + columnResizer: 'p-treetable-column-resizer', + columnHeaderContent: 'p-treetable-column-header-content', + columnTitle: 'p-treetable-column-title', + sortIcon: 'p-treetable-sort-icon', + pcSortBadge: 'p-treetable-sort-badge', + tbody: 'p-treetable-tbody', + row: ({ instance }) => ({ + 'p-treetable-row-selected': instance.selected + }), + contextMenuRow: ({ instance }) => ({ + 'p-treetable-contextmenu-row-selected': instance.selected + }), + toggler: 'p-treetable-toggler', + nodeToggleButton: 'p-treetable-node-toggle-button', + nodeToggleIcon: 'p-treetable-node-toggle-icon', + pcNodeCheckbox: 'p-treetable-node-checkbox', + tfoot: 'p-treetable-tfoot', + footerCell: ({ instance }) => ({ + 'p-treetable-frozen-column': instance.columnProp('frozen') + }), + footer: 'p-treetable-footer', + columnResizeIndicator: 'p-treetable-column-resize-indicator', + wrapper: 'p-treetable-wrapper', + scrollableWrapper: 'p-treetable-scrollable-wrapper', + scrollableView: 'p-treetable-scrollable-view', + frozenView: 'p-treetable-frozen-view', + columnResizerHelper: 'p-column-resizer-helper', + reorderIndicatorUp: 'p-treetable-reorder-indicator-up', + reorderIndicatorDown: 'p-treetable-reorder-indicator-down', + scrollableHeader: 'p-treetable-scrollable-header', + scrollableHeaderBox: 'p-treetable-scrollable-header-box', + scrollableHeaderTable: 'p-treetable-scrollable-header-table', + scrollableBody: 'p-treetable-scrollable-body', + scrollableFooter: 'p-treetable-scrollable-footer', + scrollableFooterBox: 'p-treetable-scrollable-footer-box', + scrollableFooterTable: 'p-treetable-scrollable-footer-table' +}; + +@Injectable() +export class TreeTableStyle extends BaseStyle { + name = 'treetable'; + + style = style; + + classes = classes; +} + +/** + * + * TreeTable is used to display hierarchical data in tabular format. + * + * [Live Demo](https://www.primeng.org/treetable/) + * + * @module treetablestyle + * + */ +export enum TreeTableClasses { + /** + * Class name of the root element + */ + root = 'p-treetable', + /** + * Class name of the loading element + */ + loading = 'p-treetable-loading', + /** + * Class name of the mask element + */ + mask = 'p-treetable-mask', + /** + * Class name of the loading icon element + */ + loadingIcon = 'p-treetable-loading-icon', + /** + * Class name of the header element + */ + header = 'p-treetable-header', + /** + * Class name of the paginator element + */ + pcPaginator = 'p-treetable-paginator-[position]', + /** + * Class name of the table container element + */ + tableContainer = 'p-treetable-table-container', + /** + * Class name of the table element + */ + table = 'p-treetable-table', + /** + * Class name of the thead element + */ + thead = 'p-treetable-thead', + /** + * Class name of the column resizer element + */ + columnResizer = 'p-treetable-column-resizer', + /** + * Class name of the column title element + */ + columnTitle = 'p-treetable-column-title', + /** + * Class name of the sort icon element + */ + sortIcon = 'p-treetable-sort-icon', + /** + * Class name of the sort badge element + */ + pcSortBadge = 'p-treetable-sort-badge', + /** + * Class name of the tbody element + */ + tbody = 'p-treetable-tbody', + /** + * Class name of the node toggle button element + */ + nodeToggleButton = 'p-treetable-node-toggle-button', + /** + * Class name of the node toggle icon element + */ + nodeToggleIcon = 'p-treetable-node-toggle-icon', + /** + * Class name of the node checkbox element + */ + pcNodeCheckbox = 'p-treetable-node-checkbox', + /** + * Class name of the empty message element + */ + emptyMessage = 'p-treetable-empty-message', + /** + * Class name of the tfoot element + */ + tfoot = 'p-treetable-tfoot', + /** + * Class name of the footer element + */ + footer = 'p-treetable-footer', + /** + * Class name of the column resize indicator element + */ + columnResizeIndicator = 'p-treetable-column-resize-indicator', + /** + * Class name of the wrapper element + */ + wrapper = 'p-treetable-wrapper', + /** + * Class name of the scrollable wrapper element + */ + scrollableWrapper = 'p-treetable-scrollable-wrapper', + /** + * Class name of the scrollable view element + */ + scrollableView = 'p-treetable-scrollable-view', + /** + * Class name of the frozen view element + */ + frozenView = 'p-treetable-frozen-view', + /** + * Class name of the column resizer helper element + */ + columnResizerHelper = 'p-treetable-column-resizer-helper', + /** + * Class name of the reorder indicator up element + */ + reorderIndicatorUp = 'p-treetable-reorder-indicator-up', + /** + * Class name of the reorder indicator down element + */ + reorderIndicatorDown = 'p-treetable-reorder-indicator-down', + /** + * Class name of the scrollable header element + */ + scrollableHeader = 'p-treetable-scrollable-header', + /** + * Class name of the scrollable header box element + */ + scrollableHeaderBox = 'p-treetable-scrollable-header-box', + /** + * Class name of the scrollable header table element + */ + scrollableHeaderTable = 'p-treetable-scrollable-header-table', + /** + * Class name of the scrollable body element + */ + scrollableBody = 'p-treetable-scrollable-body', + /** + * Class name of the scrollable footer element + */ + scrollableFooter = 'p-treetable-scrollable-footer', + /** + * Class name of the scrollable footer box element + */ + scrollableFooterBox = 'p-treetable-scrollable-footer-box', + /** + * Class name of the scrollable footer table element + */ + scrollableFooterTable = 'p-treetable-scrollable-footer-table', + /** + * Class name of the sortable column icon element + */ + sortableColumnIcon = 'p-sortable-column-icon' +} + +export interface TreeTableStyle extends BaseStyle {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/treetable/treetable.ts b/projects/cps-ui-kit/src/lib/primeng-temp/treetable/treetable.ts new file mode 100755 index 000000000..32a4ef05f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/treetable/treetable.ts @@ -0,0 +1,4121 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/treetable/treetable.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { CommonModule, isPlatformBrowser } from '@angular/common'; +import { + booleanAttribute, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ContentChild, + ContentChildren, + Directive, + ElementRef, + EventEmitter, + HostListener, + inject, + Injectable, + InjectionToken, + Input, + NgModule, + NgZone, + numberAttribute, + Output, + QueryList, + SimpleChanges, + TemplateRef, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { + addClass, + addStyle, + calculateScrollbarHeight, + calculateScrollbarWidth, + clearSelection, + equals, + find, + findSingle, + focus, + getAttribute, + getHiddenElementOuterHeight, + getHiddenElementOuterWidth, + getIndex, + getOffset, + invokeElementMethod, + isClickable, + isEmpty, + isNotEmpty, + removeClass, + reorderArray, + resolveFieldData +} from '../../primeuix-temp/utils/src/index'; +import { BlockableUI, FilterMetadata, FilterService, PrimeTemplate, ScrollerOptions, SharedModule, SortMeta, TreeNode, TreeTableNode } from '../api/public_api'; +import { BadgeModule } from '../badge/public_api'; +import { BaseComponent, PARENT_INSTANCE } from '../basecomponent/public_api'; +import { Bind, BindModule } from '../bind/public_api'; +import { Checkbox } from '../checkbox/public_api'; +import { DomHandler } from '../dom/public_api'; +import { ArrowDownIcon, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronRightIcon, SortAltIcon, SortAmountDownIcon, SortAmountUpAltIcon, SpinnerIcon } from '../icons/public_api'; +import { PaginatorModule } from '../paginator/public_api'; +import { Ripple } from '../ripple/public_api'; +import { Scroller } from '../scroller/public_api'; +import { Nullable, VoidListener } from '../ts-helpers/public_api'; +import { + TreeTableBodyTemplateContext, + TreeTableCheckboxIconTemplateContext, + TreeTableColResizeEvent, + TreeTableColumnReorderEvent, + TreeTableColumnsTemplateContext, + TreeTableContextMenuSelectEvent, + TreeTableEditEvent, + TreeTableEmptyMessageTemplateContext, + TreeTableFilterEvent, + TreeTableFilterOptions, + TreeTableHeaderCheckboxIconTemplateContext, + TreeTableHeaderCheckboxToggleEvent, + TreeTableLazyLoadEvent, + TreeTableNodeCollapseEvent, + TreeTableNodeExpandEvent, + TreeTableNodeUnSelectEvent, + TreeTablePaginatorState, + TreeTablePassThrough, + TreeTableSortEvent, + TreeTableSortIconTemplateContext, + TreeTableTogglerIconTemplateContext +} from '../types/treetable/public_api'; +import { Subject, Subscription } from 'rxjs'; +import { TreeTableStyle } from './style/treetablestyle'; + +const TREETABLE_INSTANCE = new InjectionToken('TREETABLE_INSTANCE'); + +@Injectable() +export class TreeTableService { + private sortSource = new Subject(); + private selectionSource = new Subject(); + private contextMenuSource = new Subject(); + private uiUpdateSource = new Subject(); + private totalRecordsSource = new Subject(); + + sortSource$ = this.sortSource.asObservable(); + selectionSource$ = this.selectionSource.asObservable(); + contextMenuSource$ = this.contextMenuSource.asObservable(); + uiUpdateSource$ = this.uiUpdateSource.asObservable(); + totalRecordsSource$ = this.totalRecordsSource.asObservable(); + + onSort(sortMeta: SortMeta | SortMeta[] | null) { + this.sortSource.next(sortMeta); + } + + onSelectionChange() { + this.selectionSource.next(null); + } + + onContextMenu(node: any) { + this.contextMenuSource.next(node); + } + + onUIUpdate(value: any) { + this.uiUpdateSource.next(value); + } + + onTotalRecordsChange(value: number) { + this.totalRecordsSource.next(value); + } +} + +/** + * TreeTable is used to display hierarchical data in tabular format. + * @group Components + */ +@Component({ + selector: 'p-treeTable, p-treetable, p-tree-table', + standalone: false, + template: ` +
    + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + + + + + + `, + providers: [TreeTableService, TreeTableStyle, { provide: TREETABLE_INSTANCE, useExisting: TreeTable }, { provide: PARENT_INSTANCE, useExisting: TreeTable }], + encapsulation: ViewEncapsulation.None, + host: { + '[class]': "cn(cx('root'), styleClass)", + '[attr.data-p]': 'dataP', + '[attr.data-scrollselectors]': "'.p-treetable-scrollable-body'" + }, + changeDetection: ChangeDetectionStrategy.Eager, + hostDirectives: [Bind] +}) +export class TreeTable extends BaseComponent implements BlockableUI { + componentName = 'TreeTable'; + + _componentStyle = inject(TreeTableStyle); + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root'])); + } + /** + * An array of objects to represent dynamic columns. + * @group Props + */ + @Input() columns: any[] | undefined; + /** + * Style class of the component. + * @deprecated since v20.0.0, use `class` instead. + * @group Props + */ + @Input() styleClass: string | undefined; + /** + * Inline style of the table. + * @group Props + */ + @Input() tableStyle: { [klass: string]: any } | null | undefined; + /** + * Style class of the table. + * @group Props + */ + @Input() tableStyleClass: string | undefined; + /** + * Whether the cell widths scale according to their content or not. + * @group Props + */ + @Input({ transform: booleanAttribute }) autoLayout: boolean | undefined; + /** + * Defines if data is loaded and interacted with in lazy manner. + * @group Props + */ + @Input({ transform: booleanAttribute }) lazy: boolean = false; + /** + * Whether to call lazy loading on initialization. + * @group Props + */ + @Input({ transform: booleanAttribute }) lazyLoadOnInit: boolean = true; + /** + * When specified as true, enables the pagination. + * @group Props + */ + @Input({ transform: booleanAttribute }) paginator: boolean | undefined; + /** + * Number of rows to display per page. + * @group Props + */ + @Input({ transform: numberAttribute }) rows: number | undefined; + /** + * Index of the first row to be displayed. + * @group Props + */ + @Input({ transform: numberAttribute }) first: number = 0; + /** + * Number of page links to display in paginator. + * @group Props + */ + @Input({ transform: numberAttribute }) pageLinks: number = 5; + /** + * Array of integer/object values to display inside rows per page dropdown of paginator + * @group Props + */ + @Input() rowsPerPageOptions: any[] | undefined; + /** + * Whether to show it even there is only one page. + * @group Props + */ + @Input({ transform: booleanAttribute }) alwaysShowPaginator: boolean = true; + /** + * Position of the paginator. + * @group Props + */ + @Input() paginatorPosition: 'top' | 'bottom' | 'both' = 'bottom'; + /** + * Custom style class for paginator + * @group Props + */ + @Input() paginatorStyleClass: string | undefined; + /** + * Target element to attach the paginator dropdown overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). + * @group Props + */ + @Input() paginatorDropdownAppendTo: HTMLElement | ElementRef | TemplateRef | string | null | undefined | any; + /** + * Template of the current page report element. Available placeholders are {currentPage},{totalPages},{rows},{first},{last} and {totalRecords} + * @group Props + */ + @Input() currentPageReportTemplate: string = '{currentPage} of {totalPages}'; + /** + * Whether to display current page report. + * @group Props + */ + @Input({ transform: booleanAttribute }) showCurrentPageReport: boolean | undefined; + /** + * Whether to display a dropdown to navigate to any page. + * @group Props + */ + @Input({ transform: booleanAttribute }) showJumpToPageDropdown: boolean | undefined; + /** + * When enabled, icons are displayed on paginator to go first and last page. + * @group Props + */ + @Input({ transform: booleanAttribute }) showFirstLastIcon: boolean = true; + /** + * Whether to show page links. + * @group Props + */ + @Input({ transform: booleanAttribute }) showPageLinks: boolean = true; + /** + * Sort order to use when an unsorted column gets sorted by user interaction. + * @group Props + */ + @Input({ transform: numberAttribute }) defaultSortOrder: number = 1; + /** + * Defines whether sorting works on single column or on multiple columns. + * @group Props + */ + @Input() sortMode: 'single' | 'multiple' = 'single'; + /** + * When true, resets paginator to first page after sorting. + * @group Props + */ + @Input({ transform: booleanAttribute }) resetPageOnSort: boolean = true; + /** + * Whether to use the default sorting or a custom one using sortFunction. + * @group Props + */ + @Input({ transform: booleanAttribute }) customSort: boolean | undefined; + /** + * Specifies the selection mode, valid values are "single" and "multiple". + * @group Props + */ + @Input() selectionMode: string | undefined; + /** + * Selected row with a context menu. + * @group Props + */ + @Input() contextMenuSelection: any; + /** + * Mode of the contet menu selection. + * @group Props + */ + @Input() contextMenuSelectionMode: string = 'separate'; + /** + * A property to uniquely identify a record in data. + * @group Props + */ + @Input() dataKey: string | undefined; + /** + * Defines whether metaKey is should be considered for the selection. On touch enabled devices, metaKeySelection is turned off automatically. + * @group Props + */ + @Input({ transform: booleanAttribute }) metaKeySelection: boolean | undefined = false; + /** + * Algorithm to define if a row is selected, valid values are "equals" that compares by reference and "deepEquals" that compares all fields. + * @group Props + */ + @Input() compareSelectionBy: string = 'deepEquals'; + /** + * Adds hover effect to rows without the need for selectionMode. + * @group Props + */ + @Input({ transform: booleanAttribute }) rowHover: boolean | undefined; + /** + * Displays a loader to indicate data load is in progress. + * @group Props + */ + @Input({ transform: booleanAttribute }) loading: boolean | undefined; + /** + * The icon to show while indicating data load is in progress. + * @group Props + */ + @Input() loadingIcon: string | undefined; + /** + * Whether to show the loading mask when loading property is true. + * @group Props + */ + @Input({ transform: booleanAttribute }) showLoader: boolean = true; + /** + * When specified, enables horizontal and/or vertical scrolling. + * @group Props + */ + @Input({ transform: booleanAttribute }) scrollable: boolean | undefined; + /** + * Height of the scroll viewport in fixed pixels or the "flex" keyword for a dynamic size. + * @group Props + */ + @Input() scrollHeight: string | undefined; + /** + * Whether the data should be loaded on demand during scroll. + * @group Props + */ + @Input({ transform: booleanAttribute }) virtualScroll: boolean | undefined; + /** + * Height of a row to use in calculations of virtual scrolling. + * @group Props + */ + @Input({ transform: numberAttribute }) virtualScrollItemSize: number | undefined; + /** + * Whether to use the scroller feature. The properties of scroller component can be used like an object in it. + * @group Props + */ + @Input() virtualScrollOptions: ScrollerOptions | undefined; + /** + * The delay (in milliseconds) before triggering the virtual scroll. This determines the time gap between the user's scroll action and the actual rendering of the next set of items in the virtual scroll. + * @group Props + */ + @Input({ transform: numberAttribute }) virtualScrollDelay: number = 150; + /** + * Width of the frozen columns container. + * @group Props + */ + @Input() frozenWidth: string | undefined; + /** + * An array of objects to represent dynamic columns that are frozen. + * @group Props + */ + @Input() frozenColumns: { [klass: string]: any } | null | undefined; + /** + * When enabled, columns can be resized using drag and drop. + * @group Props + */ + @Input({ transform: booleanAttribute }) resizableColumns: boolean | undefined; + /** + * Defines whether the overall table width should change on column resize, valid values are "fit" and "expand". + * @group Props + */ + @Input() columnResizeMode: string = 'fit'; + /** + * When enabled, columns can be reordered using drag and drop. + * @group Props + */ + @Input({ transform: booleanAttribute }) reorderableColumns: boolean | undefined; + /** + * Local ng-template varilable of a ContextMenu. + * @group Props + */ + @Input() contextMenu: any; + /** + * Function to optimize the dom operations by delegating to ngForTrackBy, default algorithm checks for object identity. + * @group Props + */ + @Input() rowTrackBy: Function = (index: number, item: any) => item; + /** + * An array of FilterMetadata objects to provide external filters. + * @group Props + */ + @Input() filters: { [s: string]: FilterMetadata | undefined } = {}; + /** + * An array of fields as string to use in global filtering. + * @group Props + */ + @Input() globalFilterFields: string[] | undefined; + /** + * Delay in milliseconds before filtering the data. + * @group Props + */ + @Input({ transform: numberAttribute }) filterDelay: number = 300; + /** + * Mode for filtering valid values are "lenient" and "strict". Default is lenient. + * @group Props + */ + @Input() filterMode: string = 'lenient'; + /** + * Locale to use in filtering. The default locale is the host environment's current locale. + * @group Props + */ + @Input() filterLocale: string | undefined; + /** + * Locale to be used in paginator formatting. + * @group Props + */ + @Input() paginatorLocale: string | undefined; + /** + * Number of total records, defaults to length of value when not defined. + * @group Props + */ + @Input() get totalRecords(): number { + return this._totalRecords; + } + set totalRecords(val: number) { + this._totalRecords = val; + this.tableService.onTotalRecordsChange(this._totalRecords); + } + /** + * Name of the field to sort data by default. + * @group Props + */ + @Input() get sortField(): string | undefined | null { + return this._sortField; + } + set sortField(val: string | undefined | null) { + this._sortField = val; + } + /** + * Order to sort when default sorting is enabled. + * @defaultValue 1 + * @group Props + */ + @Input() get sortOrder(): number { + return this._sortOrder; + } + set sortOrder(val: number) { + this._sortOrder = val; + } + /** + * An array of SortMeta objects to sort the data by default in multiple sort mode. + * @defaultValue null + * @group Props + */ + @Input() get multiSortMeta(): SortMeta[] | undefined | null { + return this._multiSortMeta; + } + set multiSortMeta(val: SortMeta[] | undefined | null) { + this._multiSortMeta = val; + } + /** + * Selected row in single mode or an array of values in multiple mode. + * @defaultValue null + * @group Props + */ + @Input() get selection(): any { + return this._selection; + } + set selection(val: any) { + this._selection = val; + } + /** + * An array of objects to display. + * @defaultValue null + * @group Props + */ + @Input() get value(): TreeNode[] | undefined { + return this._value; + } + set value(val: TreeNode[] | undefined) { + this._value = val; + } + /** + * Indicates the height of rows to be scrolled. + * @defaultValue 28 + * @group Props + * @deprecated use virtualScrollItemSize property instead. + */ + @Input() get virtualRowHeight(): number { + return this._virtualRowHeight; + } + set virtualRowHeight(val: number) { + this._virtualRowHeight = val; + console.log('The virtualRowHeight property is deprecated, use virtualScrollItemSize property instead.'); + } + /** + * A map of keys to control the selection state. + * @group Props + */ + @Input() get selectionKeys(): any { + return this._selectionKeys; + } + set selectionKeys(value: any) { + this._selectionKeys = value; + this.selectionKeysChange.emit(this._selectionKeys); + } + /** + * Whether to show grid lines between cells. + * @defaultValue false + * @group Props + */ + @Input({ transform: booleanAttribute }) showGridlines: boolean = false; + /** + * Callback to invoke on selected node change. + * @param {TreeTableNode} object - Node instance. + * @group Emits + */ + @Output() selectionChange: EventEmitter | TreeTableNode[] | null> = new EventEmitter | TreeTableNode[] | null>(); + /** + * Callback to invoke on context menu selection change. + * @param {TreeTableNode} object - Node instance. + * @group Emits + */ + @Output() contextMenuSelectionChange: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when data is filtered. + * @param {TreeTableFilterEvent} event - Custom filter event. + * @group Emits + */ + @Output() onFilter: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is expanded. + * @param {TreeTableNodeExpandEvent} event - Node expand event. + * @group Emits + */ + @Output() onNodeExpand: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is collapsed. + * @param {TreeTableNodeCollapseEvent} event - Node collapse event. + * @group Emits + */ + @Output() onNodeCollapse: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when pagination occurs. + * @param {TreeTablePaginatorState} object - Paginator state. + * @group Emits + */ + @Output() onPage: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a column gets sorted. + * @param {Object} Object - Sort data. + * @group Emits + */ + @Output() onSort: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when paging, sorting or filtering happens in lazy mode. + * @param {TreeTableLazyLoadEvent} event - Custom lazy load event. + * @group Emits + */ + @Output() onLazyLoad: EventEmitter = new EventEmitter(); + /** + * An event emitter to invoke on custom sorting, refer to sorting section for details. + * @param {TreeTableSortEvent} event - Custom sort event. + * @group Emits + */ + @Output() sortFunction: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a column is resized. + * @param {TreeTableColResizeEvent} event - Custom column resize event. + * @group Emits + */ + @Output() onColResize: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a column is reordered. + * @param {TreeTableColumnReorderEvent} event - Custom column reorder. + * @group Emits + */ + @Output() onColReorder: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is selected. + * @param {TreeTableNode} object - Node instance. + * @group Emits + */ + @Output() onNodeSelect: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is unselected. + * @param {TreeTableNodeUnSelectEvent} event - Custom node unselect event. + * @group Emits + */ + @Output() onNodeUnselect: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a node is selected with right click. + * @param {TreeTableContextMenuSelectEvent} event - Custom context menu select event. + * @group Emits + */ + @Output() onContextMenuSelect: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when state of header checkbox changes. + * @param {TreeTableHeaderCheckboxToggleEvent} event - Custom checkbox toggle event. + * @group Emits + */ + @Output() onHeaderCheckboxToggle: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when a cell switches to edit mode. + * @param {TreeTableEditEvent} event - Custom edit event. + * @group Emits + */ + @Output() onEditInit: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when cell edit is completed. + * @param {TreeTableEditEvent} event - Custom edit event. + * @group Emits + */ + @Output() onEditComplete: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when cell edit is cancelled with escape key. + * @param {TreeTableEditEvent} event - Custom edit event. + * @group Emits + */ + @Output() onEditCancel: EventEmitter = new EventEmitter(); + /** + * Callback to invoke when selectionKeys are changed. + * @param {Object} object - updated value of the selectionKeys. + * @group Emits + */ + @Output() selectionKeysChange: EventEmitter = new EventEmitter(); + + @ViewChild('resizeHelper') resizeHelperViewChild: Nullable; + + @ViewChild('reorderIndicatorUp') reorderIndicatorUpViewChild: Nullable; + + @ViewChild('reorderIndicatorDown') reorderIndicatorDownViewChild: Nullable; + + @ViewChild('table') tableViewChild: Nullable; + + @ViewChild('scrollableView') scrollableViewChild: Nullable; + + @ViewChild('scrollableFrozenView') scrollableFrozenViewChild: Nullable; + + _value: TreeNode[] | undefined = []; + + _virtualRowHeight: number = 28; + + _selectionKeys: any; + + serializedValue: any[] | undefined | null; + + _totalRecords: number = 0; + + _multiSortMeta: SortMeta[] | undefined | null; + + _sortField: string | undefined | null; + + _sortOrder: number = 1; + + filteredNodes: Nullable; + + filterTimeout: any; + + @ContentChild('colgroup', { descendants: false }) _colGroupTemplate: Nullable>; + colGroupTemplate: Nullable>; + + @ContentChild('caption', { descendants: false }) _captionTemplate: Nullable>; + captionTemplate: Nullable>; + + @ContentChild('header', { descendants: false }) _headerTemplate: Nullable>; + headerTemplate: Nullable>; + + @ContentChild('body', { descendants: false }) _bodyTemplate: Nullable>; + bodyTemplate: Nullable>; + + @ContentChild('footer', { descendants: false }) _footerTemplate: Nullable>; + footerTemplate: Nullable>; + + @ContentChild('summary', { descendants: false }) _summaryTemplate: Nullable>; + summaryTemplate: Nullable>; + + @ContentChild('emptymessage', { descendants: false }) _emptyMessageTemplate: Nullable>; + emptyMessageTemplate: Nullable>; + + @ContentChild('paginatorleft', { descendants: false }) _paginatorLeftTemplate: Nullable>; + paginatorLeftTemplate: Nullable>; + + @ContentChild('paginatorright', { descendants: false }) _paginatorRightTemplate: Nullable>; + paginatorRightTemplate: Nullable>; + + @ContentChild('paginatordropdownitem', { descendants: false }) _paginatorDropdownItemTemplate: Nullable>; + paginatorDropdownItemTemplate: Nullable>; + + @ContentChild('frozenheader', { descendants: false }) _frozenHeaderTemplate: Nullable>; + frozenHeaderTemplate: Nullable>; + + @ContentChild('frozenbody', { descendants: false }) _frozenBodyTemplate: Nullable>; + frozenBodyTemplate: Nullable>; + + @ContentChild('frozenfooter', { descendants: false }) _frozenFooterTemplate: Nullable>; + frozenFooterTemplate: Nullable>; + + @ContentChild('frozencolgroup', { descendants: false }) _frozenColGroupTemplate: Nullable>; + frozenColGroupTemplate: Nullable>; + + @ContentChild('loadingicon', { descendants: false }) _loadingIconTemplate: Nullable>; + loadingIconTemplate: Nullable>; + + @ContentChild('reorderindicatorupicon', { descendants: false }) _reorderIndicatorUpIconTemplate: Nullable>; + reorderIndicatorUpIconTemplate: Nullable>; + + @ContentChild('reorderindicatordownicon', { descendants: false }) _reorderIndicatorDownIconTemplate: Nullable>; + reorderIndicatorDownIconTemplate: Nullable>; + + @ContentChild('sorticon', { descendants: false }) _sortIconTemplate: Nullable>; + sortIconTemplate: Nullable>; + + @ContentChild('checkboxicon', { descendants: false }) _checkboxIconTemplate: Nullable>; + checkboxIconTemplate: Nullable>; + + @ContentChild('headercheckboxicon', { descendants: false }) _headerCheckboxIconTemplate: Nullable>; + headerCheckboxIconTemplate: Nullable>; + + @ContentChild('togglericon', { descendants: false }) _togglerIconTemplate: Nullable>; + togglerIconTemplate: Nullable>; + + @ContentChild('paginatorfirstpagelinkicon', { descendants: false }) _paginatorFirstPageLinkIconTemplate: Nullable>; + paginatorFirstPageLinkIconTemplate: Nullable>; + + @ContentChild('paginatorlastpagelinkicon', { descendants: false }) _paginatorLastPageLinkIconTemplate: Nullable>; + paginatorLastPageLinkIconTemplate: Nullable>; + + @ContentChild('paginatorpreviouspagelinkicon', { descendants: false }) _paginatorPreviousPageLinkIconTemplate: Nullable>; + paginatorPreviousPageLinkIconTemplate: Nullable>; + + @ContentChild('paginatornextpagelinkicon', { descendants: false }) _paginatorNextPageLinkIconTemplate: Nullable>; + paginatorNextPageLinkIconTemplate: Nullable>; + + @ContentChild('loader', { descendants: false }) _loaderTemplate: Nullable>; + loaderTemplate: Nullable>; + + lastResizerHelperX: Nullable; + + reorderIconWidth: Nullable; + + reorderIconHeight: Nullable; + + draggedColumn: Nullable; + + dropPosition: Nullable; + + preventSelectionSetterPropagation: Nullable; + + _selection: any; + + selectedKeys: any = {}; + + rowTouched: Nullable; + + editingCell: Nullable; + + editingCellData: any | undefined | null; + + editingCellField: any | undefined | null; + + editingCellClick: Nullable; + + documentEditListener: VoidListener; + + initialized: Nullable; + + toggleRowIndex: Nullable; + + onInit() { + if (this.lazy && this.lazyLoadOnInit && !this.virtualScroll) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } + this.initialized = true; + } + + @ContentChildren(PrimeTemplate) templates: Nullable>; + + onAfterContentInit() { + (this.templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'caption': + this.captionTemplate = item.template; + break; + + case 'header': + this.headerTemplate = item.template; + break; + + case 'body': + this.bodyTemplate = item.template; + break; + + case 'footer': + this.footerTemplate = item.template; + break; + + case 'summary': + this.summaryTemplate = item.template; + break; + + case 'colgroup': + this.colGroupTemplate = item.template; + break; + + case 'emptymessage': + this.emptyMessageTemplate = item.template; + break; + + case 'paginatorleft': + this.paginatorLeftTemplate = item.template; + break; + + case 'paginatorright': + this.paginatorRightTemplate = item.template; + break; + + case 'paginatordropdownitem': + this.paginatorDropdownItemTemplate = item.template; + break; + + case 'frozenheader': + this.frozenHeaderTemplate = item.template; + break; + + case 'frozenbody': + this.frozenBodyTemplate = item.template; + break; + + case 'frozenfooter': + this.frozenFooterTemplate = item.template; + break; + + case 'frozencolgroup': + this.frozenColGroupTemplate = item.template; + break; + + case 'loadingicon': + this.loadingIconTemplate = item.template; + break; + + case 'reorderindicatorupicon': + this.reorderIndicatorUpIconTemplate = item.template; + break; + + case 'reorderindicatordownicon': + this.reorderIndicatorDownIconTemplate = item.template; + break; + + case 'sorticon': + this.sortIconTemplate = item.template; + break; + + case 'checkboxicon': + this.checkboxIconTemplate = item.template; + break; + + case 'headercheckboxicon': + this.headerCheckboxIconTemplate = item.template; + break; + + case 'togglericon': + this.togglerIconTemplate = item.template; + break; + + case 'paginatorfirstpagelinkicon': + this.paginatorFirstPageLinkIconTemplate = item.template; + break; + + case 'paginatorlastpagelinkicon': + this.paginatorLastPageLinkIconTemplate = item.template; + break; + + case 'paginatorpreviouspagelinkicon': + this.paginatorPreviousPageLinkIconTemplate = item.template; + break; + + case 'paginatornextpagelinkicon': + this.paginatorNextPageLinkIconTemplate = item.template; + break; + + case 'loader': + this.loaderTemplate = item.template; + break; + } + }); + } + + filterService = inject(FilterService); + + tableService = inject(TreeTableService); + + zone = inject(NgZone); + + onChanges(simpleChange: SimpleChanges) { + if (simpleChange.value) { + this._value = simpleChange.value.currentValue; + + if (!this.lazy) { + this.totalRecords = this._value ? this._value.length : 0; + + if (this.sortMode == 'single' && this.sortField) this.sortSingle(); + else if (this.sortMode == 'multiple' && this.multiSortMeta) this.sortMultiple(); + else if (this.hasFilter()) + //sort already filters + this._filter(); + } + + this.updateSerializedValue(); + this.tableService.onUIUpdate(this.value); + } + + if (simpleChange.sortField) { + this._sortField = simpleChange.sortField.currentValue; + + //avoid triggering lazy load prior to lazy initialization at onInit + if (!this.lazy || this.initialized) { + if (this.sortMode === 'single') { + this.sortSingle(); + } + } + } + + if (simpleChange.sortOrder) { + this._sortOrder = simpleChange.sortOrder.currentValue; + + //avoid triggering lazy load prior to lazy initialization at onInit + if (!this.lazy || this.initialized) { + if (this.sortMode === 'single') { + this.sortSingle(); + } + } + } + + if (simpleChange.multiSortMeta) { + this._multiSortMeta = simpleChange.multiSortMeta.currentValue; + if (this.sortMode === 'multiple') { + this.sortMultiple(); + } + } + + if (simpleChange.selection) { + this._selection = simpleChange.selection.currentValue; + + if (!this.preventSelectionSetterPropagation) { + this.updateselectedKeys(); + this.tableService.onSelectionChange(); + } + this.preventSelectionSetterPropagation = false; + } + } + + updateSerializedValue() { + this.serializedValue = []; + + if (this.paginator) this.serializePageNodes(); + else this.serializeNodes(null, this.filteredNodes || this.value, 0, true); + } + + serializeNodes(parent: Nullable, nodes: Nullable, level: Nullable, visible: Nullable) { + if (nodes && nodes.length) { + for (let node of nodes) { + node.parent = parent; + const rowNode = { + node: node, + parent: parent, + level: level, + visible: visible && (parent ? parent.expanded : true) + }; + (this.serializedValue).push(rowNode); + + if (rowNode.visible && node.expanded) { + this.serializeNodes(node, node.children, level + 1, rowNode.visible); + } + } + } + } + + serializePageNodes() { + let data = this.filteredNodes || this.value; + this.serializedValue = []; + if (data && data.length) { + const first = this.lazy ? 0 : this.first; + + for (let i = first; i < first + this.rows; i++) { + let node = data[i]; + if (node) { + this.serializedValue.push({ + node: node, + parent: null, + level: 0, + visible: true + }); + + this.serializeNodes(node, node.children, 1, true); + } + } + } + } + + updateselectedKeys() { + if (this.dataKey && this._selection) { + this.selectedKeys = {}; + if (Array.isArray(this._selection)) { + for (let node of this._selection) { + this.selectedKeys[String(resolveFieldData(node.data, this.dataKey))] = 1; + } + } else { + this.selectedKeys[String(resolveFieldData((this._selection).data, this.dataKey))] = 1; + } + } + } + + onPageChange(event: TreeTablePaginatorState) { + this.first = event.first; + this.rows = event.rows; + + if (this.lazy) this.onLazyLoad.emit(this.createLazyLoadMetadata()); + else this.serializePageNodes(); + + this.onPage.emit({ + first: this.first, + rows: this.rows + }); + + this.tableService.onUIUpdate(this.value); + + if (this.scrollable) { + this.resetScrollTop(); + } + } + + sort(event: TreeTableSortEvent) { + let originalEvent = event.originalEvent; + + if (this.sortMode === 'single') { + this._sortOrder = this.sortField === event.field ? this.sortOrder * -1 : this.defaultSortOrder; + this._sortField = event.field; + this.sortSingle(); + + if (this.resetPageOnSort && this.scrollable) { + this.resetScrollTop(); + } + } + if (this.sortMode === 'multiple') { + let metaKey = (originalEvent).metaKey || (originalEvent).ctrlKey; + let sortMeta = this.getSortMeta(event.field); + + if (sortMeta) { + if (!metaKey) { + this._multiSortMeta = [{ field: event.field, order: sortMeta.order * -1 }]; + + if (this.resetPageOnSort && this.scrollable) { + this.resetScrollTop(); + } + } else { + sortMeta.order = sortMeta.order * -1; + } + } else { + if (!metaKey || !this.multiSortMeta) { + this._multiSortMeta = []; + + if (this.resetPageOnSort && this.scrollable) { + this.resetScrollTop(); + } + } + (this.multiSortMeta).push({ field: event.field, order: this.defaultSortOrder }); + } + + this.sortMultiple(); + } + } + + sortSingle() { + if (this.sortField && this.sortOrder) { + if (this.lazy) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } else if (this.value) { + this.sortNodes(this.value); + + if (this.hasFilter()) { + this._filter(); + } + } + + let sortMeta: SortMeta = { + field: this.sortField, + order: this.sortOrder + }; + + this.onSort.emit(sortMeta); + this.tableService.onSort(sortMeta); + this.updateSerializedValue(); + } + } + + sortNodes(nodes: TreeNode[]) { + if (!nodes || nodes.length === 0) { + return; + } + + if (this.customSort) { + this.sortFunction.emit({ + data: nodes, + mode: this.sortMode, + field: this.sortField, + order: this.sortOrder + }); + } else { + nodes.sort((node1, node2) => { + let value1 = resolveFieldData(node1.data, this.sortField); + let value2 = resolveFieldData(node2.data, this.sortField); + let result: number = 0; + + if (value1 == null && value2 != null) result = -1; + else if (value1 != null && value2 == null) result = 1; + else if (value1 == null && value2 == null) result = 0; + else if (typeof value1 === 'string' && typeof value2 === 'string') result = value1.localeCompare(value2, undefined, { numeric: true }); + else result = value1 < value2 ? -1 : value1 > value2 ? 1 : 0; + + return this.sortOrder * result; + }); + } + + for (let node of nodes) { + this.sortNodes(node.children as TreeNode[]); + } + } + + sortMultiple() { + if (this.multiSortMeta) { + if (this.lazy) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } else if (this.value) { + this.sortMultipleNodes(this.value); + + if (this.hasFilter()) { + this._filter(); + } + } + + this.onSort.emit({ + multisortmeta: this.multiSortMeta + }); + this.updateSerializedValue(); + this.tableService.onSort(this.multiSortMeta); + } + } + + sortMultipleNodes(nodes: TreeNode[]) { + if (!nodes || nodes.length === 0) { + return; + } + + if (this.customSort) { + this.sortFunction.emit({ + data: this.value, + mode: this.sortMode, + multiSortMeta: this.multiSortMeta + }); + } else { + nodes.sort((node1, node2) => { + return this.multisortField(node1, node2, this.multiSortMeta, 0); + }); + } + + for (let node of nodes) { + this.sortMultipleNodes(node.children as TreeNode[]); + } + } + + multisortField(node1: TreeTableNode, node2: TreeTableNode, multiSortMeta: SortMeta[], index: number): number { + if (isEmpty(this.multiSortMeta) || isEmpty(multiSortMeta[index])) { + return 0; + } + + let value1 = resolveFieldData(node1.data, multiSortMeta[index].field); + let value2 = resolveFieldData(node2.data, multiSortMeta[index].field); + let result: number = 0; + + if (value1 == null && value2 != null) result = -1; + else if (value1 != null && value2 == null) result = 1; + else if (value1 == null && value2 == null) result = 0; + if (typeof value1 == 'string' || value1 instanceof String) { + if (value1.localeCompare && value1 != value2) { + return multiSortMeta[index].order * value1.localeCompare(value2, undefined, { numeric: true }); + } + } else { + result = value1 < value2 ? -1 : 1; + } + + if (value1 == value2) { + return multiSortMeta.length - 1 > index ? this.multisortField(node1, node2, multiSortMeta, index + 1) : 0; + } + + return multiSortMeta[index].order * result; + } + + getSortMeta(field: string) { + if (this.multiSortMeta && this.multiSortMeta.length) { + for (let i = 0; i < this.multiSortMeta.length; i++) { + if (this.multiSortMeta[i].field === field) { + return this.multiSortMeta[i]; + } + } + } + + return null; + } + + isSorted(field: string) { + if (this.sortMode === 'single') { + return this.sortField && this.sortField === field; + } else if (this.sortMode === 'multiple') { + let sorted = false; + if (this.multiSortMeta) { + for (let i = 0; i < this.multiSortMeta.length; i++) { + if (this.multiSortMeta[i].field == field) { + sorted = true; + break; + } + } + } + return sorted; + } + } + + createLazyLoadMetadata(): any { + return { + first: this.first, + rows: this.rows, + sortField: this.sortField, + sortOrder: this.sortOrder, + filters: this.filters, + globalFilter: this.filters && this.filters['global'] ? this.filters['global'].value : null, + multiSortMeta: this.multiSortMeta, + forceUpdate: () => this.cd.detectChanges() + }; + } + + onLazyItemLoad(event: TreeTableLazyLoadEvent) { + this.onLazyLoad.emit({ + ...this.createLazyLoadMetadata(), + ...event, + rows: event.last - event.first + }); + } + /** + * Resets scroll to top. + * @group Method + */ + public resetScrollTop() { + if (this.virtualScroll) this.scrollToVirtualIndex(0); + else this.scrollTo({ top: 0 }); + } + /** + * Scrolls to given index when using virtual scroll. + * @param {number} index - index of the element. + * @group Method + */ + public scrollToVirtualIndex(index: number) { + if (this.scrollableViewChild) { + (this.scrollableViewChild).scrollToVirtualIndex(index); + } + + if (this.scrollableFrozenViewChild) { + (this.scrollableViewChild).scrollToVirtualIndex(index); + } + } + /** + * Scrolls to given index. + * @param {ScrollToOptions} options - Scroll options. + * @group Method + */ + public scrollTo(options: ScrollToOptions) { + if (this.scrollableViewChild) { + (this.scrollableViewChild).scrollTo(options); + } + + if (this.scrollableFrozenViewChild) { + (this.scrollableViewChild).scrollTo(options); + } + } + + isEmpty() { + let data = this.filteredNodes || this.value; + return data == null || data.length == 0; + } + + getBlockableElement(): HTMLElement { + return this.el.nativeElement.children[0]; + } + + onColumnResizeBegin(event: MouseEvent) { + let containerLeft = getOffset(this.el?.nativeElement).left; + this.lastResizerHelperX = event.pageX - containerLeft + this.el?.nativeElement.scrollLeft; + event.preventDefault(); + } + + onColumnResize(event: MouseEvent) { + let containerLeft = getOffset(this.el?.nativeElement).left; + this.el?.nativeElement.setAttribute('data-p-unselectable-text', 'true'); + !this.$unstyled() && addStyle(this.el.nativeElement, { 'user-select': 'none' }); + (this.resizeHelperViewChild).nativeElement.style.height = this.el?.nativeElement.offsetHeight + 'px'; + (this.resizeHelperViewChild).nativeElement.style.top = 0 + 'px'; + (this.resizeHelperViewChild).nativeElement.style.left = event.pageX - containerLeft + this.el?.nativeElement.scrollLeft + 'px'; + + (this.resizeHelperViewChild).nativeElement.style.display = 'block'; + } + + onColumnResizeEnd(event: MouseEvent, column: any) { + let delta = (this.resizeHelperViewChild).nativeElement.offsetLeft - this.lastResizerHelperX; + let columnWidth = column.offsetWidth; + let newColumnWidth = columnWidth + delta; + let minWidth = column.style.minWidth || 15; + + if (columnWidth + delta > parseInt(minWidth)) { + if (this.columnResizeMode === 'fit') { + let nextColumn = column.nextElementSibling; + while (!nextColumn.offsetParent) { + nextColumn = nextColumn.nextElementSibling; + } + + if (nextColumn) { + let nextColumnWidth = nextColumn.offsetWidth - delta; + let nextColumnMinWidth = nextColumn.style.minWidth || 15; + + if (newColumnWidth > 15 && nextColumnWidth > parseInt(nextColumnMinWidth)) { + if (this.scrollable) { + let scrollableView = this.findParentScrollableView(column); + let scrollableBodyTable = findSingle(scrollableView, '[data-pc-section="scrollablebody"] table') || findSingle(scrollableView, '[data-pc-name="virtualscroller"] table'); + let scrollableHeaderTable = findSingle(scrollableView, '[data-pc-section="scrollableheadertable"]'); + let scrollableFooterTable = findSingle(scrollableView, '[data-pc-section="scrollablefootertable"]'); + let resizeColumnIndex = getIndex(column); + + this.resizeColGroup(scrollableHeaderTable, resizeColumnIndex, newColumnWidth, nextColumnWidth); + this.resizeColGroup(scrollableBodyTable, resizeColumnIndex, newColumnWidth, nextColumnWidth); + this.resizeColGroup(scrollableFooterTable, resizeColumnIndex, newColumnWidth, nextColumnWidth); + } else { + column.style.width = newColumnWidth + 'px'; + if (nextColumn) { + nextColumn.style.width = nextColumnWidth + 'px'; + } + } + } + } + } else if (this.columnResizeMode === 'expand') { + if (this.scrollable) { + let scrollableView = this.findParentScrollableView(column); + let scrollableBody = findSingle(scrollableView, '[data-pc-section="scrollablebody"]') || findSingle(scrollableView, '[data-pc-name="virtualscroller"]'); + let scrollableHeader = findSingle(scrollableView, '[data-pc-section="scrollableheader"]'); + let scrollableFooter = findSingle(scrollableView, '[data-pc-section="scrollablefooter"]'); + let scrollableBodyTable = findSingle(scrollableView, '[data-pc-section="scrollablebody"] table') || findSingle(scrollableView, '[data-pc-name="virtualscroller"] table'); + let scrollableHeaderTable = findSingle(scrollableView, '[data-pc-section="scrollableheadertable"]'); + let scrollableFooterTable = findSingle(scrollableView, '[data-pc-section="scrollablefootertable"]'); + scrollableBodyTable.style.width = scrollableBodyTable.offsetWidth + delta + 'px'; + scrollableHeaderTable.style.width = scrollableHeaderTable.offsetWidth + delta + 'px'; + if (scrollableFooterTable) { + scrollableFooterTable.style.width = scrollableFooterTable.offsetWidth + delta + 'px'; + } + let resizeColumnIndex = getIndex(column); + + const scrollableBodyTableWidth = column ? scrollableBodyTable.offsetWidth + delta : newColumnWidth; + const scrollableHeaderTableWidth = column ? scrollableHeaderTable.offsetWidth + delta : newColumnWidth; + const isContainerInViewport = this.el?.nativeElement.offsetWidth >= scrollableBodyTableWidth; + + let setWidth = (container: HTMLElement, table: HTMLElement, width: number, isContainerInViewport: boolean) => { + if (container && table) { + container.style.width = isContainerInViewport ? width + calculateScrollbarWidth(scrollableBody) + 'px' : 'auto'; + table.style.width = width + 'px'; + } + }; + + setWidth(scrollableBody, scrollableBodyTable, scrollableBodyTableWidth, isContainerInViewport); + setWidth(scrollableHeader, scrollableHeaderTable, scrollableHeaderTableWidth, isContainerInViewport); + setWidth(scrollableFooter, scrollableFooterTable, scrollableHeaderTableWidth, isContainerInViewport); + + this.resizeColGroup(scrollableHeaderTable, resizeColumnIndex, newColumnWidth, null); + this.resizeColGroup(scrollableBodyTable, resizeColumnIndex, newColumnWidth, null); + this.resizeColGroup(scrollableFooterTable, resizeColumnIndex, newColumnWidth, null); + } else { + (this.tableViewChild).nativeElement.style.width = this.tableViewChild?.nativeElement.offsetWidth + delta + 'px'; + column.style.width = newColumnWidth + 'px'; + let containerWidth = this.tableViewChild?.nativeElement.style.width; + (this.el).nativeElement.style.width = containerWidth + 'px'; + } + } + + this.onColResize.emit({ + element: column, + delta: delta + }); + } + + (this.resizeHelperViewChild as ElementRef).nativeElement.style.display = 'none'; + + this.el.nativeElement.removeAttribute('data-p-unselectable-text'); + !this.$unstyled() && (this.el.nativeElement.style['user-select'] = ''); + } + + findParentScrollableView(column: any) { + if (column) { + let parent = column.parentElement; + while (parent && !findSingle(parent, '[data-pc-section="scrollableview"]')) { + parent = parent.parentElement; + } + + return parent; + } else { + return null; + } + } + + resizeColGroup(table: Nullable, resizeColumnIndex: Nullable, newColumnWidth: Nullable, nextColumnWidth: Nullable) { + if (table) { + let colGroup = table.children[0].nodeName === 'COLGROUP' ? table.children[0] : null; + + if (colGroup) { + let col = colGroup.children[resizeColumnIndex]; + let nextCol = col.nextElementSibling; + (col).style.width = newColumnWidth + 'px'; + + if (nextCol && nextColumnWidth) { + (nextCol).style.width = nextColumnWidth + 'px'; + } + } else { + throw 'Scrollable tables require a colgroup to support resizable columns'; + } + } + } + + onColumnDragStart(event: DragEvent, columnElement: any) { + this.reorderIconWidth = getHiddenElementOuterWidth(this.reorderIndicatorUpViewChild?.nativeElement); + this.reorderIconHeight = getHiddenElementOuterHeight(this.reorderIndicatorDownViewChild?.nativeElement); + this.draggedColumn = columnElement; + (event).dataTransfer.setData('text', 'b'); // For firefox + } + + onColumnDragEnter(event: DragEvent, dropHeader: any) { + if (this.reorderableColumns && this.draggedColumn && dropHeader) { + event.preventDefault(); + let containerOffset = getOffset(this.el?.nativeElement); + let dropHeaderOffset = getOffset(dropHeader); + + if (this.draggedColumn != dropHeader) { + let targetLeft = dropHeaderOffset.left - containerOffset.left; + let targetTop = containerOffset.top - dropHeaderOffset.top; + let columnCenter = dropHeaderOffset.left + dropHeader.offsetWidth / 2; + + (this.reorderIndicatorUpViewChild).nativeElement.style.top = dropHeaderOffset.top - containerOffset.top - (this.reorderIconHeight - 1) + 'px'; + (this.reorderIndicatorDownViewChild).nativeElement.style.top = dropHeaderOffset.top - containerOffset.top + dropHeader.offsetHeight + 'px'; + + if (event.pageX > columnCenter) { + (this.reorderIndicatorUpViewChild).nativeElement.style.left = targetLeft + dropHeader.offsetWidth - Math.ceil(this.reorderIconWidth / 2) + 'px'; + (this.reorderIndicatorDownViewChild).nativeElement.style.left = targetLeft + dropHeader.offsetWidth - Math.ceil(this.reorderIconWidth / 2) + 'px'; + this.dropPosition = 1; + } else { + (this.reorderIndicatorUpViewChild).nativeElement.style.left = targetLeft - Math.ceil(this.reorderIconWidth / 2) + 'px'; + (this.reorderIndicatorDownViewChild).nativeElement.style.left = targetLeft - Math.ceil(this.reorderIconWidth / 2) + 'px'; + this.dropPosition = -1; + } + + (this.reorderIndicatorUpViewChild).nativeElement.style.display = 'block'; + (this.reorderIndicatorDownViewChild).nativeElement.style.display = 'block'; + } else { + (event).dataTransfer.dropEffect = 'none'; + } + } + } + + onColumnDragLeave(event: DragEvent) { + if (this.reorderableColumns && this.draggedColumn) { + event.preventDefault(); + (this.reorderIndicatorUpViewChild).nativeElement.style.display = 'none'; + (this.reorderIndicatorDownViewChild).nativeElement.style.display = 'none'; + } + } + + onColumnDrop(event: DragEvent, dropColumn: any) { + event.preventDefault(); + if (this.draggedColumn) { + let dragIndex = DomHandler.indexWithinGroup(this.draggedColumn, 'ttreorderablecolumn'); + let dropIndex = DomHandler.indexWithinGroup(dropColumn, 'ttreorderablecolumn'); + let allowDrop = dragIndex != dropIndex; + if (allowDrop && ((dropIndex - dragIndex == 1 && this.dropPosition === -1) || (dragIndex - dropIndex == 1 && this.dropPosition === 1))) { + allowDrop = false; + } + + if (allowDrop && dropIndex < dragIndex && this.dropPosition === 1) { + dropIndex = dropIndex + 1; + } + + if (allowDrop && dropIndex > dragIndex && this.dropPosition === -1) { + dropIndex = dropIndex - 1; + } + + if (allowDrop) { + reorderArray(this.columns, dragIndex, dropIndex); + + this.onColReorder.emit({ + dragIndex: dragIndex, + dropIndex: dropIndex, + columns: this.columns + }); + } + + (this.reorderIndicatorUpViewChild).nativeElement.style.display = 'none'; + (this.reorderIndicatorDownViewChild).nativeElement.style.display = 'none'; + (this.draggedColumn as any).draggable = false; + this.draggedColumn = null; + this.dropPosition = null; + } + } + + handleRowClick(event: any) { + let targetNode = (event.originalEvent.target).nodeName; + if (targetNode == 'INPUT' || targetNode == 'BUTTON' || targetNode == 'A' || isClickable(event.originalEvent.target)) { + return; + } + + if (this.selectionMode) { + this.preventSelectionSetterPropagation = true; + let rowNode = event.rowNode; + let selected = this.isSelected((rowNode).node); + let metaSelection = this.rowTouched ? false : this.metaKeySelection; + let dataKeyValue = this.dataKey ? String(resolveFieldData((rowNode.node).data, this.dataKey)) : null; + + if (metaSelection) { + let keyboardEvent = event.originalEvent; + let metaKey = keyboardEvent.metaKey || keyboardEvent.ctrlKey; + + if (selected && metaKey) { + if (this.isSingleSelectionMode()) { + this._selection = null; + this.selectedKeys = {}; + this.selectionChange.emit(null); + } else { + let selectionIndex = this.findIndexInSelection(rowNode.node); + this._selection = this.selection.filter((val: TreeTableNode, i: number) => i != selectionIndex); + this.selectionChange.emit(this.selection); + if (dataKeyValue) { + delete this.selectedKeys[dataKeyValue]; + } + } + + this.onNodeUnselect.emit({ + originalEvent: event.originalEvent, + node: rowNode.node, + type: 'row' + }); + } else { + if (this.isSingleSelectionMode()) { + this._selection = rowNode.node; + this.selectionChange.emit(rowNode.node); + if (dataKeyValue) { + this.selectedKeys = {}; + this.selectedKeys[dataKeyValue] = 1; + } + } else if (this.isMultipleSelectionMode()) { + if (metaKey) { + this._selection = this.selection || []; + } else { + this._selection = []; + this.selectedKeys = {}; + } + + this._selection = [...this.selection, rowNode.node]; + this.selectionChange.emit(this.selection); + if (dataKeyValue) { + this.selectedKeys[dataKeyValue] = 1; + } + } + + this.onNodeSelect.emit({ + originalEvent: event.originalEvent, + node: rowNode.node, + type: 'row', + index: (event).rowIndex + }); + } + } else { + if (this.selectionMode === 'single') { + if (selected) { + this._selection = null; + this.selectedKeys = {}; + this.selectionChange.emit(this.selection); + this.onNodeUnselect.emit({ + originalEvent: event.originalEvent, + node: rowNode.node, + type: 'row' + }); + } else { + this._selection = rowNode.node; + this.selectionChange.emit(this.selection); + this.onNodeSelect.emit({ + originalEvent: event.originalEvent, + node: rowNode.node, + type: 'row', + index: event.rowIndex + }); + if (dataKeyValue) { + this.selectedKeys = {}; + this.selectedKeys[dataKeyValue] = 1; + } + } + } else if (this.selectionMode === 'multiple') { + if (selected) { + let selectionIndex = this.findIndexInSelection(rowNode.node); + this._selection = this.selection.filter((val: TreeTableNode, i: number) => i != selectionIndex); + this.selectionChange.emit(this.selection); + this.onNodeUnselect.emit({ + originalEvent: event.originalEvent, + node: rowNode.node, + type: 'row' + }); + if (dataKeyValue) { + delete this.selectedKeys[dataKeyValue]; + } + } else { + this._selection = this.selection ? [...this.selection, rowNode.node] : [rowNode.node]; + this.selectionChange.emit(this.selection); + this.onNodeSelect.emit({ + originalEvent: event.originalEvent, + node: rowNode.node, + type: 'row', + index: event.rowIndex + }); + if (dataKeyValue) { + this.selectedKeys[dataKeyValue] = 1; + } + } + } + } + + this.tableService.onSelectionChange(); + } + + this.rowTouched = false; + } + + handleRowTouchEnd(event: Event) { + this.rowTouched = true; + } + + handleRowRightClick(event: any) { + if (this.contextMenu) { + const node = event.rowNode.node; + + const showContextMenu = () => { + this.contextMenu.show(event.originalEvent); + this.contextMenu.hideCallback = () => { + this.contextMenuSelection = null; + this.contextMenuSelectionChange.emit(); + this.tableService.onContextMenu(null); + }; + }; + + if (this.contextMenuSelectionMode === 'separate') { + this.contextMenuSelection = node; + this.contextMenuSelectionChange.emit(node); + this.tableService.onContextMenu(node); + showContextMenu(); + this.onContextMenuSelect.emit({ originalEvent: event.originalEvent, node: node }); + } else if (this.contextMenuSelectionMode === 'joint') { + this.preventSelectionSetterPropagation = true; + let selected = this.isSelected(node); + let dataKeyValue = this.dataKey ? String(resolveFieldData(node.data, this.dataKey)) : null; + + if (!selected) { + if (this.isSingleSelectionMode()) { + this.selection = node; + this.selectionChange.emit(node); + } else if (this.isMultipleSelectionMode()) { + this.selection = [node]; + this.selectionChange.emit(this.selection); + } + + if (dataKeyValue) { + this.selectedKeys[dataKeyValue] = 1; + } + } + + this.contextMenuSelection = node; + this.contextMenuSelectionChange.emit(node); + this.tableService.onContextMenu(node); + + showContextMenu(); + this.onContextMenuSelect.emit({ originalEvent: event.originalEvent, node: node }); + } + } + } + + toggleNodeWithCheckbox(event: any) { + // legacy selection support, will be removed in v18 + this.selection = this.selection || []; + this.preventSelectionSetterPropagation = true; + let node = event.rowNode.node; + let selected = this.isSelected(node); + + if (selected) { + this.propagateSelectionDown(node, false); + if (event.rowNode.parent) { + this.propagateSelectionUp(node.parent, false); + } + this.selectionChange.emit(this.selection); + this.onNodeUnselect.emit({ originalEvent: event, node: node }); + } else { + this.propagateSelectionDown(node, true); + if (event.rowNode.parent) { + this.propagateSelectionUp(node.parent, true); + } + this.selectionChange.emit(this.selection); + this.onNodeSelect.emit({ originalEvent: event, node: node }); + } + + this.tableService.onSelectionChange(); + } + + toggleNodesWithCheckbox(event: Event, check: boolean) { + // legacy selection support, will be removed in v18 + let data = this.filteredNodes || this.value; + this._selection = check && data ? data.slice() : []; + + this.toggleAll(check); + + if (!check) { + this._selection = []; + this.selectedKeys = {}; + } + + this.preventSelectionSetterPropagation = true; + this.selectionChange.emit(this._selection); + this.tableService.onSelectionChange(); + + this.onHeaderCheckboxToggle.emit({ originalEvent: event, checked: check }); + } + + toggleAll(checked: boolean) { + let data = this.filteredNodes || this.value; + + if (!this.selectionKeys) { + if (data && data.length) { + for (let node of data) { + this.propagateSelectionDown(node, checked); + } + } + } else { + // legacy selection support, will be removed in v18 + if (data && data.length) { + for (let node of data) { + this.propagateDown(node, checked); + } + this.selectionKeysChange.emit(this.selectionKeys); + } + } + } + + propagateSelectionUp(node: TreeTableNode, select: boolean) { + // legacy selection support, will be removed in v18 + if (node.children && node.children.length) { + let selectedChildCount: number = 0; + let childPartialSelected: boolean = false; + let dataKeyValue = this.dataKey ? String(resolveFieldData(node.data, this.dataKey)) : null; + + for (let child of node.children) { + if (this.isSelected(child)) selectedChildCount++; + else if (child.partialSelected) childPartialSelected = true; + } + + if (select && selectedChildCount == node.children.length) { + this._selection = [...(this.selection || []), node]; + node.partialSelected = false; + if (dataKeyValue) { + this.selectedKeys[dataKeyValue] = 1; + } + } else { + if (!select) { + let index = this.findIndexInSelection(node); + if (index >= 0) { + this._selection = this.selection.filter((val: any, i: number) => i != index); + + if (dataKeyValue) { + delete this.selectedKeys[dataKeyValue]; + } + } + } + + if (childPartialSelected || (selectedChildCount > 0 && selectedChildCount != node.children.length)) node.partialSelected = true; + else node.partialSelected = false; + } + } + + let parent = node.parent; + node.checked = select; + if (parent) { + this.propagateSelectionUp(parent, select); + } + } + + propagateSelectionDown(node: TreeTableNode, select: boolean) { + // legacy selection support, will be removed in v18 + let index = this.findIndexInSelection(node); + let dataKeyValue = this.dataKey ? String(resolveFieldData(node.data, this.dataKey)) : null; + + if (select && index == -1) { + this._selection = [...(this.selection || []), node]; + if (dataKeyValue) { + this.selectedKeys[dataKeyValue] = 1; + } + } else if (!select && index > -1) { + this._selection = this.selection.filter((val: any, i: number) => i != index); + if (dataKeyValue) { + delete this.selectedKeys[dataKeyValue]; + } + } + + node.partialSelected = false; + node.checked = select; + + if (node.children && node.children.length) { + for (let child of node.children) { + this.propagateSelectionDown(child, select); + } + } + } + + isSelected(node: TreeTableNode) { + // legacy selection support, will be removed in v18 + if (node && this.selection) { + if (this.dataKey) { + if (node.hasOwnProperty('checked')) { + return node['checked']; + } else { + return this.selectedKeys[resolveFieldData(node.data, this.dataKey)] !== undefined; + } + } else { + if (Array.isArray(this.selection)) return this.findIndexInSelection(node) > -1; + else return this.equals(node, this.selection); + } + } + + return false; + } + + isNodeSelected(node) { + return this.selectionMode && this.selectionKeys ? this.selectionKeys[this.nodeKey(node)]?.checked === true : false; + } + + isNodePartialSelected(node) { + return this.selectionMode && this.selectionKeys ? this.selectionKeys[this.nodeKey(node)]?.partialChecked === true : false; + } + + nodeKey(node) { + return resolveFieldData(node, this.dataKey) || resolveFieldData(node?.data, this.dataKey); + } + + toggleCheckbox(event) { + let { rowNode, check, originalEvent } = event; + let node = rowNode.node; + if (this.selectionKeys) { + this.propagateDown(node, check); + if (node.parent) { + this.propagateUp(node.parent, check); + } + + this.selectionKeysChange.emit(this.selectionKeys); + } else { + this.toggleNodeWithCheckbox({ originalEvent, rowNode }); + } + + this.tableService.onSelectionChange(); + } + + propagateDown(node, check) { + if (check) { + this.selectionKeys[this.nodeKey(node)] = { checked: true, partialChecked: false }; + } else { + delete this.selectionKeys[this.nodeKey(node)]; + } + + if (node.children && node.children.length) { + for (let child of node.children) { + this.propagateDown(child, check); + } + } + } + + propagateUp(node, check) { + let checkedChildCount = 0; + let childPartialSelected = false; + + for (let child of node.children) { + if (this.selectionKeys[this.nodeKey(child)] && this.selectionKeys[this.nodeKey(child)].checked) checkedChildCount++; + else if (this.selectionKeys[this.nodeKey(child)] && this.selectionKeys[this.nodeKey(child)].partialChecked) childPartialSelected = true; + } + + if (check && checkedChildCount === node.children.length) { + this.selectionKeys[this.nodeKey(node)] = { checked: true, partialChecked: false }; + } else { + if (!check) { + delete this.selectionKeys[this.nodeKey(node)]; + } + + if (childPartialSelected || (checkedChildCount > 0 && checkedChildCount !== node.children.length)) this.selectionKeys[this.nodeKey(node)] = { checked: false, partialChecked: true }; + else this.selectionKeys[this.nodeKey(node)] = { checked: false, partialChecked: false }; + } + + let parent = node.parent; + if (parent) { + this.propagateUp(parent, check); + } + } + + findIndexInSelection(node: any) { + let index: number = -1; + if (this.selection && this.selection.length) { + for (let i = 0; i < this.selection.length; i++) { + if (this.equals(node, this.selection[i])) { + index = i; + break; + } + } + } + + return index; + } + + isSingleSelectionMode() { + return this.selectionMode === 'single'; + } + + isMultipleSelectionMode() { + return this.selectionMode === 'multiple'; + } + + equals(node1: TreeTableNode, node2: TreeTableNode) { + return this.compareSelectionBy === 'equals' ? equals(node1, node2) : equals(node1.data, node2.data, this.dataKey); + } + + filter(value: string | string[], field: string, matchMode: string) { + if (this.filterTimeout) { + clearTimeout(this.filterTimeout); + } + + if (!this.isFilterBlank(value)) { + this.filters[field] = { value: value, matchMode: matchMode }; + } else if (this.filters[field]) { + delete this.filters[field]; + } + + this.filterTimeout = setTimeout(() => { + this._filter(); + this.filterTimeout = null; + }, this.filterDelay); + } + + filterGlobal(value: string, matchMode: string) { + this.filter(value, 'global', matchMode); + } + + isFilterBlank(filter: any): boolean { + if (filter !== null && filter !== undefined) { + if ((typeof filter === 'string' && filter.trim().length == 0) || (Array.isArray(filter) && filter.length == 0)) return true; + else return false; + } + return true; + } + + _filter() { + if (this.lazy) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } else { + if (!this.value) { + return; + } + + if (!this.hasFilter()) { + this.filteredNodes = null; + if (this.paginator) { + this.totalRecords = this.value ? this.value.length : 0; + } + } else { + let globalFilterFieldsArray; + if (this.filters['global']) { + if (!this.columns && !this.globalFilterFields) throw new Error('Global filtering requires dynamic columns or globalFilterFields to be defined.'); + else globalFilterFieldsArray = this.globalFilterFields || this.columns; + } + + this.filteredNodes = []; + const isStrictMode = this.filterMode === 'strict'; + let isValueChanged = false; + + for (let node of this.value) { + let copyNode = { ...node }; + let localMatch = true; + let globalMatch = false; + let paramsWithoutNode; + + for (let prop in this.filters) { + if (this.filters.hasOwnProperty(prop) && prop !== 'global') { + let filterMeta = this.filters[prop]; + let filterField = prop; + let filterValue = filterMeta.value; + let filterMatchMode = filterMeta.matchMode || 'startsWith'; + let filterConstraint = (this.filterService).filters[filterMatchMode]; + paramsWithoutNode = { filterField, filterValue, filterConstraint, isStrictMode }; + if ( + (isStrictMode && !(this.findFilteredNodes(copyNode, paramsWithoutNode) || this.isFilterMatched(copyNode, paramsWithoutNode))) || + (!isStrictMode && !(this.isFilterMatched(copyNode, paramsWithoutNode) || this.findFilteredNodes(copyNode, paramsWithoutNode))) + ) { + localMatch = false; + } + + if (!localMatch) { + break; + } + } + } + + if (this.filters['global'] && !globalMatch && globalFilterFieldsArray) { + let copyNodeForGlobal = { ...copyNode }; + let filterField = undefined; + let filterValue = this.filters['global'].value; + let filterConstraint = (this.filterService).filters[(this.filters)['global'].matchMode]; + paramsWithoutNode = { + filterField, + filterValue, + filterConstraint, + isStrictMode, + globalFilterFieldsArray + }; + + if ( + (isStrictMode && (this.findFilteredNodes(copyNodeForGlobal, paramsWithoutNode) || this.isFilterMatched(copyNodeForGlobal, paramsWithoutNode))) || + (!isStrictMode && (this.isFilterMatched(copyNodeForGlobal, paramsWithoutNode) || this.findFilteredNodes(copyNodeForGlobal, paramsWithoutNode))) + ) { + globalMatch = true; + copyNode = copyNodeForGlobal; + } + } + + let matches = localMatch; + if (this.filters['global']) { + matches = localMatch && globalMatch; + } + + if (matches) { + this.filteredNodes.push(copyNode); + } + + isValueChanged = isValueChanged || !localMatch || globalMatch || (localMatch && this.filteredNodes.length > 0) || (!globalMatch && this.filteredNodes.length === 0); + } + + if (!isValueChanged) { + this.filteredNodes = null; + } + + if (this.paginator) { + this.totalRecords = this.filteredNodes ? this.filteredNodes.length : this.value ? this.value.length : 0; + } + } + this.cd.markForCheck(); + } + + this.first = 0; + + const filteredValue = this.filteredNodes || this.value; + + this.onFilter.emit({ + filters: this.filters, + filteredValue: filteredValue + }); + + this.tableService.onUIUpdate(filteredValue); + this.updateSerializedValue(); + + if (this.scrollable) { + this.resetScrollTop(); + } + } + + findFilteredNodes(node: TreeTableNode, paramsWithoutNode: any) { + if (node) { + let matched = false; + if (node.children) { + let childNodes = [...node.children]; + node.children = []; + for (let childNode of childNodes) { + let copyChildNode = { ...childNode }; + if (this.isFilterMatched(copyChildNode, paramsWithoutNode)) { + matched = true; + node.children.push(copyChildNode); + } + } + } + + if (matched) { + return true; + } + } + } + + isFilterMatched(node: TreeTableNode, filterOptions: TreeTableFilterOptions) { + let { filterField, filterValue, filterConstraint, isStrictMode, globalFilterFieldsArray } = filterOptions; + let matched = false; + const isMatched = (field: string) => filterConstraint(resolveFieldData(node.data, field), filterValue, this.filterLocale); + + matched = globalFilterFieldsArray?.length ? globalFilterFieldsArray.some((globalFilterField) => isMatched(globalFilterField.field || globalFilterField)) : isMatched(filterField); + + if (!matched || (isStrictMode && !this.isNodeLeaf(node))) { + matched = + this.findFilteredNodes(node, { + filterField, + filterValue, + filterConstraint, + isStrictMode, + globalFilterFieldsArray + }) || matched; + } + + return matched; + } + + isNodeLeaf(node: TreeTableNode) { + return node.leaf === false ? false : !(node.children && node.children.length); + } + + hasFilter() { + let empty = true; + for (let prop in this.filters) { + if (this.filters.hasOwnProperty(prop)) { + empty = false; + break; + } + } + + return !empty; + } + /** + * Clears the sort and paginator state. + * @group Method + */ + public reset() { + this._sortField = null; + this._sortOrder = 1; + this._multiSortMeta = null; + this.tableService.onSort(null); + + this.filteredNodes = null; + this.filters = {}; + + this.first = 0; + + if (this.lazy) { + this.onLazyLoad.emit(this.createLazyLoadMetadata()); + } else { + this.totalRecords = this._value ? this._value.length : 0; + } + } + + updateEditingCell(cell: any, data: any, field: string) { + this.editingCell = cell; + this.editingCellData = data; + this.editingCellField = field; + this.bindDocumentEditListener(); + } + + isEditingCellValid() { + return this.editingCell && find(this.editingCell, '.ng-invalid.ng-dirty').length === 0; + } + + bindDocumentEditListener() { + if (!this.documentEditListener) { + this.documentEditListener = this.renderer.listen(this.document, 'click', (event) => { + if (this.editingCell && !this.editingCellClick && this.isEditingCellValid()) { + !this.$unstyled() && removeClass(this.editingCell, 'p-cell-editing'); + this.editingCell = null; + this.onEditComplete.emit({ field: this.editingCellField, data: this.editingCellData }); + this.editingCellField = null; + this.editingCellData = null; + this.unbindDocumentEditListener(); + } + + this.editingCellClick = false; + }); + } + } + + unbindDocumentEditListener() { + if (this.documentEditListener) { + this.documentEditListener(); + this.documentEditListener = null; + } + } + + onDestroy() { + this.unbindDocumentEditListener(); + this.editingCell = null; + this.editingCellField = null; + this.editingCellData = null; + this.initialized = null; + } + + get dataP() { + return this.cn({ + scrollable: this.scrollable, + 'flex-scrollable': this.scrollable && this.scrollHeight === 'flex', + loading: this.loading, + empty: this.isEmpty() + }); + } +} + +@Component({ + selector: '[pTreeTableBody]', + standalone: false, + template: ` + + + + + + + + + `, + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.Eager, + host: { + '[attr.data-p]': 'dataP' + } +}) +export class TTBody extends BaseComponent { + @Input('pTreeTableBody') columns: any[] | undefined; + + @Input('pTreeTableBodyTemplate') template: Nullable>; + + @Input({ transform: booleanAttribute }) frozen: boolean | undefined; + + @Input() serializedNodes: any; + + @Input() scrollerOptions: any; + + subscription: Subscription; + + constructor( + public tt: TreeTable, + public treeTableService: TreeTableService + ) { + super(); + this.subscription = this.tt.tableService.uiUpdateSource$.subscribe(() => { + if (this.tt.virtualScroll) { + this.cd.detectChanges(); + } + }); + } + + getScrollerOption(option: any, options?: any) { + if (this.tt.virtualScroll) { + options = options || this.scrollerOptions; + return options ? options[option] : null; + } + + return null; + } + + getRowIndex(rowIndex: number) { + const getItemOptions = this.getScrollerOption('getItemOptions'); + return getItemOptions ? getItemOptions(rowIndex).index : rowIndex; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } + + get dataP() { + return this.cn({ + hoverable: this.tt.rowHover || this.tt.selectionMode, + frozen: this.frozen + }); + } +} + +@Component({ + selector: '[ttScrollableView]', + standalone: false, + template: ` +
    +
    + + + + + +
    +
    +
    + + + + + + + + + + + + +
    + +
    +
    + + + + + +
    +
    +
    + +
    +
    + + + + + +
    +
    +
    + `, + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.Eager, + providers: [TreeTableStyle] +}) +export class TTScrollableView extends BaseComponent { + hostName = 'TreeTable'; + + @Input('ttScrollableView') columns: any[] | undefined; + + @Input({ transform: booleanAttribute }) frozen: boolean | undefined; + + @ViewChild('scrollHeader') scrollHeaderViewChild: Nullable; + + @ViewChild('scrollHeaderBox') scrollHeaderBoxViewChild: Nullable; + + @ViewChild('scrollBody') scrollBodyViewChild: Nullable; + + @ViewChild('scrollTable') scrollTableViewChild: Nullable; + + @ViewChild('loadingTable') scrollLoadingTableViewChild: Nullable; + + @ViewChild('scrollFooter') scrollFooterViewChild: Nullable; + + @ViewChild('scrollFooterBox') scrollFooterBoxViewChild: Nullable; + + @ViewChild('scrollableAligner') scrollableAlignerViewChild: Nullable; + + @ViewChild('scroller') scroller: Nullable; + + headerScrollListener: VoidListener; + + bodyScrollListener: VoidListener; + + footerScrollListener: VoidListener; + + frozenSiblingBody: Nullable; + + totalRecordsSubscription: Nullable; + + _scrollHeight: string | undefined | null; + + preventBodyScrollPropagation: boolean | undefined; + + _componentStyle = inject(TreeTableStyle); + + @Input() get scrollHeight(): string | undefined | null { + return this._scrollHeight; + } + set scrollHeight(val: string | undefined | null) { + this._scrollHeight = val; + if (val != null && (val.includes('%') || val.includes('calc'))) { + console.log('Percentage scroll height calculation is removed in favor of the more performant CSS based flex mode, use scrollHeight="flex" instead.'); + } + } + + constructor( + public tt: TreeTable, + public zone: NgZone + ) { + super(); + } + + onAfterViewInit() { + if (isPlatformBrowser(this.platformId)) { + if (!this.frozen) { + if (this.tt.frozenColumns || this.tt.frozenBodyTemplate || this.tt._frozenBodyTemplate) { + addClass(this.el.nativeElement, 'p-treetable-unfrozen-view'); + } + + let frozenView = this.el.nativeElement.previousElementSibling; + if (frozenView) { + if (this.tt.virtualScroll) this.frozenSiblingBody = findSingle(frozenView, '[data-pc-name="virtualscroller"]'); + else this.frozenSiblingBody = findSingle(frozenView, '[data-pc-section="scrollablebody"]'); + } + + if (this.scrollHeight) { + let scrollBarWidth = calculateScrollbarWidth(); + if (this.scrollHeaderBoxViewChild?.nativeElement) { + this.scrollHeaderBoxViewChild.nativeElement.style.paddingRight = scrollBarWidth + 'px'; + } + + if (this.scrollFooterBoxViewChild && this.scrollFooterBoxViewChild.nativeElement) { + this.scrollFooterBoxViewChild.nativeElement.style.paddingRight = scrollBarWidth + 'px'; + } + } + } else { + if (this.scrollableAlignerViewChild && this.scrollableAlignerViewChild.nativeElement) { + this.scrollableAlignerViewChild.nativeElement.style.height = calculateScrollbarHeight() + 'px'; + } + } + + this.bindEvents(); + } + } + + bindEvents() { + if (isPlatformBrowser(this.platformId)) { + this.zone.runOutsideAngular(() => { + if (this.scrollHeaderViewChild && this.scrollHeaderViewChild.nativeElement) { + this.headerScrollListener = this.renderer.listen(this.scrollHeaderBoxViewChild?.nativeElement, 'scroll', this.onHeaderScroll.bind(this)); + } + + if (this.scrollFooterViewChild && this.scrollFooterViewChild.nativeElement) { + this.footerScrollListener = this.renderer.listen(this.scrollFooterViewChild.nativeElement, 'scroll', this.onFooterScroll.bind(this)); + } + + if (!this.frozen) { + if (this.tt.virtualScroll) { + this.bodyScrollListener = this.renderer.listen((this.scroller?.getElementRef() as ElementRef).nativeElement, 'scroll', this.onBodyScroll.bind(this)); + } else { + this.bodyScrollListener = this.renderer.listen(this.scrollBodyViewChild?.nativeElement, 'scroll', this.onBodyScroll.bind(this)); + } + } + }); + } + } + + unbindEvents() { + if (isPlatformBrowser(this.platformId)) { + if (this.scrollHeaderViewChild && this.scrollHeaderViewChild.nativeElement) { + if (this.headerScrollListener) { + this.headerScrollListener(); + this.headerScrollListener = null; + } + } + + if (this.scrollFooterViewChild && this.scrollFooterViewChild.nativeElement) { + if (this.footerScrollListener) { + this.footerScrollListener(); + this.footerScrollListener = null; + } + } + + if (this.scrollBodyViewChild && this.scrollBodyViewChild.nativeElement) { + if (this.bodyScrollListener) { + this.bodyScrollListener(); + this.bodyScrollListener = null; + } + } + + if (this.scroller && this.scroller.getElementRef()) { + if (this.bodyScrollListener) { + this.bodyScrollListener(); + this.bodyScrollListener = null; + } + } + } + } + + onHeaderScroll() { + const scrollLeft = this.scrollHeaderViewChild?.nativeElement.scrollLeft; + + (this.scrollBodyViewChild as ElementRef).nativeElement.scrollLeft = scrollLeft; + + if (this.scrollFooterViewChild && this.scrollFooterViewChild.nativeElement) { + this.scrollFooterViewChild.nativeElement.scrollLeft = scrollLeft; + } + + this.preventBodyScrollPropagation = true; + } + + onFooterScroll() { + const scrollLeft = this.scrollFooterViewChild?.nativeElement.scrollLeft; + (this.scrollBodyViewChild as ElementRef).nativeElement.scrollLeft = scrollLeft; + + if (this.scrollHeaderViewChild && this.scrollHeaderViewChild.nativeElement) { + this.scrollHeaderViewChild.nativeElement.scrollLeft = scrollLeft; + } + + this.preventBodyScrollPropagation = true; + } + + onBodyScroll(event: any) { + if (this.preventBodyScrollPropagation) { + this.preventBodyScrollPropagation = false; + return; + } + + if (this.scrollHeaderViewChild && this.scrollHeaderViewChild.nativeElement) { + (this.scrollHeaderBoxViewChild as ElementRef).nativeElement.style.marginLeft = -1 * event.target.scrollLeft + 'px'; + } + + if (this.scrollFooterViewChild && this.scrollFooterViewChild.nativeElement) { + (this.scrollFooterBoxViewChild as ElementRef).nativeElement.style.marginLeft = -1 * event.target.scrollLeft + 'px'; + } + + if (this.frozenSiblingBody) { + this.frozenSiblingBody.scrollTop = event.target.scrollTop; + } + } + + scrollToVirtualIndex(index: number): void { + if (this.scroller) { + this.scroller.scrollToIndex(index); + } + } + + scrollTo(options: ScrollToOptions): void { + if (this.scroller) { + this.scroller.scrollTo(options); + } else { + if (this.scrollBodyViewChild?.nativeElement.scrollTo) { + this.scrollBodyViewChild.nativeElement.scrollTo(options); + } else { + (this.scrollBodyViewChild as ElementRef).nativeElement.scrollLeft = options.left; + (this.scrollBodyViewChild as ElementRef).nativeElement.scrollTop = options.top; + } + } + } + + onDestroy() { + this.unbindEvents(); + + this.frozenSiblingBody = null; + } +} + +@Directive({ + selector: '[ttSortableColumn]', + standalone: false, + host: { + '[class]': 'cx("sortableColumn")', + '[tabindex]': 'isEnabled() ? "0" : null', + role: 'columnheader', + '[attr.aria-sort]': 'ariaSorted' + }, + providers: [TreeTableStyle], + hostDirectives: [Bind] +}) +export class TTSortableColumn extends BaseComponent { + hostName = 'TreeTable '; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('sortableColumn', { context: { sorted: this.sorted } })); + } + + @Input('ttSortableColumn') field: string | undefined; + + @Input({ transform: booleanAttribute }) ttSortableColumnDisabled: boolean | undefined; + + sorted: boolean | undefined; + + subscription: Subscription | undefined; + + _componentStyle = inject(TreeTableStyle); + + get ariaSorted() { + if (this.sorted && this.tt.sortOrder < 0) return 'descending'; + else if (this.sorted && this.tt.sortOrder > 0) return 'ascending'; + else return 'none'; + } + + constructor(public tt: TreeTable) { + super(); + if (this.isEnabled()) { + this.subscription = this.tt.tableService.sortSource$.subscribe((sortMeta) => { + this.updateSortState(); + }); + } + } + + onInit() { + if (this.isEnabled()) { + this.updateSortState(); + } + } + + updateSortState() { + this.sorted = this.tt.isSorted(this.field) as boolean; + } + + @HostListener('click', ['$event']) + onClick(event: MouseEvent) { + if (this.isEnabled()) { + this.updateSortState(); + this.tt.sort({ + originalEvent: event, + field: this.field + }); + + clearSelection(); + } + } + + @HostListener('keydown.enter', ['$any($event)']) + onEnterKey(event: MouseEvent) { + this.onClick(event); + } + + isEnabled() { + return this.ttSortableColumnDisabled !== true; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Component({ + selector: 'p-treeTableSortIcon, p-treetable-sort-icon, p-tree-table-sort-icon', + standalone: false, + template: ` + + + + + + + + + + `, + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [TreeTableStyle] +}) +export class TTSortIcon extends BaseComponent { + hostName = 'TreeTable'; + + @Input() field: string | undefined; + + @Input() ariaLabelDesc: string | undefined; + + @Input() ariaLabelAsc: string | undefined; + + subscription: Subscription | undefined; + + sortOrder: number | undefined; + + _componentStyle = inject(TreeTableStyle); + + constructor( + public tt: TreeTable, + public cd: ChangeDetectorRef + ) { + super(); + this.subscription = this.tt.tableService.sortSource$.subscribe((sortMeta) => { + this.updateSortState(); + this.cd.markForCheck(); + }); + } + + onInit() { + this.updateSortState(); + } + + onClick(event: Event) { + event.preventDefault(); + } + + getMultiSortMetaIndex() { + let multiSortMeta = this.tt._multiSortMeta; + let index = -1; + + if (multiSortMeta && this.tt.sortMode === 'multiple' && multiSortMeta.length > 1) { + for (let i = 0; i < multiSortMeta.length; i++) { + let meta = multiSortMeta[i]; + if (meta.field === this.field || meta.field === this.field) { + index = i; + break; + } + } + } + + return index; + } + + updateSortState() { + if (this.tt.sortMode === 'single') { + this.sortOrder = this.tt.isSorted(this.field) ? this.tt.sortOrder : 0; + } else if (this.tt.sortMode === 'multiple') { + let sortMeta = this.tt.getSortMeta(this.field); + this.sortOrder = sortMeta ? sortMeta.order : 0; + } + } + + getBadgeValue() { + return this.getMultiSortMetaIndex() + 1; + } + + isMultiSorted() { + return this.tt.sortMode === 'multiple' && this.getMultiSortMetaIndex() > -1; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Directive({ + selector: '[ttResizableColumn]', + standalone: false +}) +export class TTResizableColumn extends BaseComponent { + hostName = 'TreeTable'; + + @Input({ transform: booleanAttribute }) ttResizableColumnDisabled: boolean | undefined; + + resizer: HTMLSpanElement | undefined; + + resizerMouseDownListener: VoidListener; + + documentMouseMoveListener: VoidListener; + + documentMouseUpListener: VoidListener; + + constructor( + public tt: TreeTable, + public zone: NgZone + ) { + super(); + } + + onAfterViewInit() { + if (isPlatformBrowser(this.platformId)) { + if (this.isEnabled()) { + addClass(this.el.nativeElement, 'p-resizable-column'); + this.resizer = this.renderer.createElement('span'); + !this.$unstyled() && this.renderer.addClass(this.resizer, 'p-column-resizer'); + (this.resizer as HTMLElement).setAttribute('data-pc-section', 'columnresizer'); + this.renderer.appendChild(this.el.nativeElement, this.resizer); + + this.zone.runOutsideAngular(() => { + this.resizerMouseDownListener = this.renderer.listen(this.resizer, 'mousedown', this.onMouseDown.bind(this)); + }); + } + } + } + + bindDocumentEvents() { + this.zone.runOutsideAngular(() => { + this.documentMouseMoveListener = this.renderer.listen(this.document, 'mousemove', this.onDocumentMouseMove.bind(this)); + this.documentMouseUpListener = this.renderer.listen(this.document, 'mouseup', this.onDocumentMouseUp.bind(this)); + }); + } + + unbindDocumentEvents() { + if (this.documentMouseMoveListener) { + this.documentMouseMoveListener(); + this.documentMouseMoveListener = null; + } + + if (this.documentMouseUpListener) { + this.documentMouseUpListener(); + this.documentMouseUpListener = null; + } + } + + onMouseDown(event: MouseEvent) { + this.tt.onColumnResizeBegin(event); + this.bindDocumentEvents(); + } + + onDocumentMouseMove(event: MouseEvent) { + this.tt.onColumnResize(event); + } + + onDocumentMouseUp(event: MouseEvent) { + this.tt.onColumnResizeEnd(event, this.el.nativeElement); + this.unbindDocumentEvents(); + } + + isEnabled() { + return this.ttResizableColumnDisabled !== true; + } + + onDestroy() { + if (this.resizerMouseDownListener) { + this.resizerMouseDownListener(); + this.resizerMouseDownListener = null; + } + + this.unbindDocumentEvents(); + } +} + +@Directive({ + selector: '[ttReorderableColumn]', + standalone: false +}) +export class TTReorderableColumn extends BaseComponent { + hostName = 'TreeTable'; + + @Input({ transform: booleanAttribute }) ttReorderableColumnDisabled: boolean | undefined; + + dragStartListener: VoidListener; + + dragOverListener: VoidListener; + + dragEnterListener: VoidListener; + + dragLeaveListener: VoidListener; + + mouseDownListener: VoidListener; + + constructor( + public tt: TreeTable, + public zone: NgZone + ) { + super(); + } + + onAfterViewInit() { + if (this.isEnabled()) { + this.bindEvents(); + } + } + + bindEvents() { + if (isPlatformBrowser(this.platformId)) { + this.zone.runOutsideAngular(() => { + this.mouseDownListener = this.renderer.listen(this.el.nativeElement, 'mousedown', this.onMouseDown.bind(this)); + this.dragStartListener = this.renderer.listen(this.el.nativeElement, 'dragstart', this.onDragStart.bind(this)); + this.dragOverListener = this.renderer.listen(this.el.nativeElement, 'dragover', this.onDragEnter.bind(this)); + this.dragEnterListener = this.renderer.listen(this.el.nativeElement, 'dragenter', this.onDragEnter.bind(this)); + this.dragLeaveListener = this.renderer.listen(this.el.nativeElement, 'dragleave', this.onDragLeave.bind(this)); + }); + } + } + + unbindEvents() { + if (isPlatformBrowser(this.platformId)) { + if (this.mouseDownListener) { + this.mouseDownListener(); + this.mouseDownListener = null; + } + + if (this.dragOverListener) { + this.dragOverListener(); + this.dragOverListener = null; + } + + if (this.dragEnterListener) { + this.dragEnterListener(); + this.dragEnterListener = null; + } + + if (this.dragLeaveListener) { + this.dragLeaveListener(); + this.dragLeaveListener = null; + } + } + } + + onMouseDown(event: any) { + if (event.target.nodeName === 'INPUT' || event.target.nodeName === 'TEXTAREA' || findSingle(event.target, '[data-pc-section="columnresizer"]')) this.el.nativeElement.draggable = false; + else this.el.nativeElement.draggable = true; + } + + onDragStart(event: DragEvent) { + this.tt.onColumnDragStart(event, this.el.nativeElement); + } + + onDragOver(event: DragEvent) { + event.preventDefault(); + } + + onDragEnter(event: DragEvent) { + this.tt.onColumnDragEnter(event, this.el.nativeElement); + } + + onDragLeave(event: DragEvent) { + this.tt.onColumnDragLeave(event); + } + + @HostListener('drop', ['$event']) + onDrop(event: DragEvent) { + if (this.isEnabled()) { + this.tt.onColumnDrop(event, this.el.nativeElement); + } + } + + isEnabled() { + return this.ttReorderableColumnDisabled !== true; + } + + onDestroy() { + this.unbindEvents(); + } +} + +@Directive({ + selector: '[ttSelectableRow]', + standalone: false, + host: { + '[class]': 'cx("row")', + '[attr.aria-selected]': 'selected' + }, + providers: [TreeTableStyle] +}) +export class TTSelectableRow extends BaseComponent { + @Input('ttSelectableRow') rowNode: any; + + @Input({ transform: booleanAttribute }) ttSelectableRowDisabled: boolean | undefined; + + selected: boolean | undefined; + + subscription: Subscription | undefined; + + _componentStyle = inject(TreeTableStyle); + + constructor( + public tt: TreeTable, + public tableService: TreeTableService + ) { + super(); + if (this.isEnabled()) { + this.subscription = this.tt.tableService.selectionSource$.subscribe(() => { + this.selected = this.tt.isSelected(this.rowNode.node); + }); + } + } + + onInit() { + if (this.isEnabled()) { + this.selected = this.tt.isSelected(this.rowNode.node); + } + } + + @HostListener('click', ['$event']) + onClick(event: Event) { + if (this.isEnabled()) { + this.tt.handleRowClick({ + originalEvent: event, + rowNode: this.rowNode + }); + } + } + + @HostListener('keydown', ['$event']) + onKeyDown(event: KeyboardEvent) { + switch (event.code) { + case 'Enter': + case 'Space': + this.onEnterKey(event); + break; + + default: + break; + } + } + + @HostListener('touchend', ['$event']) + onTouchEnd(event: Event) { + if (this.isEnabled()) { + this.tt.handleRowTouchEnd(event); + } + } + + onEnterKey(event) { + if (this.tt.selectionMode === 'checkbox') { + this.tt.toggleNodeWithCheckbox({ + originalEvent: event, + rowNode: this.rowNode + }); + } else { + this.onClick(event); + } + event.preventDefault(); + } + + isEnabled() { + return this.ttSelectableRowDisabled !== true; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Directive({ + selector: '[ttSelectableRowDblClick]', + standalone: false, + host: { + '[class]': 'cx("row")' + }, + providers: [TreeTableStyle] +}) +export class TTSelectableRowDblClick extends BaseComponent { + @Input('ttSelectableRowDblClick') rowNode: any; + + @Input({ transform: booleanAttribute }) ttSelectableRowDisabled: boolean | undefined; + + selected: boolean | undefined; + + subscription: Subscription | undefined; + + _componentStyle = inject(TreeTableStyle); + + constructor( + public tt: TreeTable, + public tableService: TreeTableService + ) { + super(); + if (this.isEnabled()) { + this.subscription = this.tt.tableService.selectionSource$.subscribe(() => { + this.selected = this.tt.isSelected(this.rowNode.node); + }); + } + } + + onInit() { + if (this.isEnabled()) { + this.selected = this.tt.isSelected(this.rowNode.node); + } + } + + @HostListener('dblclick', ['$event']) + onClick(event: Event) { + if (this.isEnabled()) { + this.tt.handleRowClick({ + originalEvent: event, + rowNode: this.rowNode + }); + } + } + + isEnabled() { + return this.ttSelectableRowDisabled !== true; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Directive({ + selector: '[ttContextMenuRow]', + standalone: false, + host: { + '[class]': 'cx("contextMenuRow")', + '[tabindex]': 'isEnabled() ? 0 : undefined' + }, + providers: [TreeTableStyle] +}) +export class TTContextMenuRow extends BaseComponent { + @Input('ttContextMenuRow') rowNode: any | undefined; + + @Input({ transform: booleanAttribute }) ttContextMenuRowDisabled: boolean | undefined; + + selected: boolean | undefined; + + subscription: Subscription | undefined; + + _componentStyle = inject(TreeTableStyle); + + constructor( + public tt: TreeTable, + public tableService: TreeTableService + ) { + super(); + if (this.isEnabled()) { + this.subscription = this.tt.tableService.contextMenuSource$.subscribe((node) => { + this.selected = node ? this.tt.equals(this.rowNode.node, node) : false; + }); + } + } + + @HostListener('contextmenu', ['$event']) + onContextMenu(event: Event) { + if (this.isEnabled()) { + this.tt.handleRowRightClick({ + originalEvent: event, + rowNode: this.rowNode + }); + + this.el.nativeElement.focus(); + + event.preventDefault(); + } + } + + isEnabled() { + return this.ttContextMenuRowDisabled !== true; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Component({ + selector: 'p-treeTableCheckbox, p-treetable-checkbox, p-tree-table-checkbox', + standalone: false, + template: ` + + + + + + + + `, + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [TreeTableStyle] +}) +export class TTCheckbox extends BaseComponent { + hostName = 'TreeTable'; + + @Input({ transform: booleanAttribute }) disabled: boolean | undefined; + + @Input('value') rowNode: any; + + checked: boolean | undefined; + + partialChecked: boolean | undefined; + + focused: boolean | undefined; + + subscription: Subscription | undefined; + + _componentStyle = inject(TreeTableStyle); + + constructor( + public tt: TreeTable, + public tableService: TreeTableService, + public cd: ChangeDetectorRef + ) { + super(); + this.subscription = this.tt.tableService.selectionSource$.subscribe(() => { + if (this.tt.selectionKeys) { + this.checked = this.tt.isNodeSelected(this.rowNode.node); + this.partialChecked = this.tt.isNodePartialSelected(this.rowNode.node); + } else { + this.checked = this.tt.isSelected(this.rowNode.node); + this.partialChecked = this.rowNode.node.partialSelected; + } + this.cd.markForCheck(); + }); + } + + onInit() { + if (this.tt.selectionKeys) { + this.checked = this.tt.isNodeSelected(this.rowNode.node); + this.partialChecked = this.tt.isNodePartialSelected(this.rowNode.node); + } else { + // for backward compatibility + this.checked = this.tt.isSelected(this.rowNode.node); + this.partialChecked = this.rowNode.node.partialSelected; + } + } + + onClick(event: Event) { + if (!this.disabled) { + if (this.tt.selectionKeys) { + const _check = !this.checked; + this.tt.toggleCheckbox({ + originalEvent: event, + check: _check, + rowNode: this.rowNode + }); + } else { + this.tt.toggleNodeWithCheckbox({ + originalEvent: event, + rowNode: this.rowNode + }); + } + } + clearSelection(); + } + + onFocus() { + this.focused = true; + } + + onBlur() { + this.focused = false; + } + + onDestroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} + +@Component({ + selector: 'p-treeTableHeaderCheckbox', + standalone: false, + template: ` + + + + + + + + `, + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class TTHeaderCheckbox extends BaseComponent { + checked: boolean | undefined; + + disabled: boolean | undefined; + + selectionChangeSubscription: Subscription; + + valueChangeSubscription: Subscription; + + constructor( + public tt: TreeTable, + public tableService: TreeTableService + ) { + super(); + this.valueChangeSubscription = this.tt.tableService.uiUpdateSource$.subscribe(() => { + this.checked = this.updateCheckedState(); + }); + + this.selectionChangeSubscription = this.tt.tableService.selectionSource$.subscribe(() => { + this.checked = this.updateCheckedState(); + }); + } + + onInit() { + this.checked = this.updateCheckedState(); + } + + onClick(event: Event) { + if ((this.tt?.value || this.tt?.filteredNodes) && ((this.tt?.value && this.tt.value.length > 0) || (this.tt?.filteredNodes && this.tt.filteredNodes.length > 0))) { + this.tt?.toggleNodesWithCheckbox(event, !this.checked); + } + + clearSelection(); + } + + onDestroy() { + if (this.selectionChangeSubscription) { + this.selectionChangeSubscription.unsubscribe(); + } + + if (this.valueChangeSubscription) { + this.valueChangeSubscription.unsubscribe(); + } + } + + updateCheckedState() { + this.cd.markForCheck(); + let checked!: boolean; + const data = this.tt.filteredNodes || this.tt.value; + + if (data) { + if (this.tt.selectionKeys) { + for (let node of data) { + if (this.tt.isNodeSelected(node)) { + checked = true; + } else { + checked = false; + break; + } + } + } + if (!this.tt.selectionKeys) { + // legacy selection support, will be removed in v18 + for (let node of data) { + if (this.tt.isSelected(node)) { + checked = true; + } else { + checked = false; + break; + } + } + } + } else { + checked = false; + } + + return checked; + } +} + +@Directive({ + selector: '[ttEditableColumn]', + standalone: false +}) +export class TTEditableColumn extends BaseComponent { + @Input('ttEditableColumn') data: any; + + @Input('ttEditableColumnField') field: any; + + @Input({ transform: booleanAttribute }) ttEditableColumnDisabled: boolean | undefined; + + constructor( + public tt: TreeTable, + public zone: NgZone + ) { + super(); + } + + onAfterViewInit() { + if (this.isEnabled()) { + !this.$unstyled() && addClass(this.el.nativeElement, 'p-editable-column'); + this.el?.nativeElement.setAttribute('data-p-editable-column', 'true'); + } + } + + @HostListener('click', ['$event']) + onClick(event: MouseEvent) { + if (this.isEnabled()) { + this.tt.editingCellClick = true; + + if (this.tt.editingCell) { + if (this.tt.editingCell !== this.el.nativeElement) { + if (!this.tt.isEditingCellValid()) { + return; + } + + if (this.tt.editingCell) !this.$unstyled() && removeClass(this.tt.editingCell, 'p-cell-editing'); + this.openCell(); + } + } else { + this.openCell(); + } + } + } + + openCell() { + this.tt.updateEditingCell(this.el.nativeElement, this.data, this.field); + !this.$unstyled() && addClass(this.el.nativeElement, 'p-cell-editing'); + this.el?.nativeElement.setAttribute('data-p-cell-editing', 'true'); + this.tt.onEditInit.emit({ field: this.field, data: this.data }); + this.tt.editingCellClick = true; + this.zone.runOutsideAngular(() => { + setTimeout(() => { + let focusable = findSingle(this.el.nativeElement, 'input, textarea'); + if (focusable) { + focusable.focus(); + } + }, 50); + }); + } + + closeEditingCell() { + if (this.tt.editingCell) !this.$unstyled() && removeClass(this.tt.editingCell, 'p-checkbox-icon'); + this.tt.editingCell = null; + this.tt.unbindDocumentEditListener(); + } + + @HostListener('keydown', ['$event']) + onKeyDown(event: KeyboardEvent) { + if (this.isEnabled()) { + //enter + if (event.keyCode == 13 && !event.shiftKey) { + if (this.tt.isEditingCellValid()) { + if (this.tt.editingCell) { + !this.$unstyled() && removeClass(this.tt.editingCell, 'p-cell-editing'); + this.el?.nativeElement.setAttribute('data-p-cell-editing', 'false'); + } + this.closeEditingCell(); + this.tt.onEditComplete.emit({ field: this.field, data: this.data }); + } + + event.preventDefault(); + } + + //escape + else if (event.keyCode == 27) { + if (this.tt.isEditingCellValid()) { + if (this.tt.editingCell) { + !this.$unstyled() && removeClass(this.tt.editingCell, 'p-cell-editing'); + this.el?.nativeElement.setAttribute('data-p-cell-editing', 'false'); + } + this.closeEditingCell(); + this.tt.onEditCancel.emit({ field: this.field, data: this.data }); + } + + event.preventDefault(); + } + + //tab + else if (event.keyCode == 9) { + this.tt.onEditComplete.emit({ field: this.field, data: this.data }); + + if (event.shiftKey) this.moveToPreviousCell(event); + else this.moveToNextCell(event); + } + } + } + + findCell(element: any) { + if (element) { + let cell = element; + while (cell && !findSingle(cell, '[data-p-cell-editing="true"]')) { + cell = cell.parentElement; + } + + return cell; + } else { + return null; + } + } + + moveToPreviousCell(event: KeyboardEvent) { + let currentCell = this.findCell(event.target); + let row = currentCell.parentElement; + let targetCell = this.findPreviousEditableColumn(currentCell); + + if (targetCell) { + // @ts-ignore + invokeElementMethod(targetCell as HTMLElement, 'click', undefined); + event.preventDefault(); + } + } + + moveToNextCell(event: KeyboardEvent) { + let currentCell = this.findCell(event.target); + let row = currentCell.parentElement; + let targetCell = this.findNextEditableColumn(currentCell); + + if (targetCell) { + // @ts-ignore + invokeElementMethod(targetCell, 'click', undefined); + event.preventDefault(); + } + } + + findPreviousEditableColumn(cell: any): Element | null { + let prevCell = cell.previousElementSibling; + + if (!prevCell) { + let previousRow = cell.parentElement ? cell.parentElement.previousElementSibling : null; + if (previousRow) { + prevCell = previousRow.lastElementChild; + } + } + + if (prevCell) { + if (findSingle(prevCell, '[data-p-editable-column="true"]')) return prevCell; + else return this.findPreviousEditableColumn(prevCell); + } else { + return null; + } + } + + findNextEditableColumn(cell: Element): Element | null { + let nextCell = cell.nextElementSibling; + + if (!nextCell) { + let nextRow = cell.parentElement ? cell.parentElement.nextElementSibling : null; + if (nextRow) { + nextCell = nextRow.firstElementChild; + } + } + + if (nextCell) { + if (findSingle(nextCell, '[data-p-editable-column="true"]')) return nextCell; + else return this.findNextEditableColumn(nextCell); + } else { + return null; + } + } + + isEnabled() { + return this.ttEditableColumnDisabled !== true; + } +} + +@Component({ + selector: 'p-treeTableCellEditor, p-treetablecelleditor, p-treetable-cell-editor', + standalone: false, + template: ` + + + + + + + `, + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.Eager, + hostDirectives: [Bind] +}) +export class TreeTableCellEditor extends BaseComponent { + hostName = 'TreeTable'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('cellEditor')); + } + + @ContentChildren(PrimeTemplate) templates: Nullable>; + + inputTemplate: Nullable>; + + outputTemplate: Nullable>; + + constructor( + public tt: TreeTable, + public editableColumn: TTEditableColumn + ) { + super(); + } + + onAfterContentInit() { + (this.templates as QueryList).forEach((item) => { + switch (item.getType()) { + case 'input': + this.inputTemplate = item.template; + break; + + case 'output': + this.outputTemplate = item.template; + break; + } + }); + } +} + +@Directive({ + selector: '[ttRow]', + standalone: false, + host: { + '[class]': `'p-element ' + styleClass`, + '[tabindex]': "'0'", + '[attr.aria-expanded]': 'expanded', + '[attr.aria-level]': 'level', + role: 'row' + }, + providers: [TreeTableStyle], + hostDirectives: [Bind] +}) +export class TTRow extends BaseComponent { + hostName = 'TreeTable'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + treeTable = inject(TreeTable); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('row', this.ptmOptions())); + } + + get level() { + return this.rowNode?.['level'] + 1; + } + + get styleClass() { + return this.rowNode?.node['styleClass'] || ''; + } + + get expanded() { + return this.rowNode?.node['expanded']; + } + + @Input('ttRow') rowNode: any; + + _componentStyle = inject(TreeTableStyle); + + constructor( + public tt: TreeTable, + public el: ElementRef, + public zone: NgZone + ) { + super(); + } + + @HostListener('keydown', ['$event']) + onKeyDown(event: KeyboardEvent) { + switch (event.code) { + case 'ArrowDown': + this.onArrowDownKey(event); + break; + + case 'ArrowUp': + this.onArrowUpKey(event); + break; + + case 'ArrowRight': + this.onArrowRightKey(event); + break; + + case 'ArrowLeft': + this.onArrowLeftKey(event); + break; + + case 'Tab': + this.onTabKey(event); + break; + + case 'Home': + this.onHomeKey(event); + break; + + case 'End': + this.onEndKey(event); + break; + + default: + break; + } + } + + onArrowDownKey(event: KeyboardEvent) { + let nextRow = this.el?.nativeElement?.nextElementSibling; + if (nextRow) { + this.focusRowChange(event.currentTarget, nextRow); + } + + event.preventDefault(); + } + + onArrowUpKey(event: KeyboardEvent) { + let prevRow = this.el?.nativeElement?.previousElementSibling; + if (prevRow) { + this.focusRowChange(event.currentTarget, prevRow); + } + + event.preventDefault(); + } + + onArrowRightKey(event: KeyboardEvent) { + const currentTarget = event.currentTarget; + const isHiddenIcon = (findSingle(currentTarget, 'button') as any).style.visibility === 'hidden'; + + if (!isHiddenIcon && !this.expanded && this.rowNode.node['children']) { + this.expand(event); + + currentTarget.tabIndex = -1; + } + event.preventDefault(); + } + + onArrowLeftKey(event: KeyboardEvent) { + const container = this.tt.el?.nativeElement; + const expandedRows = find(container, '[aria-expanded="true"]'); + const lastExpandedRow = expandedRows[expandedRows.length - 1]; + + if (this.expanded) { + this.collapse(event); + } + if (lastExpandedRow) { + this.tt.toggleRowIndex = getIndex(lastExpandedRow as any); + } + this.restoreFocus(); + event.preventDefault(); + } + + onHomeKey(event: KeyboardEvent) { + const firstElement = findSingle(this.tt.el?.nativeElement, `tr[aria-level="${this.level}"]`); + firstElement && focus(firstElement); + event.preventDefault(); + } + + onEndKey(event: KeyboardEvent) { + const nodes = find(this.tt.el?.nativeElement, `tr[aria-level="${this.level}"]`); + const lastElement = nodes[nodes.length - 1]; + focus(lastElement); + event.preventDefault(); + } + + onTabKey(event: KeyboardEvent) { + const rows = this.el.nativeElement ? [...find(this.el.nativeElement.parentNode, 'tr')] : undefined; + + if (rows && isNotEmpty(rows)) { + const hasSelectedRow = rows.some((row) => getAttribute(row, 'data-p-highlight') || row.getAttribute('aria-selected') === 'true'); + rows.forEach((row: any) => { + row.tabIndex = -1; + }); + + if (hasSelectedRow) { + const selectedNodes = rows.filter((node) => getAttribute(node, 'data-p-highlight') || node.getAttribute('aria-selected') === 'true'); + (selectedNodes[0] as any).tabIndex = 0; + + return; + } + + (rows[0] as any).tabIndex = 0; + } + } + + expand(event: Event) { + this.tt.toggleRowIndex = getIndex(this.el.nativeElement); + this.rowNode.node['expanded'] = true; + + this.tt.updateSerializedValue(); + this.tt.tableService.onUIUpdate(this.tt.value); + this.rowNode.node['children'] ? this.restoreFocus(this.tt.toggleRowIndex + 1) : this.restoreFocus(); + + this.tt.onNodeExpand.emit({ + originalEvent: event, + node: this.rowNode.node + }); + } + + collapse(event: Event) { + this.rowNode.node['expanded'] = false; + + this.tt.updateSerializedValue(); + this.tt.tableService.onUIUpdate(this.tt.value); + + this.tt.onNodeCollapse.emit({ originalEvent: event, node: this.rowNode.node }); + } + + focusRowChange(firstFocusableRow, currentFocusedRow, lastVisibleDescendant?) { + firstFocusableRow.tabIndex = '-1'; + currentFocusedRow.tabIndex = '0'; + + focus(currentFocusedRow); + } + + restoreFocus(index?) { + this.zone.runOutsideAngular(() => { + setTimeout(() => { + const container = this.tt.el?.nativeElement; + const tbody = findSingle(container, '[data-pc-section="tbody"]'); + const row = tbody?.children?.[index || this.tt.toggleRowIndex || 0]; + const rows = [...find(container, 'tr')]; + + rows && + rows.forEach((r: any) => { + if (row && !row.isSameNode(r)) { + r.tabIndex = -1; + } + }); + + if (row) { + (row as HTMLElement).tabIndex = 0; + (row as HTMLElement).focus(); + } + }, 25); + }); + } + + ptmOptions() { + return { + context: { + selectable: this.treeTable?.rowHover || this.treeTable.selectionMode === 'row', + selected: this.treeTable.isSelected((this.rowNode)?.node), + scrollable: this.treeTable?.scrollable, + rowNode: this.rowNode + } + }; + } +} + +@Component({ + selector: 'p-treeTableToggler, p-treetabletoggler, p-treetable-toggler', + standalone: false, + template: ` + + `, + encapsulation: ViewEncapsulation.None, + providers: [TreeTableStyle], + changeDetection: ChangeDetectionStrategy.Eager, + hostDirectives: [Bind] +}) +export class TreeTableToggler extends BaseComponent { + hostName = 'TreeTable'; + + bindDirectiveInstance = inject(Bind, { self: true }); + + onAfterViewChecked(): void { + this.bindDirectiveInstance.setAttrs(this.ptm('toggler')); + } + + @Input() rowNode: any; + + _componentStyle = inject(TreeTableStyle); + + constructor(public tt: TreeTable) { + super(); + } + + get toggleButtonAriaLabel() { + return this.config.translation ? (this.rowNode.expanded ? this.config.translation?.aria?.collapseRow : this.config.translation?.aria?.expandRow) : undefined; + } + + onClick(event: Event) { + this.rowNode.node.expanded = !this.rowNode.node.expanded; + + if (this.rowNode.node.expanded) { + this.tt.onNodeExpand.emit({ + originalEvent: event, + node: this.rowNode.node + }); + } else { + this.tt.onNodeCollapse.emit({ + originalEvent: event, + node: this.rowNode.node + }); + } + + this.tt.updateSerializedValue(); + this.tt.tableService.onUIUpdate(this.tt.value); + + event.preventDefault(); + } +} + +@NgModule({ + imports: [ + CommonModule, + PaginatorModule, + Ripple, + Scroller, + SpinnerIcon, + ArrowDownIcon, + ArrowUpIcon, + SortAltIcon, + SortAmountUpAltIcon, + SortAmountDownIcon, + BadgeModule, + CheckIcon, + ChevronDownIcon, + ChevronRightIcon, + Checkbox, + SharedModule, + FormsModule, + BindModule + ], + exports: [ + TreeTable, + SharedModule, + TreeTableToggler, + TTSortableColumn, + TTSortIcon, + TTResizableColumn, + TTRow, + TTReorderableColumn, + TTSelectableRow, + TTSelectableRowDblClick, + TTContextMenuRow, + TTCheckbox, + TTHeaderCheckbox, + TTEditableColumn, + TreeTableCellEditor, + Scroller + ], + declarations: [ + TreeTable, + TreeTableToggler, + TTScrollableView, + TTBody, + TTSortableColumn, + TTSortIcon, + TTResizableColumn, + TTRow, + TTReorderableColumn, + TTSelectableRow, + TTSelectableRowDblClick, + TTContextMenuRow, + TTCheckbox, + TTHeaderCheckbox, + TTEditableColumn, + TreeTableCellEditor + ] +}) +export class TreeTableModule {} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/ts-helpers/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/ts-helpers/public_api.ts new file mode 100644 index 000000000..82514a133 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/ts-helpers/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/ts-helpers/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './ts-helpers'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/ts-helpers/ts-helpers.ts b/projects/cps-ui-kit/src/lib/primeng-temp/ts-helpers/ts-helpers.ts new file mode 100644 index 000000000..5057461ce --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/ts-helpers/ts-helpers.ts @@ -0,0 +1,13 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/ts-helpers/ts-helpers.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export declare type Booleanish = boolean | 'true' | 'false'; +export declare type Numberish = number | string; +export declare type Nullable = T | null | undefined; +export declare type VoidListener = VoidFunction | null | undefined; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/accordion/accordion.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/accordion/accordion.types.ts new file mode 100644 index 000000000..340bf61dd --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/accordion/accordion.types.ts @@ -0,0 +1,111 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/accordion/accordion.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Defines valid pass-through options in Accordion component. + * @template I Type of instance. + * + * @group Interface + */ +export interface AccordionPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Accordion component. + * @see {@link AccordionPassThroughOptions} + * + * @template I Type of instance. + */ +export type AccordionPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in AccordionPanel component. + * @template I Type of instance. + * + * @group Interface + */ +export interface AccordionPanelPassThroughOptions { + /** + * Used to pass attributes to the panel's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in AccordionPanel component. + * @see {@link AccordionPanelPassThroughOptions} + * + * @template I Type of instance. + */ +export type AccordionPanelPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in AccordionHeader component. + * @template I Type of instance. + * + * @group Interface + */ +export interface AccordionHeaderPassThroughOptions { + /** + * Used to pass attributes to the header's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the toggle icon's DOM element. + */ + toggleicon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in AccordionHeader component. + * @see {@link AccordionHeaderPassThroughOptions} + * + * @template I Type of instance. + */ +export type AccordionHeaderPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in AccordionContent component. + * @template I Type of instance. + * + * @group Interface + */ +export interface AccordionContentPassThroughOptions { + /** + * Used to pass attributes to the content container's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content wrapper DOM element. + */ + contentWrapper?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; +} + +/** + * Defines valid pass-through options in AccordionContent component. + * @see {@link AccordionContentPassThroughOptions} + * + * @template I Type of instance. + */ +export type AccordionContentPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/accordion/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/accordion/public_api.ts new file mode 100644 index 000000000..4be88831f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/accordion/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/accordion/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './accordion.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/autocomplete/autocomplete.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/autocomplete/autocomplete.types.ts new file mode 100644 index 000000000..53cf806de --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/autocomplete/autocomplete.types.ts @@ -0,0 +1,327 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/autocomplete/autocomplete.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import { ScrollerOptions } from '../../api/public_api'; +import type { ChipPassThrough } from '../chip/public_api'; +import type { InputTextPassThrough } from '../inputtext/public_api'; +import type { OverlayPassThrough } from '../overlay/public_api'; +import type { VirtualScrollerPassThrough } from '../scroller/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link AutoComplete.pt} + * @group Interface + */ +export interface AutoCompletePassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the InputText component. + * @see {@link InputTextPassThrough} + */ + pcInputText?: InputTextPassThrough; + /** + * Used to pass attributes to the input multiple's DOM element. + */ + inputMultiple?: PassThroughOption; + /** + * Used to pass attributes to the chip item's DOM element. + */ + chipItem?: PassThroughOption; + /** + * Used to pass attributes to the Chip component. + * @see {@link ChipPassThrough} + */ + pcChip?: ChipPassThrough; + /** + * Used to pass attributes to the chip icon's DOM element. + */ + chipIcon?: PassThroughOption; + /** + * Used to pass attributes to the input chip's DOM element. + */ + inputChip?: PassThroughOption; + /** + * Used to pass attributes to the clear icon's DOM element. + */ + clearIcon?: PassThroughOption; + /** + * Used to pass attributes to the loader's DOM element. + */ + loader?: PassThroughOption; + /** + * Used to pass attributes to the dropdown button's DOM element. + */ + dropdown?: PassThroughOption; + /** + * Used to pass attributes to the Overlay component. + * @see {@link OverlayPassThrough} + */ + pcOverlay?: OverlayPassThrough; + /** + * Used to pass attributes to the overlay's DOM element. + */ + overlay?: PassThroughOption; + /** + * Used to pass attributes to the list container's DOM element. + */ + listContainer?: PassThroughOption; + /** + * Used to pass attributes to the Scroller component. + * @see {@link VirtualScrollerPassThrough} + */ + pcScroller?: VirtualScrollerPassThrough; + /** + * Used to pass attributes to the list's DOM element. + */ + list?: PassThroughOption; + /** + * Used to pass attributes to the option group's DOM element. + */ + optionGroup?: PassThroughOption; + /** + * Used to pass attributes to the option's DOM element. + */ + option?: PassThroughOption; + /** + * Used to pass attributes to the empty message's DOM element. + */ + emptyMessage?: PassThroughOption; +} + +/** + * Defines valid pass-through options in AutoComplete. + * @see {@link AutoCompletePassThroughOptions} + * + * @template I Type of instance. + */ +export type AutoCompletePassThrough = PassThrough>; + +/** + * Custom complete event. + * @see {@link AutoComplete.completeMethod} + * @group Events + */ +export interface AutoCompleteCompleteEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Selected option value. + */ + query: string; +} +/** + * Custom click event. + * @see {@link AutoComplete.onDropdownClick} + * @group Events + */ +export interface AutoCompleteDropdownClickEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Selected option value. + */ + query?: string; +} +/** + * Custom select event. + * @see {@link AutoComplete.onSelect} + * @group Events + */ +export interface AutoCompleteSelectEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Selected value. + */ + value: any; +} +/** + * Custom unselect event. + * @see {@link AutoComplete.onUnSelect} + * @group Events + */ +export interface AutoCompleteUnselectEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Removed value. + */ + value: any; +} +/** + * Custom add event. + * @see {@link AutoComplete.onAdd} + * @group Events + */ +export interface AutoCompleteAddEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Added value. + */ + value: any; +} +/** + * Custom lazy load event. + * @see {@link AutoComplete.onLazyLoad} + * @group Events + */ +export interface AutoCompleteLazyLoadEvent { + /** + * First element in viewport. + */ + first: any; + /** + * Last element in viewport. + */ + last: any; +} +/** + * Custom item template context. + * @group Interface + */ +export interface AutoCompleteItemTemplateContext { + /** + * Data of the option. + */ + $implicit: T; + /** + * Index of the option. + */ + index: number; +} + +/** + * Custom group template context. + * @group Interface + */ +export interface AutoCompleteGroupTemplateContext { + /** + * Group option. + */ + $implicit: T; +} + +/** + * Custom selected item template context. + * @group Interface + */ +export interface AutoCompleteSelectedItemTemplateContext { + /** + * Selected option value. + */ + $implicit: T; +} + +/** + * Custom loader template context. + * @group Interface + */ +export interface AutoCompleteLoaderTemplateContext { + /** + * Virtual scroller options. + */ + options: ScrollerOptions; +} + +/** + * Custom remove icon template context. + * @group Interface + */ +export interface AutoCompleteRemoveIconTemplateContext { + /** + * Style class of the icon. + */ + class: string; + /** + * Callback to remove the item. + */ + removeCallback: (event: Event, index: number) => void; + /** + * Index of the item. + */ + index: number; +} + +/** + * Defines valid templates in AutoComplete. + * @group Templates + */ +export interface AutoCompleteTemplates { + /** + * Custom item template. + * @param {Object} context - option data. + */ + item(context: AutoCompleteItemTemplateContext): TemplateRef>; + /** + * Custom group template. + * @param {Object} context - group data. + */ + group(context: AutoCompleteGroupTemplateContext): TemplateRef>; + /** + * Custom selected item template, only supported in multiple mode. + * @param {Object} context - selected item data. + */ + selecteditem(context: AutoCompleteSelectedItemTemplateContext): TemplateRef>; + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom empty template. + */ + empty(): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; + /** + * Custom loader template. + * @param {Object} context - scroller options. + */ + loader(context: AutoCompleteLoaderTemplateContext): TemplateRef; + /** + * Custom remove icon template. + * @param {Object} context - icon context. + */ + removeicon(context: AutoCompleteRemoveIconTemplateContext): TemplateRef; + /** + * Custom loading icon template. + */ + loadingicon(): TemplateRef; + /** + * Custom clear icon template. + */ + clearicon(): TemplateRef; + /** + * Custom dropdown icon template. + */ + dropdownicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/autocomplete/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/autocomplete/public_api.ts new file mode 100644 index 000000000..e6847af8d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/autocomplete/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/autocomplete/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './autocomplete.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/avatar/avatar.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/avatar/avatar.types.ts new file mode 100644 index 000000000..fa31b98d7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/avatar/avatar.types.ts @@ -0,0 +1,48 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/avatar/avatar.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Avatar.pt} + * @group Interface + */ +export interface AvatarPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; + /** + * Used to pass attributes to the image's DOM element. + */ + image?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Avatar component. + * @see {@link AvatarPassThroughOptions} + * + * @template I Type of instance. + */ +export type AvatarPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/avatar/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/avatar/public_api.ts new file mode 100644 index 000000000..90759aa7b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/avatar/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/avatar/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './avatar.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/avatargroup/avatargroup.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/avatargroup/avatargroup.types.ts new file mode 100644 index 000000000..3b0a0f653 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/avatargroup/avatargroup.types.ts @@ -0,0 +1,36 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/avatargroup/avatargroup.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link AvatarGroupProps.pt} + * @group Interface + */ +export interface AvatarGroupPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in AvatarGroup. + * @see {@link AvatarGroupPassThroughOptions} + * + * @template I Type of instance. + */ +export type AvatarGroupPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/avatargroup/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/avatargroup/public_api.ts new file mode 100644 index 000000000..dc449dc56 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/avatargroup/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/avatargroup/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './avatargroup.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/badge/badge.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/badge/badge.types.ts new file mode 100644 index 000000000..d580efa72 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/badge/badge.types.ts @@ -0,0 +1,35 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/badge/badge.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom passthrough(pt) options. + * @see {@link Badge.pt} + * @group Interface + */ + +export interface BadgePassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Badge component. + * @see {@link BadgePassThroughOptions} + * + * @template I Type of instance. + */ +export type BadgePassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/badge/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/badge/public_api.ts new file mode 100644 index 000000000..0175f6c46 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/badge/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/badge/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './badge.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/blockui/blockui.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/blockui/blockui.types.ts new file mode 100644 index 000000000..1025a30b6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/blockui/blockui.types.ts @@ -0,0 +1,48 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/blockui/blockui.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link BlockUI.pt} + * @group Interface + */ +export interface BlockUIPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in BlockUI component. + * @see {@link BlockUIPassThroughOptions} + * + * @template I Type of instance. + */ +export type BlockUIPassThrough = PassThrough>; + +/** + * Defines valid templates in BlockUI. + * @group Templates + */ +export interface BlockUITemplates { + /** + * Custom template of content. + */ + content(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/blockui/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/blockui/public_api.ts new file mode 100644 index 000000000..3541ee97e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/blockui/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/blockui/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './blockui.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/breadcrumb/breadcrumb.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/breadcrumb/breadcrumb.types.ts new file mode 100644 index 000000000..74a233ef0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/breadcrumb/breadcrumb.types.ts @@ -0,0 +1,107 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/breadcrumb/breadcrumb.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MenuItem, PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Breadcrumb.pt} + * @group Interface + */ +export interface BreadcrumbPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the list's DOM element. + */ + list?: PassThroughOption; + /** + * Used to pass attributes to the home item's DOM element. + */ + homeItem?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the item link's DOM element. + */ + itemLink?: PassThroughOption; + /** + * Used to pass attributes to the item icon's DOM element. + */ + itemIcon?: PassThroughOption; + /** + * Used to pass attributes to the item label's DOM element. + */ + itemLabel?: PassThroughOption; + /** + * Used to pass attributes to the separator's DOM element. + */ + separator?: PassThroughOption; + /** + * Used to pass attributes to the separator icon's DOM element. + */ + separatorIcon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Breadcrumb. + * @see {@link BreadcrumbPassThroughOptions} + * + * @template I Type of instance. + */ +export type BreadcrumbPassThrough = PassThrough>; + +/** + * Defines clicked item event. + * @see {@link BreadcrumbEmitsOptions.itemClick} + */ +export interface BreadcrumbItemClickEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Clicked item instance. + */ + item: MenuItem; +} + +/** + * Custom item template context. + * @group Interface + */ +export interface BreadcrumbItemTemplateContext { + /** + * Menu item instance. + */ + $implicit: MenuItem; +} + +/** + * Defines valid templates in Breadcrumb. + * @group Templates + */ +export interface BreadcrumbTemplates { + /** + * Custom item template. + * @param {Object} context - item data. + */ + item(context: BreadcrumbItemTemplateContext): TemplateRef; + /** + * Custom separator template. + */ + separator(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/breadcrumb/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/breadcrumb/public_api.ts new file mode 100644 index 000000000..e8f2d74ee --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/breadcrumb/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/breadcrumb/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './breadcrumb.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/button/button.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/button/button.types.ts new file mode 100644 index 000000000..1a2eb01c1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/button/button.types.ts @@ -0,0 +1,136 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/button/button.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { BadgePassThrough } from '../badge/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Button.pt} + * @group Interface + */ +export interface ButtonPassThroughOptions { + /** + * Used to pass attributes to the host DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the loading icon's DOM element. + */ + loadingIcon?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; + /** + * Used to pass attributes to the Badge component. + */ + pcBadge?: BadgePassThrough; +} + +/** + * Defines valid pass-through options in Button component. + * @see {@link ButtonPassThroughOptions} + * + * @template I Type of instance. + */ +export type ButtonPassThrough = PassThrough>; + +/** + * Custom icon template context. + * @group Interface + */ +export interface ButtonIconTemplateContext { + /** + * Style class of the icon. + */ + class: string; + /** + * Pass-through options for the icon element. + */ + pt: any; +} + +/** + * Custom loading icon template context. + * @group Interface + */ +export interface ButtonLoadingIconTemplateContext { + /** + * Style class of the loading icon. + */ + class: string; + /** + * Pass-through options for the loading icon element. + */ + pt: any; +} + +/** + * Defines valid templates in Button. + * @group Templates + */ +export interface ButtonTemplates { + /** + * Custom content template. + */ + content(): TemplateRef; + /** + * Custom icon template. + * @param {Object} context - icon context. + */ + icon(context: ButtonIconTemplateContext): TemplateRef; + /** + * Custom loading icon template. + * @param {Object} context - loading icon context. + */ + loadingicon(context: ButtonLoadingIconTemplateContext): TemplateRef; +} + +type ButtonIconPosition = 'left' | 'right' | 'top' | 'bottom'; + +export interface ButtonProps { + type?: string; + iconPos?: ButtonIconPosition; + icon?: string | undefined; + badge?: string | undefined; + label?: string | undefined; + disabled?: boolean | undefined; + loading?: boolean; + loadingIcon?: string | undefined; + raised?: boolean; + rounded?: boolean; + text?: boolean; + plain?: boolean; + severity?: ButtonSeverity; + outlined?: boolean; + link?: boolean; + tabindex?: number | undefined; + size?: 'small' | 'large' | undefined; + style?: { [klass: string]: any } | null | undefined; + styleClass?: string | undefined; + badgeClass?: string | undefined; + badgeSeverity?: 'success' | 'info' | 'warning' | 'danger' | 'help' | 'primary' | 'secondary' | 'contrast' | null | undefined; + ariaLabel?: string | undefined; + autofocus?: boolean | undefined; + variant?: string | undefined; +} + +export type ButtonSeverity = 'success' | 'info' | 'warn' | 'danger' | 'help' | 'primary' | 'secondary' | 'contrast' | null | undefined; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/button/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/button/public_api.ts new file mode 100644 index 000000000..3629a59f8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/button/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/button/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './button.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/card/card.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/card/card.types.ts new file mode 100644 index 000000000..7fe2c06ce --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/card/card.types.ts @@ -0,0 +1,84 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/card/card.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Card.pt} + * @group Interface + */ +export interface CardPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the body's DOM element. + */ + body?: PassThroughOption; + /** + * Used to pass attributes to the subtitle's DOM element. + */ + subtitle?: PassThroughOption; + /** + * Used to pass attributes to the title's DOM element. + */ + title?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the footer's DOM element. + */ + footer?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Card component. + * @see {@link CardPassThroughOptions} + * + * @template I Type of instance. + */ +export type CardPassThrough = PassThrough>; + +/** + * Defines valid templates in Card. + * @group Templates + */ +export interface CardTemplates { + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom title template. + */ + title(): TemplateRef; + /** + * Custom subtitle template. + */ + subtitle(): TemplateRef; + /** + * Custom content template. + */ + content(): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/card/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/card/public_api.ts new file mode 100644 index 000000000..68d3f646b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/card/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/card/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './card.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/carousel/carousel.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/carousel/carousel.types.ts new file mode 100644 index 000000000..2e5c0371a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/carousel/carousel.types.ts @@ -0,0 +1,153 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/carousel/carousel.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThroughOptions } from '../button/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Carousel.pt} + * @group Interface + */ +export interface CarouselPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the content container's DOM element. + */ + contentContainer?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the previous button's DOM element. + */ + pcPrevButton?: ButtonPassThroughOptions; + /** + * Used to pass attributes to the viewport's DOM element. + */ + viewport?: PassThroughOption; + /** + * Used to pass attributes to the item list's DOM element. + */ + itemList?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the item clone's DOM element. + */ + itemClone?: PassThroughOption; + /** + * Used to pass attributes to the next button's DOM element. + */ + pcNextButton?: ButtonPassThroughOptions; + /** + * Used to pass attributes to the indicator list's DOM element. + */ + indicatorList?: PassThroughOption; + /** + * Used to pass attributes to the indicator's DOM element. + */ + indicator?: PassThroughOption; + /** + * Used to pass attributes to the indicator button's DOM element. + */ + indicatorButton?: PassThroughOption; + /** + * Used to pass attributes to the footer's DOM element. + */ + footer?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Carousel. + * @see {@link CarouselPassThroughOptions} + * + * @template I Type of instance. + */ +export type CarouselPassThrough = PassThrough>; + +/** + * Responsive options of the component. + * @group Interface + */ +export interface CarouselResponsiveOptions { + /** + * Breakpoint for responsive mode. Exp; @media screen and (max-width: ${breakpoint}) {...} + */ + breakpoint: string; + /** + * The number of visible items on breakpoint. + */ + numVisible: number; + /** + * The number of scrolled items on breakpoint. + */ + numScroll: number; +} +/** + * Custom page event. + * @group Events + */ +export interface CarouselPageEvent { + /** + * Current page. + */ + page?: number; +} +/** + * Custom item template context. + * @group Interface + */ +export interface CarouselItemTemplateContext { + /** + * Data of the item. + */ + $implicit: T; +} + +/** + * Defines valid templates in Carousel. + * @group Templates + */ +export interface CarouselTemplates { + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom item template. + * @param {Object} context - item data. + */ + item(context: CarouselItemTemplateContext): TemplateRef>; + /** + * Custom previous icon template. + */ + previousicon(): TemplateRef; + /** + * Custom next icon template. + */ + nexticon(): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/carousel/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/carousel/public_api.ts new file mode 100644 index 000000000..b5625a7cf --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/carousel/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/carousel/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './carousel.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/cascadeselect/cascadeselect.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/cascadeselect/cascadeselect.types.ts new file mode 100644 index 000000000..095e9f7c3 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/cascadeselect/cascadeselect.types.ts @@ -0,0 +1,223 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/cascadeselect/cascadeselect.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { ElementRef, TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link CascadeSelect.pt} + * @group Interface + */ +export interface CascadeSelectPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the hidden input wrapper's DOM element. + */ + hiddenInputWrapper?: PassThroughOption; + /** + * Used to pass attributes to the hidden input's DOM element. + */ + hiddenInput?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; + /** + * Used to pass attributes to the dropdown's DOM element. + */ + dropdown?: PassThroughOption; + /** + * Used to pass attributes to the loading icon's DOM element. + */ + loadingIcon?: PassThroughOption; + /** + * Used to pass attributes to the dropdown icon's DOM element. + */ + dropdownIcon?: PassThroughOption; + /** + * Used to pass attributes to the clear icon's DOM element. + */ + clearIcon?: PassThroughOption; + /** + * Used to pass attributes to the overlay's DOM element. + */ + overlay?: PassThroughOption; + /** + * Used to pass attributes to the list container's DOM element. + */ + listContainer?: PassThroughOption; + /** + * Used to pass attributes to the list's DOM element. + */ + list?: PassThroughOption; + /** + * Used to pass attributes to the option list's DOM element. + */ + optionList?: PassThroughOption; + /** + * Used to pass attributes to the option's DOM element. + */ + option?: PassThroughOption; + /** + * Used to pass attributes to the option content's DOM element. + */ + optionContent?: PassThroughOption; + /** + * Used to pass attributes to the option text's DOM element. + */ + optionText?: PassThroughOption; + /** + * Used to pass attributes to the group icon's DOM element. + */ + groupIcon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in CascadeSelect. + * @see {@link CascadeSelectPassThroughOptions} + * + * @template I Type of instance. + */ +export type CascadeSelectPassThrough = PassThrough>; + +/** + * Custom panel show event. + * @see {@link CascadeSelect.onShow} + * @group Events + */ +export interface CascadeSelectShowEvent { + /** + * Overlay element. + */ + overlay?: ElementRef | TemplateRef | HTMLElement | null | undefined; + /** + * Target element. + */ + target?: ElementRef | TemplateRef | HTMLElement | null | undefined; + /** + * Overlay mode. + */ + overlayMode?: 'modal' | 'overlay' | string; +} +/** + * Custom panel hide event. + * @see {@link CascadeSelect.onHide} + * @extends {CascadeSelectShowEvent} + * @group Events + */ +export interface CascadeSelectHideEvent extends CascadeSelectShowEvent {} +/** + * Custom panel show event emits right before the panel is shown. + * @see {@link CascadeSelect.onBeforeShow} + * @extends {CascadeSelectShowEvent} + * @group Events + */ +export interface CascadeSelectBeforeShowEvent extends CascadeSelectShowEvent {} +/** + * Custom panel hide event emits right before the panel is hidden. + * @see {@link CascadeSelect.onBeforeHide} + * @extends {CascadeSelectShowEvent} + * @group Events + */ +export interface CascadeSelectBeforeHideEvent extends CascadeSelectShowEvent {} +/** + * Custom panel change event emits when selection changed. + * @see {@link CascadeSelect.onChange} + * @group Events + */ +export interface CascadeSelectChangeEvent { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Selected value. + */ + value?: any; + /** + * Focus state. + */ + isFocus?: boolean; +} +/** + * Custom value template context. + * @group Interface + */ +export interface CascadeSelectValueTemplateContext { + /** + * Selected value. + */ + $implicit: T; + /** + * Placeholder text. + */ + placeholder: string; +} + +/** + * Custom option template context. + * @group Interface + */ +export interface CascadeSelectOptionTemplateContext { + /** + * Option instance. + */ + $implicit: T; + /** + * Level of the option in the hierarchy. + */ + level: number; +} + +/** + * Defines valid templates in CascadeSelect. + * @group Templates + */ +export interface CascadeSelectTemplates { + /** + * Custom value template. + * @param {Object} context - value data. + */ + value(context: CascadeSelectValueTemplateContext): TemplateRef>; + /** + * Custom option template. + * @param {Object} context - option data. + */ + option(context: CascadeSelectOptionTemplateContext): TemplateRef>; + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; + /** + * Custom dropdown trigger icon template. + */ + triggericon(): TemplateRef; + /** + * Custom clear icon template. + */ + clearicon(): TemplateRef; + /** + * Custom option group icon template. + */ + optiongroupicon(): TemplateRef; + /** + * Custom loading icon template. + */ + loadingicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/cascadeselect/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/cascadeselect/public_api.ts new file mode 100644 index 000000000..b82bb8d10 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/cascadeselect/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/cascadeselect/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './cascadeselect.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/checkbox/checkbox.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/checkbox/checkbox.types.ts new file mode 100644 index 000000000..dd0d21f10 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/checkbox/checkbox.types.ts @@ -0,0 +1,92 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/checkbox/checkbox.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom change event. + * @see {@link Checkbox.onChange} + * @group Events + */ +export interface CheckboxChangeEvent { + /** + * Checked value. + */ + checked?: any; + /** + * Browser event. + */ + originalEvent?: Event; +} + +/** + * Custom checkbox icon template context. + * @group Interface + */ +export interface CheckboxIconTemplateContext { + /** + * State of the checkbox. + */ + checked: boolean; + /** + * Style class of the icon. + */ + class: string; + /** + * DataP attributes. + */ + dataP: string; +} + +/** + * Defines valid templates in Checkbox. + * @group Templates + */ +export interface CheckboxTemplates { + /** + * Custom checkbox icon template. + * @param {Object} context - icon context. + */ + icon(context: CheckboxIconTemplateContext): TemplateRef; +} + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link CheckboxProps.pt} + * @group Interface + */ +export interface CheckboxPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the input's DOM element. + */ + input?: PassThroughOption; + /** + * Used to pass attributes to the box's DOM element. + */ + box?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Checkbox. + * @see {@link CheckboxPassThroughOptions} + * + * @template I Type of instance. + */ +export type CheckboxPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/checkbox/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/checkbox/public_api.ts new file mode 100644 index 000000000..7f9a06b9c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/checkbox/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/checkbox/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './checkbox.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/chip/chip.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/chip/chip.types.ts new file mode 100644 index 000000000..1e0e35dd4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/chip/chip.types.ts @@ -0,0 +1,79 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/chip/chip.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Chip.pt} + * @group Interface + */ +export interface ChipPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the image's DOM element. + */ + image?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; + /** + * Used to pass attributes to the remove icon's DOM element. + */ + removeIcon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Chip component. + * @see {@link ChipPassThroughOptions} + * + * @template I Type of instance. + */ +export type ChipPassThrough = PassThrough>; + +/** + * Defines valid templates in Chip. + * @group Templates + */ +export interface ChipTemplates { + /** + * Custom content template. + */ + content(): TemplateRef; + /** + * Custom remove icon template. + */ + removeicon(): TemplateRef; +} + +export interface ChipProps { + label?: string; + icon?: string | undefined; + image?: string | undefined; + alt?: string | undefined; + style?: { [klass: string]: any } | null | undefined; + styleClass?: string | undefined; + removable?: boolean | undefined; + removeIcon?: string | undefined; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/chip/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/chip/public_api.ts new file mode 100644 index 000000000..a1146113c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/chip/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/chip/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './chip.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/colorpicker/colorpicker.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/colorpicker/colorpicker.types.ts new file mode 100644 index 000000000..f5b5f995d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/colorpicker/colorpicker.types.ts @@ -0,0 +1,87 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/colorpicker/colorpicker.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link ColorPicker.pt} + * @group Interface + */ +export interface ColorPickerPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the preview input's DOM element. + */ + preview?: PassThroughOption; + /** + * Used to pass attributes to the panel's DOM element. + */ + panel?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the color selector's DOM element. + */ + colorSelector?: PassThroughOption; + /** + * Used to pass attributes to the color background's DOM element. + */ + colorBackground?: PassThroughOption; + /** + * Used to pass attributes to the color handle's DOM element. + */ + colorHandle?: PassThroughOption; + /** + * Used to pass attributes to the hue's DOM element. + */ + hue?: PassThroughOption; + /** + * Used to pass attributes to the hue handle's DOM element. + */ + hueHandle?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Custom passthrough attributes for each DOM elements + * @group Interface + */ +export type ColorPickerPassThrough = PassThrough>; + +/** + * Custom change event. + * @see {@link ColorPicker.onChange} + * @group Events + */ +export interface ColorPickerChangeEvent { + /** + * Browser event + */ + originalEvent: Event; + /** + * Selected color value. + */ + value: string | object; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/colorpicker/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/colorpicker/public_api.ts new file mode 100644 index 000000000..cfe09a381 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/colorpicker/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/colorpicker/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './colorpicker.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmdialog/confirmdialog.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmdialog/confirmdialog.types.ts new file mode 100644 index 000000000..c771bb9f1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmdialog/confirmdialog.types.ts @@ -0,0 +1,158 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/confirmdialog/confirmdialog.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { Confirmation, PassThrough, PassThroughOption } from '../../api/public_api'; +import { DialogPassThrough } from '../dialog/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link ConfirmDialog.pt} + * @group Interface + */ +export interface ConfirmDialogPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + * @see {@link DialogPassThrough} + */ + root?: DialogPassThrough; + /** + * Used to pass attributes to the mask's DOM element. + */ + mask?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; + /** + * Used to pass attributes to the message's DOM element. + */ + message?: PassThroughOption; + /** + * Used to pass attributes to the resize handle's DOM element. + */ + resizeHandle?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the title's DOM element. + */ + title?: PassThroughOption; + /** + * Used to pass attributes to the header actions' DOM element. + */ + headerActions?: PassThroughOption; + /** + * Used to pass attributes to the close Button component. + * @see {@link ButtonPassThrough} + */ + pcCloseButton?: ButtonPassThrough; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the footer's DOM element. + */ + footer?: PassThroughOption; + /** + * Used to pass attributes to the accept Button component. + * @see {@link ButtonPassThrough} + */ + pcAcceptButton?: ButtonPassThrough; + /** + * Used to pass attributes to the reject Button component. + * @see {@link ButtonPassThrough} + */ + pcRejectButton?: ButtonPassThrough; +} + +/** + * Defines valid pass-through options in ConfirmDialog. + * @see {@link ConfirmDialogPassThroughOptions} + * + * @template I Type of instance. + */ +export type ConfirmDialogPassThrough = PassThrough>; + +/** + * Custom headless template context. + * @group Interface + */ +export interface ConfirmDialogHeadlessTemplateContext { + /** + * Confirmation instance. + */ + $implicit: Confirmation | null | undefined; + /** + * Callback to accept the confirmation. + */ + onAccept: () => void; + /** + * Callback to reject the confirmation. + */ + onReject: () => void; +} + +/** + * Custom message template context. + * @group Interface + */ +export interface ConfirmDialogMessageTemplateContext { + /** + * Confirmation instance. + */ + $implicit: Confirmation | null | undefined; +} + +/** + * Defines valid templates in ConfirmDialog. + * @group Templates + */ +export interface ConfirmDialogTemplates { + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; + /** + * Custom message template. + * @param {Object} context - message context. + */ + message(context: ConfirmDialogMessageTemplateContext): TemplateRef; + /** + * Custom icon template. + */ + icon(): TemplateRef; + /** + * Custom reject icon template. + */ + rejecticon(): TemplateRef; + /** + * Custom accept icon template. + */ + accepticon(): TemplateRef; + /** + * Custom headless template. + * @param {Object} context - headless context. + */ + headless(context: ConfirmDialogHeadlessTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmdialog/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmdialog/public_api.ts new file mode 100644 index 000000000..1ea18b2c1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmdialog/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/confirmdialog/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './confirmdialog.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmpopup/confirmpopup.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmpopup/confirmpopup.types.ts new file mode 100644 index 000000000..2c547966f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmpopup/confirmpopup.types.ts @@ -0,0 +1,116 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/confirmpopup/confirmpopup.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { Confirmation, PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link ConfirmPopup.pt} + * @group Interface + */ +export interface ConfirmPopupPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; + /** + * Used to pass attributes to the message's DOM element. + */ + message?: PassThroughOption; + /** + * Used to pass attributes to the footer's DOM element. + */ + footer?: PassThroughOption; + /** + * Used to pass attributes to the reject Button component. + * @see {@link ButtonPassThrough} + */ + pcRejectButton?: ButtonPassThrough; + /** + * Used to pass attributes to the accept Button component. + * @see {@link ButtonPassThrough} + */ + pcAcceptButton?: ButtonPassThrough; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in ConfirmPopup. + * @see {@link ConfirmPopupPassThroughOptions} + * + * @template I Type of instance. + */ +export type ConfirmPopupPassThrough = PassThrough>; + +/** + * Custom headless template context. + * @group Interface + */ +export interface ConfirmPopupHeadlessTemplateContext { + /** + * Confirmation instance. + */ + $implicit: Confirmation | null | undefined; +} + +/** + * Custom content template context. + * @group Interface + */ +export interface ConfirmPopupContentTemplateContext { + /** + * Confirmation instance. + */ + $implicit: Confirmation | null | undefined; +} + +/** + * Defines valid templates in ConfirmPopup. + * @group Templates + */ +export interface ConfirmPopupTemplates { + /** + * Custom content template. + * @param {Object} context - content context. + */ + content(context: ConfirmPopupContentTemplateContext): TemplateRef; + /** + * Custom reject icon template. + */ + rejecticon(): TemplateRef; + /** + * Custom accept icon template. + */ + accepticon(): TemplateRef; + /** + * Custom headless template. + * @param {Object} context - headless context. + */ + headless(context: ConfirmPopupHeadlessTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmpopup/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmpopup/public_api.ts new file mode 100644 index 000000000..a4f4fe926 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/confirmpopup/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/confirmpopup/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './confirmpopup.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/datepicker/datepicker.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/datepicker/datepicker.types.ts new file mode 100644 index 000000000..d59516603 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/datepicker/datepicker.types.ts @@ -0,0 +1,534 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/datepicker/datepicker.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; +import type { InputTextPassThrough } from '../inputtext/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * @see {@link DatePicker.pt} + * @group Interface + */ +export interface DatePickerPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the InputText component. + * @see {@link InputTextPassThrough} + */ + pcInputText?: InputTextPassThrough; + /** + * Used to pass attributes to the dropdown button's DOM element. + */ + dropdown?: PassThroughOption; + /** + * Used to pass attributes to the dropdown icon's DOM element. + */ + dropdownIcon?: PassThroughOption; + /** + * Used to pass attributes to the input icon container's DOM element. + */ + inputIconContainer?: PassThroughOption; + /** + * Used to pass attributes to the input icon's DOM element. + */ + inputIcon?: PassThroughOption; + /** + * Used to pass attributes to the panel's DOM element. + */ + panel?: PassThroughOption; + /** + * Used to pass attributes to the calendar container's DOM element. + */ + calendarContainer?: PassThroughOption; + /** + * Used to pass attributes to the calendar's DOM element. + */ + calendar?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the previous button component. + * @see {@link ButtonPassThrough} + */ + pcPrevButton?: ButtonPassThrough; + /** + * Used to pass attributes to the title's DOM element. + */ + title?: PassThroughOption; + /** + * Used to pass attributes to the select month's DOM element. + */ + selectMonth?: PassThroughOption; + /** + * Used to pass attributes to the select year's DOM element. + */ + selectYear?: PassThroughOption; + /** + * Used to pass attributes to the decade's DOM element. + */ + decade?: PassThroughOption; + /** + * Used to pass attributes to the next button component. + * @see {@link ButtonPassThrough} + */ + pcNextButton?: ButtonPassThrough; + /** + * Used to pass attributes to the day view's DOM element. + */ + dayView?: PassThroughOption; + /** + * Used to pass attributes to the table's DOM element. + */ + table?: PassThroughOption; + /** + * Used to pass attributes to the table header's DOM element. + */ + tableHeader?: PassThroughOption; + /** + * Used to pass attributes to the table header row's DOM element. + */ + tableHeaderRow?: PassThroughOption; + /** + * Used to pass attributes to the week header's DOM element. + */ + weekHeader?: PassThroughOption; + /** + * Used to pass attributes to the week header label's DOM element. + */ + weekHeaderLabel?: PassThroughOption; + /** + * Used to pass attributes to the table header cell's DOM element. + */ + tableHeaderCell?: PassThroughOption; + /** + * Used to pass attributes to the week day cell's DOM element. + */ + weekDayCell?: PassThroughOption; + /** + * Used to pass attributes to the week day's DOM element. + */ + weekDay?: PassThroughOption; + /** + * Used to pass attributes to the table body's DOM element. + */ + tableBody?: PassThroughOption; + /** + * Used to pass attributes to the table body row's DOM element. + */ + tableBodyRow?: PassThroughOption; + /** + * Used to pass attributes to the week number's DOM element. + */ + weekNumber?: PassThroughOption; + /** + * Used to pass attributes to the week label container's DOM element. + */ + weekLabelContainer?: PassThroughOption; + /** + * Used to pass attributes to the day cell's DOM element. + */ + dayCell?: PassThroughOption; + /** + * Used to pass attributes to the day's DOM element. + */ + day?: PassThroughOption; + /** + * Used to pass attributes to the month view's DOM element. + */ + monthView?: PassThroughOption; + /** + * Used to pass attributes to the month's DOM element. + */ + month?: PassThroughOption; + /** + * Used to pass attributes to the year view's DOM element. + */ + yearView?: PassThroughOption; + /** + * Used to pass attributes to the year's DOM element. + */ + year?: PassThroughOption; + /** + * Used to pass attributes to the time picker's DOM element. + */ + timePicker?: PassThroughOption; + /** + * Used to pass attributes to the hour picker's DOM element. + */ + hourPicker?: PassThroughOption; + /** + * Used to pass attributes to the hour's DOM element. + */ + hour?: PassThroughOption; + /** + * Used to pass attributes to the separator container's DOM element. + */ + separatorContainer?: PassThroughOption; + /** + * Used to pass attributes to the separator's DOM element. + */ + separator?: PassThroughOption; + /** + * Used to pass attributes to the minute picker's DOM element. + */ + minutePicker?: PassThroughOption; + /** + * Used to pass attributes to the minute's DOM element. + */ + minute?: PassThroughOption; + /** + * Used to pass attributes to the second picker's DOM element. + */ + secondPicker?: PassThroughOption; + /** + * Used to pass attributes to the second's DOM element. + */ + second?: PassThroughOption; + /** + * Used to pass attributes to the ampm picker's DOM element. + */ + ampmPicker?: PassThroughOption; + /** + * Used to pass attributes to the ampm's DOM element. + */ + ampm?: PassThroughOption; + /** + * Used to pass attributes to the buttonbar's DOM element. + */ + buttonbar?: PassThroughOption; + /** + * Used to pass attributes to the increment button component. + * @see {@link ButtonPassThrough} + */ + pcIncrementButton?: ButtonPassThrough; + /** + * Used to pass attributes to the decrement button component. + * @see {@link ButtonPassThrough} + */ + pcDecrementButton?: ButtonPassThrough; + /** + * Used to pass attributes to the today button component. + * @see {@link ButtonPassThrough} + */ + pcTodayButton?: ButtonPassThrough; + /** + * Used to pass attributes to the clear button component. + * @see {@link ButtonPassThrough} + */ + pcClearButton?: ButtonPassThrough; + /** + * Used to pass attributes to the hidden selected day's DOM element. + */ + hiddenSelectedDay?: PassThroughOption; + /** + * Used to pass attributes to the hidden month's DOM element. + */ + hiddenMonth?: PassThroughOption; + /** + * Used to pass attributes to the hidden year's DOM element. + */ + hiddenYear?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in DatePicker. + * @see {@link DatePickerPassThroughOptions} + * @template I Type of instance. + */ +export type DatePickerPassThrough = PassThrough>; + +/** + * Represents metadata for a single date cell in the DatePicker. + * @group Interface + */ +export interface DatePickerDateMeta { + /** + * Day of the month (1-31). + */ + day: number; + /** + * Month (0-11). + */ + month: number; + /** + * Year. + */ + year: number; + /** + * Whether this date belongs to a different month than the displayed month. + */ + otherMonth?: boolean; + /** + * Whether this date is today. + */ + today?: boolean; + /** + * Whether this date is selectable. + */ + selectable?: boolean; +} + +/** + * Custom date template context. + * @group Interface + */ +export interface DatePickerDateTemplateContext { + /** + * Date metadata object. + */ + $implicit: DatePickerDateMeta; +} + +/** + * Custom disabled date template context. + * @group Interface + */ +export interface DatePickerDisabledDateTemplateContext { + /** + * Disabled date metadata object. + */ + $implicit: DatePickerDateMeta; +} + +/** + * Custom decade template context. + * @group Interface + */ +export interface DatePickerDecadeTemplateContext { + /** + * Function that returns an array of years for the decade. + */ + $implicit: () => number[]; +} + +/** + * Custom input icon template context. + * @group Interface + */ +export interface DatePickerInputIconTemplateContext { + /** + * Click callback function to open the DatePicker. + */ + clickCallBack: (event: Event) => void; +} + +/** + * Custom button bar template context. + * @group Interface + */ +export interface DatePickerButtonBarTemplateContext { + /** + * Today button click callback. + */ + todayCallback: (event: Event) => void; + /** + * Clear button click callback. + */ + clearCallback: (event: Event) => void; +} + +/** + * Defines valid templates in DatePicker. + * @group Templates + */ +export interface DatePickerTemplates { + /** + * Custom date template. + * @param {Object} context - date metadata. + */ + date(context: DatePickerDateTemplateContext): TemplateRef; + /** + * Custom decade template. + * @param {Object} context - decade years function. + */ + decade(context: DatePickerDecadeTemplateContext): TemplateRef; + /** + * Custom disabled date template. + * @param {Object} context - disabled date metadata. + */ + disabledDate(context: DatePickerDisabledDateTemplateContext): TemplateRef; + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom input icon template. + * @param {Object} context - input icon template params. + */ + inputicon(context: DatePickerInputIconTemplateContext): TemplateRef; + /** + * Custom previous icon template. + */ + previousicon(): TemplateRef; + /** + * Custom next icon template. + */ + nexticon(): TemplateRef; + /** + * Custom dropdown trigger icon template. + */ + triggericon(): TemplateRef; + /** + * Custom clear icon template. + */ + clearicon(): TemplateRef; + /** + * Custom decrement icon template. + */ + decrementicon(): TemplateRef; + /** + * Custom increment icon template. + */ + incrementicon(): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; + /** + * Custom button bar template. + * @param {Object} context - button bar template params. + */ + buttonbar(context: DatePickerButtonBarTemplateContext): TemplateRef; +} +/** + * Locale settings options. + * @group Interface + */ +export interface LocaleSettings { + /** + * Day value. + */ + firstDayOfWeek?: number; + /** + * Day names. + */ + dayNames?: string[]; + /** + * Shortened day names. + */ + dayNamesShort?: string[]; + /** + * Minimum days names. + */ + dayNamesMin?: string[]; + /** + * Month names. + */ + monthNames?: string[]; + /** + * Shortened month names. + */ + monthNamesShort?: string[]; + /** + * Value of today date string. + */ + today?: string; + /** + * Clear. + */ + clear?: string; + /** + * Date format. + */ + dateFormat?: string; + /** + * Week header. + */ + weekHeader?: string; +} +/** + * Month interface. + * @group Interface + */ +export interface Month { + /** + * Mont value. + */ + month?: number; + /** + * Year value. + */ + year?: number; + /** + * Array of dates. + */ + dates?: Date[]; + /** + * Array of week numbers. + */ + weekNumbers?: number[]; +} +/** + * Custom DatePicker responsive options metadata. + * @group Interface + */ +export interface DatePickerResponsiveOptions { + /** + * Breakpoint for responsive mode. Exp; @media screen and (max-width: ${breakpoint}) {...} + */ + breakpoint?: string; + /** + * The number of visible months on breakpoint. + */ + numMonths?: number; +} +/** + * Custom type for the DatePicker views. + * @group Types + */ +export type DatePickerTypeView = 'date' | 'month' | 'year'; +/** + * Custom type for the DatePicker navigation state. + * @group Types + */ +export type NavigationState = { backward?: boolean; button?: boolean }; + +/** + * Custom DatePicker year change event. + * @see {@link DatePicker.onYearChange} + * @group Events + */ +export interface DatePickerYearChangeEvent { + /** + * New month. + */ + month?: number; + /** + * New year. + */ + year?: number; +} +/** + * Custom DatePicker month change event. + * @see {@link DatePicker.onMonthChange} + * @group Events + */ +export interface DatePickerMonthChangeEvent { + /** + * New month. + */ + month?: number; + /** + * New year. + */ + year?: number; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/datepicker/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/datepicker/public_api.ts new file mode 100644 index 000000000..0fdf87735 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/datepicker/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/datepicker/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './datepicker.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/dialog/dialog.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/dialog/dialog.types.ts new file mode 100644 index 000000000..a278c03b6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/dialog/dialog.types.ts @@ -0,0 +1,116 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/dialog/dialog.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Dialog.pt} + * @group Interface + */ +export interface DialogPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the mask's DOM element. + */ + mask?: PassThroughOption; + /** + * Used to pass attributes to the resize handle's DOM element. + */ + resizeHandle?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the title's DOM element. + */ + title?: PassThroughOption; + /** + * Used to pass attributes to the header actions' DOM element. + */ + headerActions?: PassThroughOption; + /** + * Used to pass attributes to the maximize Button component. + * @see {@link ButtonPassThrough} + */ + pcMaximizeButton?: ButtonPassThrough; + /** + * Used to pass attributes to the close Button component. + * @see {@link ButtonPassThrough} + */ + pcCloseButton?: ButtonPassThrough; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the footer's DOM element. + */ + footer?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Dialog. + * @see {@link DialogPassThroughOptions} + * + * @template I Type of instance. + */ +export type DialogPassThrough = PassThrough>; + +/** + * Defines valid templates in Dialog. + * @group Templates + */ +export interface DialogTemplates { + /** + * Custom template of header. + */ + header(): TemplateRef; + /** + * Custom template of content. + */ + content(): TemplateRef; + /** + * Custom template of footer. + */ + footer(): TemplateRef; + /** + * Custom template of closeicon. + */ + closeicon(): TemplateRef; + /** + * Custom template of maximizeicon. + */ + maximizeicon(): TemplateRef; + /** + * Custom template of minimizeicon. + */ + minimizeicon(): TemplateRef; + /** + * Custom headless template to replace the entire dialog content. + */ + headless(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/dialog/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/dialog/public_api.ts new file mode 100644 index 000000000..d866f1298 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/dialog/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/dialog/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './dialog.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/divider/divider.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/divider/divider.types.ts new file mode 100644 index 000000000..d177ce5af --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/divider/divider.types.ts @@ -0,0 +1,36 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/divider/divider.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Divider.pt} + * @group Interface + */ +export interface DividerPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Divider component. + * @see {@link DividerPassThroughOptions} + * + * @template I Type of instance. + */ +export type DividerPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/divider/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/divider/public_api.ts new file mode 100644 index 000000000..8c4d651a0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/divider/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/divider/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './divider.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/dock/dock.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/dock/dock.types.ts new file mode 100644 index 000000000..7b9d92df3 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/dock/dock.types.ts @@ -0,0 +1,80 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/dock/dock.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MenuItem, PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Dock.pt} + * @group Interface + */ +export interface DockPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the list container's DOM element. + */ + listContainer?: PassThroughOption; + /** + * Used to pass attributes to the list's DOM element. + */ + list?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the item content's DOM element. + */ + itemContent?: PassThroughOption; + /** + * Used to pass attributes to the item link's DOM element. + */ + itemLink?: PassThroughOption; + /** + * Used to pass attributes to the item icon's DOM element. + */ + itemIcon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Dock. + * @see {@link DockPassThroughOptions} + * + * @template I Type of instance. + */ +export type DockPassThrough = PassThrough>; + +/** + * Custom item template context. + * @group Interface + */ +export interface DockItemTemplateContext { + /** + * Menu item instance. + */ + $implicit: MenuItem; +} + +/** + * Defines valid templates in Dock. + * @group Templates + */ +export interface DockTemplates { + /** + * Custom template of item. + * @param {Object} context - item data. + */ + item(context: DockItemTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/dock/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/dock/public_api.ts new file mode 100644 index 000000000..7327ba2e7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/dock/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/dock/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './dock.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/drawer/drawer.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/drawer/drawer.types.ts new file mode 100644 index 000000000..faa23aab3 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/drawer/drawer.types.ts @@ -0,0 +1,91 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/drawer/drawer.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Drawer.pt} + * @group Interface + */ +export interface DrawerPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the title's DOM element. + */ + title?: PassThroughOption; + /** + * Used to pass attributes to the close Button component. + * @see {@link ButtonPassThrough} + */ + pcCloseButton?: ButtonPassThrough; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the footer's DOM element. + */ + footer?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Drawer. + * @see {@link DrawerPassThroughOptions} + * + * @template I Type of instance. + */ +export type DrawerPassThrough = PassThrough>; + +/** + * Defines valid templates in Drawer. + * @group Templates + */ +export interface DrawerTemplates { + /** + * Custom template of header. + */ + header(): TemplateRef; + /** + * Custom template of content. + */ + content(): TemplateRef; + /** + * Custom template of footer. + */ + footer(): TemplateRef; + /** + * Custom template of close icon. + */ + closeicon(): TemplateRef; + /** + * Headless template to replace the entire drawer content. + */ + headless(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/drawer/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/drawer/public_api.ts new file mode 100644 index 000000000..a840cefa1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/drawer/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/drawer/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './drawer.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/editor/editor.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/editor/editor.types.ts new file mode 100644 index 000000000..0c7bb3f31 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/editor/editor.types.ts @@ -0,0 +1,219 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/editor/editor.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom passthrough(pt) options. + * @template I Type of instance. + * + * @see {@link Editor.pt} + * @group Interface + */ +export interface EditorPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the toolbar's DOM element. + */ + toolbar?: PassThroughOption; + /** + * Used to pass attributes to the formats span's DOM element. + */ + formats?: PassThroughOption; + /** + * Used to pass attributes to the header select's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the option's DOM element. + */ + option?: PassThroughOption; + /** + * Used to pass attributes to the bold button's DOM element. + */ + bold?: PassThroughOption; + /** + * Used to pass attributes to the italic button's DOM element. + */ + italic?: PassThroughOption; + /** + * Used to pass attributes to the underline button's DOM element. + */ + underline?: PassThroughOption; + /** + * Used to pass attributes to the color select's DOM element. + */ + color?: PassThroughOption; + /** + * Used to pass attributes to the background select's DOM element. + */ + background?: PassThroughOption; + /** + * Used to pass attributes to the list button's DOM element. + */ + list?: PassThroughOption; + /** + * Used to pass attributes to the select's DOM element. + */ + select?: PassThroughOption; + /** + * Used to pass attributes to the link button's DOM element. + */ + link?: PassThroughOption; + /** + * Used to pass attributes to the image button's DOM element. + */ + image?: PassThroughOption; + /** + * Used to pass attributes to the code block button's DOM element. + */ + codeBlock?: PassThroughOption; + /** + * Used to pass attributes to the clean button's DOM element. + */ + clean?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Editor component. + * @see {@link EditorPassThroughOptions} + * + * @template I Type of instance. + */ +export type EditorPassThrough = PassThrough>; + +/** + * Quill Delta object interface for text changes. + * @group Interfaces + */ +export interface QuillDelta { + ops?: any[]; + retain?: number; + delete?: number; + insert?: string | object; + attributes?: { [key: string]: any }; +} + +/** + * Quill Range object interface for selection changes. + * @group Interfaces + */ +export interface QuillRange { + index: number; + length: number; +} + +/** + * Custom text change event. + * @see {@link Editor.onTextChange} + * @group Events + */ +export interface EditorTextChangeEvent { + /** + * Current value as html. + */ + htmlValue: string | null; + /** + * Current value as text. + */ + textValue: string; + /** + * Representation of the change as Quill Delta. + */ + delta: QuillDelta; + /** + * Source of change. Will be 'user', 'api', or 'silent'. + */ + source: 'user' | 'api' | 'silent'; +} +/** + * Custom selection change event. + * @see {@link Editor.onSelectionChange} + * @group Events + */ +export interface EditorSelectionChangeEvent { + /** + * Representation of the selection boundaries. + */ + range: QuillRange | null; + /** + * Representation of the previous selection boundaries. + */ + oldRange: QuillRange | null; + /** + * Source of change. Will be 'user', 'api', or 'silent'. + */ + source: 'user' | 'api' | 'silent'; +} +/** + * Custom editor change event. + * @see {@link Editor.onEditorChange} + * @group Events + */ +export interface EditorChangeEvent { + /** + * Type of change ('text-change' or 'selection-change'). + */ + eventName: 'text-change' | 'selection-change'; + /** + * Arguments passed to the change event. + */ + args: any[]; +} +/** + * Custom focus event. + * @see {@link Editor.onFocus} + * @group Events + */ +export interface EditorFocusEvent { + /** + * Source of the focus event. + */ + source: 'user' | 'api' | 'silent'; +} +/** + * Custom blur event. + * @see {@link Editor.onBlur} + * @group Events + */ +export interface EditorBlurEvent { + /** + * Source of the blur event. + */ + source: 'user' | 'api' | 'silent'; +} +/** + * Custom load event. + * @see {@link Editor.onInit} + * @group Events + */ +export interface EditorInitEvent { + /** + * Text editor instance. + */ + editor: any; +} +/** + * Defines valid templates in Editor. + * @group Templates + */ +export interface EditorTemplates { + /** + * Custom header template. + */ + header(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/editor/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/editor/public_api.ts new file mode 100644 index 000000000..3e6a4f812 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/editor/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/editor/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './editor.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/fieldset/fieldset.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/fieldset/fieldset.types.ts new file mode 100644 index 000000000..b3994772b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/fieldset/fieldset.types.ts @@ -0,0 +1,111 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/fieldset/fieldset.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom passthrough(pt) options. + * @see {@link Fieldset.pt} + * @group Interface + */ +export interface FieldsetPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the legend's DOM element. + */ + legend?: PassThroughOption; + /** + * Used to pass attributes to the toggle button's DOM element. + */ + toggleButton?: PassThroughOption; + /** + * Used to pass attributes to the toggle icon's DOM element. + */ + toggleIcon?: PassThroughOption; + /** + * Used to pass attributes to the legend label's DOM element. + */ + legendLabel?: PassThroughOption; + /** + * Used to pass attributes to the content container's DOM element. + */ + contentContainer?: PassThroughOption; + /** + * Used to pass attributes to the content wrapper DOM element. + */ + contentWrapper?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Fieldset component. + * @see {@link FieldsetPassThroughOptions} + * + * @template I Type of instance. + */ +export type FieldsetPassThrough = PassThrough>; + +/** + * Custom panel toggle event, emits after toggle. + * @see {@link Fieldset.onAfterToggle} + * @group Events + */ +export interface FieldsetAfterToggleEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Collapsed state of the panel. + */ + collapsed: boolean | undefined; +} + +/** + * Custom panel toggle event, emits before toggle. + * @see {@link Fieldset.onBeforeToggle} + * @extends {FieldsetAfterToggleEvent} + * @group Events + */ +export interface FieldsetBeforeToggleEvent extends FieldsetAfterToggleEvent {} + +/** + * Defines valid templates in Fieldset. + * @group Templates + */ +export interface FieldsetTemplates { + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom content template. + */ + content(): TemplateRef; + /** + * Custom expand icon template. + */ + expandicon(): TemplateRef; + /** + * Custom collapse icon template. + */ + collapseicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/fieldset/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/fieldset/public_api.ts new file mode 100644 index 000000000..96f318abd --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/fieldset/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/fieldset/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './fieldset.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/fileupload/fileupload.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/fileupload/fileupload.types.ts new file mode 100644 index 000000000..476676ce5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/fileupload/fileupload.types.ts @@ -0,0 +1,372 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/fileupload/fileupload.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { HttpEvent } from '@angular/common/http'; +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { BadgePassThrough } from '../badge/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; +import type { MessagePassThrough } from '../message/public_api'; +import type { ProgressBarPassThrough } from '../progressbar/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link FileUpload.pt} + * @group Interface + */ +export interface FileUploadPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the input's DOM element. + */ + input?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the choose button component. + */ + pcChooseButton?: ButtonPassThrough; + /** + * Used to pass attributes to the upload button component. + */ + pcUploadButton?: ButtonPassThrough; + /** + * Used to pass attributes to the cancel button component. + */ + pcCancelButton?: ButtonPassThrough; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the progress bar component. + */ + pcProgressBar?: ProgressBarPassThrough; + /** + * Used to pass attributes to the message component. + */ + pcMessage?: MessagePassThrough; + /** + * Used to pass attributes to the file list's DOM element. + */ + fileList?: PassThroughOption; + /** + * Used to pass attributes to the file's DOM element. + */ + file?: PassThroughOption; + /** + * Used to pass attributes to the file thumbnail's DOM element. + */ + fileThumbnail?: PassThroughOption; + /** + * Used to pass attributes to the file info's DOM element. + */ + fileInfo?: PassThroughOption; + /** + * Used to pass attributes to the file name's DOM element. + */ + fileName?: PassThroughOption; + /** + * Used to pass attributes to the file size's DOM element. + */ + fileSize?: PassThroughOption; + /** + * Used to pass attributes to the file badge component. + */ + pcFileBadge?: BadgePassThrough; + /** + * Used to pass attributes to the file actions's DOM element. + */ + fileActions?: PassThroughOption; + /** + * Used to pass attributes to the file remove button component. + */ + pcFileRemoveButton?: ButtonPassThrough; + /** + * Used to pass attributes to the basic content's DOM element. + */ + basicContent?: PassThroughOption; + /** + * Used to pass attributes to the empty's DOM element. + */ + empty?: PassThroughOption; +} + +/** + * Defines valid pass-through options in FileUpload. + * @see {@link FileUploadPassThroughOptions} + * + * @template I Type of instance. + */ +export type FileUploadPassThrough = PassThrough>; + +/** + * Upload event. + * @group Events + */ +export interface UploadEvent { + /** + * HTTP event. + */ + originalEvent: HttpEvent; +} +/** + * Remove uploaded file event. + * @group Events + */ +export interface RemoveUploadedFileEvent { + /** + * Removed file. + */ + file: any; + /** + * Uploaded files. + */ + files: any[]; +} +/** + * Form data event. + * @group Events + */ +export interface FormDataEvent { + /** + * FormData object. + */ + formData: FormData; +} + +/** + * An event indicating that the request was sent to the server. Useful when a request may be retried multiple times, to distinguish between retries on the final event stream. + * @see {@link FileUpload.onSend} + * @group Events + */ +export interface FileSendEvent extends UploadEvent, FormDataEvent {} +/** + * Callback to invoke before file upload is initialized. + * @see {@link FileUpload.onBeforeUpload} + * @group Events + */ +export interface FileBeforeUploadEvent extends FormDataEvent {} +/** + * Callback to invoke when file upload is complete. + * @see {@link FileUpload.onUpload} + * @group Events + */ +export interface FileUploadEvent extends UploadEvent { + /** + * Uploaded files. + */ + files: File[]; +} +/** + * Callback to invoke when a file is removed without uploading using clear button of a file. + * @see {@link FileUpload.onRemove} + * @group Events + */ +export interface FileRemoveEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Selected file + */ + file: File; +} +/** + * Callback to invoke when files are selected. + * @see {@link FileUpload.onSelect} + * @group Events + */ +export interface FileSelectEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Uploaded files. + */ + files: File[]; + /** + * All files to be uploaded. + */ + currentFiles: File[]; +} +/** + * Callback to invoke when files are being uploaded. + * @see {@link FileUpload.onProgress} + * @extends {UploadEvent} + * @group Events + */ +export interface FileProgressEvent extends UploadEvent { + /** + * Calculated progress value. + */ + progress: number; +} +/** + * Callback to invoke in custom upload mode to upload the files manually. + * @see {@link FileUpload.uploadHandler} + * @group Events + */ +export interface FileUploadHandlerEvent { + /** + * List of selected files. + */ + files: File[]; +} +/** + * Callback to invoke on upload error. + * @see {@link FileUpload.onError} + * @group Events + */ +export interface FileUploadErrorEvent { + /** + * List of selected files. + */ + error?: ErrorEvent; + /** + * List of selected files. + */ + files: File[]; +} + +/** + * Custom header template context. + * @group Interface + */ +export interface FileUploadHeaderTemplateContext { + /** + * File list. + */ + $implicit: File[]; + /** + * Uploaded files list. + */ + uploadedFiles: File[]; + /** + * Callback to invoke on choose button click. + */ + chooseCallback: () => void; + /** + * Callback to invoke on clear button click. + */ + clearCallback: () => void; + /** + * Callback to invoke on upload. + */ + uploadCallback: () => void; +} + +/** + * Custom content template context. + * @group Interface + */ +export interface FileUploadContentTemplateContext { + /** + * File list. + */ + $implicit: File[]; + /** + * Uploaded files list. + */ + uploadedFiles: File[]; + /** + * Upload progress value (0-100). + */ + progress: number; + /** + * Status messages about upload process. + */ + messages: any[]; + /** + * Callback to invoke on choose button click. + */ + chooseCallback: () => void; + /** + * Callback to invoke to remove a file from the list. + */ + removeFileCallback: (event: Event, index: number) => void; + /** + * Callback to invoke on clear button click. + */ + clearCallback: () => void; + /** + * Callback to invoke on remove uploaded file. + */ + removeUploadedFileCallback: (index: number) => void; +} + +/** + * Custom file label template context. + * @group Interface + */ +export interface FileUploadFileLabelTemplateContext { + /** + * File list. + */ + $implicit: File[]; +} + +/** + * Defines valid templates in FileUpload. + * @group Templates + */ +export interface FileUploadTemplates { + /** + * Custom file template. + */ + file(): TemplateRef; + /** + * Custom file label template. + * @param {Object} context - file label template context. + */ + filelabel(context: FileUploadFileLabelTemplateContext): TemplateRef; + /** + * Custom header template. + * @param {Object} context - header template context. + */ + header(context: FileUploadHeaderTemplateContext): TemplateRef; + /** + * Custom content template. + * @param {Object} context - content template context. + */ + content(context: FileUploadContentTemplateContext): TemplateRef; + /** + * Custom toolbar template. + */ + toolbar(): TemplateRef; + /** + * Custom choose icon template. + */ + chooseicon(): TemplateRef; + /** + * Custom upload icon template. + */ + uploadicon(): TemplateRef; + /** + * Custom cancel icon template. + */ + cancelicon(): TemplateRef; + /** + * Custom empty state template. + */ + empty(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/fileupload/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/fileupload/public_api.ts new file mode 100644 index 000000000..4c7df9ba9 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/fileupload/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/fileupload/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './fileupload.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/floatlabel/floatlabel.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/floatlabel/floatlabel.types.ts new file mode 100644 index 000000000..1279944c4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/floatlabel/floatlabel.types.ts @@ -0,0 +1,34 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/floatlabel/floatlabel.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link FloatLabel.pt} + * @group Interface + */ +export interface FloatLabelPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Custom passthrough attributes for each DOM elements + * @group Interface + */ +export type FloatLabelPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/floatlabel/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/floatlabel/public_api.ts new file mode 100644 index 000000000..82bd55f8c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/floatlabel/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/floatlabel/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './floatlabel.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/fluid/fluid.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/fluid/fluid.types.ts new file mode 100644 index 000000000..8ec2de43d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/fluid/fluid.types.ts @@ -0,0 +1,36 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/fluid/fluid.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Fluid.pt} + * @group Interface + */ +export interface FluidPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Fluid component. + * @see {@link FluidPassThroughOptions} + * + * @template I Type of instance. + */ +export type FluidPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/fluid/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/fluid/public_api.ts new file mode 100644 index 000000000..d5af26573 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/fluid/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/fluid/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './fluid.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/galleria/galleria.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/galleria/galleria.types.ts new file mode 100644 index 000000000..3de3b824f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/galleria/galleria.types.ts @@ -0,0 +1,264 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/galleria/galleria.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Galleria.pt} + * @group Interface + */ +export interface GalleriaPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the mask's DOM element. + */ + mask?: PassThroughOption; + /** + * Used to pass attributes to the close button's DOM element. + */ + closeButton?: PassThroughOption; + /** + * Used to pass attributes to the close icon's DOM element. + */ + closeIcon?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the items container's DOM element. + */ + itemsContainer?: PassThroughOption; + /** + * Used to pass attributes to the items's DOM element. + */ + items?: PassThroughOption; + /** + * Used to pass attributes to the previous button's DOM element. + */ + prevButton?: PassThroughOption; + /** + * Used to pass attributes to the previous icon's DOM element. + */ + prevIcon?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the next button's DOM element. + */ + nextButton?: PassThroughOption; + /** + * Used to pass attributes to the next icon's DOM element. + */ + nextIcon?: PassThroughOption; + /** + * Used to pass attributes to the caption's DOM element. + */ + caption?: PassThroughOption; + /** + * Used to pass attributes to the indicator list's DOM element. + */ + indicatorList?: PassThroughOption; + /** + * Used to pass attributes to the indicator's DOM element. + */ + indicator?: PassThroughOption; + /** + * Used to pass attributes to the indicator button's DOM element. + */ + indicatorButton?: PassThroughOption; + /** + * Used to pass attributes to the thumbnails's DOM element. + */ + thumbnails?: PassThroughOption; + /** + * Used to pass attributes to the thumbnail content's DOM element. + */ + thumbnailContent?: PassThroughOption; + /** + * Used to pass attributes to the thumbnail previous button's DOM element. + */ + thumbnailPrevButton?: PassThroughOption; + /** + * Used to pass attributes to the thumbnail previous icon's DOM element. + */ + thumbnailPrevIcon?: PassThroughOption; + /** + * Used to pass attributes to the thumbnails viewport's DOM element. + */ + thumbnailsViewport?: PassThroughOption; + /** + * Used to pass attributes to the thumbnail items's DOM element. + */ + thumbnailItems?: PassThroughOption; + /** + * Used to pass attributes to the thumbnail item's DOM element. + */ + thumbnailItem?: PassThroughOption; + /** + * Used to pass attributes to the thumbnail's DOM element. + */ + thumbnail?: PassThroughOption; + /** + * Used to pass attributes to the thumbnail next button's DOM element. + */ + thumbnailNextButton?: PassThroughOption; + /** + * Used to pass attributes to the thumbnail next icon's DOM element. + */ + thumbnailNextIcon?: PassThroughOption; + /** + * Used to pass attributes to the footer's DOM element. + */ + footer?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Galleria. + * @see {@link GalleriaPassThroughOptions} + * + * @template I Type of instance. + */ +export type GalleriaPassThrough = PassThrough>; + +/** + * Responsive options of the component. + * @group Interface + */ +export interface GalleriaResponsiveOptions { + /** + * Breakpoint for responsive mode. Exp; @media screen and (max-width: ${breakpoint}) {...} + */ + breakpoint: string; + /** + * The number of visible items on breakpoint. + */ + numVisible: number; +} + +/** + * Custom indicator template context. + * @group Interface + */ +export interface GalleriaIndicatorTemplateContext { + /** + * Index of the indicator. + */ + $implicit: number; +} + +/** + * Custom item template context. + * @group Interface + */ +export interface GalleriaItemTemplateContext { + /** + * Item instance. + */ + $implicit: T; +} + +/** + * Custom thumbnail template context. + * @group Interface + */ +export interface GalleriaThumbnailTemplateContext { + /** + * Item instance. + */ + $implicit: T; +} + +/** + * Custom caption template context. + * @group Interface + */ +export interface GalleriaCaptionTemplateContext { + /** + * Item instance. + */ + $implicit: T; +} + +/** + * Defines valid templates in Galleria. + * @group Templates + */ +export interface GalleriaTemplates { + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; + /** + * Custom indicator template. + * @param {Object} context - indicator context. + */ + indicator(context: GalleriaIndicatorTemplateContext): TemplateRef; + /** + * Custom close icon template. + */ + closeicon(): TemplateRef; + /** + * Custom item next icon template. + */ + itemnexticon(): TemplateRef; + /** + * Custom item previous icon template. + */ + itempreviousicon(): TemplateRef; + /** + * Custom previous thumbnail icon template. + */ + previousthumbnailicon(): TemplateRef; + /** + * Custom next thumbnail icon template. + */ + nextthumbnailicon(): TemplateRef; + /** + * Custom caption template. + * @param {Object} context - caption context. + */ + caption(context: GalleriaCaptionTemplateContext): TemplateRef; + /** + * Custom thumbnail template. + * @param {Object} context - thumbnail context. + */ + thumbnail(context: GalleriaThumbnailTemplateContext): TemplateRef; + /** + * Custom item template. + * @param {Object} context - item context. + */ + item(context: GalleriaItemTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/galleria/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/galleria/public_api.ts new file mode 100644 index 000000000..f81e386bb --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/galleria/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/galleria/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './galleria.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/iconfield/iconfield.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/iconfield/iconfield.types.ts new file mode 100644 index 000000000..813e3eb0c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/iconfield/iconfield.types.ts @@ -0,0 +1,34 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/iconfield/iconfield.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link IconField.pt} + * @group Interface + */ +export interface IconFieldPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Custom passthrough attributes for each DOM elements + * @group Interface + */ +export type IconFieldPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/iconfield/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/iconfield/public_api.ts new file mode 100644 index 000000000..622280786 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/iconfield/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/iconfield/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './iconfield.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/iftalabel/iftalabel.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/iftalabel/iftalabel.types.ts new file mode 100644 index 000000000..20cbc2bfb --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/iftalabel/iftalabel.types.ts @@ -0,0 +1,34 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/iftalabel/iftalabel.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link IftaLabel.pt} + * @group Interface + */ +export interface IftaLabelPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Custom passthrough attributes for each DOM elements + * @group Interface + */ +export type IftaLabelPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/iftalabel/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/iftalabel/public_api.ts new file mode 100644 index 000000000..10bd64a6b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/iftalabel/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/iftalabel/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './iftalabel.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/image/image.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/image/image.types.ts new file mode 100644 index 000000000..00fec16a2 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/image/image.types.ts @@ -0,0 +1,153 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/image/image.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Image.pt} + * @group Interface + */ +export interface ImagePassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the image's DOM element. + */ + image?: PassThroughOption; + /** + * Used to pass attributes to the preview mask button's DOM element. + */ + previewMask?: PassThroughOption; + /** + * Used to pass attributes to the preview icon's DOM element. + */ + previewIcon?: PassThroughOption; + /** + * Used to pass attributes to the mask's DOM element. + */ + mask?: PassThroughOption; + /** + * Used to pass attributes to the toolbar's DOM element. + */ + toolbar?: PassThroughOption; + /** + * Used to pass attributes to the rotate right button's DOM element. + */ + rotateRightButton?: PassThroughOption; + /** + * Used to pass attributes to the rotate left button's DOM element. + */ + rotateLeftButton?: PassThroughOption; + /** + * Used to pass attributes to the zoom out button's DOM element. + */ + zoomOutButton?: PassThroughOption; + /** + * Used to pass attributes to the zoom in button's DOM element. + */ + zoomInButton?: PassThroughOption; + /** + * Used to pass attributes to the close button's DOM element. + */ + closeButton?: PassThroughOption; + /** + * Used to pass attributes to the original/preview image's DOM element. + */ + original?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Image. + * @see {@link ImagePassThroughOptions} + * + * @template I Type of instance. + */ +export type ImagePassThrough = PassThrough>; + +/** + * Custom image template context. + * @group Interface + */ +export interface ImageImageTemplateContext { + /** + * Callback to invoke on image error. + */ + errorCallback: (event: Event) => void; +} + +/** + * Custom preview template context. + * @group Interface + */ +export interface ImagePreviewTemplateContext { + /** + * Style class of the preview image element. + */ + class: string; + /** + * Inline style of the preview image element. + */ + style: { [key: string]: any }; + /** + * Callback to invoke on preview image click. + */ + previewCallback: () => void; +} + +/** + * Defines valid templates in Image. + * @group Templates + */ +export interface ImageTemplates { + /** + * Custom indicator template. + */ + indicator(): TemplateRef; + /** + * Custom image template. + * @param {Object} context - image context. + */ + image(context: ImageImageTemplateContext): TemplateRef; + /** + * Custom preview template. + * @param {Object} context - preview context. + */ + preview(context: ImagePreviewTemplateContext): TemplateRef; + /** + * Custom rotate right icon template. + */ + rotaterighticon(): TemplateRef; + /** + * Custom rotate left icon template. + */ + rotatelefticon(): TemplateRef; + /** + * Custom zoom out icon template. + */ + zoomouticon(): TemplateRef; + /** + * Custom zoom in icon template. + */ + zoominicon(): TemplateRef; + /** + * Custom close icon template. + */ + closeicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/image/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/image/public_api.ts new file mode 100644 index 000000000..c84c6d97e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/image/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/image/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './image.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/imagecompare/imagecompare.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/imagecompare/imagecompare.types.ts new file mode 100644 index 000000000..d121300c4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/imagecompare/imagecompare.types.ts @@ -0,0 +1,52 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/imagecompare/imagecompare.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link ImageCompare.pt} + * @group Interface + */ +export interface ImageComparePassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the slider's DOM element. + */ + slider?: PassThroughOption; +} + +/** + * Defines valid pass-through options in ImageCompare. + * @see {@link ImageComparePassThroughOptions} + * + * @template I Type of instance. + */ +export type ImageComparePassThrough = PassThrough>; + +/** + * Defines valid templates in ImageCompare. + * @group Templates + */ +export interface ImageCompareTemplates { + /** + * Custom left side template. + */ + left(): TemplateRef; + /** + * Custom right side template. + */ + right(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/imagecompare/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/imagecompare/public_api.ts new file mode 100644 index 000000000..ef90be0b0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/imagecompare/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/imagecompare/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './imagecompare.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inplace/inplace.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inplace/inplace.types.ts new file mode 100644 index 000000000..2b61a820f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inplace/inplace.types.ts @@ -0,0 +1,82 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inplace/inplace.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Inplace.pt} + * @group Interface + */ +export interface InplacePassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the display's DOM element. + */ + display?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the Button component. + * @see {@link ButtonPassThrough} + */ + pcButton?: ButtonPassThrough; +} + +/** + * Defines valid pass-through options in Inplace. + * @see {@link InplacePassThroughOptions} + * + * @template I Type of instance. + */ +export type InplacePassThrough = PassThrough>; + +/** + * Custom content template context. + * @group Interface + */ +export interface InplaceContentTemplateContext { + /** + * Callback to invoke to close the inplace content. + */ + closeCallback: (event: MouseEvent) => void; +} + +/** + * Defines valid templates in Inplace. + * @group Templates + */ +export interface InplaceTemplates { + /** + * Custom display template. + */ + display(): TemplateRef; + /** + * Custom content template. + * @param {Object} context - content context. + */ + content(context: InplaceContentTemplateContext): TemplateRef; + /** + * Custom close icon template. + */ + closeicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inplace/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inplace/public_api.ts new file mode 100644 index 000000000..49601d4a8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inplace/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inplace/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inplace.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroup/inputgroup.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroup/inputgroup.types.ts new file mode 100644 index 000000000..70557e754 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroup/inputgroup.types.ts @@ -0,0 +1,36 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputgroup/inputgroup.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link InputGroup.pt} + * @group Interface + */ +export interface InputGroupPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in InputGroup. + * @see {@link InputGroupPassThroughOptions} + * + * @template I Type of instance. + */ +export type InputGroupPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroup/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroup/public_api.ts new file mode 100644 index 000000000..f2337c5be --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroup/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputgroup/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputgroup.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroupaddon/inputgroupaddon.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroupaddon/inputgroupaddon.types.ts new file mode 100644 index 000000000..f98a29301 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroupaddon/inputgroupaddon.types.ts @@ -0,0 +1,36 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputgroupaddon/inputgroupaddon.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link InputGroupAddon.pt} + * @group Interface + */ +export interface InputGroupAddonPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in InputGroupAddon. + * @see {@link InputGroupAddonPassThroughOptions} + * + * @template I Type of instance. + */ +export type InputGroupAddonPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroupaddon/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroupaddon/public_api.ts new file mode 100644 index 000000000..f866dca2f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputgroupaddon/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputgroupaddon/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputgroupaddon.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputicon/inputicon.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputicon/inputicon.types.ts new file mode 100644 index 000000000..96f107949 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputicon/inputicon.types.ts @@ -0,0 +1,34 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputicon/inputicon.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link InputIcon.pt} + * @group Interface + */ +export interface InputIconPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Custom passthrough attributes for each DOM elements + * @group Interface + */ +export type InputIconPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputicon/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputicon/public_api.ts new file mode 100644 index 000000000..fd153b0ec --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputicon/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputicon/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputicon.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputmask/inputmask.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputmask/inputmask.types.ts new file mode 100644 index 000000000..baa032b71 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputmask/inputmask.types.ts @@ -0,0 +1,62 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputmask/inputmask.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { InputTextPassThrough } from '../inputtext/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link InputMask.pt} + * @group Interface + */ +export interface InputMaskPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the InputText component. + */ + pcInputText?: InputTextPassThrough; + /** + * Used to pass attributes to the clear icon's DOM element. + */ + clearIcon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in InputMask. + * @see {@link InputMaskPassThroughOptions} + * + * @template I Type of instance. + */ +export type InputMaskPassThrough = PassThrough>; + +/** + * Caret positions. + * @group Types + */ +export type Caret = { begin: number; end: number }; +/** + * Defines valid templates in InputMask. + * @group Templates + */ +export interface InputMaskTemplates { + /** + * Custom clear icon template. + */ + clearicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputmask/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputmask/public_api.ts new file mode 100644 index 000000000..35167015e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputmask/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputmask/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputmask.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputnumber/inputnumber.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputnumber/inputnumber.types.ts new file mode 100644 index 000000000..236bcf072 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputnumber/inputnumber.types.ts @@ -0,0 +1,105 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputnumber/inputnumber.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { InputTextPassThrough } from '../inputtext/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link InputNumber.pt} + * @group Interface + */ +export interface InputNumberPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the InputText component. + */ + pcInputText?: InputTextPassThrough; + /** + * Used to pass attributes to the clear icon's DOM element. + */ + clearIcon?: PassThroughOption; + /** + * Used to pass attributes to the button group's DOM element. + */ + buttonGroup?: PassThroughOption; + /** + * Used to pass attributes to the increment button's DOM element. + */ + incrementButton?: PassThroughOption; + /** + * Used to pass attributes to the decrement button's DOM element. + */ + decrementButton?: PassThroughOption; + /** + * Used to pass attributes to the increment button icon's DOM element. + */ + incrementButtonIcon?: PassThroughOption; + /** + * Used to pass attributes to the decrement button icon's DOM element. + */ + decrementButtonIcon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in InputNumber component. + * @see {@link InputNumberPassThroughOptions} + * + * @template I Type of instance. + */ +export type InputNumberPassThrough = PassThrough>; + +/** + * Custom InputNumber input event. + * @see {@link onInput} + * @group Interface + */ +export interface InputNumberInputEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Input value. + */ + value: number | null; + /** + * Formatted value. + */ + formattedValue: string; +} + +/** + * Defines valid templates in InputNumber. + * @group Templates + */ +export interface InputNumberTemplates { + /** + * Custom clear icon template. + */ + clearicon(): TemplateRef; + /** + * Custom increment button icon template. + */ + incrementbuttonicon(): TemplateRef; + /** + * Custom decrement button icon template. + */ + decrementbuttonicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputnumber/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputnumber/public_api.ts new file mode 100644 index 000000000..72454fcb0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputnumber/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputnumber/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputnumber.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputotp/inputotp.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputotp/inputotp.types.ts new file mode 100644 index 000000000..8e86dd302 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputotp/inputotp.types.ts @@ -0,0 +1,113 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputotp/inputotp.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { InputTextPassThrough } from '../inputtext/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link InputOtp.pt} + * @group Interface + */ +export interface InputOtpPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the InputText component. + */ + pcInputText?: InputTextPassThrough; +} + +/** + * Custom passthrough attributes for each DOM elements + * @group Interface + */ +export type InputOtpPassThrough = PassThrough>; + +/** + * Input change event. + * @group Events + */ +export interface InputOtpChangeEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Updated value. + */ + value: any; +} + +/** + * Context interface for the input template events. + * @group Interface + */ +export interface InputOtpTemplateEvents { + /** + * Input event handler. + */ + input: (event: Event, index: number) => void; + /** + * Keydown event handler. + */ + keydown: (event: Event) => void; + /** + * Focus event handler. + */ + focus: (event: Event) => void; + /** + * Blur event handler. + */ + blur: (event: Event) => void; + /** + * Paste event handler. + */ + paste: (event: Event) => void; +} + +/** + * Custom input template context. + * @group Interface + */ +export interface InputOtpInputTemplateContext { + /** + * Token value. + */ + $implicit: number | string; + /** + * Browser events of the template. + */ + events: InputOtpTemplateEvents; + /** + * Index of the token. + */ + index: number; +} + +/** + * Defines valid templates in InputOtp. + * @group Templates + */ +export interface InputOtpTemplates { + /** + * Custom input template. + * @param {Object} context - input context. + */ + input(context: InputOtpInputTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputotp/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputotp/public_api.ts new file mode 100644 index 000000000..e461e6776 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputotp/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputotp/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputotp.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputtext/inputtext.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputtext/inputtext.types.ts new file mode 100644 index 000000000..9c31ea7d7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputtext/inputtext.types.ts @@ -0,0 +1,32 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputtext/inputtext.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link InputTextPassThrough} + * @group Interface + */ +export interface InputTextPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in InputText. + * @see {@link InputTextPassThroughOptions} + * + * @template I Type of instance. + */ +export type InputTextPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/inputtext/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputtext/public_api.ts new file mode 100644 index 000000000..82ee409db --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/inputtext/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/inputtext/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './inputtext.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/knob/knob.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/knob/knob.types.ts new file mode 100644 index 000000000..f8b42a22c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/knob/knob.types.ts @@ -0,0 +1,48 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/knob/knob.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Knob.pt} + * @group Interface + */ +export interface KnobPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the SVG's DOM element. + */ + svg?: PassThroughOption; + /** + * Used to pass attributes to the range's DOM element. + */ + range?: PassThroughOption; + /** + * Used to pass attributes to the value's DOM element. + */ + value?: PassThroughOption; + /** + * Used to pass attributes to the text's DOM element. + */ + text?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Knob component. + * @see {@link KnobPassThroughOptions} + * + * @template I Type of instance. + */ +export type KnobPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/knob/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/knob/public_api.ts new file mode 100644 index 000000000..e08437630 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/knob/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/knob/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './knob.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/listbox/listbox.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/listbox/listbox.types.ts new file mode 100644 index 000000000..817eb93fb --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/listbox/listbox.types.ts @@ -0,0 +1,375 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/listbox/listbox.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption, ScrollerOptions } from '../../api/public_api'; +/** + * Defines valid pass-through options in ListBox component. + * @template I Type of instance. + * + * @see {@link Listbox.pt} + * @group Interface + */ +export interface ListBoxPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the Checkbox component. + */ + pcCheckbox?: any; + /** + * Used to pass attributes to the IconField component. + */ + pcFilterContainer?: any; + /** + * Used to pass attributes to the filter input's DOM element. + */ + pcFilter?: any; + /** + * Used to pass attributes to the InputIcon component. + */ + pcFilterIconContainer?: any; + /** + * Used to pass attributes to the filter icon's DOM element. + */ + filterIcon?: PassThroughOption; + /** + * Used to pass attributes to the hidden filter result's DOM element. + */ + hiddenFilterResult?: PassThroughOption; + /** + * Used to pass attributes to the list container's DOM element. + */ + listContainer?: PassThroughOption; + /** + * Used to pass attributes to the VirtualScroller component. + */ + virtualScroller?: any; + /** + * Used to pass attributes to the list's DOM element. + */ + list?: PassThroughOption; + /** + * Used to pass attributes to the option group's DOM element. + */ + optionGroup?: PassThroughOption; + /** + * Used to pass attributes to the option's DOM element. + */ + option?: PassThroughOption; + /** + * Used to pass attributes to the option check icon's DOM element. + */ + optionCheckIcon?: PassThroughOption; + /** + * Used to pass attributes to the option blank icon's DOM element. + */ + optionBlankIcon?: PassThroughOption; + /** + * Used to pass attributes to the empty message's DOM element. + */ + emptyMessage?: PassThroughOption; + /** + * Used to pass attributes to the hidden empty message's DOM element. + */ + hiddenEmptyMessage?: PassThroughOption; + /** + * Used to pass attributes to the hidden selected message's DOM element. + */ + hiddenSelectedMessage?: PassThroughOption; + /** + * Used to pass attributes to the first hidden focusable element. + */ + hiddenFirstFocusableEl?: PassThroughOption; + /** + * Used to pass attributes to the last hidden focusable element. + */ + hiddenLastFocusableEl?: PassThroughOption; +} + +/** + * Defines valid pass-through options in ListBox component. + * @see {@link ListBoxPassThroughOptions} + * + * @template I Type of instance. + */ +export type ListBoxPassThrough = PassThrough>; + +/** + * Filter options of listbox. + * @group Interface + */ +export interface ListboxFilterOptions { + /** + * Callback to filter options. + * @param {any} value - Filter value. + */ + filter?: (value?: any) => void; + /** + * Callback to reset filter. + */ + reset?: () => void; +} +/** + * Custom change event. + * @group Events + */ +export interface ListboxChangeEvent { + /** + * Original event + */ + originalEvent: Event; + /** + * Selected option value + */ + value: any; +} +/** + * Custom change event. + * @group Events + */ +export interface ListboxSelectAllChangeEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Boolean value indicates whether all data is selected. + */ + checked: boolean; +} +/** + * Custom filter event. + * @group Events + */ +export interface ListboxFilterEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Filter value. + */ + filter: any; +} +/** + * Custom change event. + * @group Events + */ +export interface ListboxClickEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Value of the component. + */ + value: any; + /** + * Selected option + */ + option?: any; +} +/** + * Custom change event. + * @group Events + */ +export interface ListboxDoubleClickEvent extends ListboxClickEvent {} +/** + * Custom item template context. + * @group Interface + */ +export interface ListboxItemTemplateContext { + /** + * Data of the option. + */ + $implicit: T; + /** + * Index of the option. + */ + index: number; + /** + * Whether the option is selected. + */ + selected: boolean; + /** + * Whether the option is disabled. + */ + disabled: boolean; +} + +/** + * Custom group template context. + * @group Interface + */ +export interface ListboxGroupTemplateContext { + /** + * Group option data. + */ + $implicit: T; +} + +/** + * Custom header template context. + * @group Interface + */ +export interface ListboxHeaderTemplateContext { + /** + * Current model value. + */ + $implicit: T; + /** + * Visible options. + */ + options: any[]; +} + +/** + * Custom filter template context. + * @group Interface + */ +export interface ListboxFilterTemplateContext { + /** + * Filter options. + */ + options: ListboxFilterOptions; +} + +/** + * Custom footer template context. + * @group Interface + */ +export interface ListboxFooterTemplateContext { + /** + * Current model value. + */ + $implicit: T; + /** + * Visible options. + */ + options: any[]; +} + +/** + * Custom check icon template context. + * @group Interface + */ +export interface ListboxCheckIconTemplateContext { + /** + * Whether the item is selected. + */ + $implicit: boolean; +} + +/** + * Custom checkmark template context. + * Note: Uses 'implicit' property instead of '$implicit'. + * @group Interface + */ +export interface ListboxCheckmarkTemplateContext { + /** + * Whether the item is selected. + */ + implicit: boolean; +} + +/** + * Custom loader template context. + * @group Interface + */ +export interface ListboxLoaderTemplateContext { + /** + * Scroller options. + */ + options: ScrollerOptions; +} + +/** + * Defines valid templates in Listbox. + * @group Templates + */ +export interface ListboxTemplates { + /** + * Custom item template. + * @param {Object} context - item data. + */ + item(context: ListboxItemTemplateContext): TemplateRef; + /** + * Custom group template. + * @param {Object} context - group data. + */ + group(context: ListboxGroupTemplateContext): TemplateRef; + /** + * Custom header template. + * @param {Object} context - header context. + */ + header(context: ListboxHeaderTemplateContext): TemplateRef; + /** + * Custom filter template. + * @param {Object} context - filter options. + */ + filter(context: ListboxFilterTemplateContext): TemplateRef; + /** + * Custom footer template. + * @param {Object} context - footer context. + */ + footer(context: ListboxFooterTemplateContext): TemplateRef; + /** + * Custom empty template. + */ + empty(): TemplateRef; + /** + * Custom empty filter template. + */ + emptyfilter(): TemplateRef; + /** + * Custom filter icon template. + */ + filtericon(): TemplateRef; + /** + * Custom check icon template. + * @param {Object} context - check icon context. + */ + checkicon(context: ListboxCheckIconTemplateContext): TemplateRef; + /** + * Custom checkmark template. + * @param {Object} context - checkmark context. + */ + checkmark(context: ListboxCheckmarkTemplateContext): TemplateRef; + /** + * Custom loader template for virtual scroll. + * @param {Object} context - loader context. + */ + loader(context: ListboxLoaderTemplateContext): TemplateRef; +} + +/** + * Defines context options for ListBox passthrough. + * @group Interface + */ +export interface ListBoxContext { + /** + * Whether the option is selected. + */ + selected?: boolean; + /** + * Whether the option is focused. + */ + focused?: boolean; + /** + * Whether the option is disabled. + */ + disabled?: boolean; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/listbox/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/listbox/public_api.ts new file mode 100644 index 000000000..1d8b0e7f8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/listbox/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/listbox/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './listbox.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/megamenu/megamenu.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/megamenu/megamenu.types.ts new file mode 100644 index 000000000..188546848 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/megamenu/megamenu.types.ts @@ -0,0 +1,148 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/megamenu/megamenu.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MenuItem, PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link MegaMenu.pt} + * @group Interface + */ +export interface MegaMenuPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the start's DOM element. + */ + start?: PassThroughOption; + /** + * Used to pass attributes to the button's DOM element. + */ + button?: PassThroughOption; + /** + * Used to pass attributes to the button icon's DOM element. + */ + buttonIcon?: PassThroughOption; + /** + * Used to pass attributes to the root list's DOM element. + */ + rootList?: PassThroughOption; + /** + * Used to pass attributes to the submenu label's DOM element. + */ + submenuLabel?: PassThroughOption; + /** + * Used to pass attributes to the separator's DOM element. + */ + separator?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the item content's DOM element. + */ + itemContent?: PassThroughOption; + /** + * Used to pass attributes to the item link's DOM element. + */ + itemLink?: PassThroughOption; + /** + * Used to pass attributes to the item icon's DOM element. + */ + itemIcon?: PassThroughOption; + /** + * Used to pass attributes to the item label's DOM element. + */ + itemLabel?: PassThroughOption; + /** + * Used to pass attributes to the submenu icon's DOM element. + */ + submenuIcon?: PassThroughOption; + /** + * Used to pass attributes to the overlay's DOM element. + */ + overlay?: PassThroughOption; + /** + * Used to pass attributes to the grid's DOM element. + */ + grid?: PassThroughOption; + /** + * Used to pass attributes to the column's DOM element. + */ + column?: PassThroughOption; + /** + * Used to pass attributes to the submenu's DOM element. + */ + submenu?: PassThroughOption; + /** + * Used to pass attributes to the end's DOM element. + */ + end?: PassThroughOption; +} + +/** + * Defines valid pass-through options in MegaMenu. + * @see {@link MegaMenuPassThroughOptions} + * + * @template I Type of instance. + */ +export type MegaMenuPassThrough = PassThrough>; + +/** + * Custom item template context. + * @group Interface + */ +export interface MegaMenuItemTemplateContext { + /** + * Menu item instance. + */ + $implicit: MenuItem; +} + +/** + * Defines valid templates in MegaMenu. + * @group Templates + */ +export interface MegaMenuTemplates { + /** + * Custom item template. + * @param {Object} context - item context. + */ + item(context: MegaMenuItemTemplateContext): TemplateRef; + /** + * Custom template of start. + */ + start(): TemplateRef; + /** + * Custom template of end. + */ + end(): TemplateRef; + /** + * Custom template of submenu icon. + */ + submenuicon(): TemplateRef; + /** + * Custom menu button template on responsive mode. + */ + button(): TemplateRef; + /** + * Custom menu button icon template on responsive mode. + */ + buttonicon(): TemplateRef; + /** + * Custom menu icon template. + */ + menuicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/megamenu/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/megamenu/public_api.ts new file mode 100644 index 000000000..2c0952329 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/megamenu/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/megamenu/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './megamenu.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/menu/menu.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/menu/menu.types.ts new file mode 100644 index 000000000..406035080 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/menu/menu.types.ts @@ -0,0 +1,125 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/menu/menu.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { MenuItem, PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Menu.pt} + * @group Interface + */ +export interface MenuPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the start's DOM element. + */ + start?: PassThroughOption; + /** + * Used to pass attributes to the list's DOM element. + */ + list?: PassThroughOption; + /** + * Used to pass attributes to the submenu label's DOM element. + */ + submenuLabel?: PassThroughOption; + /** + * Used to pass attributes to the separator's DOM element. + */ + separator?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the item content's DOM element. + */ + itemContent?: PassThroughOption; + /** + * Used to pass attributes to the item link's DOM element. + */ + itemLink?: PassThroughOption; + /** + * Used to pass attributes to the item icon's DOM element. + */ + itemIcon?: PassThroughOption; + /** + * Used to pass attributes to the item label's DOM element. + */ + itemLabel?: PassThroughOption; + /** + * Used to pass attributes to the end's DOM element. + */ + end?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Menu. + * @see {@link MenuPassThroughOptions} + * + * @template I Type of instance. + */ +export type MenuPassThrough = PassThrough>; + +/** + * Custom item template context. + * @group Interface + */ +export interface MenuItemTemplateContext { + /** + * Menu item instance. + */ + $implicit: MenuItem; +} + +/** + * Custom submenu header template context. + * @group Interface + */ +export interface MenuSubmenuHeaderTemplateContext { + /** + * Submenu item instance. + */ + $implicit: MenuItem; +} + +/** + * Defines valid templates in Menu. + * @group Templates + */ +export interface MenuTemplates { + /** + * Custom template of start. + */ + start(): TemplateRef; + /** + * Custom template of end. + */ + end(): TemplateRef; + /** + * Custom template of item. + * @param {Object} context - item context. + */ + item(context: MenuItemTemplateContext): TemplateRef; + /** + * Custom template of submenu header. + * @param {Object} context - submenu header context. + */ + submenuheader(context: MenuSubmenuHeaderTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/menu/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/menu/public_api.ts new file mode 100644 index 000000000..8951aa590 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/menu/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/menu/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './menu.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/menubar/menubar.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/menubar/menubar.types.ts new file mode 100644 index 000000000..99ad07cc1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/menubar/menubar.types.ts @@ -0,0 +1,135 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/menubar/menubar.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import { MenuItem } from '../../api/public_api'; +import type { BadgePassThrough } from '../badge/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Menubar.pt} + * @group Interface + */ +export interface MenubarPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the root list's DOM element. + */ + rootList?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the item content's DOM element. + */ + itemContent?: PassThroughOption; + /** + * Used to pass attributes to the item link's DOM element. + */ + itemLink?: PassThroughOption; + /** + * Used to pass attributes to the item icon's DOM element. + */ + itemIcon?: PassThroughOption; + /** + * Used to pass attributes to the item label's DOM element. + */ + itemLabel?: PassThroughOption; + /** + * Used to pass attributes to the submenu icon's DOM element. + */ + submenuIcon?: PassThroughOption; + /** + * Used to pass attributes to the separator's DOM element. + */ + separator?: PassThroughOption; + /** + * Used to pass attributes to the mobile menu button's DOM element. + */ + button?: PassThroughOption; + /** + * Used to pass attributes to the mobile menu button icon's DOM element. + */ + buttonIcon?: PassThroughOption; + /** + * Used to pass attributes to the submenu's DOM element. + */ + submenu?: PassThroughOption; + /** + * Used to pass attributes to the start of the component. + */ + start?: PassThroughOption; + /** + * Used to pass attributes to the end of the component. + */ + end?: PassThroughOption; + /** + * Used to pass attributes to Badge component. + * @see {@link BadgePassThrough} + */ + pcBadge?: BadgePassThrough; +} + +/** + * Defines valid pass-through options in Menubar. + * @see {@link MenubarPassThroughOptions} + * + * @template I Type of instance. + */ +export type MenubarPassThrough = PassThrough>; + +/** + * Custom item template context. + * @group Interface + */ +export interface MenubarItemTemplateContext { + /** + * Menu item instance. + */ + $implicit: MenuItem; + /** + * Whether the item is at the root level. + */ + root: boolean; +} + +/** + * Defines valid templates in Menubar. + * @group Templates + */ +export interface MenubarTemplates { + /** + * Custom item template. + * @param {Object} context - item context. + */ + item(context: MenubarItemTemplateContext): TemplateRef; + /** + * Custom template of start. + */ + start(): TemplateRef; + /** + * Custom template of end. + */ + end(): TemplateRef; + /** + * Custom template of menu icon. + */ + menuicon(): TemplateRef; + /** + * Custom template of submenu icon. + */ + submenuicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/menubar/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/menubar/public_api.ts new file mode 100644 index 000000000..8bd7565b5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/menubar/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/menubar/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './menubar.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/message/message.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/message/message.types.ts new file mode 100644 index 000000000..3415cccd0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/message/message.types.ts @@ -0,0 +1,97 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/message/message.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Message.pt} + * @group Interface + */ +export interface MessagePassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + contentWrapper?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; + /** + * Used to pass attributes to the text's DOM element. + */ + text?: PassThroughOption; + /** + * Used to pass attributes to the close button's DOM element. + */ + closeButton?: PassThroughOption; + /** + * Used to pass attributes to the close icon's DOM element. + */ + closeIcon?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Message. + * @see {@link MessagePassThroughOptions} + * + * @template I Type of instance. + */ +export type MessagePassThrough = PassThrough>; + +/** + * Custom container template context. + * @group Interface + */ +export interface MessageContainerTemplateContext { + /** + * Callback to close the message. + */ + closeCallback: (event: Event) => void; +} + +/** + * Defines valid templates in Message. + * @group Templates + */ +export interface MessageTemplates { + /** + * Custom container template. + * @param {Object} context - container context. + */ + container(context: MessageContainerTemplateContext): TemplateRef; + /** + * Custom icon template. + */ + icon(): TemplateRef; + /** + * Custom close icon template. + */ + closeicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/message/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/message/public_api.ts new file mode 100644 index 000000000..8fe7cdfdd --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/message/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/message/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './message.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/metergroup/metergroup.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/metergroup/metergroup.types.ts new file mode 100644 index 000000000..08d9a21a1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/metergroup/metergroup.types.ts @@ -0,0 +1,188 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/metergroup/metergroup.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link MeterGroup.pt} + * @group Interface + */ +export interface MeterGroupPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the meters' DOM element. + */ + meters?: PassThroughOption; + /** + * Used to pass attributes to the meter's DOM element. + */ + meter?: PassThroughOption; + /** + * Used to pass attributes to the label list's DOM element. + */ + labelList?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; + /** + * Used to pass attributes to the label icon's DOM element. + */ + labelIcon?: PassThroughOption; + /** + * Used to pass attributes to the label marker's DOM element. + */ + labelMarker?: PassThroughOption; + /** + * Used to pass attributes to the label text's DOM element. + */ + labelText?: PassThroughOption; +} + +/** + * Defines valid pass-through options in MeterGroup. + * @see {@link MeterGroupPassThroughOptions} + * + * @template I Type of instance. + */ +export type MeterGroupPassThrough = PassThrough>; + +/** + * Custom label template context. + * @group Interface + */ +export interface MeterGroupLabelTemplateContext { + /** + * Array of meter items. + */ + $implicit: MeterItem[]; + /** + * Total percent of the metergroup items. + */ + totalPercent: number; + /** + * Array of sequential sum of values of metergroup items. + */ + percentages: number[]; +} + +/** + * Custom meter template context. + * @group Interface + */ +export interface MeterGroupMeterTemplateContext { + /** + * Current meter item. + */ + $implicit: MeterItem; + /** + * Current index of the meter item. + */ + index: number; + /** + * Current orientation of the component. + */ + orientation: 'horizontal' | 'vertical'; + /** + * Style class of the meter item. + */ + class: string; + /** + * Size (width/height percentage) of the meter item. + */ + size: string; + /** + * Total percent of all metergroup items. + */ + totalPercent: number; + /** + * DataP attributes. + */ + dataP: string; +} + +/** + * Custom icon template context. + * @group Interface + */ +export interface MeterGroupIconTemplateContext { + /** + * Current meter item. + */ + $implicit: MeterItem; + /** + * Icon class of the meter item. + */ + icon: string | undefined; +} + +/** + * Defines valid templates in MeterGroup. + * @group Templates + */ +export interface MeterGroupTemplates { + /** + * Custom label template. + * @param {Object} context - label context. + */ + label(context: MeterGroupLabelTemplateContext): TemplateRef; + /** + * Custom meter item template. + * @param {Object} context - meter context. + */ + meter(context: MeterGroupMeterTemplateContext): TemplateRef; + /** + * Custom start template. + * @param {Object} context - start context. + */ + start(context: MeterGroupLabelTemplateContext): TemplateRef; + /** + * Custom end template. + * @param {Object} context - end context. + */ + end(context: MeterGroupLabelTemplateContext): TemplateRef; + /** + * Custom icon template. + * @param {Object} context - icon context. + */ + icon(context: MeterGroupIconTemplateContext): TemplateRef; +} +/** + * Represents a meter item configuration. + * @group Interface + */ +export interface MeterItem { + /** + * Label of the meter item. + */ + label?: string; + /** + * Value of the meter item. + */ + value?: number; + /** + * Color of the meter item. + */ + color?: string; + /** + * Icon of the meter item. + */ + icon?: string; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/metergroup/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/metergroup/public_api.ts new file mode 100644 index 000000000..61c1eebcc --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/metergroup/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/metergroup/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './metergroup.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/motion/motion.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/motion/motion.types.ts new file mode 100644 index 000000000..ea673781f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/motion/motion.types.ts @@ -0,0 +1,35 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/motion/motion.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom passthrough(pt) options. + * @see {@link Motion.pt} + * @group Interface + */ + +export interface MotionPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Motion component. + * @see {@link MotionPassThroughOptions} + * + * @template I Type of instance. + */ +export type MotionPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/motion/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/motion/public_api.ts new file mode 100644 index 000000000..bc0d46719 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/motion/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/motion/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './motion.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/orderlist/orderlist.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/orderlist/orderlist.types.ts new file mode 100644 index 000000000..bbf734196 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/orderlist/orderlist.types.ts @@ -0,0 +1,187 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/orderlist/orderlist.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; +import type { ListBoxPassThrough } from '../listbox/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link OrderList.pt} + * @group Interface + */ +export interface OrderListPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the controls container's DOM element. + */ + controls?: PassThroughOption; + /** + * Used to pass attributes to the move up button's DOM element. + */ + pcMoveUpButton?: ButtonPassThrough; + /** + * Used to pass attributes to the move top button's DOM element. + */ + pcMoveTopButton?: ButtonPassThrough; + /** + * Used to pass attributes to the move down button's DOM element. + */ + pcMoveDownButton?: ButtonPassThrough; + /** + * Used to pass attributes to the move bottom button's DOM element. + */ + pcMoveBottomButton?: ButtonPassThrough; + /** + * Used to pass attributes to the Listbox component. + */ + pcListbox?: ListBoxPassThrough; +} + +/** + * Defines valid pass-through options in OrderList. + * @see {@link OrderListPassThroughOptions} + * + * @template I Type of instance. + */ +export type OrderListPassThrough = PassThrough>; + +/** + * Callbacks to invoke on filter. + * @group Interface + */ +export interface OrderListFilterOptions { + filter?: (value?: any) => void; + reset?: () => void; +} + +/** + * Custom change event. + * @see {@link OrderList.selectionChange} + * @group Events + */ +export interface OrderListSelectionChangeEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Current selected values. + */ + value: any[]; +} + +/** + * Custom change event. + * @see {@link OrderList.selectionChange} + * @group Events + */ +export interface OrderListFilterEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Filtered options. + */ + value: any[]; +} + +/** + * Custom item template context. + * @group Interface + */ +export interface OrderListItemTemplateContext { + /** + * Item instance. + */ + $implicit: any; + /** + * Whether the item is selected. + */ + selected: boolean; + /** + * Index of the item. + */ + index: number; +} + +/** + * Custom filter template context. + * @group Interface + */ +export interface OrderListFilterTemplateContext { + /** + * Filter options. + */ + options: OrderListFilterOptions; +} + +/** + * Defines valid templates in OrderList. + * @group Templates + */ +export interface OrderListTemplates { + /** + * Custom item template. + * @param {OrderListItemTemplateContext} context - item context. + */ + item(context: OrderListItemTemplateContext): TemplateRef; + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom filter template. + * @param {OrderListFilterTemplateContext} context - filter context. + */ + filter(context: OrderListFilterTemplateContext): TemplateRef; + /** + * Custom empty filter template. + */ + emptyfilter(): TemplateRef; + /** + * Custom empty template. + */ + empty(): TemplateRef; + /** + * Custom clear icon template. + */ + clearicon(): TemplateRef; + /** + * Custom filter icon template. + */ + filtericon(): TemplateRef; + /** + * Custom move up icon template. + */ + moveupicon(): TemplateRef; + /** + * Custom move top icon template. + */ + movetopicon(): TemplateRef; + /** + * Custom move down icon template. + */ + movedownicon(): TemplateRef; + /** + * Custom move bottom icon template. + */ + movebottomicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/orderlist/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/orderlist/public_api.ts new file mode 100644 index 000000000..32a4c369b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/orderlist/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/orderlist/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './orderlist.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/organizationchart/organizationchart.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/organizationchart/organizationchart.types.ts new file mode 100644 index 000000000..322be731b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/organizationchart/organizationchart.types.ts @@ -0,0 +1,143 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/organizationchart/organizationchart.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import { TreeNode } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link OrganizationChart.pt} + * @group Interface + */ +export interface OrganizationChartPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the table's DOM element. + */ + table?: PassThroughOption; + /** + * Used to pass attributes to the body's DOM element. + */ + body?: PassThroughOption; + /** + * Used to pass attributes to the row's DOM element. + */ + row?: PassThroughOption; + /** + * Used to pass attributes to the cell's DOM element. + */ + cell?: PassThroughOption; + /** + * Used to pass attributes to the node's DOM element. + */ + node?: PassThroughOption; + /** + * Used to pass attributes to the node toggle button's DOM element. + */ + nodeToggleButton?: PassThroughOption; + /** + * Used to pass attributes to the node toggle button icon's DOM element. + */ + nodeToggleButtonIcon?: PassThroughOption; + /** + * Used to pass attributes to the connectors' DOM element. + */ + connectors?: PassThroughOption; + /** + * Used to pass attributes to the line cell's DOM element. + */ + lineCell?: PassThroughOption; + /** + * Used to pass attributes to the connector down's DOM element. + */ + connectorDown?: PassThroughOption; + /** + * Used to pass attributes to the connector left's DOM element. + */ + connectorLeft?: PassThroughOption; + /** + * Used to pass attributes to the connector right's DOM element. + */ + connectorRight?: PassThroughOption; + /** + * Used to pass attributes to the node children's DOM element. + */ + nodeChildren?: PassThroughOption; + /** + * Used to pass attributes to the node cell's DOM element. + */ + nodeCell?: PassThroughOption; +} + +/** + * Defines valid pass-through options in OrganizationChart. + * @see {@link OrganizationChartPassThroughOptions} + * + * @template I Type of instance. + */ +export type OrganizationChartPassThrough = PassThrough>; + +/** + * Custom node select event. + * @see {@link OrganizationChart.onNodeSelect} + * @group Events + */ +export interface OrganizationChartNodeSelectEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Node instance. + */ + node: TreeNode; +} +/** + * Custom node unselect event. + * @see {@link OrganizationChart.onNodeUnSelect} + * @extends {OrganizationChartNodeSelectEvent} + * @group Events + */ +export interface OrganizationChartNodeUnSelectEvent extends OrganizationChartNodeSelectEvent {} +/** + * Custom node expand event. + * @see {@link OrganizationChart.onNodeExpand} + * @extends {OrganizationChartNodeSelectEvent} + * @group Events + */ +export interface OrganizationChartNodeExpandEvent extends OrganizationChartNodeSelectEvent {} +/** + * Custom node collapse event. + * @see {@link OrganizationChart.onNodeCollapse} + * @extends {OrganizationChartNodeSelectEvent} + * @group Events + */ +export interface OrganizationChartNodeCollapseEvent extends OrganizationChartNodeSelectEvent {} +/** + * Defines valid templates in OrganizationChart. + * @group Templates + */ +export interface OrganizationChartTemplates { + /** + * Custom toggler icon template. + * @param {Object} context - item data. + */ + togglericon(context: { + /** + * Expanded state of the node. + */ + $implicit: boolean; + }): TemplateRef<{ $implicit: boolean }>; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/organizationchart/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/organizationchart/public_api.ts new file mode 100644 index 000000000..98e04ddd4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/organizationchart/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/organizationchart/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './organizationchart.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/overlay/overlay.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/overlay/overlay.types.ts new file mode 100644 index 000000000..7ad7acf7e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/overlay/overlay.types.ts @@ -0,0 +1,70 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/overlay/overlay.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { OverlayModeType, PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom content template context. + * @group Interface + */ +export interface OverlayContentTemplateContext { + /** + * Object containing the overlay mode. + */ + $implicit: { + /** + * Current overlay mode. + */ + mode: OverlayModeType | string | null; + }; +} + +/** + * Defines valid templates in Overlay. + * @group Templates + */ +export interface OverlayTemplates { + /** + * Custom content template. + * @param {OverlayContentTemplateContext} context - content context. + */ + content(context: OverlayContentTemplateContext): TemplateRef; +} + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link OverlayProps.pt} + * @group Interface + */ +export interface OverlayPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Overlay component. + * @see {@link OverlayPassThroughOptions} + * + * @template I Type of instance. + */ +export type OverlayPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/overlay/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/overlay/public_api.ts new file mode 100644 index 000000000..7f185953d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/overlay/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/overlay/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './overlay.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/overlaybadge/overlaybadge.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/overlaybadge/overlaybadge.types.ts new file mode 100644 index 000000000..4edf50b46 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/overlaybadge/overlaybadge.types.ts @@ -0,0 +1,42 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/overlaybadge/overlaybadge.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { BadgePassThrough } from '../badge/public_api'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link OverlayBadgeProps.pt} + * @group Interface + */ +export interface OverlayBadgePassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the Badge component. + * @see {@link BadgePassThrough} + */ + pcBadge?: BadgePassThrough; +} + +/** + * Defines valid pass-through options in OverlayBadge. + * @see {@link OverlayBadgePassThroughOptions} + * + * @template I Type of instance. + */ +export type OverlayBadgePassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/overlaybadge/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/overlaybadge/public_api.ts new file mode 100644 index 000000000..ee437a77d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/overlaybadge/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/overlaybadge/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './overlaybadge.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/paginator/paginator.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/paginator/paginator.types.ts new file mode 100644 index 000000000..67a412f43 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/paginator/paginator.types.ts @@ -0,0 +1,179 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/paginator/paginator.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import { InputNumberPassThrough } from '../inputnumber/public_api'; +import { SelectPassThrough } from '../select/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Paginator.pt} + * @group Interface + */ +export interface PaginatorPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content start's DOM element. + */ + contentStart?: PassThroughOption; + /** + * Used to pass attributes to the current page report's DOM element. + */ + current?: PassThroughOption; + /** + * Used to pass attributes to the first page button's DOM element. + */ + first?: PassThroughOption; + /** + * Used to pass attributes to the first page button icon's DOM element. + */ + firstIcon?: PassThroughOption; + /** + * Used to pass attributes to the previous page button's DOM element. + */ + prev?: PassThroughOption; + /** + * Used to pass attributes to the previous page button icon's DOM element. + */ + prevIcon?: PassThroughOption; + /** + * Used to pass attributes to the pages container's DOM element. + */ + pages?: PassThroughOption; + /** + * Used to pass attributes to the page button's DOM element. + */ + page?: PassThroughOption; + /** + * Used to pass attributes to the next page button's DOM element. + */ + next?: PassThroughOption; + /** + * Used to pass attributes to the next page button icon's DOM element. + */ + nextIcon?: PassThroughOption; + /** + * Used to pass attributes to the last page button's DOM element. + */ + last?: PassThroughOption; + /** + * Used to pass attributes to the last page button icon's DOM element. + */ + lastIcon?: PassThroughOption; + /** + * Used to pass attributes to the content end's DOM element. + */ + contentEnd?: PassThroughOption; + /** + * Used to pass attributes to the Select component (jump to page dropdown). + */ + pcJumpToPageDropdown?: SelectPassThrough; + /** + * Used to pass attributes to the InputNumber component (jump to page input). + */ + pcJumpToPageInput?: InputNumberPassThrough; + /** + * Used to pass attributes to the Select component (rows per page dropdown). + */ + pcRowPerPageDropdown?: SelectPassThrough; +} + +/** + * Defines valid pass-through options in Paginator. + * @see {@link PaginatorPassThroughOptions} + * + * @template I Type of instance. + */ +export type PaginatorPassThrough = PassThrough>; + +/** + * Paginator state. + * @group Interface + */ +export interface PaginatorState { + /** + * Current page number. + */ + page?: number; + /** + * Index of the first record. + */ + first?: number; + /** + * Number of rows per page. + */ + rows?: number; + /** + * Total number of pages. + */ + pageCount?: number; + /** + * Total number of records. + */ + totalRecords?: number; +} + +/** + * Custom template context for left/right templates. + * @group Interface + */ +export interface PaginatorTemplateContext { + /** + * Paginator state. + */ + $implicit: PaginatorState; +} + +/** + * Custom template context for dropdown item templates. + * @group Interface + */ +export interface PaginatorDropdownItemTemplateContext { + /** + * Dropdown item instance. + */ + $implicit: any; +} + +/** + * Defines valid templates in PaginatorTemplates. + * @group Templates + */ +export interface PaginatorTemplates { + /** + * Custom dropdown trigger icon template. + */ + dropdownicon(): TemplateRef; + /** + * Custom first page link icon template. + */ + firstpagelinkicon(): TemplateRef; + /** + * Custom previous page link icon template. + */ + previouspagelinkicon(): TemplateRef; + /** + * Custom last page link icon template. + */ + lastpagelinkicon(): TemplateRef; + /** + * Custom next page link icon template. + */ + nextpagelinkicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/paginator/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/paginator/public_api.ts new file mode 100644 index 000000000..12996e9be --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/paginator/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/paginator/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './paginator.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/panel/panel.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/panel/panel.types.ts new file mode 100644 index 000000000..afedabe14 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/panel/panel.types.ts @@ -0,0 +1,140 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/panel/panel.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Panel.pt} + * @group Interface + */ +export interface PanelPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the title's DOM element. + */ + title?: PassThroughOption; + /** + * Used to pass attributes to the header actions' DOM element. + */ + headerActions?: PassThroughOption; + /** + * Used to pass attributes to the toggle button button's DOM element. + * @see {@link ButtonPassThroughOptions} + */ + pcToggleButton?: ButtonPassThrough; + /** + * Used to pass attributes to the content container's DOM element. + */ + contentContainer?: PassThroughOption; + /** + * Used to pass attributes to the content wrapper DOM element. + */ + contentWrapper?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the footer's DOM element. + */ + footer?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Panel component. + * @see {@link PanelPassThroughOptions} + * + * @template I Type of instance. + */ +export type PanelPassThrough = PassThrough>; + +/** + * Custom panel toggle event, emits before panel toggle. + * @see {@link onBeforeToggle} + * @group Interface + */ +export interface PanelBeforeToggleEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Collapsed state of the panel. + */ + collapsed: boolean | undefined; +} + +/** + * Custom panel toggle event, emits after panel toggle. + * @see {@link onAfterToggle} + * @extends {PanelBeforeToggleEvent} + * @group Interface + */ +export interface PanelAfterToggleEvent extends PanelBeforeToggleEvent {} + +/** + * Toggle icon template context. + * @param {boolean} $implicit - Collapsed state as a boolean, implicit value. + * @group Interface + */ +export interface PanelHeaderIconsTemplateContext { + /** + * Collapsed state as a boolean, implicit value. + */ + $implicit: boolean; +} + +/** + * Defines valid templates in Panel. + * @group Templates + */ +export interface PanelTemplates { + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom icons template. + */ + icons(): TemplateRef; + /** + * Custom content template. + */ + content(): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; + /** + * Custom header icons template. + * @param {PanelHeaderIconsTemplateContext} context - header icons context. + */ + headericons(context: PanelHeaderIconsTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/panel/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/panel/public_api.ts new file mode 100644 index 000000000..00a2fe057 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/panel/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/panel/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './panel.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/panelmenu/panelmenu.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/panelmenu/panelmenu.types.ts new file mode 100644 index 000000000..bfde393e1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/panelmenu/panelmenu.types.ts @@ -0,0 +1,141 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/panelmenu/panelmenu.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { MenuItem, PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link PanelMenu.pt} + * @group Interface + */ +export interface PanelMenuPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the panel's DOM element. + */ + panel?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the header content's DOM element. + */ + headerContent?: PassThroughOption; + /** + * Used to pass attributes to the header link's DOM element. + */ + headerLink?: PassThroughOption; + /** + * Used to pass attributes to the submenu icon's DOM element. + */ + submenuIcon?: PassThroughOption; + /** + * Used to pass attributes to the header icon's DOM element. + */ + headerIcon?: PassThroughOption; + /** + * Used to pass attributes to the header label's DOM element. + */ + headerLabel?: PassThroughOption; + /** + * Used to pass attributes to the toggleable content's DOM element. + */ + contentContainer?: PassThroughOption; + /** + * Used to pass attributes to the toggleable content's DOM element. + */ + contentWrapper?: PassThroughOption; + /** + * Used to pass attributes to the menu content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the root list's DOM element. + */ + rootList?: PassThroughOption; + /** + * Used to pass attributes to the submenu's DOM element. + */ + submenu?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the item content's DOM element. + */ + itemContent?: PassThroughOption; + /** + * Used to pass attributes to the item link's DOM element. + */ + itemLink?: PassThroughOption; + /** + * Used to pass attributes to the item icon's DOM element. + */ + itemIcon?: PassThroughOption; + /** + * Used to pass attributes to the item label's DOM element. + */ + itemLabel?: PassThroughOption; + /** + * Used to pass attributes to the separator's DOM element. + */ + separator?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in PanelMenu. + * @see {@link PanelMenuPassThroughOptions} + * + * @template I Type of instance. + */ +export type PanelMenuPassThrough = PassThrough>; + +/** + * Custom item template context. + * @group Interface + */ +export interface PanelMenuItemTemplateContext { + /** + * Item instance. + */ + $implicit: MenuItem; +} + +/** + * Defines valid templates in PanelMenu. + * @group Templates + */ +export interface PanelMenuTemplates { + /** + * Custom item template. + * @param {PanelMenuItemTemplateContext} context - item context. + */ + item(context: PanelMenuItemTemplateContext): TemplateRef; + /** + * Custom template of submenuicon. + */ + submenuicon(): TemplateRef; + /** + * Custom template of headericon. + */ + headericon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/panelmenu/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/panelmenu/public_api.ts new file mode 100644 index 000000000..9b63569de --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/panelmenu/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/panelmenu/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './panelmenu.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/popover/popover.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/popover/popover.types.ts new file mode 100644 index 000000000..be39351e8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/popover/popover.types.ts @@ -0,0 +1,69 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/popover/popover.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Popover.pt} + * @group Interface + */ +export interface PopoverPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Popover. + * @see {@link PopoverPassThroughOptions} + * + * @template I Type of instance. + */ +export type PopoverPassThrough = PassThrough>; + +/** + * Custom content template context. + * @group Interface + */ +export interface PopoverContentTemplateContext { + /** + * Callback to close the popover. + */ + closeCallback: VoidFunction; +} + +/** + * Defines valid templates in Popover. + * @group Templates + */ +export interface PopoverTemplates { + /** + * Custom template of content. + * @param {PopoverContentTemplateContext} context - content context. + */ + content(context: PopoverContentTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/popover/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/popover/public_api.ts new file mode 100644 index 000000000..2a21ba0ab --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/popover/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/popover/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './popover.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/progressbar/progressbar.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/progressbar/progressbar.types.ts new file mode 100644 index 000000000..ad5865a37 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/progressbar/progressbar.types.ts @@ -0,0 +1,68 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/progressbar/progressbar.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link ProgressBar.pt} + * @group Interface + */ +export interface ProgressBarPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the value's DOM element. + */ + value?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; +} + +/** + * Defines valid pass-through options in ProgressBar. + * @see {@link ProgressBarPassThroughOptions} + * + * @template I Type of instance. + */ +export type ProgressBarPassThrough = PassThrough>; + +/** + * Custom content template context. + * @group Interface + */ +export interface ProgressBarContentTemplateContext { + /** + * Value of the progressbar. + */ + $implicit: number | undefined; +} + +/** + * Defines valid templates in ProgressBar. + * @group Templates + */ +export interface ProgressBarTemplates { + /** + * Custom template of content. + * @param {ProgressBarContentTemplateContext} context - content context. + */ + content(context: ProgressBarContentTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/progressbar/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/progressbar/public_api.ts new file mode 100644 index 000000000..8a466f69d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/progressbar/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/progressbar/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './progressbar.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/progressspinner/progressspinner.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/progressspinner/progressspinner.types.ts new file mode 100644 index 000000000..956d8ec45 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/progressspinner/progressspinner.types.ts @@ -0,0 +1,44 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/progressspinner/progressspinner.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link ProgressSpinner.pt} + * @group Interface + */ +export interface ProgressSpinnerPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the spin's DOM element. + */ + spin?: PassThroughOption; + /** + * Used to pass attributes to the circle's DOM element. + */ + circle?: PassThroughOption; +} + +/** + * Defines valid pass-through options in ProgressSpinner. + * @see {@link ProgressSpinnerPassThroughOptions} + * + * @template I Type of instance. + */ +export type ProgressSpinnerPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/progressspinner/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/progressspinner/public_api.ts new file mode 100644 index 000000000..e980ec91e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/progressspinner/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/progressspinner/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './progressspinner.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/radiobutton/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/radiobutton/public_api.ts new file mode 100644 index 000000000..3c45eb62e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/radiobutton/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/radiobutton/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './radiobutton.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/radiobutton/radiobutton.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/radiobutton/radiobutton.types.ts new file mode 100644 index 000000000..f2b120797 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/radiobutton/radiobutton.types.ts @@ -0,0 +1,60 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/radiobutton/radiobutton.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom passthrough(pt) options. + * @template I Type of instance. + * + * @see {@link RadioButton.pt} + * @group Interface + */ +export interface RadioButtonPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the input's DOM element. + */ + input?: PassThroughOption; + /** + * Used to pass attributes to the box's DOM element. + */ + box?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in RadioButton component. + * @see {@link RadioButtonPassThroughOptions} + * + * @template I Type of instance. + */ +export type RadioButtonPassThrough = PassThrough>; + +/** + * Custom click event. + * @see {@link RadioButton.onClick} + * @group Events + */ +export interface RadioButtonClickEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Browser event. + */ + value: any; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/rating/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/rating/public_api.ts new file mode 100644 index 000000000..c3c99f338 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/rating/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/rating/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './rating.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/rating/rating.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/rating/rating.types.ts new file mode 100644 index 000000000..2fec469d0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/rating/rating.types.ts @@ -0,0 +1,104 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/rating/rating.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import { TemplateRef } from '@angular/core'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Rating.pt} + * @group Interface + */ +export interface RatingPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the option's DOM element. + */ + option?: PassThroughOption; + /** + * Used to pass attributes to the on icon's DOM element. + */ + onIcon?: PassThroughOption; + /** + * Used to pass attributes to the off icon's DOM element. + */ + offIcon?: PassThroughOption; + /** + * Used to pass attributes to the hidden option input container's DOM element. + */ + hiddenOptionInputContainer?: PassThroughOption; + /** + * Used to pass attributes to the hidden option input's DOM element. + */ + hiddenOptionInput?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Rating component. + * @see {@link RatingPassThroughOptions} + * + * @template I Type of instance. + */ +export type RatingPassThrough = PassThrough>; + +/** + * Custom change event. + * @see {@link Rating.onRate} + * @group Events + */ +export interface RatingRateEvent { + /** + * Browser event + */ + originalEvent: Event; + /** + * Selected option value + */ + value: number; +} +/** + * Custom icon template context. + * @group Interface + */ +export interface RatingIconTemplateContext { + /** + * Star value (1-based index). + */ + $implicit: number; + /** + * Style class of the icon. + */ + class: string; +} + +/** + * Defines valid templates in Rating. + * @group Templates + */ +export interface RatingTemplates { + /** + * Custom on icon template. + * @param {RatingIconTemplateContext} context - icon context. + */ + onicon(context: RatingIconTemplateContext): TemplateRef; + /** + * Custom off icon template. + * @param {RatingIconTemplateContext} context - icon context. + */ + officon(context: RatingIconTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/scroller/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/scroller/public_api.ts new file mode 100644 index 000000000..3d8132cc3 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/scroller/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/scroller/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './scroller.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/scroller/scroller.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/scroller/scroller.types.ts new file mode 100644 index 000000000..4cecc9c75 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/scroller/scroller.types.ts @@ -0,0 +1,239 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/scroller/scroller.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Scroller.pt} + * @group Interface + */ +export interface VirtualScrollerPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the spacer's DOM element. + */ + spacer?: PassThroughOption; + /** + * Used to pass attributes to the loader's DOM element. + */ + loader?: PassThroughOption; + /** + * Used to pass attributes to the loading icon's DOM element. + */ + loadingIcon?: PassThroughOption; +} + +/** + * Defines valid pass-through options in VirtualScroller. + * @see {@link VirtualScrollerPassThroughOptions} + * + * @template I Type of instance. + */ +export type VirtualScrollerPassThrough = PassThrough>; + +/** + * Options of the scroll direction. + * @group Types + */ +export type ScrollerToType = 'to-start' | 'to-end' | undefined; +/** + * Options of the scroller orientation. + * @group Types + */ +export type VirtualScrollerOrientationType = 'vertical' | 'horizontal' | 'both'; +/** + * Loader icon options. + * @group Types + */ +export interface ScrollerLoaderIconOptions { + [klass: string]: any; +} +/** + * Scroller content options. + * @group Interface + */ +export interface ScrollerContentOptions { + contentStyleClass?: string; + items?: any[]; + loading?: boolean; + itemSize?: number; + rows?: any[]; + columns?: any[]; + spacerStyle?: { [klass: string]: any } | null | undefined; + contentStyle?: { [klass: string]: any } | null | undefined; + vertical?: boolean; + horizontal?: boolean; + both?: boolean; + getItemOptions?: (index: number) => ScrollerItemOptions; + getLoaderOptions?: (index: number, options?: any) => ScrollerLoaderOptions; +} +/** + * Scroller item options. + * @group Interface + */ +export interface ScrollerItemOptions { + /** + * Index of the item. + */ + index?: number; + /** + * Item count. + */ + count?: number; + /** + * Index of the first element in viewport. + */ + first?: boolean; + /** + * Index of the last element in viewport. + */ + last?: boolean; + /** + * Defines if index is even number. + */ + even?: boolean; + /** + * Defines if index is odd number. + */ + odd?: boolean; +} +/** + * Loader settings. + * @extends {ScrollerItemOptions} + * @group Interface + */ +export interface ScrollerLoaderOptions extends ScrollerItemOptions { + [klass: string]: any; +} +/** + * Custom lazy load event. + * @see {@link Scroller.onLazyLoad} + * @group Events + */ +export interface ScrollerLazyLoadEvent { + /** + * First element index in viewport. + */ + first: number; + /** + * Last element index in viewport. + */ + last: number; +} +/** + * Custom scroll index change event. + * @see {@link Scroller.onScrollIndexChange} + * @extends {ScrollerLazyLoadEvent} + * @group Events + */ +export interface ScrollerScrollIndexChangeEvent extends ScrollerLazyLoadEvent {} +/** + * Custom scroll event. + * @see {@link Scroller.onScroll} + * @group Events + */ +export interface ScrollerScrollEvent { + /** + * Browser event. + */ + originalEvent?: Event; +} +/** + * Custom content template context. + * @group Interface + */ +export interface ScrollerContentTemplateContext { + /** + * Loaded items. + */ + $implicit: any[] | any | null | undefined; + /** + * Content options. + */ + options: ScrollerContentOptions; +} + +/** + * Custom item template context. + * @group Interface + */ +export interface ScrollerItemTemplateContext { + /** + * Item instance. + */ + $implicit: any; + /** + * Scroller item options. + */ + options: ScrollerItemOptions; +} + +/** + * Custom loader template context. + * @group Interface + */ +export interface ScrollerLoaderTemplateContext { + /** + * Loader options. + */ + options: ScrollerLoaderOptions; +} + +/** + * Custom loader icon template context. + * @group Interface + */ +export interface ScrollerLoaderIconTemplateContext { + /** + * Loader icon options. + */ + options: ScrollerLoaderIconOptions; +} + +/** + * Defines valid templates in Scroller. + * @group Templates + */ +export interface ScrollerTemplates { + /** + * Custom content template. + * @param {ScrollerContentTemplateContext} context - content context. + */ + content(context: ScrollerContentTemplateContext): TemplateRef; + /** + * Custom item template. + * @param {ScrollerItemTemplateContext} context - item context. + */ + item(context: ScrollerItemTemplateContext): TemplateRef; + /** + * Custom loader template. + * @param {ScrollerLoaderTemplateContext} context - loader context. + */ + loader(context: ScrollerLoaderTemplateContext): TemplateRef; + /** + * Custom loader icon template. + * @param {ScrollerLoaderIconTemplateContext} context - loader icon context. + */ + loadericon(context: ScrollerLoaderIconTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/scrollpanel/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/scrollpanel/public_api.ts new file mode 100644 index 000000000..f56bb02de --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/scrollpanel/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/scrollpanel/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './scrollpanel.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/scrollpanel/scrollpanel.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/scrollpanel/scrollpanel.types.ts new file mode 100644 index 000000000..36e92865a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/scrollpanel/scrollpanel.types.ts @@ -0,0 +1,60 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/scrollpanel/scrollpanel.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link ScrollPanel.pt} + * @group Interface + */ +export interface ScrollPanelPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content container's DOM element. + */ + contentContainer?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the horizontal panel's DOM element. + */ + barX?: PassThroughOption; + /** + * Used to pass attributes to the vertical panel's DOM element. + */ + barY?: PassThroughOption; +} + +/** + * Defines valid pass-through options in ScrollPanel component. + * @see {@link ScrollPanelPassThroughOptions} + * + * @template I Type of instance. + */ +export type ScrollPanelPassThrough = PassThrough>; + +/** + * Defines valid templates in ScrollPanel. + * @group Templates + */ +export interface ScrollPanelTemplates { + /** + * Custom content template. + */ + content(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/scrolltop/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/scrolltop/public_api.ts new file mode 100644 index 000000000..365fbc9e5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/scrolltop/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/scrolltop/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './scrolltop.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/scrolltop/scrolltop.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/scrolltop/scrolltop.types.ts new file mode 100644 index 000000000..c1e8193bb --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/scrolltop/scrolltop.types.ts @@ -0,0 +1,71 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/scrolltop/scrolltop.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link ScrollTop.pt} + * @group Interface + */ +export interface ScrollTopPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the Button component. + * @see {@link ButtonPassThrough} + */ + pcButton?: ButtonPassThrough; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in ScrollTop. + * @see {@link ScrollTopPassThroughOptions} + * + * @template I Type of instance. + */ +export type ScrollTopPassThrough = PassThrough>; + +/** + * Custom icon template context. + * @group Interface + */ +export interface ScrollTopIconTemplateContext { + /** + * Style class of the icon. + */ + styleClass: string; +} + +/** + * Defines valid templates in ScrollTop. + * @group Templates + */ +export interface ScrollTopTemplates { + /** + * Custom icon template. + * @param {ScrollTopIconTemplateContext} context - icon context. + */ + icon(context: ScrollTopIconTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/select/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/select/public_api.ts new file mode 100644 index 000000000..cb6a18186 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/select/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/select/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './select.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/select/select.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/select/select.types.ts new file mode 100644 index 000000000..2dfc74bbc --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/select/select.types.ts @@ -0,0 +1,338 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/select/select.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption, ScrollerOptions } from '../../api/public_api'; +import type { IconFieldPassThrough } from '../iconfield/public_api'; +import type { InputIconPassThrough } from '../inputicon/public_api'; +import type { InputTextPassThrough } from '../inputtext/public_api'; +import type { OverlayPassThrough } from '../overlay/public_api'; +import type { VirtualScrollerPassThrough } from '../scroller/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Select.pt} + * @group Interface + */ +export interface SelectPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; + /** + * Used to pass attributes to the clear icon's DOM element. + */ + clearIcon?: PassThroughOption; + /** + * Used to pass attributes to the dropdown's DOM element. + */ + dropdown?: PassThroughOption; + /** + * Used to pass attributes to the loading icon's DOM element. + */ + loadingIcon?: PassThroughOption; + /** + * Used to pass attributes to the dropdown icon's DOM element. + */ + dropdownIcon?: PassThroughOption; + /** + * Used to pass attributes to the Overlay component. + * @see {@link OverlayPassThrough} + */ + pcOverlay?: OverlayPassThrough; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the filter container's DOM element. + */ + pcFilterContainer?: IconFieldPassThrough; + /** + * Used to pass attributes to the filter input's DOM element. + */ + pcFilter?: InputTextPassThrough; + /** + * Used to pass attributes to the filter icon container's DOM element. + */ + pcFilterIconContainer?: InputIconPassThrough; + /** + * Used to pass attributes to the filter icon's DOM element. + */ + filterIcon?: PassThroughOption; + /** + * Used to pass attributes to the list container's DOM element. + */ + listContainer?: PassThroughOption; + /** + * Used to pass attributes to the VirtualScroller component. + * @see {@link ScrollerOptions} + */ + virtualScroller?: VirtualScrollerPassThrough; + /** + * Used to pass attributes to the list's DOM element. + */ + list?: PassThroughOption; + /** + * Used to pass attributes to the option group's DOM element. + */ + optionGroup?: PassThroughOption; + /** + * Used to pass attributes to the option group label's DOM element. + */ + optionGroupLabel?: PassThroughOption; + /** + * Used to pass attributes to the option's DOM element. + */ + option?: PassThroughOption; + /** + * Used to pass attributes to the option check icon's DOM element. + */ + optionCheckIcon?: PassThroughOption; + /** + * Used to pass attributes to the option blank icon's DOM element. + */ + optionBlankIcon?: PassThroughOption; + /** + * Used to pass attributes to the option label's DOM element. + */ + optionLabel?: PassThroughOption; + /** + * Used to pass attributes to the empty message's DOM element. + */ + emptyMessage?: PassThroughOption; + /** + * Used to pass attributes to the hidden first focusable element's DOM element. + */ + hiddenFirstFocusableEl?: PassThroughOption; + /** + * Used to pass attributes to the hidden filter result's DOM element. + */ + hiddenFilterResult?: PassThroughOption; + /** + * Used to pass attributes to the hidden empty message's DOM element. + */ + hiddenEmptyMessage?: PassThroughOption; + /** + * Used to pass attributes to the hidden selected message's DOM element. + */ + hiddenSelectedMessage?: PassThroughOption; + /** + * Used to pass attributes to the hidden last focusable element's DOM element. + */ + hiddenLastFocusableEl?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Select component. + * @see {@link SelectPassThroughOptions} + * + * @template I Type of instance. + */ +export type SelectPassThrough = PassThrough>; + +/** + * Filter callbacks of the select. + * @group Interface + */ +export interface SelectFilterOptions { + /** + * Filter function. + */ + filter?: (value?: any) => void; + /** + * Reset function. + */ + reset?: () => void; +} + +/** + * Custom change event. + * @see {@link Select.onChange} + * @group Events + */ +export interface SelectChangeEvent { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Selected option value + */ + value: any; +} + +/** + * Custom filter event. + * @see {@link Select.onFilter} + * @group Events + */ +export interface SelectFilterEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Filter value. + */ + filter: any; +} + +/** + * Custom lazy load event. + * @see {@link Select.onLazyLoad} + * @group Events + */ +export interface SelectLazyLoadEvent { + /** + * Index of the first element in viewport. + */ + first: number; + /** + * Index of the last element in viewport. + */ + last: number; +} + +/** + * Custom item template context. + * @group Interface + */ +export interface SelectItemTemplateContext { + /** + * Data of the option. + */ + $implicit: T; +} + +/** + * Custom selected item template context. + * @group Interface + */ +export interface SelectSelectedItemTemplateContext { + /** + * Selected option value. + */ + $implicit: T; +} + +/** + * Custom group template context. + * @group Interface + */ +export interface SelectGroupTemplateContext { + /** + * Group option. + */ + $implicit: T; +} + +/** + * Custom filter template context. + * @group Interface + */ +export interface SelectFilterTemplateContext { + /** + * Filter options. + */ + options: SelectFilterOptions; +} + +/** + * Custom loader template context. + * @group Interface + */ +export interface SelectLoaderTemplateContext { + /** + * Virtual scroller options. + */ + options: ScrollerOptions; +} + +/** + * Custom icon template context. + * @group Interface + */ +export interface SelectIconTemplateContext { + /** + * Style class of the icon. + */ + class: string; +} + +/** + * Defines valid templates in Select. + * @group Templates + */ +export interface SelectTemplates { + /** + * Custom item template. + * @param {Object} context - item data. + */ + item(context: SelectItemTemplateContext): TemplateRef>; + /** + * Custom selected item template. + * @param {Object} context - selected item data. + */ + selectedItem(context: SelectSelectedItemTemplateContext): TemplateRef>; + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom filter template. + * @param {SelectFilterOptions} options - filter options. + */ + filter(context: SelectFilterTemplateContext): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; + /** + * Custom empty filter template. + */ + emptyfilter(): TemplateRef; + /** + * Custom empty template. + */ + empty(): TemplateRef; + /** + * Custom group template. + */ + group(context: SelectGroupTemplateContext): TemplateRef>; + /** + * Custom loader template. This template can be used with virtualScroll. + * @param {ScrollerOptions} options - virtual scroller options. + */ + loader(context: SelectLoaderTemplateContext): TemplateRef; + /** + * Custom select icon template. + * @param {Object} context - icon context. + */ + dropdownicon(context: SelectIconTemplateContext): TemplateRef; + /** + * Custom clear icon template. + * @param {Object} context - icon context. + */ + clearicon(context: SelectIconTemplateContext): TemplateRef; + /** + * Custom filter icon template. + */ + filtericon(): TemplateRef; + /** + * Custom loading icon template. + */ + loadingicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/selectbutton/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/selectbutton/public_api.ts new file mode 100644 index 000000000..446685d30 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/selectbutton/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/selectbutton/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './selectbutton.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/selectbutton/selectbutton.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/selectbutton/selectbutton.types.ts new file mode 100644 index 000000000..8d3eb3c4e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/selectbutton/selectbutton.types.ts @@ -0,0 +1,104 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/selectbutton/selectbutton.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ToggleButtonPassThrough } from '../togglebutton/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link SelectButton.pt} + * @group Interface + */ +export interface SelectButtonPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the ToggleButton component. + * @see {@link ToggleButtonPassThrough} + */ + pcToggleButton?: ToggleButtonPassThrough; +} + +/** + * Custom passthrough attributes for each DOM elements + * @group Interface + */ +export type SelectButtonPassThrough = PassThrough>; + +/** + * Custom change event. + * @see {@link SelectButton.onChange} + * @group Events + */ +export interface SelectButtonChangeEvent { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Selected option. + */ + value?: any; +} + +/** + * Custom option click event. + * @see {@link SelectButton.onOptionClick} + * @group Events + */ +export interface SelectButtonOptionClickEvent { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Selected option. + */ + option?: any; + /** + * Index of the selected option. + */ + index?: number; +} + +/** + * Custom item template context. + * @group Interface + */ +export interface SelectButtonItemTemplateContext { + /** + * Option instance. + */ + $implicit: any; + /** + * Index of the option. + */ + index: number; +} + +/** + * Defines valid templates in SelectButton. + * @group Templates + */ +export interface SelectButtonTemplates { + /** + * Custom item template. + * @param {SelectButtonItemTemplateContext} context - item context. + */ + item(context: SelectButtonItemTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/skeleton/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/skeleton/public_api.ts new file mode 100644 index 000000000..2f4b022b6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/skeleton/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/skeleton/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './skeleton.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/skeleton/skeleton.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/skeleton/skeleton.types.ts new file mode 100644 index 000000000..fc9a333c3 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/skeleton/skeleton.types.ts @@ -0,0 +1,36 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/skeleton/skeleton.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Skeleton.pt} + * @group Interface + */ +export interface SkeletonPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Skeleton. + * @see {@link SkeletonPassThroughOptions} + * + * @template I Type of instance. + */ +export type SkeletonPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/slider/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/slider/public_api.ts new file mode 100644 index 000000000..37f839e13 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/slider/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/slider/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './slider.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/slider/slider.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/slider/slider.types.ts new file mode 100644 index 000000000..5a1e4fedc --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/slider/slider.types.ts @@ -0,0 +1,87 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/slider/slider.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom passthrough(pt) options. + * @template I Type of instance. + * + * @see {@link Slider.pt} + * @group Interface + */ +export interface SliderPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the range's DOM element. + */ + range?: PassThroughOption; + /** + * Used to pass attributes to the handle's DOM element. + */ + handle?: PassThroughOption; + /** + * Used to pass attributes to the start handler's DOM element. + */ + startHandler?: PassThroughOption; + /** + * Used to pass attributes to the end handler's DOM element. + */ + endHandler?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Slider component. + * @see {@link SliderPassThroughOptions} + * + * @template I Type of instance. + */ +export type SliderPassThrough = PassThrough>; + +/** + * Custom change event. + * @see {@link Slider.onChange} + * @group Events + */ +export interface SliderChangeEvent { + /** + * Browser event. + */ + event: Event; + /** + * New values. + */ + values?: number[]; + /** + * New value. + */ + value?: number; +} +/** + * Custom slide end event. + * @see {@link Slider.onSlideEnd} + * @group Events + */ +export interface SliderSlideEndEvent { + /** + * Original event + */ + originalEvent: Event; + /** + * New value. + */ + value?: number; + /** + * New values. + */ + values?: number[]; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/speeddial/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/speeddial/public_api.ts new file mode 100644 index 000000000..a0b7706b2 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/speeddial/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/speeddial/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './speeddial.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/speeddial/speeddial.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/speeddial/speeddial.types.ts new file mode 100644 index 000000000..669101c85 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/speeddial/speeddial.types.ts @@ -0,0 +1,111 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/speeddial/speeddial.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MenuItem, PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link SpeedDial.pt} + * @group Interface + */ +export interface SpeedDialPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the Button component. + * @see {@link ButtonPassThrough} + */ + pcButton?: ButtonPassThrough; + /** + * Used to pass attributes to the list's DOM element. + */ + list?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the action's Button component. + * @see {@link ButtonPassThrough} + */ + pcAction?: ButtonPassThrough; + /** + * Used to pass attributes to the action icon's DOM element. + */ + actionIcon?: PassThroughOption; + /** + * Used to pass attributes to the mask's DOM element. + */ + mask?: PassThroughOption; +} + +/** + * Defines valid pass-through options in SpeedDial component. + * @see {@link SpeedDialPassThroughOptions} + * + * @template I Type of instance. + */ +export type SpeedDialPassThrough = PassThrough>; + +/** + * Custom button template context. + * @group Interface + */ +export interface SpeedDialButtonTemplateContext { + /** + * Callback to toggle the speed dial visibility. + */ + toggleCallback: (event: MouseEvent) => void; +} + +/** + * Custom item template context. + * @group Interface + */ +export interface SpeedDialItemTemplateContext { + /** + * Menu item instance. + */ + $implicit: MenuItem; + /** + * Index of the item. + */ + index: number; + /** + * Callback to handle item click. + */ + toggleCallback: (event: Event, item: MenuItem) => void; +} + +/** + * Defines valid templates in SpeedDial. + * @group Templates + */ +export interface SpeedDialTemplates { + /** + * Custom button template. + * @param {SpeedDialButtonTemplateContext} context - button context. + */ + button(context: SpeedDialButtonTemplateContext): TemplateRef; + /** + * Custom icon template. + */ + icon(): TemplateRef; + /** + * Custom item template. + * @param {SpeedDialItemTemplateContext} context - item context. + */ + item(context: SpeedDialItemTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/splitbutton/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/splitbutton/public_api.ts new file mode 100644 index 000000000..b3b130828 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/splitbutton/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/splitbutton/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './splitbutton.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/splitbutton/splitbutton.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/splitbutton/splitbutton.types.ts new file mode 100644 index 000000000..f1c4c7152 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/splitbutton/splitbutton.types.ts @@ -0,0 +1,79 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/splitbutton/splitbutton.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough } from '../button/public_api'; +import { MenuPassThrough } from '../menu/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link SplitButton.pt} + * @group Interface + */ +export interface SplitButtonPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the Button component. + * @see {@link ButtonPassThrough} + */ + pcButton?: ButtonPassThrough; + /** + * Used to pass attributes to the dropdown Button component. + * @see {@link ButtonPassThrough} + */ + pcDropdown?: ButtonPassThrough; + /** + * Used to pass attributes to the TieredMenu component. + */ + pcMenu?: MenuPassThrough; +} + +/** + * Defines valid pass-through options in SplitButton component. + * @see {@link SplitButtonPassThroughOptions} + * + * @template I Type of instance. + */ +export type SplitButtonPassThrough = PassThrough>; + +/** + * Defines valid templates in SplitButton. + * @group Templates + */ +export interface SplitButtonTemplates { + /** + * Custom content template. + */ + content(): TemplateRef; + /** + * Custom dropdown icon template. + */ + dropdownicon(): TemplateRef; +} +/** + * Defines ButtonProps interface. + */ +export interface ButtonProps { + ariaLabel?: string; +} +/** + * Defines MenuButtonProps interface. + */ +export interface MenuButtonProps { + ariaLabel?: string; + ariaHasPopup?: boolean; + ariaExpanded?: boolean; + ariaControls?: string; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/splitter/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/splitter/public_api.ts new file mode 100644 index 000000000..2b1241a74 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/splitter/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/splitter/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './splitter.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/splitter/splitter.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/splitter/splitter.types.ts new file mode 100644 index 000000000..1f2dd89b7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/splitter/splitter.types.ts @@ -0,0 +1,79 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/splitter/splitter.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Splitter.pt} + * @group Interface + */ +export interface SplitterPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the panel's DOM element. + */ + panel: PassThroughOption; + /** + * Used to pass attributes to the gutter's DOM element. + */ + gutter?: PassThroughOption; + /** + * Used to pass attributes to the gutter handle's DOM element. + */ + gutterHandle?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Splitter component. + * @see {@link SplitterPassThroughOptions} + * + * @template I Type of instance. + */ +export type SplitterPassThrough = PassThrough>; + +/** + * Custom panel resize start event. + * @see {@link Splitter.onResizeStart} + * @group Events + */ +export interface SplitterResizeStartEvent { + /** + * Browser event. + */ + originalEvent: TouchEvent | MouseEvent; + /** + * Sizes of the panels, can be percentages, pixels, rem, or other CSS units. + */ + sizes: (number | string)[]; +} +/** + * Custom panel resize end event. + * @see {@link Splitter.onResizeEnd} + * @extends {SplitterResizeStartEvent} + * @group Events + */ +export interface SplitterResizeEndEvent extends SplitterResizeStartEvent {} + +/** + * Defines valid templates in Splitter. + * @group Templates + */ +export interface SplitterTemplates { + /** + * Custom panel template. + */ + panel(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/stepper/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/stepper/public_api.ts new file mode 100644 index 000000000..3be697b4d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/stepper/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/stepper/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './stepper.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/stepper/stepper.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/stepper/stepper.types.ts new file mode 100644 index 000000000..626efe431 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/stepper/stepper.types.ts @@ -0,0 +1,182 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/stepper/stepper.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Defines valid pass-through options in Stepper component. + * @template I Type of instance. + * + * @group Interface + */ +export interface StepperPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Stepper component. + * @see {@link StepperPassThroughOptions} + * + * @template I Type of instance. + */ +export type StepperPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in StepList component. + * @template I Type of instance. + * + * @group Interface + */ +export interface StepListPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in StepList component. + * @see {@link StepListPassThroughOptions} + * + * @template I Type of instance. + */ +export type StepListPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in StepperSeparator component. + * @template I Type of instance. + * + * @group Interface + */ +export interface StepperSeparatorPassThroughOptions { + /** + * Used to pass attributes to the separator's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in StepperSeparator component. + * @see {@link StepperSeparatorPassThroughOptions} + * + * @template I Type of instance. + */ +export type StepperSeparatorPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in StepItem component. + * @template I Type of instance. + * + * @group Interface + */ +export interface StepItemPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in StepItem component. + * @see {@link StepItemPassThroughOptions} + * + * @template I Type of instance. + */ +export type StepItemPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in Step component. + * @template I Type of instance. + * + * @group Interface + */ +export interface StepPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the number's DOM element. + */ + number?: PassThroughOption; + /** + * Used to pass attributes to the title's DOM element. + */ + title?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Step component. + * @see {@link StepPassThroughOptions} + * + * @template I Type of instance. + */ +export type StepPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in StepPanel component. + * @template I Type of instance. + * + * @group Interface + */ +export interface StepPanelPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content wrapper DOM element. + */ + contentWrapper?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; +} + +/** + * Defines valid pass-through options in StepPanel component. + * @see {@link StepPanelPassThroughOptions} + * + * @template I Type of instance. + */ +export type StepPanelPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in StepPanels component. + * @template I Type of instance. + * + * @group Interface + */ +export interface StepPanelsPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in StepPanels component. + * @see {@link StepPanelsPassThroughOptions} + * + * @template I Type of instance. + */ +export type StepPanelsPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/table/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/table/public_api.ts new file mode 100644 index 000000000..38884496d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/table/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/table/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './table.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/table/table.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/table/table.types.ts new file mode 100644 index 000000000..d59482b1a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/table/table.types.ts @@ -0,0 +1,875 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/table/table.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { FilterMetadata, LazyLoadMeta, PassThrough, PassThroughOption } from '../../api/public_api'; +import type { ButtonPassThrough, ButtonProps } from '../button/public_api'; +import type { CheckboxPassThrough } from '../checkbox/public_api'; +import type { PaginatorPassThrough } from '../paginator/public_api'; +import type { VirtualScrollerPassThrough } from '../scroller/public_api'; +import type { InputTextPassThrough } from '../inputtext/public_api'; +import type { SelectPassThrough } from '../select/public_api'; +import type { InputNumberPassThrough } from '../inputnumber/public_api'; +import type { DatePickerPassThrough } from '../datepicker/public_api'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; + +/** + * Custom pass-through(pt) options for ColumnFilter. + * @template I Type of instance. + * + * @group Interface + */ +export interface ColumnFilterPassThroughOptions { + /** + * Used to pass attributes to the filter container element. + */ + filter?: PassThroughOption; + /** + * Used to pass attributes to the column filter button component. + */ + pcColumnFilterButton?: ButtonPassThrough; + /** + * Used to pass attributes to the filter overlay element. + */ + filterOverlay?: PassThroughOption; + /** + * Used to pass attributes to the filter constraint list element. + */ + filterConstraintList?: PassThroughOption; + /** + * Used to pass attributes to the filter constraint element. + */ + filterConstraint?: PassThroughOption; + /** + * Used to pass attributes to the filter constraint separator element. + */ + filterConstraintSeparator?: PassThroughOption; + /** + * Used to pass attributes to the empty filter label element. + */ + emtpyFilterLabel?: PassThroughOption; + /** + * Used to pass attributes to the filter operator element. + */ + filterOperator?: PassThroughOption; + /** + * Used to pass attributes to the filter operator dropdown component. + */ + pcFilterOperatorDropdown?: SelectPassThrough; + /** + * Used to pass attributes to the filter rule list element. + */ + filterRuleList?: PassThroughOption; + /** + * Used to pass attributes to the filter rule element. + */ + filterRule?: PassThroughOption; + /** + * Used to pass attributes to the filter constraint dropdown component. + */ + pcFilterConstraintDropdown?: SelectPassThrough; + /** + * Used to pass attributes to the filter remove rule button component. + */ + pcFilterRemoveRuleButton?: ButtonPassThrough; + /** + * Used to pass attributes to the add rule button label. + */ + pcAddRuleButtonLabel?: ButtonPassThrough; + /** + * Used to pass attributes to the filter button bar element. + */ + filterButtonBar?: PassThroughOption; + /** + * Used to pass attributes to the filter clear button component. + */ + pcFilterClearButton?: ButtonPassThrough; + /** + * Used to pass attributes to the filter apply button component. + */ + pcFilterApplyButton?: ButtonPassThrough; + /** + * Used to pass attributes to the filter input text component. + */ + pcFilterInputText?: InputTextPassThrough; + /** + * Used to pass attributes to the filter input number component. + */ + pcFilterInputNumber?: InputNumberPassThrough; + /** + * Used to pass attributes to the filter checkbox component. + */ + pcFilterCheckbox?: CheckboxPassThrough; + /** + * Used to pass attributes to the filter datepicker component. + */ + pcFilterDatePicker?: DatePickerPassThrough; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in ColumnFilter. + * @see {@link ColumnFilterPassThroughOptions} + * + * @template I Type of instance. + */ +export type ColumnFilterPassThrough = PassThrough>; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link TableProps.pt} + * @group Interface + */ +export interface TablePassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the loading mask element. + */ + mask?: PassThroughOption; + /** + * Used to pass attributes to the loading icon element. + */ + loadingIcon?: PassThroughOption; + /** + * Used to pass attributes to the header (caption) element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the paginator component. + */ + pcPaginator?: PaginatorPassThrough; + /** + * Used to pass attributes to the table container element. + */ + tableContainer?: PassThroughOption; + /** + * Used to pass attributes to the virtual scroller component. + */ + virtualScroller?: VirtualScrollerPassThrough; + /** + * Used to pass attributes to the table element. + */ + table?: PassThroughOption; + /** + * Used to pass attributes to the thead element. + */ + thead?: PassThroughOption; + /** + * Used to pass attributes to the tbody element. + */ + tbody?: PassThroughOption; + /** + * Used to pass attributes to the virtual scroller spacer element. + */ + virtualScrollerSpacer?: PassThroughOption; + /** + * Used to pass attributes to the tfoot element. + */ + tfoot?: PassThroughOption; + /** + * Used to pass attributes to the footer element. + */ + footer?: PassThroughOption; + /** + * Used to pass attributes to the column resize indicator element. + */ + columnResizeIndicator?: PassThroughOption; + /** + * Used to pass attributes to the row reorder indicator up element. + */ + rowReorderIndicatorUp?: PassThroughOption; + /** + * Used to pass attributes to the row reorder indicator down element. + */ + rowReorderIndicatorDown?: PassThroughOption; + /** + * Used to pass attributes to the reorderable row element. + */ + reorderableRow?: PassThroughOption; + /** + * Used to pass attributes to the reorderable row handle element. + */ + reorderableRowHandle?: PassThroughOption; + /** + * Used to pass attributes to the header checkbox component. + */ + headerCheckbox?: CheckboxPassThrough; + /** + * Used to pass attributes to the checkbox component. + */ + pcCheckbox?: CheckboxPassThrough; + /** + * Used to pass attributes to the column filter component. + */ + columnFilter?: ColumnFilterPassThroughOptions; + /** + * Used to pass attributes to the column filter form element component. + */ + columnFilterFormElement?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Table. + * @see {@link TablePassThroughOptions} + * + * @template I Type of instance. + */ +export type TablePassThrough = PassThrough>; +/** + * Custom select event. + * @see {@link Table.onRowSelect} + * @extends {LazyLoadMeta} + * @group Events + */ +export interface TableRowSelectEvent { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Row data. + */ + data?: RowData | RowData[]; + /** + * Selection type. + */ + type?: string; + /** + * Index of the selected row. + */ + index?: number; +} +/** + * Custom unselect event. + * @see {@link Table.onRowUnselect} + * @extends {TableRowSelectEvent} + * @group Events + */ +export interface TableRowUnSelectEvent extends TableRowSelectEvent {} +/** + * Custom page event. + * @see {@link Table.onPage} + */ +export interface TablePageEvent { + /** + * Index of the first element. + */ + first: number; + /** + * Row count. + */ + rows: number; +} +/** + * Custom filter event. + * @see {@link Table.onFilter} + * @group Events + */ +export interface TableFilterEvent { + /** + * Filter meta. + */ + filters?: { [s: string]: FilterMetadata | undefined }; + /** + * Value after filter. + */ + filteredValue?: any[] | any; +} +/** + * Custom lazy load event. + * @see {@link Table.onLazyLoad} + * @extends {LazyLoadMeta} + * @group Events + */ +export interface TableLazyLoadEvent extends LazyLoadMeta { + /** + * First element in viewport. + */ + first?: number; + /** + * Last element in viewport. + */ + last?: number; +} +/** + * Custom row expand event. + * @see {@link Table.onRowExpand} + * @group Events + */ +export interface TableRowExpandEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Row data. + */ + data: RowData; +} +/** + * Custom row collapse event. + * @see {@link Table.onRowCollapse} + * @extends {TableRowExpandEvent} + * @group Events + */ +export interface TableRowCollapseEvent extends TableRowExpandEvent {} +/** + * Custom context menu select event. + * @see {@link Table.onContextMenuSelect} + * @group Events + */ +export interface TableContextMenuSelectEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Row data. + */ + data: RowData; + /** + * Row index. + */ + index: number; +} +/** + * Custom context menu selection change event. + * @see {@link Table.contextMenuSelectionChange} + * @group Events + */ +export interface TableContextMenuSelectionChangeEvent { + /** + * Row data. + */ + data: RowData; +} +/** + * Custom column resize event. + * @see {@link Table.onColResize} + * @group Events + */ +export interface TableColResizeEvent { + /** + * Instance of resized column. + */ + element: HTMLElement; + /** + * Position. + */ + delta: number; +} +/** + * Custom column reorder event. + * @see {@link Table.onColReorder} + * @group Events + */ +export interface TableColumnReorderEvent { + /** + * Index of the dragged item. + */ + dragIndex?: number; + /** + * Index of the drop position. + */ + dropIndex?: number; + /** + * Columns after reorder. + */ + columns?: any[]; +} +/** + * Custom row reorder event. + * @see {@link Table.onRowReorder} + * @group Events + */ +export interface TableRowReorderEvent { + /** + * Index of the dragged item. + */ + dragIndex?: number; + /** + * Index of the drop position. + */ + dropIndex?: number; +} +/** + * Custom edit event. + * @group Events + */ +export interface TableEditEvent { + /** + * Field to be edited. + */ + field?: string; + /** + * New value. + */ + data?: RowData; +} +/** + * Custom edit init event. + * @see {@link Table.onEditInit} + * @group Events + */ +export interface TableEditInitEvent extends TableEditEvent { + /** + * Edited element index. + */ + index: number; +} +/** + * Custom edit cancel event. + * @see {@link Table.onEditCancel} + * @group Events + */ +export interface TableEditCancelEvent extends TableEditEvent { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Edited element index. + */ + index?: number; +} +/** + * Custom edit complete event. + * @see {@link Table.onEditComplete} + * @group Events + */ +export interface TableEditCompleteEvent extends TableEditCancelEvent {} +/** + * Custom checkbox toggle event. + * @see {@link Table.onHeaderCheckboxToggle} + * @group Events + */ +export interface TableHeaderCheckboxToggleEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Checked state. + */ + checked: boolean; +} +/** + * Custom all selection change event. + * @see {@link Table.selectAllChange} + * @group Events + */ +export interface TableSelectAllChangeEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Checked state. + */ + checked: boolean; +} +/** + * Custom table filter popover button props options. + */ +export interface TableFilterButtonPopoverPropsOptions { + /** + * Add rule button props + */ + addRule: ButtonProps | undefined; + /** + * Remove rule button props + */ + removeRule: ButtonProps | undefined; + /** + * Apply button props + */ + apply: ButtonProps | undefined; + /** + * Apply button props + */ + clear: ButtonProps | undefined; +} +/** + * Custom table filter inline button props options. + */ +export interface TableFilterButtonInlinePropsOptions { + /** + * Apply button props + */ + clear: ButtonProps | undefined; +} +/** + * Custom table filter buttons' props options. + */ +export interface TableFilterButtonPropsOptions { + /** + * Filter button props + */ + filter: ButtonProps | undefined; + /** + * Inline filter buttons' options + */ + inline: TableFilterButtonInlinePropsOptions | undefined; + /** + * Popover filter buttons' options + */ + popover: TableFilterButtonPopoverPropsOptions | undefined; +} +/** + * Custom CSV export options. + */ +export interface ExportCSVOptions { + /** + * Boolean value determining whether to export all selected values. + */ + selectionOnly?: boolean; + /** + * Boolean value determining whether to export all values. + */ + allValues?: boolean; +} +/** + * Defines valid templates in Table. + * @group Templates + */ +export interface TableTemplates { + /** + * Custom caption template. + */ + caption(): TemplateRef; + /** + * Custom grouped header template. + * @param {Object} context - row data. + */ + headergrouped(context: { + /** + * Row data. + */ + $implicit?: any; + /** + * Row index. + */ + rowIndex?: number; + /** + * Columns. + */ + columns?: any[]; + /** + * Editing state. + */ + editing?: boolean; + /** + * Frozen state. + */ + frozen?: boolean; + }): TemplateRef; + /** + * Custom grouped header template. + * @param {Object} context - header data. + */ + header(context: { + /** + * Field. + */ + $implicit: string; + }): TemplateRef<{ $implicit: string }>; + /** + * Custom body template. + * @param {Object} context - body data. + */ + body(context: { + /** + * Columns. + */ + $implicit: any; + /** + * Frozen state. + */ + frozen: boolean; + }): TemplateRef<{ $implicit: any; frozen: boolean }>; + /** + * Custom loading body template. + * @param {Object} context - loading body data. + */ + loadingbody(context: { + /** + * Row span. + */ + rowspan?: number; + /** + * Row group. + */ + rowgroup?: number; + }): TemplateRef; + /** + * Custom footer template. + * @param {Object} context - footer data. + */ + footer(context: { + /** + * Field. + */ + $implicit: string; + }): TemplateRef<{ $implicit: string }>; + /** + * Custom footer template. + * @param {Object} context - footer data. + */ + footergrouped(context: { + /** + * Columns. + */ + $implicit: any[]; + }): TemplateRef; + /** + * Custom column group template. + * @param {Object} context - columns data. + */ + colgroup(context: { + /** + * Columns. + */ + $implicit: any[]; + }): TemplateRef; + /** + * Custom summary template. + */ + summary(): TemplateRef; + /** + * Custom expanded row template. + * @param {Object} context - expanded row data. + */ + expandedrow(context: { + /** + * Row span. + */ + rowspan?: number; + /** + * Row group. + */ + rowgroup?: number; + /** + * Expanded state. + */ + expanded: boolean; + }): TemplateRef; + /** + * Custom group header template. + * @param {Object} context - row data. + */ + groupheader(context: { + /** + * Row data. + */ + $implicit?: any; + /** + * Row index. + */ + rowIndex?: number; + /** + * Columns. + */ + columns?: any[]; + /** + * Editing state. + */ + editing?: boolean; + /** + * Frozen state. + */ + frozen?: boolean; + }): TemplateRef; + /** + * Custom group footer template. + * @param {TableRowContext} context - row data. + */ + groupfooter(context: { + /** + * Row data. + */ + $implicit?: any; + /** + * Row index. + */ + rowIndex?: number; + /** + * Columns. + */ + columns?: any[]; + /** + * Editing state. + */ + editing?: boolean; + /** + * Frozen state. + */ + frozen?: boolean; + }): TemplateRef; + /** + * Custom frozen header template. + * @param {*} context - columns. + */ + frozenheader(): TemplateRef<{ $implicit: any[] }>; + /** + * Custom frozen body template. + * @param {Object} context - row data. + */ + frozenbody(context: { + /** + * Row data. + */ + $implicit?: any; + /** + * Row index. + */ + rowIndex?: number; + /** + * Columns. + */ + columns?: any[]; + /** + * Editing state. + */ + editing?: boolean; + /** + * Frozen state. + */ + frozen?: boolean; + }): TemplateRef; + /** + * Custom frozen footer template. + * @param {*} context - columns. + */ + frozenfooter(): TemplateRef<{ $implicit: any[] }>; + /** + * Custom frozen column group template. + * @param {*} context - columns. + */ + frozencolgroup(): TemplateRef<{ $implicit: any[] }>; + /** + * Custom frozen expanded row template. + * @param {Object} context - row data. + */ + frozenexpandedrow(context: { + /** + * Row span. + */ + rowspan?: number; + /** + * Row group. + */ + rowgroup?: number; + /** + * Expanded state. + */ + expanded: boolean; + }): TemplateRef; + /** + * Custom empty message template. + */ + emptymessage(context: { + /** + * Columns + */ + $implicit: any[]; + /** + * Frozen state. + */ + frozen: boolean; + }): TemplateRef<{ $implicit: any[]; frozen: boolean }>; + /** + * Custom paginator left template. + */ + paginatorleft(): TemplateRef; + /** + * Custom paginator right template. + */ + paginatorright(): TemplateRef; + /** + * Custom paginator dropdown trigger icon template. + */ + paginatordropdownicon(): TemplateRef; + /** + * Custom paginator dropdown item template. + */ + paginatordropdownitem(): TemplateRef; + /** + * Custom paginator first page link icon template. + */ + paginatorfirstpagelinkicon(): TemplateRef; + /** + * Custom paginator last page link icon template. + */ + paginatorlastpagelinkicon(): TemplateRef; + /** + * Custom paginator previous page link icon template. + */ + paginatorpreviouspagelinkicon(): TemplateRef; + /** + * Custom paginator next page link icon template. + */ + paginatornextpagelinkicon(): TemplateRef; + /** + * Custom loading icon template. + */ + loadingicon(): TemplateRef; + /** + * Custom reorder indicator up icon template. + */ + reorderindicatorupicon(): TemplateRef; + /** + * Custom reorder indicator down icon template. + */ + reorderindicatordownicon(): TemplateRef; + /** + * Custom sort icon template. + */ + sorticon(context: { + /** + * Sort order. + */ + $implicit: number; + }): TemplateRef<{ $implicit: number }>; + /** + * Custom checkbox icon template. + * @param {Object} context - checkbox data. + */ + checkboxicon(context: { + /** + * Checkbox state. + */ + $implicit: boolean; + /** + * Partial selection state of row node. + */ + partialSelected: boolean; + }): TemplateRef<{ $implicit: boolean; partialSelected: boolean }>; + /** + * Custom header checkbox icon template. + * @param {Object} context - checkbox data. + */ + headercheckboxicon(context: { + /** + * Checked state. + */ + $implicit: boolean; + }): TemplateRef<{ $implicit: boolean }>; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tabs/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tabs/public_api.ts new file mode 100644 index 000000000..af50aa717 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tabs/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tabs/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './tabs.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tabs/tabs.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tabs/tabs.types.ts new file mode 100644 index 000000000..d210dba25 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tabs/tabs.types.ts @@ -0,0 +1,135 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tabs/tabs.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Defines valid pass-through options in Tabs component. + * @template I Type of instance. + * + * @group Interface + */ +export interface TabsPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Tabs component. + * @see {@link TabsPassThroughOptions} + * + * @template I Type of instance. + */ +export type TabsPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in TabList component. + * @template I Type of instance. + * + * @group Interface + */ +export interface TabListPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the previous button's DOM element. + */ + prevButton?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the tab list's DOM element. + */ + tabList?: PassThroughOption; + /** + * Used to pass attributes to the active bar's DOM element. + */ + activeBar?: PassThroughOption; + /** + * Used to pass attributes to the next button's DOM element. + */ + nextButton?: PassThroughOption; +} + +/** + * Defines valid pass-through options in TabList component. + * @see {@link TabListPassThroughOptions} + * + * @template I Type of instance. + */ +export type TabListPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in Tab component. + * @template I Type of instance. + * + * @group Interface + */ +export interface TabPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Tab component. + * @see {@link TabPassThroughOptions} + * + * @template I Type of instance. + */ +export type TabPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in TabPanel component. + * @template I Type of instance. + * + * @group Interface + */ +export interface TabPanelPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in TabPanel component. + * @see {@link TabPanelPassThroughOptions} + * + * @template I Type of instance. + */ +export type TabPanelPassThrough = PassThrough>; + +/** + * Defines valid pass-through options in TabPanels component. + * @template I Type of instance. + * + * @group Interface + */ +export interface TabPanelsPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; +} + +/** + * Defines valid pass-through options in TabPanels component. + * @see {@link TabPanelsPassThroughOptions} + * + * @template I Type of instance. + */ +export type TabPanelsPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tag/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tag/public_api.ts new file mode 100644 index 000000000..03457ae06 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tag/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tag/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './tag.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tag/tag.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tag/tag.types.ts new file mode 100644 index 000000000..a7cb520ea --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tag/tag.types.ts @@ -0,0 +1,56 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tag/tag.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Tag.pt} + * @group Interface + */ +export interface TagPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Tag. + * @see {@link TagPassThroughOptions} + * + * @template I Type of instance. + */ +export type TagPassThrough = PassThrough>; + +/** + * Defines valid templates in Tag. + * @group Templates + */ +export interface TagTemplates { + /** + * Custom icon template. + */ + icon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/terminal/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/terminal/public_api.ts new file mode 100644 index 000000000..a4c0695d7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/terminal/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/terminal/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './terminal.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/terminal/terminal.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/terminal/terminal.types.ts new file mode 100644 index 000000000..bf9cb799b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/terminal/terminal.types.ts @@ -0,0 +1,68 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/terminal/terminal.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Terminal.pt} + * @group Interface + */ +export interface TerminalPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the welcome message's DOM element. + */ + welcomeMessage?: PassThroughOption; + /** + * Used to pass attributes to the command list's DOM element. + */ + commandList?: PassThroughOption; + /** + * Used to pass attributes to the command's DOM element. + */ + command?: PassThroughOption; + /** + * Used to pass attributes to the prompt label's DOM element. + */ + promptLabel?: PassThroughOption; + /** + * Used to pass attributes to the command value's DOM element. + */ + commandValue?: PassThroughOption; + /** + * Used to pass attributes to the command response's DOM element. + */ + commandResponse?: PassThroughOption; + /** + * Used to pass attributes to the prompt's DOM element. + */ + prompt?: PassThroughOption; + /** + * Used to pass attributes to the prompt value's DOM element. + */ + promptValue?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Terminal. + * @see {@link TerminalPassThroughOptions} + * + * @template I Type of instance. + */ +export type TerminalPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tieredmenu/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tieredmenu/public_api.ts new file mode 100644 index 000000000..7cfff3a7d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tieredmenu/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tieredmenu/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './tieredmenu.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tieredmenu/tieredmenu.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tieredmenu/tieredmenu.types.ts new file mode 100644 index 000000000..c6597351d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tieredmenu/tieredmenu.types.ts @@ -0,0 +1,105 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tieredmenu/tieredmenu.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link TieredMenu.pt} + * @group Interface + */ +export interface TieredMenuPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the root list's DOM element. + */ + rootList?: PassThroughOption; + /** + * Used to pass attributes to the submenu's DOM element. + */ + submenu?: PassThroughOption; + /** + * Used to pass attributes to the item's DOM element. + */ + item?: PassThroughOption; + /** + * Used to pass attributes to the item content's DOM element. + */ + itemContent?: PassThroughOption; + /** + * Used to pass attributes to the item link's DOM element. + */ + itemLink?: PassThroughOption; + /** + * Used to pass attributes to the item icon's DOM element. + */ + itemIcon?: PassThroughOption; + /** + * Used to pass attributes to the item label's DOM element. + */ + itemLabel?: PassThroughOption; + /** + * Used to pass attributes to the submenu icon's DOM element. + */ + submenuIcon?: PassThroughOption; + /** + * Used to pass attributes to the separator's DOM element. + */ + separator?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in TieredMenu. + * @see {@link TieredMenuPassThroughOptions} + * + * @template I Type of instance. + */ +export type TieredMenuPassThrough = PassThrough>; + +/** + * Custom item template context. + * @group Interface + */ +export interface TieredMenuItemTemplateContext { + /** + * Item instance. + */ + $implicit: any; + /** + * Whether the item has a submenu. + */ + hasSubmenu: boolean; +} + +/** + * Defines valid templates in TieredMenu. + * @group Templates + */ +export interface TieredMenuTemplates { + /** + * Custom item template. + * @param {TieredMenuItemTemplateContext} context - item context. + */ + item(context: TieredMenuItemTemplateContext): TemplateRef; + /** + * Custom submenu icon template. + */ + submenuicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/timeline/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/timeline/public_api.ts new file mode 100644 index 000000000..bc4b222fe --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/timeline/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/timeline/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './timeline.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/timeline/timeline.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/timeline/timeline.types.ts new file mode 100644 index 000000000..c26bd5913 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/timeline/timeline.types.ts @@ -0,0 +1,95 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/timeline/timeline.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Timeline.pt} + * @group Interface + */ +export interface TimelinePassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the event's DOM element. + */ + event?: PassThroughOption; + /** + * Used to pass attributes to the event opposite's DOM element. + */ + eventOpposite?: PassThroughOption; + /** + * Used to pass attributes to the event separator's DOM element. + */ + eventSeparator?: PassThroughOption; + /** + * Used to pass attributes to the event marker's DOM element. + */ + eventMarker?: PassThroughOption; + /** + * Used to pass attributes to the event connector's DOM element. + */ + eventConnector?: PassThroughOption; + /** + * Used to pass attributes to the event content's DOM element. + */ + eventContent?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Timeline. + * @see {@link TimelinePassThroughOptions} + * + * @template I Type of instance. + */ +export type TimelinePassThrough = PassThrough>; + +/** + * Custom item template context. + * @template T Type of item. + * @group Interface + */ +export interface TimelineItemTemplateContext { + /** + * Item instance. + */ + $implicit: T; +} + +/** + * Defines valid templates in Timeline. + * @group Templates + */ +export interface TimelineTemplates { + /** + * Custom content template. + * @param {TimelineItemTemplateContext} context - item data. + */ + content(context: TimelineItemTemplateContext): TemplateRef>; + /** + * Custom opposite item template. + * @param {TimelineItemTemplateContext} context - item data. + */ + opposite(context: TimelineItemTemplateContext): TemplateRef>; + /** + * Custom marker template. + * @param {TimelineItemTemplateContext} context - item data. + */ + marker(context: TimelineItemTemplateContext): TemplateRef>; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/toast/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/toast/public_api.ts new file mode 100644 index 000000000..3e1acb062 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/toast/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/toast/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './toast.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/toast/toast.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/toast/toast.types.ts new file mode 100644 index 000000000..4eb118d26 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/toast/toast.types.ts @@ -0,0 +1,145 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/toast/toast.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { MotionOptions } from '../../../primeuix-temp/motion/src/index'; +import type { PassThrough, PassThroughOption, ToastMessageOptions } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options for Toast. + * @template I Type of instance. + * + * @see {@link Toast.pt} + * @group Interface + */ +export interface ToastPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the message's DOM element. + */ + message?: PassThroughOption; + /** + * Used to pass attributes to the message content's DOM element. + */ + messageContent?: PassThroughOption; + /** + * Used to pass attributes to the message icon's DOM element. + */ + messageIcon?: PassThroughOption; + /** + * Used to pass attributes to the message text's DOM element. + */ + messageText?: PassThroughOption; + /** + * Used to pass attributes to the summary's DOM element. + */ + summary?: PassThroughOption; + /** + * Used to pass attributes to the detail's DOM element. + */ + detail?: PassThroughOption; + /** + * Used to pass attributes to the close button's DOM element. + */ + closeButton?: PassThroughOption; + /** + * Used to pass attributes to the close icon's DOM element. + */ + closeIcon?: PassThroughOption; + /** + * Used to pass options to the motion component/directive. + */ + motion?: MotionOptions; +} + +/** + * Defines valid pass-through options in Toast. + * @see {@link ToastPassThroughOptions} + * + * @template I Type of instance. + */ +export type ToastPassThrough = PassThrough>; + +/** + * Custom message template context. + * @group Interface + */ +export interface ToastMessageTemplateContext { + /** + * Message instance. + */ + $implicit: ToastMessageOptions | null | undefined; +} + +/** + * Custom headless template context. + * @group Interface + */ +export interface ToastHeadlessTemplateContext { + /** + * Message instance. + */ + $implicit: ToastMessageOptions | null | undefined; + /** + * Callback to close the toast. + */ + closeFn: (event: Event) => void; +} + +/** + * Defines valid templates in Toast. + * @group Templates + */ +export interface ToastTemplates { + /** + * Custom message template. + * @param {ToastMessageTemplateContext} context - message context. + */ + message(context: ToastMessageTemplateContext): TemplateRef; + /** + * Custom headless template. + * @param {ToastHeadlessTemplateContext} context - headless context. + */ + headless(context: ToastHeadlessTemplateContext): TemplateRef; +} + +/** + * Defines the position type for Toast. + */ +export type ToastPositionType = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' | 'center'; + +/** + * Custom close event. + * @see {@link Toast.onClose} + * @group Events + */ +export interface ToastCloseEvent { + /** + * Message of the closed element. + */ + message: ToastMessageOptions; +} + +/** + * Custom close event. + * @see {@link ToastItem.onClose} + */ +export interface ToastItemCloseEvent extends ToastCloseEvent { + /** + * Index of the closed element. + */ + index: number; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/togglebutton/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/togglebutton/public_api.ts new file mode 100644 index 000000000..9b030c970 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/togglebutton/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/togglebutton/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './togglebutton.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/togglebutton/togglebutton.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/togglebutton/togglebutton.types.ts new file mode 100644 index 000000000..b6203e5de --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/togglebutton/togglebutton.types.ts @@ -0,0 +1,98 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/togglebutton/togglebutton.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link ToggleButtonProps.pt} + * @group Interface + */ +export interface ToggleButtonPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the content's DOM element. + */ + content?: PassThroughOption; + /** + * Used to pass attributes to the icon's DOM element. + */ + icon?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; +} + +/** + * Custom passthrough attributes for each DOM elements + * @group Interface + */ +export type ToggleButtonPassThrough = PassThrough>; + +/** + * Custom change event. + * @see {@link ToggleButton.onChange} + * @group Events + */ +export interface ToggleButtonChangeEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Checked state as a boolean. + */ + checked: boolean; +} + +/** + * Custom icon template context. + * @group Interface + */ +export interface ToggleButtonIconTemplateContext { + /** + * Checked state. + */ + $implicit: boolean; +} + +/** + * Custom content template context. + * @group Interface + */ +export interface ToggleButtonContentTemplateContext { + /** + * Checked state. + */ + $implicit: boolean; +} + +/** + * Defines valid templates in ToggleButton. + * @group Templates + */ +export interface ToggleButtonTemplates { + /** + * Custom icon template. + * @param {ToggleButtonIconTemplateContext} context - icon context. + */ + icon(context: ToggleButtonIconTemplateContext): TemplateRef; + /** + * Custom content template. + * @param {ToggleButtonContentTemplateContext} context - content context. + */ + content(context: ToggleButtonContentTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/toggleswitch/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/toggleswitch/public_api.ts new file mode 100644 index 000000000..64d598b03 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/toggleswitch/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/toggleswitch/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './toggleswitch.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/toggleswitch/toggleswitch.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/toggleswitch/toggleswitch.types.ts new file mode 100644 index 000000000..c0a6fd469 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/toggleswitch/toggleswitch.types.ts @@ -0,0 +1,84 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/toggleswitch/toggleswitch.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom passthrough(pt) options. + * @template I Type of instance. + * + * @see {@link ToggleSwitch.pt} + * @group Interface + */ +export interface ToggleSwitchPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the input's DOM element. + */ + input?: PassThroughOption; + /** + * Used to pass attributes to the slider's DOM element. + */ + slider?: PassThroughOption; + /** + * Used to pass attributes to the handle's DOM element. + */ + handle?: PassThroughOption; +} + +/** + * Defines valid pass-through options in ToggleSwitch component. + * @see {@link ToggleSwitchPassThroughOptions} + * + * @template I Type of instance. + */ +export type ToggleSwitchPassThrough = PassThrough>; + +/** + * Custom change event. + * @see {@link ToggleSwitch.onChange} + * @group Events + */ +export interface ToggleSwitchChangeEvent { + /** + * Browser event + */ + originalEvent: Event; + /** + * Checked state as a boolean. + */ + checked: boolean; +} + +/** + * Custom handle template context. + * @group Interface + */ +export interface ToggleSwitchHandleTemplateContext { + /** + * Checked state of the toggle switch. + */ + checked: boolean; +} + +/** + * Defines valid templates in ToggleSwitch. + * @group Templates + */ +export interface ToggleSwitchTemplates { + /** + * Custom handle template. + * @param {ToggleSwitchHandleTemplateContext} context - handle context. + */ + handle(context: ToggleSwitchHandleTemplateContext): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/toolbar/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/toolbar/public_api.ts new file mode 100644 index 000000000..dcce41e2d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/toolbar/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/toolbar/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './toolbar.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/toolbar/toolbar.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/toolbar/toolbar.types.ts new file mode 100644 index 000000000..ded498c15 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/toolbar/toolbar.types.ts @@ -0,0 +1,64 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/toolbar/toolbar.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Toolbar.pt} + * @group Interface + */ +export interface ToolbarPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the start's DOM element. + */ + start?: PassThroughOption; + /** + * Used to pass attributes to the center's DOM element. + */ + center?: PassThroughOption; + /** + * Used to pass attributes to the right's DOM element. + */ + end?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Toolbar component. + * @see {@link ToolbarPassThroughOptions} + * + * @template I Type of instance. + */ +export type ToolbarPassThrough = PassThrough>; + +/** + * Defines valid templates in Toolbar. + * @group Templates + */ +export interface ToolbarTemplates { + /** + * Custom start template. + */ + start(): TemplateRef; + /** + * Custom end template. + */ + end(): TemplateRef; + /** + * Custom center template. + */ + center(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tooltip/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tooltip/public_api.ts new file mode 100644 index 000000000..35c275172 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tooltip/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tooltip/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './tooltip.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tooltip/tooltip.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tooltip/tooltip.types.ts new file mode 100644 index 000000000..382f99295 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tooltip/tooltip.types.ts @@ -0,0 +1,40 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tooltip/tooltip.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import type { PassThrough, PassThroughOption } from '../../api/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Tooltip.pt} + * @group Interface + */ +export interface TooltipPassThroughOptions { + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the arrow's DOM element. + */ + arrow?: PassThroughOption; + /** + * Used to pass attributes to the text's DOM element. + */ + text?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Tooltip. + * @see {@link TooltipPassThroughOptions} + * + * @template I Type of instance. + */ +export type TooltipPassThrough = PassThrough>; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tree/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tree/public_api.ts new file mode 100644 index 000000000..5cb51c102 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tree/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tree/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './tree.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/tree/tree.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/tree/tree.types.ts new file mode 100644 index 000000000..1437468e1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/tree/tree.types.ts @@ -0,0 +1,361 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/tree/tree.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption } from '../../api/public_api'; +import { ScrollerOptions, TreeNode } from '../../api/public_api'; +import type { CheckboxPassThrough } from '../checkbox/public_api'; +import type { IconFieldPassThrough } from '../iconfield/public_api'; +import type { InputIconPassThrough } from '../inputicon/public_api'; +import type { InputTextPassThrough } from '../inputtext/public_api'; +import type { VirtualScrollerPassThrough } from '../scroller/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link Tree.pt} + * @group Interface + */ +export interface TreePassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the loading mask's DOM element. + */ + mask?: PassThroughOption; + /** + * Used to pass attributes to the loading icon's DOM element. + */ + loadingIcon?: PassThroughOption; + /** + * Used to pass attributes to the filter container's DOM element. + */ + pcFilterContainer?: IconFieldPassThrough; + /** + * Used to pass attributes to the filter icon container's DOM element. + */ + pcFilterIconContainer?: InputIconPassThrough; + /** + * Used to pass attributes to the filter input's DOM element. + */ + pcFilterInput?: InputTextPassThrough; + /** + * Used to pass attributes to the filter icon's DOM element. + */ + filterIcon?: PassThroughOption; + /** + * Used to pass attributes to the Scroller component. + */ + pcScroller?: VirtualScrollerPassThrough; + /** + * Used to pass attributes to the wrapper's DOM element. + */ + wrapper?: PassThroughOption; + /** + * Used to pass attributes to the root children's DOM element. + */ + rootChildren?: PassThroughOption; + /** + * Used to pass attributes to the node's DOM element. + */ + node?: PassThroughOption; + /** + * Used to pass attributes to the drop point's DOM element. + */ + dropPoint?: PassThroughOption; + /** + * Used to pass attributes to the node content's DOM element. + */ + nodeContent?: PassThroughOption; + /** + * Used to pass attributes to the node toggle button's DOM element. + */ + nodeToggleButton?: PassThroughOption; + /** + * Used to pass attributes to the node toggle icon's DOM element. + */ + nodeTogglerIcon?: PassThroughOption; + /** + * Used to pass attributes to the node checkbox's DOM element. + */ + pcNodeCheckbox?: CheckboxPassThrough; + /** + * Used to pass attributes to the node icon's DOM element. + */ + nodeIcon?: PassThroughOption; + /** + * Used to pass attributes to the node label's DOM element. + */ + nodeLabel?: PassThroughOption; + /** + * Used to pass attributes to the node children's DOM element. + */ + nodeChildren?: PassThroughOption; + /** + * Used to pass attributes to the empty message's DOM element. + */ + emptyMessage?: PassThroughOption; +} + +/** + * Defines valid pass-through options in Tree. + * @see {@link TreePassThroughOptions} + * + * @template I Type of instance. + */ +export type TreePassThrough = PassThrough>; + +/** + * Custom node select event. + * @see {@link Tree.onNodeSelect} + * @group Events + */ +export interface TreeNodeSelectEvent { + /** + * Browser event + */ + originalEvent: Event; + /** + * Node instance. + */ + node: TreeNode; +} + +/** + * Custom node unselect event. + * @see {@link Tree.onNodeUnSelect} + * @extends {TreeNodeSelectEvent} + * @group Events + */ +export interface TreeNodeUnSelectEvent extends TreeNodeSelectEvent {} + +/** + * Custom node expand event. + * @see {@link Tree.onNodeExpand} + * @extends {TreeNodeSelectEvent} + * @group Events + */ +export interface TreeNodeExpandEvent extends TreeNodeSelectEvent {} + +/** + * Custom node collapse event. + * @see {@link Tree.onNodeCollapse} + * @extends {TreeNodeSelectEvent} + * @group Events + */ +export interface TreeNodeCollapseEvent extends TreeNodeSelectEvent {} + +/** + * Custom context menu select event. + * @see {@link Tree.onNodeContextMenuSelect} + * @extends {TreeNodeSelectEvent} + * @group Events + */ +export interface TreeNodeContextMenuSelectEvent extends TreeNodeSelectEvent {} + +/** + * Custom node double click event. + * @see {@link Tree.onNodeDoubleClick} + * @extends {TreeNodeSelectEvent} + * @group Events + */ +export interface TreeNodeDoubleClickEvent extends TreeNodeSelectEvent {} + +/** + * Custom node drop event. + * @see {@link Tree.onNodeDrop} + * @group Events + */ +export interface TreeNodeDropEvent { + /** + * Browser drag event. + */ + originalEvent?: DragEvent; + /** + * Dragged node instance. + */ + dragNode?: TreeNode | null; + /** + * Dropped node instance. + */ + dropNode?: TreeNode | null; + /** + * Index of the dragged node. + */ + index?: number; + /** + * Callback to invoke on drop. + */ + accept?: Function; +} + +/** + * Custom lazy load event. + * @see {@link Tree.onLazyLoad} + * @group Events + */ +export interface TreeLazyLoadEvent { + /** + * First element index in viewport. + */ + first: number; + /** + * Last element index in viewport. + */ + last: number; +} + +/** + * Custom scroll index change event. + * @see {@link Tree.onScrollIndexChange} + * @group Events + */ +export interface TreeScrollIndexChangeEvent extends TreeLazyLoadEvent {} + +/** + * Custom scroll event. + * @see {@link Tree.onScroll} + * @group Events + */ +export interface TreeScrollEvent { + /** + * Browser event. + */ + originalEvent?: Event; +} + +/** + * Custom filter event. + * @see {@link Tree.onFilter} + * @group Events + */ +export interface TreeFilterEvent { + /** + * Filter value. + */ + filter: string; + /** + * Filtered nodes. + */ + filteredValue: TreeNode[] | null | undefined; +} + +/** + * Custom filter template context. + * @group Interface + */ +export interface TreeFilterTemplateContext { + /** + * Filter options with filter and reset methods. + */ + $implicit: { + filter: (value: string) => void; + reset: () => void; + }; +} + +/** + * Custom loader template context. + * @group Interface + */ +export interface TreeLoaderTemplateContext { + /** + * Scroller options. + * @see {@link ScrollerOptions} + */ + options: ScrollerOptions; +} + +/** + * Custom toggler icon template context. + * @group Interface + */ +export interface TreeTogglerIconTemplateContext { + /** + * Expanded state of the node. + */ + $implicit: boolean; + /** + * Loading state of the node. + */ + loading: boolean; +} + +/** + * Custom checkbox icon template context. + * @group Interface + */ +export interface TreeCheckboxIconTemplateContext { + /** + * Checked state of the node. + */ + $implicit: boolean; + /** + * Partial selection state of the node. + */ + partialSelected: boolean; + /** + * Style class of the checkbox. + */ + class: string; +} + +/** + * Defines valid templates in Tree. + * @group Templates + */ +export interface TreeTemplates { + /** + * Custom header template. + */ + header(): TemplateRef; + /** + * Custom empty message template. + */ + empty(): TemplateRef; + /** + * Custom footer template. + */ + footer(): TemplateRef; + /** + * Custom filter template. + * @param {TreeFilterTemplateContext} context - filter context. + */ + filter(context: TreeFilterTemplateContext): TemplateRef; + /** + * Custom loader template. + * @param {TreeLoaderTemplateContext} context - loader context. + */ + loader(context: TreeLoaderTemplateContext): TemplateRef; + /** + * Custom toggler icon template. + * @param {TreeTogglerIconTemplateContext} context - toggler icon context. + */ + togglericon(context: TreeTogglerIconTemplateContext): TemplateRef; + /** + * Custom checkbox icon template. + * @param {TreeCheckboxIconTemplateContext} context - checkbox icon context. + */ + checkboxicon(context: TreeCheckboxIconTemplateContext): TemplateRef; + /** + * Custom loading icon template. + */ + loadingicon(): TemplateRef; + /** + * Custom filter icon template. + */ + filtericon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/treeselect/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/treeselect/public_api.ts new file mode 100644 index 000000000..a2621949b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/treeselect/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/treeselect/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './treeselect.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/treeselect/treeselect.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/treeselect/treeselect.types.ts new file mode 100644 index 000000000..2f1cf0936 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/treeselect/treeselect.types.ts @@ -0,0 +1,265 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/treeselect/treeselect.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { PassThrough, PassThroughOption, TreeNode } from '../../api/public_api'; +import { ChipPassThrough } from '../chip/public_api'; +import { OverlayPassThrough } from '../overlay/public_api'; +import { TreePassThrough } from '../tree/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link TreeSelect.pt} + * @group Interface + */ +export interface TreeSelectPassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the hidden input container's DOM element. + */ + hiddenInputContainer?: PassThroughOption; + /** + * Used to pass attributes to the hidden input's DOM element. + */ + hiddenInput?: PassThroughOption; + /** + * Used to pass attributes to the label container's DOM element. + */ + labelContainer?: PassThroughOption; + /** + * Used to pass attributes to the label's DOM element. + */ + label?: PassThroughOption; + /** + * Used to pass attributes to the chip item's DOM element. + */ + chipItem?: PassThroughOption; + /** + * Used to pass attributes to the Chip component. + */ + pcChip?: ChipPassThrough; + /** + * Used to pass attributes to the clear icon's DOM element. + */ + clearIcon?: PassThroughOption; + /** + * Used to pass attributes to the dropdown's DOM element. + */ + dropdown?: PassThroughOption; + /** + * Used to pass attributes to the dropdown icon's DOM element. + */ + dropdownIcon?: PassThroughOption; + /** + * Used to pass attributes to the panel's DOM element. + */ + panel?: PassThroughOption; + /** + * Used to pass attributes to the first hidden focusable element's DOM element. + */ + hiddenFirstFocusableEl?: PassThroughOption; + /** + * Used to pass attributes to the tree container's DOM element. + */ + treeContainer?: PassThroughOption; + /** + * Used to pass attributes to the Tree component. + */ + pcTree?: TreePassThrough; + /** + * Used to pass attributes to the last hidden focusable element's DOM element. + */ + hiddenLastFocusableEl?: PassThroughOption; + /** + * Used to pass attributes to the Overlay component. + */ + pcOverlay?: OverlayPassThrough; +} + +/** + * Custom passthrough attributes for each DOM elements + * @group Interface + */ +export type TreeSelectPassThrough = PassThrough>; + +/** + * Defines valid properties in TreeSelectNodeExpandEvent. + * @group Interface + */ +export interface TreeSelectNodeExpandEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Expanded node instance. + */ + node: TreeNode; +} + +/** + * Defines valid properties in TreeSelectNodeCollapseEvent. + * @group Interface + */ +export interface TreeSelectNodeCollapseEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Collapsed node instance. + */ + node: TreeNode; +} + +/** + * Custom node collapse event. + * @see {@link TreeSelect.onNodeCollapse} + * @group Events + */ +export interface TreeSelectNodeCollapseEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Node instance. + */ + node: TreeNode; +} +/** + * Custom node expand event. + * @see {@link TreeSelect.onNodeExpand} + * @group Events + */ +export interface TreeSelectNodeExpandEvent extends TreeSelectNodeCollapseEvent {} +/** + * Custom value template context. + * @group Interface + */ +export interface TreeSelectValueTemplateContext { + /** + * Value of the component. + */ + $implicit: any; + /** + * Placeholder of the component. + */ + placeholder: string | undefined; +} + +/** + * Custom header/footer template context. + * @group Interface + */ +export interface TreeSelectHeaderTemplateContext { + /** + * Value of the component. + */ + $implicit: any; + /** + * Options of the component. + */ + options: TreeNode[] | undefined; +} + +/** + * Custom item toggler icon template context. + * @group Interface + */ +export interface TreeSelectItemTogglerIconTemplateContext { + /** + * Expanded state of the node. + */ + $implicit: boolean; +} + +/** + * Custom item checkbox icon template context. + * @group Interface + */ +export interface TreeSelectItemCheckboxIconTemplateContext { + /** + * Selected state of the node. + */ + $implicit: boolean; + /** + * Partial selection state of the node. + */ + partialSelected: boolean; +} + +/** + * Defines valid templates in TreeSelect. + * @group Templates + */ +export interface TreeSelectTemplates { + /** + * Custom value template. + * @param {TreeSelectValueTemplateContext} context - value context. + */ + value(context: TreeSelectValueTemplateContext): TemplateRef; + /** + * Custom header template. + * @param {TreeSelectHeaderTemplateContext} context - header context. + */ + header(context: TreeSelectHeaderTemplateContext): TemplateRef; + /** + * Custom footer template. + * @param {TreeSelectHeaderTemplateContext} context - footer context. + */ + footer(context: TreeSelectHeaderTemplateContext): TemplateRef; + /** + * Custom empty template. + */ + empty(): TemplateRef; + /** + * Custom clear icon template. + */ + clearicon(): TemplateRef; + /** + * Custom dropdown trigger icon template. + */ + triggericon(): TemplateRef; + /** + * Custom dropdown icon template. + */ + dropdownicon(): TemplateRef; + /** + * Custom filter icon template. + */ + filtericon(): TemplateRef; + /** + * Custom close icon template. + */ + closeicon(): TemplateRef; + /** + * Custom item toggler icon template. + * @param {TreeSelectItemTogglerIconTemplateContext} context - toggler icon context. + */ + itemtogglericon(context: TreeSelectItemTogglerIconTemplateContext): TemplateRef; + /** + * Custom item checkbox icon template. + * @param {TreeSelectItemCheckboxIconTemplateContext} context - checkbox icon context. + */ + itemcheckboxicon(context: TreeSelectItemCheckboxIconTemplateContext): TemplateRef; + /** + * Custom item loading icon template. + */ + itemloadingicon(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/treetable/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/treetable/public_api.ts new file mode 100644 index 000000000..2516f6815 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/treetable/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/treetable/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './treetable.types'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/types/treetable/treetable.types.ts b/projects/cps-ui-kit/src/lib/primeng-temp/types/treetable/treetable.types.ts new file mode 100644 index 000000000..5af27a124 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/types/treetable/treetable.types.ts @@ -0,0 +1,641 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/types/treetable/treetable.types.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { TemplateRef } from '@angular/core'; +import type { FilterMetadata, LazyLoadMeta, PassThrough, PassThroughOption, SortMeta, TreeNode, TreeTableNode } from '../../api/public_api'; +import type { BadgePassThrough } from '../badge/public_api'; +import type { CheckboxPassThrough } from '../checkbox/public_api'; +import type { PaginatorPassThrough } from '../paginator/public_api'; +import type { VirtualScrollerPassThrough } from '../scroller/public_api'; + +/** + * Custom pass-through(pt) options. + * @template I Type of instance. + * + * @see {@link TreeTableProps.pt} + * @group Interface + */ +export interface TreeTablePassThroughOptions { + /** + * Used to pass attributes to the host's DOM element. + */ + host?: PassThroughOption; + /** + * Used to pass attributes to the root's DOM element. + */ + root?: PassThroughOption; + /** + * Used to pass attributes to the loading's DOM element. + */ + loading?: PassThroughOption; + /** + * Used to pass attributes to the mask's DOM element. + */ + mask?: PassThroughOption; + /** + * Used to pass attributes to the loading icon's DOM element. + */ + loadingIcon?: PassThroughOption; + /** + * Used to pass attributes to the header's DOM element. + */ + header?: PassThroughOption; + /** + * Used to pass attributes to the Paginator component. + * @see {@link PaginatorPassThrough} + */ + pcPaginator?: PaginatorPassThrough; + /** + * Used to pass attributes to the wrapper's DOM element. + */ + wrapper?: PassThroughOption; + /** + * Used to pass attributes to the table's DOM element. + */ + table?: PassThroughOption; + /** + * Used to pass attributes to the thead's DOM element. + */ + thead?: PassThroughOption; + /** + * Used to pass attributes to the tbody's DOM element. + */ + tbody?: PassThroughOption; + /** + * Used to pass attributes to the tfoot's DOM element. + */ + tfoot?: PassThroughOption; + /** + * Used to pass attributes to the footer's DOM element. + */ + footer?: PassThroughOption; + /** + * Used to pass attributes to the scrollable wrapper's DOM element. + */ + scrollableWrapper?: PassThroughOption; + /** + * Used to pass attributes to the scrollable container's DOM element. + */ + scrollableView?: PassThroughOption; + /** + * Used to pass attributes to the scrollable header's DOM element. + */ + scrollableHeader?: PassThroughOption; + /** + * Used to pass attributes to the scrollable header box's DOM element. + */ + scrollableHeaderBox?: PassThroughOption; + /** + * Used to pass attributes to the scrollable header table's DOM element. + */ + scrollableHeaderTable?: PassThroughOption; + /** + * Used to pass attributes to the Scroller component. + * @see {@link VirtualScrollerPassThrough} + */ + virtualScroller?: VirtualScrollerPassThrough; + /** + * Used to pass attributes to the scrollable body's DOM element. + */ + scrollableBody?: PassThroughOption; + /** + * Used to pass attributes to the scrollable footer's DOM element. + */ + scrollableFooter?: PassThroughOption; + /** + * Used to pass attributes to the scrollable footer box's DOM element. + */ + scrollableFooterBox?: PassThroughOption; + /** + * Used to pass attributes to the scrollable footer table's DOM element. + */ + scrollableFooterTable?: PassThroughOption; + /** + * Used to pass attributes to the column resizer helper's DOM element. + */ + columnResizerHelper?: PassThroughOption; + /** + * Used to pass attributes to the reorder indicator up's DOM element. + */ + reorderIndicatorUp?: PassThroughOption; + /** + * Used to pass attributes to the reorder indicator down's DOM element. + */ + reorderIndicatorDown?: PassThroughOption; + /** + * Used to pass attributes to the sortable column's DOM element. + */ + sortableColumn?: PassThroughOption; + /** + * Used to pass attributes to the sortable column icon's DOM element. + */ + sortableColumnIcon?: PassThroughOption; + /** + * Used to pass attributes to the Badge component for sortable column. + * @see {@link BadgePassThrough} + */ + pcSortableColumnBadge?: BadgePassThrough; + /** + * Used to pass attributes to the row's DOM element. + */ + row?: PassThroughOption; + /** + * Used to pass attributes to the Checkbox component for row. + * @see {@link CheckboxPassThrough} + */ + pcRowCheckbox?: CheckboxPassThrough; + /** + * Used to pass attributes to the Checkbox component for header. + * @see {@link CheckboxPassThrough} + */ + pcHeaderCheckbox?: CheckboxPassThrough; + /** + * Used to pass attributes to the cell editor's DOM element. + */ + cellEditor?: PassThroughOption; + /** + * Used to pass attributes to the row toggle button's DOM element. + */ + rowToggleButton?: PassThroughOption; + /** + * Used to pass attributes to the toggler's DOM element. + */ + toggler?: PassThroughOption; +} + +/** + * Defines valid pass-through options in TreeTable. + * @see {@link TreeTablePassThroughOptions} + * + * @template I Type of instance. + */ +export type TreeTablePassThrough = PassThrough>; + +/** + * Paginator state. + * @group Interface + */ +export interface TreeTablePaginatorState { + /** + * Current page. + */ + page?: number; + /** + * Index of the first element. + */ + first?: number; + /** + * Row count. + */ + rows?: number; + /** + * Page count. + */ + pageCount?: number; +} +/** + * Custom lazy load event. + * @see {@link TreeTable.onLazyLoad} + * @extends {LazyLoadMeta} + * @group Events + */ +export interface TreeTableLazyLoadEvent extends LazyLoadMeta { + /** + * First element in viewport. + */ + first: any; + /** + * Last element in viewport. + */ + last: any; +} +/** + * Custom column reorder event. + * @see {@link TreeTable.onColReorder} + * @group Events + */ +export interface TreeTableColumnReorderEvent { + /** + * Index of the dragged item. + */ + dragIndex?: number; + /** + * Index of the drop position. + */ + dropIndex?: number; + /** + * Columns after reorder. + */ + columns?: any[]; +} +/** + * Custom filter event. + * @see {@link TreeTable.onFilter} + * @group Events + */ +export interface TreeTableFilterEvent { + /** + * Filter meta. + */ + filters?: { [s: string]: FilterMetadata | undefined }; + /** + * Value after filter. + */ + filteredValue?: TreeNode[]; +} +/** + * Custom node expand event. + * @see {@link TreeTable.onNodeExpand} + * @group Events + */ +export interface TreeTableNodeExpandEvent extends TreeTableNodeCollapseEvent {} +/** + * Custom node collapse event. + * @see {@link TreeTable.onNodeCollapse} + * @group Events + */ +export interface TreeTableNodeCollapseEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Node instance. + */ + node: TreeTableNode; +} +/** + * Custom sort event. + * @see {@link TreeTable.onSort} + * @see {@link TreeTable.sortFunction} + * @group Events + */ +export interface TreeTableSortEvent { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Value to be sorted. + */ + data?: TreeNode[]; + /** + * Sort mode. + */ + mode?: 'single' | 'multiple'; + /** + * Sort field. + */ + field?: string; + /** + * Sort order. + */ + order?: number; + /** + * Multiple sort meta. + */ + multiSortMeta?: SortMeta[] | null | undefined; + /** + * Multiple sort meta. + */ + multisortmeta?: any; + /** + * Sort meta. + */ + sortMeta?: SortMeta; +} +/** + * Custom column resize event. + * @see {@link TreeTable.onColResize} + * @group Events + */ +export interface TreeTableColResizeEvent { + /** + * Instance of resized column. + */ + element: HTMLElement; + /** + * Position. + */ + delta: number; +} +/** + * Custom node select event. + * @see {@link TreeTable.onNodeSelect} + * @extends {TreeTableNode} + * @group Events + */ +export interface TreeTableNodeSelectEvent extends TreeTableNode {} +/** + * Custom node unselect event. + * @see {@link TreeTable.onNodeUnSelect} + * @group Events + */ +export interface TreeTableNodeUnSelectEvent { + /** + * Browser event. + */ + originalEvent?: Event; + /** + * Node instance. + */ + node?: TreeTableNode; + /** + * Selection type. + */ + type?: string; +} +/** + * Custom context menu select event. + * @see {@link TreeTable.onContextMenuSelect} + * @group Events + */ +export interface TreeTableContextMenuSelectEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Node instance. + */ + node: TreeTableNode; +} +/** + * Custom checkbox toggle event. + * @see {@link TreeTable.onHeaderCheckboxToggle} + * @group Events + */ +export interface TreeTableHeaderCheckboxToggleEvent { + /** + * Browser event. + */ + originalEvent: Event; + /** + * Checked state. + */ + checked: boolean; +} +/** + * Custom edit event. + * @see {@link TreeTable.onEditInit} + * @see {@link TreeTable.onEditCancel} + * @see {@link TreeTable.onEditComplete} + * @group Events + */ +export interface TreeTableEditEvent { + /** + * Field to be edited. + */ + field: string; + /** + * New value. + */ + data: string; +} +/** + * Filtering options. + * @group Interface + */ +export interface TreeTableFilterOptions { + /** + * Field to be filtered. + */ + filterField: string; + /** + * Value to use when filtering. + */ + filterValue: any; + /** + * Filter constraints. + */ + filterConstraint: (dataFieldValue: any, filterValue: any, filterLocale: string) => boolean; + /** + * Boolean value that defines if strict mode enabled. + */ + isStrictMode: boolean; +} +/** + * Custom columns template context. + * @group Interface + */ +export interface TreeTableColumnsTemplateContext { + /** + * Columns instance. + */ + $implicit: any[]; +} + +/** + * Custom body template context. + * @group Interface + */ +export interface TreeTableBodyTemplateContext { + /** + * Node instance. + */ + $implicit: TreeNode; + /** + * Serialized node. + */ + node: TreeNode; + /** + * Row data. + */ + rowData: any; + /** + * Columns instance. + */ + columns: any[]; +} + +/** + * Custom empty message template context. + * @group Interface + */ +export interface TreeTableEmptyMessageTemplateContext { + /** + * Columns instance. + */ + $implicit: any[]; + /** + * Whether the column is frozen. + */ + frozen: boolean; +} + +/** + * Custom sort icon template context. + * @group Interface + */ +export interface TreeTableSortIconTemplateContext { + /** + * Sort order. + */ + $implicit: number; +} + +/** + * Custom checkbox icon template context. + * @group Interface + */ +export interface TreeTableCheckboxIconTemplateContext { + /** + * Checkbox state. + */ + $implicit: boolean; + /** + * Partial selection state of row node. + */ + partialSelected: boolean; +} + +/** + * Custom header checkbox icon template context. + * @group Interface + */ +export interface TreeTableHeaderCheckboxIconTemplateContext { + /** + * Checkbox state. + */ + $implicit: boolean; +} + +/** + * Custom toggler icon template context. + * @group Interface + */ +export interface TreeTableTogglerIconTemplateContext { + /** + * Expand state of row node. + */ + $implicit: boolean; +} + +/** + * Defines valid templates in TreeTable. + * @group Templates + */ +export interface TreeTableTemplates { + /** + * Custom caption template. + */ + caption(): TemplateRef; + /** + * Custom header template. + * @param {TreeTableColumnsTemplateContext} context - header context. + */ + header(context: TreeTableColumnsTemplateContext): TemplateRef; + /** + * Custom body template. + * @param {TreeTableBodyTemplateContext} context - body context. + */ + body(context: TreeTableBodyTemplateContext): TemplateRef; + /** + * Custom footer template. + * @param {TreeTableColumnsTemplateContext} context - footer context. + */ + footer(context: TreeTableColumnsTemplateContext): TemplateRef; + /** + * Custom summary template. + */ + summary(): TemplateRef; + /** + * Custom colgroup template. + * @param {TreeTableColumnsTemplateContext} context - column group context. + */ + colgroup(context: TreeTableColumnsTemplateContext): TemplateRef; + /** + * Custom empty message template. + * @param {TreeTableEmptyMessageTemplateContext} context - empty message context. + */ + emptymessage(context: TreeTableEmptyMessageTemplateContext): TemplateRef; + /** + * Custom paginator left section template. + */ + paginatorleft(): TemplateRef; + /** + * Custom paginator right section template. + */ + paginatorright(): TemplateRef; + /** + * Custom paginator dropdown item template. + */ + paginatordropdownitem(): TemplateRef; + /** + * Custom frozen header template. + * @param {TreeTableColumnsTemplateContext} context - frozen header context. + */ + frozenheader(context: TreeTableColumnsTemplateContext): TemplateRef; + /** + * Custom frozen body template. + */ + frozenbody(): TemplateRef; + /** + * Custom frozen footer template. + * @param {TreeTableColumnsTemplateContext} context - frozen footer context. + */ + frozenfooter(context: TreeTableColumnsTemplateContext): TemplateRef; + /** + * Custom frozen column group template. + * @param {TreeTableColumnsTemplateContext} context - frozen column group context. + */ + frozencolgroup(context: TreeTableColumnsTemplateContext): TemplateRef; + /** + * Custom loading icon template. + */ + loadingicon(): TemplateRef; + /** + * Custom reorder indicator up icon template. + */ + reorderindicatorupicon(): TemplateRef; + /** + * Custom reorder indicator down icon template. + */ + reorderindicatordownicon(): TemplateRef; + /** + * Custom sort icon template. + * @param {TreeTableSortIconTemplateContext} context - sort icon context. + */ + sorticon(context: TreeTableSortIconTemplateContext): TemplateRef; + /** + * Custom checkbox icon template. + * @param {TreeTableCheckboxIconTemplateContext} context - checkbox icon context. + */ + checkboxicon(context: TreeTableCheckboxIconTemplateContext): TemplateRef; + /** + * Custom header checkbox icon template. + * @param {TreeTableHeaderCheckboxIconTemplateContext} context - header checkbox icon context. + */ + headercheckboxicon(context: TreeTableHeaderCheckboxIconTemplateContext): TemplateRef; + /** + * Custom toggler icon template. + * @param {TreeTableTogglerIconTemplateContext} context - toggler icon context. + */ + togglericon(context: TreeTableTogglerIconTemplateContext): TemplateRef; + /** + * Custom paginator first page link icon template. + */ + paginatorfirstpagelinkicon(): TemplateRef; + /** + * Custom paginator last page link icon template. + */ + paginatorlastpagelinkicon(): TemplateRef; + /** + * Custom paginator previous page link icon template. + */ + paginatorpreviouspagelinkicon(): TemplateRef; + /** + * Custom paginator next page link icon template. + */ + paginatornextpagelinkicon(): TemplateRef; + /** + * Custom loader template. + */ + loader(): TemplateRef; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/usestyle/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/usestyle/public_api.ts new file mode 100644 index 000000000..d0e801833 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/usestyle/public_api.ts @@ -0,0 +1,10 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/usestyle/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export * from './usestyle'; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/usestyle/usestyle.ts b/projects/cps-ui-kit/src/lib/primeng-temp/usestyle/usestyle.ts new file mode 100644 index 000000000..eb63b9e6e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/usestyle/usestyle.ts @@ -0,0 +1,59 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/usestyle/usestyle.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { DOCUMENT } from '@angular/common'; +import { Injectable, inject } from '@angular/core'; +import { setAttribute, setAttributes } from '../../primeuix-temp/utils/src/index'; + +let _id = 0; + +@Injectable({ providedIn: 'root' }) +export class UseStyle { + document: Document = inject(DOCUMENT); + + use(css, options: any = {}) { + let isLoaded = false; + let cssRef = css; + let styleRef: HTMLStyleElement | null = null; + + const { immediate = true, manual = false, name = `style_${++_id}`, id = undefined, media = undefined, nonce = undefined, first = false, props = {} } = options; + + if (!this.document) return; + styleRef = (this.document.querySelector(`style[data-primeng-style-id="${name}"]`) || (id && this.document.getElementById(id)) || this.document.createElement('style')) as HTMLStyleElement; + + if (styleRef) { + if (!styleRef.isConnected) { + cssRef = css; + + const HEAD = this.document.head; + + setAttribute(styleRef, 'nonce', nonce); + + first && HEAD.firstChild ? HEAD.insertBefore(styleRef, HEAD.firstChild) : HEAD.appendChild(styleRef); + setAttributes(styleRef, { + type: 'text/css', + media, + nonce, + 'data-primeng-style-id': name + }); + } + + if (styleRef.textContent !== cssRef) { + styleRef.textContent = cssRef; + } + } + + return { + id, + name, + el: styleRef, + css: cssRef + }; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/utils/inpututils.ts b/projects/cps-ui-kit/src/lib/primeng-temp/utils/inpututils.ts new file mode 100644 index 000000000..0ab09ed08 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/utils/inpututils.ts @@ -0,0 +1,16 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/utils/inpututils.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export const transformToBoolean = (value: any): boolean => { + return !!value; +}; + +export const transformToNumber = (value: string | number): number => { + return typeof value === 'string' ? parseFloat(value) : value; +}; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/utils/objectutils.ts b/projects/cps-ui-kit/src/lib/primeng-temp/utils/objectutils.ts new file mode 100644 index 000000000..bd255fb56 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/utils/objectutils.ts @@ -0,0 +1,318 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/utils/objectutils.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export class ObjectUtils { + public static isArray(value, empty = true) { + return Array.isArray(value) && (empty || value.length !== 0); + } + + public static isObject(value, empty = true) { + return typeof value === 'object' && !Array.isArray(value) && value != null && (empty || Object.keys(value).length !== 0); + } + + public static equals(obj1: any, obj2: any, field?: string): boolean { + if (field) return this.resolveFieldData(obj1, field) === this.resolveFieldData(obj2, field); + else return this.equalsByValue(obj1, obj2); + } + + public static equalsByValue(obj1: any, obj2: any): boolean { + if (obj1 === obj2) return true; + + if (obj1 && obj2 && typeof obj1 == 'object' && typeof obj2 == 'object') { + var arrA = Array.isArray(obj1), + arrB = Array.isArray(obj2), + i, + length, + key; + + if (arrA && arrB) { + length = obj1.length; + if (length != obj2.length) return false; + for (i = length; i-- !== 0; ) if (!this.equalsByValue(obj1[i], obj2[i])) return false; + return true; + } + + if (arrA != arrB) return false; + + var dateA = this.isDate(obj1), + dateB = this.isDate(obj2); + if (dateA != dateB) return false; + if (dateA && dateB) return obj1.getTime() == obj2.getTime(); + + var regexpA = obj1 instanceof RegExp, + regexpB = obj2 instanceof RegExp; + if (regexpA != regexpB) return false; + if (regexpA && regexpB) return obj1.toString() == obj2.toString(); + + var keys = Object.keys(obj1); + length = keys.length; + + if (length !== Object.keys(obj2).length) return false; + + for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(obj2, keys[i])) return false; + + for (i = length; i-- !== 0; ) { + key = keys[i]; + if (!this.equalsByValue(obj1[key], obj2[key])) return false; + } + + return true; + } + + return obj1 !== obj1 && obj2 !== obj2; + } + + public static resolveFieldData(data: any, field: any): any { + if (data && field) { + if (this.isFunction(field)) { + return field(data); + } else if (field.indexOf('.') == -1) { + return data[field]; + } else { + let fields: string[] = field.split('.'); + let value = data; + for (let i = 0, len = fields.length; i < len; ++i) { + if (value == null) { + return null; + } + value = value[fields[i]]; + } + return value; + } + } else { + return null; + } + } + + public static isFunction(obj: any) { + return !!(obj && obj.constructor && obj.call && obj.apply); + } + + public static reorderArray(value: any[], from: number, to: number) { + let target: number; + if (value && from !== to) { + if (to >= value.length) { + to %= value.length; + from %= value.length; + } + value.splice(to, 0, value.splice(from, 1)[0]); + } + } + + public static insertIntoOrderedArray(item: any, index: number, arr: any[], sourceArr: any[]): void { + if (arr.length > 0) { + let injected = false; + for (let i = 0; i < arr.length; i++) { + let currentItemIndex = this.findIndexInList(arr[i], sourceArr); + if (currentItemIndex > index) { + arr.splice(i, 0, item); + injected = true; + break; + } + } + + if (!injected) { + arr.push(item); + } + } else { + arr.push(item); + } + } + + public static findIndexInList(item: any, list: any): number { + let index: number = -1; + + if (list) { + for (let i = 0; i < list.length; i++) { + if (list[i] == item) { + index = i; + break; + } + } + } + + return index; + } + + public static contains(value, list) { + if (value != null && list && list.length) { + for (let val of list) { + if (this.equals(value, val)) return true; + } + } + + return false; + } + + public static removeAccents(str) { + if (str) { + str = str.normalize('NFKD').replace(/\p{Diacritic}/gu, ''); + } + + return str; + } + + public static isDate(input: any) { + return Object.prototype.toString.call(input) === '[object Date]'; + } + + public static isEmpty(value) { + return value === null || value === undefined || value === '' || (Array.isArray(value) && value.length === 0) || (!this.isDate(value) && typeof value === 'object' && Object.keys(value).length === 0); + } + + public static isNotEmpty(value) { + return !this.isEmpty(value); + } + + public static compare(value1, value2, locale, order = 1) { + let result = -1; + const emptyValue1 = this.isEmpty(value1); + const emptyValue2 = this.isEmpty(value2); + + if (emptyValue1 && emptyValue2) result = 0; + else if (emptyValue1) result = order; + else if (emptyValue2) result = -order; + else if (typeof value1 === 'string' && typeof value2 === 'string') result = value1.localeCompare(value2, locale, { numeric: true }); + else result = value1 < value2 ? -1 : value1 > value2 ? 1 : 0; + + return result; + } + + public static sort(value1, value2, order = 1, locale, nullSortOrder = 1) { + const result = ObjectUtils.compare(value1, value2, locale, order); + let finalSortOrder = order; + + // nullSortOrder == 1 means Excel like sort nulls at bottom + if (ObjectUtils.isEmpty(value1) || ObjectUtils.isEmpty(value2)) { + finalSortOrder = nullSortOrder === 1 ? order : nullSortOrder; + } + + return finalSortOrder * result; + } + + public static merge(obj1?: any, obj2?: any): any { + if (obj1 == undefined && obj2 == undefined) { + return undefined; + } else if ((obj1 == undefined || typeof obj1 === 'object') && (obj2 == undefined || typeof obj2 === 'object')) { + return { ...(obj1 || {}), ...(obj2 || {}) }; + } else if ((obj1 == undefined || typeof obj1 === 'string') && (obj2 == undefined || typeof obj2 === 'string')) { + return [obj1 || '', obj2 || ''].join(' '); + } + + return obj2 || obj1; + } + + public static isPrintableCharacter(char = '') { + return this.isNotEmpty(char) && char.length === 1 && char.match(/\S| /); + } + + public static getItemValue(obj, ...params) { + return this.isFunction(obj) ? obj(...params) : obj; + } + + public static findLastIndex(arr, callback) { + let index = -1; + + if (this.isNotEmpty(arr)) { + try { + index = arr.findLastIndex(callback); + } catch { + index = arr.lastIndexOf([...arr].reverse().find(callback)); + } + } + + return index; + } + + public static findLast(arr, callback) { + let item; + + if (this.isNotEmpty(arr)) { + try { + item = arr.findLast(callback); + } catch { + item = [...arr].reverse().find(callback); + } + } + + return item; + } + + public static deepEquals(a, b) { + if (a === b) return true; + + if (a && b && typeof a == 'object' && typeof b == 'object') { + var arrA = Array.isArray(a), + arrB = Array.isArray(b), + i, + length, + key; + + if (arrA && arrB) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0; ) if (!this.deepEquals(a[i], b[i])) return false; + + return true; + } + + if (arrA != arrB) return false; + + var dateA = a instanceof Date, + dateB = b instanceof Date; + + if (dateA != dateB) return false; + if (dateA && dateB) return a.getTime() == b.getTime(); + + var regexpA = a instanceof RegExp, + regexpB = b instanceof RegExp; + + if (regexpA != regexpB) return false; + if (regexpA && regexpB) return a.toString() == b.toString(); + + var keys = Object.keys(a); + + length = keys.length; + + if (length !== Object.keys(b).length) return false; + + for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; + + for (i = length; i-- !== 0; ) { + key = keys[i]; + if (!this.deepEquals(a[key], b[key])) return false; + } + + return true; + } + + return a !== a && b !== b; + } + + public static minifyCSS(css) { + return css + ? css + .replace(/\/\*(?:(?!\*\/)[\s\S])*\*\/|[\r\n\t]+/g, '') + .replace(/ {2,}/g, ' ') + .replace(/ ([{:}]) /g, '$1') + .replace(/([;,]) /g, '$1') + .replace(/ !/g, '!') + .replace(/: /g, ':') + : css; + } + + public static toFlatCase(str: string) { + // convert snake, kebab, camel and pascal cases to flat case + return this.isString(str) ? str.replace(/(-|_)/g, '').toLowerCase() : str; + } + + public static isString(value: any, empty: boolean = true) { + return typeof value === 'string' && (empty || value !== ''); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/utils/public_api.ts b/projects/cps-ui-kit/src/lib/primeng-temp/utils/public_api.ts new file mode 100644 index 000000000..e7291355e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/utils/public_api.ts @@ -0,0 +1,15 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/utils/public_api.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +import { ObjectUtils } from './objectutils'; +import { UniqueComponentId } from './uniquecomponentid'; +import ZIndexUtils from './zindexutils'; +import { transformToBoolean, transformToNumber } from './inpututils'; + +export { ZIndexUtils, UniqueComponentId, ObjectUtils, transformToNumber, transformToBoolean }; diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/utils/uniquecomponentid.ts b/projects/cps-ui-kit/src/lib/primeng-temp/utils/uniquecomponentid.ts new file mode 100755 index 000000000..cf0dd795d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/utils/uniquecomponentid.ts @@ -0,0 +1,16 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/utils/uniquecomponentid.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +export var lastId = 0; + +export function UniqueComponentId(prefix = 'pn_id_') { + lastId++; + + return `${prefix}${lastId}`; +} diff --git a/projects/cps-ui-kit/src/lib/primeng-temp/utils/zindexutils.ts b/projects/cps-ui-kit/src/lib/primeng-temp/utils/zindexutils.ts new file mode 100644 index 000000000..ac8b12d05 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeng-temp/utils/zindexutils.ts @@ -0,0 +1,53 @@ +// @ts-nocheck -- vendored third-party source, see provenance note below. +/** + * Vendored from PrimeNG 21.1.9 (https://github.com/primefaces/primeng, tag 21.1.9, commit c493b1c6d9f7cdffbe1c4dc195493dd73d733593). + * Original file: packages/primeng/src/utils/zindexutils.ts + * Modified: import paths rewritten to resolve locally; // @ts-nocheck added because this + * repository's TypeScript config is stricter than PrimeNG's own (strict, noImplicitOverride, + * noUnusedLocals/Parameters, etc.). No runtime logic was changed. See ../NOTICE.md. + * Original license: MIT, Copyright (c) 2016-2026 PrimeTek. + */ +function ZIndexUtils() { + let zIndexes: any = []; + + const generateZIndex = (key, baseZIndex) => { + let lastZIndex = zIndexes.length > 0 ? zIndexes[zIndexes.length - 1] : { key, value: baseZIndex }; + let newZIndex = lastZIndex.value + (lastZIndex.key === key ? 0 : baseZIndex) + 2; + + zIndexes.push({ key, value: newZIndex }); + + return newZIndex; + }; + + const revertZIndex = (zIndex) => { + zIndexes = zIndexes.filter((obj) => obj.value !== zIndex); + }; + + const getCurrentZIndex = () => { + return zIndexes.length > 0 ? zIndexes[zIndexes.length - 1].value : 0; + }; + + const getZIndex = (el) => { + return el ? parseInt(el.style.zIndex, 10) || 0 : 0; + }; + + return { + get: getZIndex, + set: (key, el, baseZIndex) => { + if (el) { + el.style.zIndex = String(generateZIndex(key, baseZIndex)); + } + }, + clear: (el) => { + if (el) { + revertZIndex(getZIndex(el)); + el.style.zIndex = ''; + } + }, + getCurrent: () => getCurrentZIndex(), + generateZIndex, + revertZIndex + }; +} + +export default ZIndexUtils(); diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/NOTICE.md b/projects/cps-ui-kit/src/lib/primeuix-temp/NOTICE.md new file mode 100644 index 000000000..50f9c1cb0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/NOTICE.md @@ -0,0 +1,96 @@ +# Third-party notice: primeuix + +The code in this directory (`projects/cps-ui-kit/src/lib/primeuix-temp/`) is vendored +from [primeuix](https://github.com/primefaces/primeuix) — specifically the `utils`, +`styled`, `motion`, and `styles` packages (published to npm as `@primeuix/utils`, +`@primeuix/styled`, `@primeuix/motion`, `@primeuix/styles`), which the vendored PrimeNG +code in `../primeng-temp/` depends on. + +- **Source repository**: https://github.com/primefaces/primeuix +- **Commit**: `b9467bc448d35738d4f651dbc3caa4d4cb9a6a96` +- **Fetched**: 2026-07-13 +- **Vendored from**: `packages//src/` (and `packages/motion/types/`) + in the upstream repository + +The whole `primeuix` repository is MIT licensed under a single unified license (no +LTS/commercial split, unlike PrimeNG). `primeuix` doesn't tag releases matching +currently-installed npm package versions (its git tags stop at `0.6.0`, and npm doesn't +record a `gitHead` for these packages), so this is vendored from the repository's +default-branch HEAD at the commit above rather than a version-matched tag. Every +function/symbol used by the vendored PrimeNG code was confirmed present at this commit +with the same shape. There is minor version drift versus what was previously installed +via npm — `@primeuix/utils` was `0.7.2` (this commit is `0.6.4`) and `@primeuix/motion` +was `0.0.10` (this commit is `0.0.11`); `@primeuix/styled` and `@primeuix/styles` match +their installed versions (`0.7.4` and `2.0.3`) exactly. These are small, low-churn +utility/helper packages (DOM helpers, class-name/style-token merging, motion/animation +event handling) rather than stateful UI components, so this drift is low risk. + +This directory contains 116 files: `utils` and `styled` are pruned via call-graph +tracing to only the code actually reachable from the vendored PrimeNG code (including +internal cross-references, e.g. `styled`'s `ThemeService` uses `utils`'s `EventBus`), +`motion` in full (4 files, all used), and `styles` scoped to the 17 component +subdirectories the vendored PrimeNG code references (of 94 available upstream — each is +a single self-contained file with no internal imports, safe to vendor independently). + +## License + +MIT, reproduced below verbatim from upstream's root `LICENSE` file: + +``` +MIT License + +Copyright (c) 2025 PrimeTek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +## Modifications + +Per the MIT license's own terms and Apache-2.0 §4(b) of this repository's own license +(this repository is Apache-2.0 licensed; see the root +[LICENSE](../../../../../LICENSE)): + +1. **Import paths rewritten.** Every `@primeuix/[/]` import specifier is a + relative path pointing at the corresponding vendored file's `src/` location (there is + no `@primeuix/*` npm package installed in this repository). Plain relative imports + already present in the upstream source (e.g. within `styled`'s `helpers/color/` + files) are untouched. +2. **Directory structure preserved as-is per package** (`/src/**`, plus + `motion/types/**`), unlike `../primeng-temp/` which drops the `src/` segment — this + is because `@primeuix/motion`'s own source has a real relative import (`../types`) + reaching outside its `src/` directory into a sibling `types/` directory, so the + original nesting depth is kept intact for that import to resolve correctly. +3. **No `// @ts-nocheck`** (unlike `../primeng-temp/`): `primeuix`'s own `tsconfig.json` + already uses `strict: true` plus the same `noUnusedLocals`/`noUnusedParameters`/ + `noImplicitOverride` settings as this repository. Seven small, purely mechanical + fixes were needed to compile cleanly, none changing behavior: + - `motion/src/config/index.ts`: an explicit trailing `return;` added to `whenEnd()` + so all code paths return a value — the function already fell through to an + implicit `undefined` return. + - `styled/src/utils/themeUtils.ts` (`getCommon`, `getPreset`, `getLayerOrder`) and + `styled/src/utils/sharedUtils.ts` (`getVariableValue`): 6 parameters that are + unused within their own function bodies (kept for call-site/interface consistency + with sibling functions) renamed with a leading underscore — for destructured + object parameters this is `params: _params`, to keep extracting the same source + key while renaming the unused local binding. + - `styled/src/stylesheet/index.ts`: same underscore-prefix rename for `meta` on an + abstract stub method that always returns `undefined`. + +No other changes were made. Logic, types, and public API are otherwise unmodified from +the source commit above. diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/motion/src/config/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/motion/src/config/index.ts new file mode 100644 index 000000000..5beba3a8d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/motion/src/config/index.ts @@ -0,0 +1,194 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/motion/src/config/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import { addClass, removeClass } from '../../../utils/src/index'; +import type { MotionClassNamesWithPhase, MotionHooksWithPhase, MotionInstance, MotionOptions, MotionPhase, MotionType } from '../../types'; +import { getMotionHooks, getMotionMetadata, mergeOptions, removeMotionPhase, removeMotionState, resolveClassNames, resolveDuration, setAutoDimensionVariables, setMotionPhase, setMotionState, shouldSkipMotion } from '../utils'; + +export const DEFAULT_MOTION_OPTIONS: MotionOptions = { + name: 'p', + safe: true, + disabled: false, + enter: true, + leave: true, + autoHeight: true, + autoWidth: false +}; + +/** + * Creates a MotionInstance for the given element with the specified options. + * @param element - The target element for motion effects. + * @param options - Configuration options for the motion instance. + * @returns A MotionInstance that can be used to control the motion. + */ +export function createMotion(element: Element, options?: MotionOptions): MotionInstance { + if (!element) throw new Error('Element is required.'); + + const opts: MotionOptions = {}; + let skipMotion = false; + let classNames: MotionClassNamesWithPhase = {} as MotionClassNamesWithPhase; + let cancelCurrent: (() => void) | null = null; + let hooks: MotionHooksWithPhase = {}; + + const init = (newOpts?: MotionOptions) => { + Object.assign(opts, mergeOptions(newOpts, DEFAULT_MOTION_OPTIONS)); + if (!opts.enter && !opts.leave) throw new Error('Enter or leave must be true.'); + + hooks = getMotionHooks(opts); + skipMotion = shouldSkipMotion(opts); + classNames = resolveClassNames(opts); + cancelCurrent = null; + }; + + const run = async (phase: MotionPhase): Promise => { + cancelCurrent?.(); + + const { onBefore, onStart, onAfter, onCancelled } = hooks[phase] || {}; + const event = { element }; + + setMotionPhase(element as HTMLElement, phase); + + if (skipMotion) { + onBefore?.(event); + onStart?.(event); + onAfter?.(event); + + removeMotionPhase(element as HTMLElement); + + return; + } + + const { from: fromClass, active: activeClass, to: toClass } = classNames[phase] || {}; + + setAutoDimensionVariables(element as HTMLElement, opts.autoHeight, opts.autoWidth); + + onBefore?.(event); + addClass(element, fromClass); + addClass(element, activeClass); + setMotionState(element as HTMLElement, phase, 'from'); + + //await nextFrame(); + void (element as HTMLElement).offsetHeight; // force reflow + + removeClass(element, fromClass); + addClass(element, toClass); + setMotionState(element as HTMLElement, phase, 'to'); + onStart?.(event); + + return new Promise((resolve) => { + const duration = resolveDuration(opts.duration, phase); + + const cleanup = () => { + removeClass(element, [toClass, activeClass]); + cancelCurrent = null; + removeMotionState(element as HTMLElement); + removeMotionPhase(element as HTMLElement); + }; + + const onDone = () => { + cleanup(); + onAfter?.(event); + resolve(); + }; + + cancelCurrent = () => { + cleanup(); + onCancelled?.(event); + resolve(); + }; + + whenEnd(element, opts.type, duration, onDone); + }); + }; + + init(options); + + const instance: MotionInstance = { + enter: () => { + if (!opts.enter) return Promise.resolve(); + + return run('enter'); + }, + leave: () => { + if (!opts.leave) return Promise.resolve(); + + return run('leave'); + }, + cancel: () => { + cancelCurrent?.(); + cancelCurrent = null; + }, + update: (newElement?: Element, newOptions?: MotionOptions) => { + if (!newElement) throw new Error('Element is required.'); + + element = newElement as HTMLElement; + instance.cancel(); + init(newOptions); + } + }; + + if (opts.appear) instance.enter(); + + return instance; +} + +let endId = 0; + +/** + * Ported from Vue.js Transition Component; + * @see https://github.com/vuejs/core/blob/main/packages/runtime-dom/src/components/Transition.ts#L348 + * + * When the transition is triggered, it waits for the end of the motion (transition or animation) + * @param element - The element to wait for the motion end. + * @param expectedType - The expected type of motion (transition or animation). + * @param explicitTimeout - An optional explicit timeout in milliseconds. + * @param resolve - A function to call when the motion ends. + * @returns A timeout ID if an explicit timeout is provided, otherwise undefined. + */ +function whenEnd(element: Element & { _motionEndId?: number }, expectedType: MotionType | undefined, explicitTimeout: number | null, resolve: () => void) { + const id = (element._motionEndId = ++endId); + + const resolveIfNotStale = () => { + if (id === element._motionEndId) { + resolve(); + } + }; + + if (explicitTimeout != null) { + return setTimeout(resolveIfNotStale, explicitTimeout); + } + + const { type, timeout, count } = getMotionMetadata(element, expectedType); + + if (!type) { + resolve(); + + return; + } + + const endEvent = type + 'end'; + let ended = 0; + + const end = () => { + element.removeEventListener(endEvent, onEnd, true); + resolveIfNotStale(); + }; + + const onEnd = (event: Event) => { + if (event.target === element && ++ended >= count) { + end(); + } + }; + + element.addEventListener(endEvent, onEnd, { capture: true, once: true }); + setTimeout(() => { + if (ended < count) { + end(); + } + }, timeout + 1); + + return; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/motion/src/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/motion/src/index.ts new file mode 100644 index 000000000..ea2ce2827 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/motion/src/index.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/motion/src/index.ts + * Modified: import paths rewritten to resolve locally. See ../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export * from './config'; +export * from '../types'; +export * from './utils'; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/motion/src/utils/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/motion/src/utils/index.ts new file mode 100644 index 000000000..4efe44041 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/motion/src/utils/index.ts @@ -0,0 +1,216 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/motion/src/utils/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import { getHiddenElementDimensions, isPrefersReducedMotion, setCSSProperty, toMs } from '../../../utils/src/index'; +import type { MotionClassNamesWithPhase, MotionHooksWithPhase, MotionMetadata, MotionOptions, MotionPhase, MotionState, MotionType } from '../../types'; + +export const ANIMATION = 'animation'; +export const TRANSITION = 'transition'; + +/** + * Determines whether motion effects should be skipped based on the provided options. + * @param options - The motion options to evaluate. + * @returns A boolean indicating whether motion should be skipped. + */ +export function shouldSkipMotion(options: MotionOptions | undefined): boolean { + if (!options) { + return false; + } + + return options.disabled || !!(options.safe && isPrefersReducedMotion()); +} + +/** + * Merges the provided motion options with the default options. + * @param inOptions - The motion options to merge. + * @param defaultOptions - The default motion options. + * @returns The merged motion options. + */ +export function mergeOptions(inOptions: MotionOptions | undefined, defaultOptions: MotionOptions): MotionOptions { + if (!inOptions) { + return defaultOptions; + } + + return { + ...inOptions, + ...(Object.entries(defaultOptions).reduce((acc: Record, [key, value]) => { + acc[key] = (inOptions as Record)[key] ?? value; + + return acc; + }, {}) as MotionOptions) + }; +} + +/** + * Resolves class names for motion phases based on the provided options. + * @param options - The motion options containing class names and base name. + * @returns The resolved class names organized by motion phase. + */ +export function resolveClassNames(options: MotionOptions | undefined): MotionClassNamesWithPhase { + const { name, enterClass, leaveClass } = options || {}; + + return { + enter: { + from: enterClass?.from || `${name}-enter-from`, + to: enterClass?.to || `${name}-enter-to`, + active: enterClass?.active || `${name}-enter-active` + }, + leave: { + from: leaveClass?.from || `${name}-leave-from`, + to: leaveClass?.to || `${name}-leave-to`, + active: leaveClass?.active || `${name}-leave-active` + } + }; +} + +/** + * Retrieves the motion hooks organized by phase based on the provided options. + * @param options - The motion options containing hooks. + * @returns The motion hooks organized by phase. + */ +export function getMotionHooks(options: MotionOptions | undefined): MotionHooksWithPhase { + return { + enter: { + onBefore: options?.onBeforeEnter, + onStart: options?.onEnter, + onAfter: options?.onAfterEnter, + onCancelled: options?.onEnterCancelled + }, + leave: { + onBefore: options?.onBeforeLeave, + onStart: options?.onLeave, + onAfter: options?.onAfterLeave, + onCancelled: options?.onLeaveCancelled + } + }; +} + +/** + * Retrieves motion metadata including type, timeout, and count for the given element. + * @param element - The target element to retrieve motion metadata from. + * @param expectedType - The expected type of motion ('transition' or 'animation'). + * @returns The motion metadata including type, timeout, and count. + */ +export function getMotionMetadata(element: Element, expectedType?: MotionMetadata['type']): MotionMetadata { + const styles = window.getComputedStyle(element); + + const getDelaysAndDurations = (type: MotionType): [number[], number[]] => { + const delays = styles[`${type}Delay`]; + const durations = styles[`${type}Duration`]; + + return [delays.split(', ').map(toMs), durations.split(', ').map(toMs)]; + }; + + const [transitionDelays, transitionDurations] = getDelaysAndDurations(TRANSITION); + const [animationDelays, animationDurations] = getDelaysAndDurations(ANIMATION); + + const transitionTimeout = Math.max(...transitionDurations.map((d, i) => d + transitionDelays[i])); + const animationTimeout = Math.max(...animationDurations.map((d, i) => d + animationDelays[i])); + + let type: MotionMetadata['type'] = undefined; + let timeout = 0; + let count = 0; + + if (expectedType === TRANSITION) { + if (transitionTimeout > 0) { + type = TRANSITION; + timeout = transitionTimeout; + count = transitionDurations.length; + } + } else if (expectedType === ANIMATION) { + if (animationTimeout > 0) { + type = ANIMATION; + timeout = animationTimeout; + count = animationDurations.length; + } + } else { + timeout = Math.max(transitionTimeout, animationTimeout); + type = timeout > 0 ? (transitionTimeout > animationTimeout ? TRANSITION : ANIMATION) : undefined; + count = type ? (type === TRANSITION ? transitionDurations.length : animationDurations.length) : 0; + } + + return { + type, + timeout, + count + }; +} + +/** + * Resolves the duration for a given animation phase. + * @param duration - The duration can be a number or an object with `enter` and `leave` properties. + * @param phase - The phase of the transition/animation, either 'enter' or 'leave'. + * @returns The resolved duration in milliseconds or null if not specified. + */ +export function resolveDuration(duration: MotionOptions['duration'], phase: MotionPhase): number | null { + if (typeof duration === 'number') { + return duration; + } else if (typeof duration === 'object' && duration[phase] != null) { + return duration[phase]; + } + + return null; +} + +/** + * Sets CSS custom properties for auto height and/or width on the given element. + * @param element - The target HTML element. + * @param autoHeight - Whether to set the auto height CSS variable. + * @param autoWidth - Whether to set the auto width CSS variable. + * @returns + */ +export function setAutoDimensionVariables(element: HTMLElement, autoHeight: boolean = true, autoWidth: boolean = false): void { + if (!autoHeight && !autoWidth) return; + + const dimensions = getHiddenElementDimensions(element); + + if (autoHeight) { + setCSSProperty(element, '--height', dimensions.height + 'px'); + } + + if (autoWidth) { + setCSSProperty(element, '--width', dimensions.width + 'px'); + } +} + +/** + * Sets the current motion phase on the given element. + * @param element - The target HTML element. + * @param phase - The current motion phase. + */ +export function setMotionPhase(element: HTMLElement, phase: MotionPhase): void { + element.setAttribute('data-phase', phase); +} + +/** + * Sets the current motion state on the given element. + * @param element - The target HTML element. + * @param phase - The current motion phase. + * @param state - The current motion state. + */ +export function setMotionState(element: HTMLElement, phase: MotionPhase, state: MotionState): void { + element.removeAttribute('data-enter'); + element.removeAttribute('data-leave'); + + element.setAttribute(`data-${phase}`, state); +} + +/** + * Removes the motion phase attribute from the given element. + * @param element - The target HTML element. + */ +export function removeMotionPhase(element: HTMLElement): void { + element.removeAttribute('data-phase'); +} + +/** + * Removes the motion state attributes from the given element. + * @param element - The target HTML element. + */ +export function removeMotionState(element: HTMLElement): void { + element.removeAttribute('data-enter'); + element.removeAttribute('data-leave'); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/motion/types/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/motion/types/index.ts new file mode 100644 index 000000000..9dc97dec9 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/motion/types/index.ts @@ -0,0 +1,227 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/motion/types/index.ts + * Modified: import paths rewritten to resolve locally. See ../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export type MotionType = 'transition' | 'animation'; +export type MotionPhase = 'enter' | 'leave'; +export type MotionState = 'from' | 'to'; +export type MotionStage = 'Before' | 'Start' | 'After' | 'Cancelled'; + +/** + * Defines the duration of motion effects. + * It can be a single number representing the duration in milliseconds, + * or an object specifying different durations for 'enter' and 'leave' phases. + */ +export type MotionDuration = number | { [P in MotionPhase]?: number } | undefined; + +/** + * Options for specifying class names during different phases of motion. + * These class names are applied at the start, during, and at the end of the motion. + */ +export type ClassNameOptions = { + /** + * The class name to apply at the start of the motion. + */ + from?: string | undefined; + /** + * The class name to apply while the motion is active. + */ + active?: string | undefined; + /** + * The class name to apply at the end of the motion. + */ + to?: string | undefined; +}; + +/** + * Defines class names for both 'enter' and 'leave' motion phases. + */ +export interface MotionClassNames { + /** + * Class names for the 'enter' motion phase. + * @see ClassNameOptions + */ + enterClass?: ClassNameOptions | undefined; + /** + * Class names for the 'leave' motion phase. + * @see ClassNameOptions + */ + leaveClass?: ClassNameOptions | undefined; +} + +/** + * Metadata about the motion effect, including its type, timeout, and count. + */ +export type MotionMetadata = { + /** + * The type of motion effect, either 'transition' or 'animation'. + * @see MotionType + */ + type: MotionType | undefined; + /** + * The timeout duration for the motion effect in milliseconds. + */ + timeout: number | 0; + /** + * The count of transition or animation properties involved in the motion. + */ + count: number | 0; +}; + +/** + * Event object passed to motion hooks, containing the target element. + */ +export interface MotionEvent { + /** + * The target element of the motion event. + */ + element: Element; +} + +/** + * Hooks for various stages of the motion lifecycle. + */ +export interface MotionHooks { + /** + * Called before the enter motion starts. + * @param event - The motion event object. + * @returns + */ + onBeforeEnter?: (event?: MotionEvent) => void; + /** + * Called when the enter motion starts. + * @param event - The motion event object. + * @returns + */ + onEnter?: (event?: MotionEvent) => void; + /** + * Called after the enter motion ends. + * @param event - The motion event object. + * @returns + */ + onAfterEnter?: (event?: MotionEvent) => void; + /** + * Called if the enter motion is cancelled. + * @param event - The motion event object. + * @returns + */ + onEnterCancelled?: (event?: MotionEvent) => void; + /** + * Called before the leave motion starts. + * @param event - The motion event object. + * @returns + */ + onBeforeLeave?: (event?: MotionEvent) => void; + /** + * Called when the leave motion starts. + * @param event - The motion event object. + * @returns + */ + onLeave?: (event?: MotionEvent) => void; + /** + * Called after the leave motion ends. + * @param event - The motion event object. + * @returns + */ + onAfterLeave?: (event?: MotionEvent) => void; + /** + * Called if the leave motion is cancelled. + * @param event - The motion event object. + * @returns + */ + onLeaveCancelled?: (event?: MotionEvent) => void; +} + +/** + * Hooks organized by motion phase and stage. + */ +export type MotionHooksWithPhase = { + [P in MotionPhase]?: { + [S in MotionStage as `on${S}`]?: (MotionHooks & { [key: string]: unknown })[`on${S extends 'Start' | 'Cancelled' ? '' : S}${Capitalize

    }${S extends 'Cancelled' ? S : ''}`]; + }; +}; + +/** + * Class names organized by motion phase. + */ +export type MotionClassNamesWithPhase = { + [P in MotionPhase]: Required; +}; + +/** + * Options for configuring motion effects. + */ +export interface MotionOptions extends MotionClassNames, MotionHooks { + /** + * The base name used for generating default class names. + */ + name?: string | undefined; + /** + * The type of motion effect to use. + * @see MotionType + */ + type?: MotionType | undefined; + /** + * Indicates whether to respect the user's reduced motion preference. + */ + safe?: boolean | undefined; + /** + * Indicates whether motion effects are disabled. + */ + disabled?: boolean | undefined; + /** + * Indicates whether the motion should run on the initial render (appear phase). + */ + appear?: boolean | undefined; + /** + * Indicates whether to perform enter motions. + */ + enter?: boolean | undefined; + /** + * Indicates whether to perform leave motions. + */ + leave?: boolean | undefined; + /** + * The duration of the motion effect. + * @see MotionDuration + */ + duration?: MotionDuration | undefined; + /** + * Indicates whether to automatically adjust height during the motion. + */ + autoHeight?: boolean | undefined; + /** + * Indicates whether to automatically adjust width during the motion. + */ + autoWidth?: boolean | undefined; +} + +/** + * Represents an instance of a motion effect applied to an element. + */ +export type MotionInstance = { + /** + * Starts the enter motion. + * @returns - A promise that resolves to a cancellation function or void. + */ + enter: () => Promise<(() => void) | void>; + /** + * Starts the leave motion. + * @returns - A promise that resolves to a cancellation function or void. + */ + leave: () => Promise<(() => void) | void>; + /** + * Cancels the motion. + * @returns + */ + cancel: () => void; + /** + * Updates the motion instance with a new element and options. + * @param element - The target element. + * @param options - The motion options. + * @returns + */ + update: (element: Element, options?: MotionOptions) => void; +}; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/config/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/config/index.ts new file mode 100644 index 000000000..e5b22e947 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/config/index.ts @@ -0,0 +1,152 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/config/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import ThemeService from '../service/index'; +import { ThemeUtils } from '../utils/index'; + +export default { + defaults: { + variable: { + prefix: 'p', + selector: ':root,:host', + excludedKeyRegex: /^(primitive|semantic|components|directives|variables|colorscheme|light|dark|common|root|states|extend|css)$/gi + }, + options: { + prefix: 'p', + darkModeSelector: 'system', + cssLayer: false + } + }, + _theme: undefined, + _layerNames: new Set(), + _loadedStyleNames: new Set(), + _loadingStyles: new Set(), + _tokens: {}, + update(newValues: any = {}) { + const { theme } = newValues; + + if (theme) { + this._theme = { + ...theme, + options: { + ...this.defaults.options, + ...theme.options + } + }; + this._tokens = ThemeUtils.createTokens(this.preset, this.defaults); + this.clearLoadedStyleNames(); + } + }, + get theme(): any { + return this._theme; + }, + get preset() { + return this.theme?.preset || {}; + }, + get options() { + return this.theme?.options || {}; + }, + get tokens() { + return this._tokens; + }, + getTheme() { + return this.theme; + }, + setTheme(newValue: any) { + this.update({ theme: newValue }); + ThemeService.emit('theme:change', newValue); + }, + getPreset() { + return this.preset; + }, + setPreset(newValue: any) { + this._theme = { ...this.theme, preset: newValue }; + this._tokens = ThemeUtils.createTokens(newValue, this.defaults); + + this.clearLoadedStyleNames(); + ThemeService.emit('preset:change', newValue); + ThemeService.emit('theme:change', this.theme); + }, + getOptions() { + return this.options; + }, + setOptions(newValue: any) { + this._theme = { ...this.theme, options: newValue }; + + this.clearLoadedStyleNames(); + ThemeService.emit('options:change', newValue); + ThemeService.emit('theme:change', this.theme); + }, + getLayerNames() { + return [...this._layerNames]; + }, + setLayerNames(layerName: any) { + this._layerNames.add(layerName); + }, + getLoadedStyleNames() { + return this._loadedStyleNames; + }, + isStyleNameLoaded(name: string) { + return this._loadedStyleNames.has(name); + }, + setLoadedStyleName(name: string) { + this._loadedStyleNames.add(name); + }, + deleteLoadedStyleName(name: string) { + this._loadedStyleNames.delete(name); + }, + clearLoadedStyleNames() { + this._loadedStyleNames.clear(); + }, + getTokenValue(tokenPath: string) { + return ThemeUtils.getTokenValue(this.tokens, tokenPath, this.defaults); + }, + getCommon(name = '', params: any) { + return ThemeUtils.getCommon({ name, theme: this.theme, params, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }); + }, + getComponent(name = '', params: any) { + const options = { name, theme: this.theme, params, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }; + + return ThemeUtils.getPresetC(options); + }, + // @deprecated - use getComponent instead + getDirective(name = '', params: any) { + const options = { name, theme: this.theme, params, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }; + + return ThemeUtils.getPresetD(options); + }, + getCustomPreset(name = '', preset: any, selector: string, params: any) { + const options = { name, preset, options: this.options, selector, params, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }; + + return ThemeUtils.getPreset(options); + }, + getLayerOrderCSS(name = '') { + return ThemeUtils.getLayerOrder(name, this.options, { names: this.getLayerNames() }, this.defaults); + }, + transformCSS(name = '', css: string, type: string = 'style', mode?: string) { + return ThemeUtils.transformCSS(name, css, mode, type, this.options, { layerNames: this.setLayerNames.bind(this) }, this.defaults); + }, + getCommonStyleSheet(name = '', params: any, props = {}) { + return ThemeUtils.getCommonStyleSheet({ name, theme: this.theme, params, props, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }); + }, + getStyleSheet(name: string, params: any, props = {}) { + return ThemeUtils.getStyleSheet({ name, theme: this.theme, params, props, defaults: this.defaults, set: { layerNames: this.setLayerNames.bind(this) } }); + }, + onStyleMounted(name: string) { + this._loadingStyles.add(name); + }, + onStyleUpdated(name: string) { + this._loadingStyles.add(name); + }, + onStyleLoaded(event: any, { name }: { name: any }) { + if (this._loadingStyles.size) { + this._loadingStyles.delete(name); + + ThemeService.emit(`theme:${name}:load`, event); // Exp: ThemeService.emit('theme:panel-style:load', event) + !this._loadingStyles.size && ThemeService.emit('theme:load'); + } + } +}; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/css.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/css.ts new file mode 100644 index 000000000..8d07b8bab --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/css.ts @@ -0,0 +1,19 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/helpers/css.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import { resolve } from '../../../utils/src/index'; +import { evaluateDtExpressions, type StyleType } from '..'; +import { dt } from './dt'; + +export function css(strings: TemplateStringsArray | StyleType, ...exprs: unknown[]): string | undefined { + if (strings instanceof Array) { + const raw = strings.reduce((acc, str, i) => acc + str + (resolve(exprs[i], { dt }) ?? ''), ''); + + return evaluateDtExpressions(raw, dt); + } + + return resolve(strings as unknown, { dt }) as string | undefined; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/dt.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/dt.ts new file mode 100644 index 000000000..5ece6b51f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/dt.ts @@ -0,0 +1,40 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/helpers/dt.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import { isEmpty, matchRegex } from '../../../utils/src/object/index'; +import Theme from '../config/index'; +import { EXPR_REGEX, getVariableValue } from '../utils/index'; + +export const $dt = (tokenPath: string): { name: string; variable: string; value: unknown } => { + const theme = Theme.getTheme(); + + const variable = dtwt(theme, tokenPath, undefined, 'variable'); + const name = variable?.match(/--[\w-]+/g)?.[0]; + const value = dtwt(theme, tokenPath, undefined, 'value'); + + return { + name, + variable, + value + }; +}; + +export const dt = (...args: Parameters extends [unknown, ...infer Rest] ? Rest : never) => { + return dtwt(Theme.getTheme(), ...args); +}; + +export const dtwt = (theme: any = {}, tokenPath: string, fallback?: string, type?: string) => { + if (tokenPath) { + const { variable: VARIABLE, options: OPTIONS } = Theme.defaults || {}; + const { prefix, transform } = theme?.options || OPTIONS || {}; + const token = matchRegex(tokenPath, EXPR_REGEX) ? tokenPath : `{${tokenPath}}`; + const isStrictTransform = type === 'value' || (isEmpty(type) && transform === 'strict'); // @todo - TRANSFORM: strict | lenient(default) + + return isStrictTransform ? Theme.getTokenValue(tokenPath) : getVariableValue(token, undefined, prefix, [VARIABLE.excludedKeyRegex], fallback); + } + + return ''; +}; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/index.ts new file mode 100644 index 000000000..5ecdd6b60 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/index.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/helpers/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export * from './css'; +export * from './dt'; +export { default as toVariables } from './toVariables'; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/toVariables.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/toVariables.ts new file mode 100644 index 000000000..b76a714af --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/helpers/toVariables.ts @@ -0,0 +1,70 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/helpers/toVariables.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import { isObject, matchRegex, toKebabCase } from '../../../utils/src/object/index'; +import Theme from '../config/index'; +import { getRule, getVariableName, getVariableValue, setProperty, toNormalizeVariable, toValue } from '../utils/index'; + +export interface toVariableOptions { + prefix?: string; + selector?: string; + excludedKeyRegex?: RegExp; +} + +export interface toVariableOutput { + value: string[]; + tokens: string[]; + declarations: string; + css: string; +} + +export default function (theme: any, options: toVariableOptions = {}): toVariableOutput { + const VARIABLE = Theme.defaults.variable; + const { prefix = VARIABLE.prefix, selector = VARIABLE.selector, excludedKeyRegex = VARIABLE.excludedKeyRegex } = options; + + const tokens: string[] = []; + const variables: string[] = []; + + const stack = [{ node: theme, path: prefix }]; + + while (stack.length) { + const { node, path } = stack.pop()!; + + for (const key in node) { + const raw = node[key]; + const val = toValue(raw); + + const skipNormalize = matchRegex(key, excludedKeyRegex); + const variablePath = skipNormalize ? toNormalizeVariable(path) : toNormalizeVariable(path, toKebabCase(key)); + + if (isObject(val)) { + stack.push({ node: val, path: variablePath }); + } else { + const varName = getVariableName(variablePath); + const varValue = getVariableValue(val, variablePath, prefix, [excludedKeyRegex]); + + setProperty(variables, varName, varValue); + + let token = variablePath; + + if (prefix && token.startsWith(prefix + '-')) { + token = token.slice(prefix.length + 1); + } + + tokens.push(token.replace(/-/g, '.')); + } + } + } + + const declarations = variables.join(''); + + return { + value: variables, + tokens, + declarations, + css: getRule(selector, declarations) + }; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/index.ts new file mode 100644 index 000000000..498720a59 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/index.ts @@ -0,0 +1,49 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/index.ts + * Modified: import paths rewritten to resolve locally. See ../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export { default as Theme } from './config/index'; +export * from './helpers/index'; +export { default as ThemeService } from './service/index'; +export * from './utils/index'; + +export interface ThemeOptions { + /** + * The prefix for the theme + * @default 'p' + */ + prefix?: string; + /** + * Dark mode selector + * @default 'system' + */ + darkModeSelector?: string; + /** + * Whether to use the css layer + * @default false + */ + cssLayer?: boolean | { name?: string; order?: string }; +} + +export interface StyleOptions { + dt: (key: string, fallback?: string | number | Pick) => string | number | undefined; +} + +export declare type StyleType = string | ((options?: T) => string); + +export type ColorScale = { + 0?: string; + 50?: string; + 100?: string; + 200?: string; + 300?: string; + 400?: string; + 500?: string; + 600?: string; + 700?: string; + 800?: string; + 900?: string; + 950?: string; +}; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/service/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/service/index.ts new file mode 100644 index 000000000..0b16c15a2 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/service/index.ts @@ -0,0 +1,11 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/service/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import { EventBus } from '../../../utils/src/eventbus/index'; + +const ThemeService = EventBus(); + +export default ThemeService; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/utils/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/utils/index.ts new file mode 100644 index 000000000..053a33581 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/utils/index.ts @@ -0,0 +1,8 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/utils/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export * from './sharedUtils'; +export { default as ThemeUtils } from './themeUtils'; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/utils/sharedUtils.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/utils/sharedUtils.ts new file mode 100644 index 000000000..bc59adea0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/utils/sharedUtils.ts @@ -0,0 +1,196 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/utils/sharedUtils.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import { getKeyValue, isArray, isNotEmpty, isNumber, isObject, isString, matchRegex, toKebabCase } from '../../../utils/src/object/index'; + +export const EXPR_REGEX = /{([^}]*)}/g; // Exp: '{a}', '{a.b}', '{a.b.c}' etc. +export const CALC_REGEX = /(\d+\s+[\+\-\*\/]\s+\d+)/g; +export const VAR_REGEX = /var\([^)]+\)/g; + +export function toTokenKey(str: string): string { + return isString(str) ? str.replace(/[A-Z]/g, (c: string, i: number) => (i === 0 ? c : '.' + c.toLowerCase())).toLowerCase() : str; +} + +export function merge(value1: any, value2: any): void { + if (isArray(value1)) { + value1.push(...(value2 || [])); + } else if (isObject(value1)) { + Object.assign(value1, value2); + } +} + +export function toValue(value: any): any { + // Check for Figma ($value-$type) + return isObject(value) && value.hasOwnProperty('$value') && value.hasOwnProperty('$type') ? (value as any).$value : value; +} + +export function toUnit(value: string, variable: string = ''): string { + const excludedProperties = ['opacity', 'z-index', 'line-height', 'font-weight', 'flex', 'flex-grow', 'flex-shrink', 'order']; + + if (!excludedProperties.some((property) => variable.endsWith(property))) { + const val = `${value}`.trim(); + const valArr = val.split(' '); + + return valArr.map((v) => (isNumber(v) ? `${v}px` : v)).join(' '); + } + + return value; +} + +export function toNormalizePrefix(prefix: string): string { + return prefix.replaceAll(/ /g, '').replace(/[^\w]/g, '-'); +} + +export function toNormalizeVariable(prefix: string = '', variable: string = ''): string { + return toNormalizePrefix(`${isString(prefix, false) && isString(variable, false) ? `${prefix}-` : prefix}${variable}`); +} + +export function getVariableName(prefix: string = '', variable: string = ''): string { + return `--${toNormalizeVariable(prefix, variable)}`; +} + +export function hasOddBraces(str: string = ''): boolean { + const openBraces = (str.match(/{/g) || []).length; + const closeBraces = (str.match(/}/g) || []).length; + + return (openBraces + closeBraces) % 2 !== 0; +} + +export function getVariableValue(value: any, _variable: string = '', prefix: string = '', excludedKeyRegexes: RegExp[] = [], fallback?: string): string | undefined { + if (isString(value)) { + const val = value.trim(); + + if (hasOddBraces(val)) { + return undefined; + } else if (matchRegex(val, EXPR_REGEX)) { + const _val = val.replaceAll(EXPR_REGEX, (v: string) => { + const path = v.replace(/{|}/g, ''); + const keys = path.split('.').filter((_v: string) => !excludedKeyRegexes.some((_r) => matchRegex(_v, _r))); + + return `var(${getVariableName(prefix, toKebabCase(keys.join('-')))}${isNotEmpty(fallback) ? `, ${fallback}` : ''})`; + }); + + return matchRegex(_val.replace(VAR_REGEX, '0'), CALC_REGEX) ? `calc(${_val})` : _val; + } + + return val; //toUnit(val, variable); + } else if (isNumber(value)) { + return value; //toUnit(value, variable); + } + + return undefined; +} + +export function getComputedValue(obj = {}, value: any): any { + if (isString(value)) { + const val = value.trim(); + + return matchRegex(val, EXPR_REGEX) ? val.replaceAll(EXPR_REGEX, (v: string) => getKeyValue(obj, v.replace(/{|}/g, '')) as string) : val; + } else if (isNumber(value)) { + return value; + } + + return undefined; +} + +export function setProperty(properties: string[], key: string, value?: string) { + if (isString(key, false)) { + properties.push(`${key}:${value};`); + } +} + +export function getRule(selector: string, properties: string): string { + if (selector) { + return `${selector}{${properties}}`; + } + + return ''; +} + +export function evaluateDtExpressions(input: string, fn: (...args: any[]) => string): string { + if (input.indexOf('dt(') === -1) return input; + + function fastParseArgs(str: string, fn: (...args: (string | number)[]) => string): (string | number)[] { + const args: (string | number)[] = []; + let i = 0; + let current = ''; + let quote: string | null = null; + let depth = 0; + + while (i <= str.length) { + const c = str[i]; + + if ((c === '"' || c === "'" || c === '`') && str[i - 1] !== '\\') { + quote = quote === c ? null : c; + } + + if (!quote) { + if (c === '(') depth++; + if (c === ')') depth--; + + if ((c === ',' || i === str.length) && depth === 0) { + const arg = current.trim(); + + if (arg.startsWith('dt(')) { + args.push(evaluateDtExpressions(arg, fn)); + } else { + args.push(parseArg(arg)); + } + + current = ''; + i++; + continue; + } + } + + if (c !== undefined) current += c; + i++; + } + + return args; + } + + function parseArg(arg: string): string | number { + const q = arg[0]; + + if ((q === '"' || q === "'" || q === '`') && arg[arg.length - 1] === q) { + return arg.slice(1, -1); + } + + const num = Number(arg); + + return isNaN(num) ? arg : num; + } + + const indices: [number, number][] = []; + const stack: number[] = []; + + for (let i = 0; i < input.length; i++) { + if (input[i] === 'd' && input.slice(i, i + 3) === 'dt(') { + stack.push(i); + i += 2; + } else if (input[i] === ')' && stack.length > 0) { + const start = stack.pop()!; + + if (stack.length === 0) { + indices.push([start, i]); + } + } + } + + if (!indices.length) return input; + + for (let i = indices.length - 1; i >= 0; i--) { + const [start, end] = indices[i]; + const inner = input.slice(start + 3, end); + const args = fastParseArgs(inner, fn); + const resolved = fn(...args); + + input = input.slice(0, start) + resolved + input.slice(end + 1); + } + + return input; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/utils/themeUtils.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/utils/themeUtils.ts new file mode 100644 index 000000000..1329bf91e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styled/src/utils/themeUtils.ts @@ -0,0 +1,371 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styled/src/utils/themeUtils.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import { isEmpty, isNotEmpty, isObject, matchRegex, minifyCSS, resolve } from '../../../utils/src/object/index'; +import { dt, toVariables } from '../helpers/index'; +import { CALC_REGEX, EXPR_REGEX, getRule, toTokenKey, VAR_REGEX } from './sharedUtils'; + +export default { + regex: { + rules: { + class: { + pattern: /^\.([a-zA-Z][\w-]*)$/, + resolve(value: string) { + return { type: 'class', selector: value, matched: this.pattern.test(value.trim()) }; + } + }, + attr: { + pattern: /^\[(.*)\]$/, + resolve(value: string) { + return { type: 'attr', selector: `:root${value},:host${value}`, matched: this.pattern.test(value.trim()) }; + } + }, + media: { + pattern: /^@media (.*)$/, + resolve(value: string) { + return { type: 'media', selector: value, matched: this.pattern.test(value.trim()) }; + } + }, + system: { + pattern: /^system$/, + resolve(value: string) { + return { type: 'system', selector: '@media (prefers-color-scheme: dark)', matched: this.pattern.test(value.trim()) }; + } + }, + custom: { + resolve(value: string) { + return { type: 'custom', selector: value, matched: true }; + } + } + }, + resolve(value: any) { + const rules = Object.keys(this.rules) + .filter((k) => k !== 'custom') + .map((r) => (this.rules as any)[r]); + + return [value].flat().map((v) => rules.map((r) => r.resolve(v)).find((rr) => rr.matched) ?? this.rules.custom.resolve(v)); + } + }, + _toVariables(theme: any, options: any) { + return toVariables(theme, { prefix: options?.prefix }); + }, + getCommon({ name = '', theme = {}, params: _params, set, defaults }: any) { + const { preset, options } = theme; + let primitive_css, primitive_tokens, semantic_css, semantic_tokens, global_css, global_tokens, style; + + // @todo - check if options is not empty + if (isNotEmpty(preset) && options.transform !== 'strict') { + const { primitive, semantic, extend } = preset; + const { colorScheme, ...sRest } = semantic || {}; + const { colorScheme: eColorScheme, ...eRest } = extend || {}; + const { dark, ...csRest } = colorScheme || {}; + const { dark: eDark, ...ecsRest } = eColorScheme || {}; + const prim_var: any = isNotEmpty(primitive) ? this._toVariables({ primitive }, options) : {}; + const sRest_var: any = isNotEmpty(sRest) ? this._toVariables({ semantic: sRest }, options) : {}; + const csRest_var: any = isNotEmpty(csRest) ? this._toVariables({ light: csRest }, options) : {}; + const csDark_var: any = isNotEmpty(dark) ? this._toVariables({ dark }, options) : {}; + const eRest_var: any = isNotEmpty(eRest) ? this._toVariables({ semantic: eRest }, options) : {}; + const ecsRest_var: any = isNotEmpty(ecsRest) ? this._toVariables({ light: ecsRest }, options) : {}; + const ecsDark_var: any = isNotEmpty(eDark) ? this._toVariables({ dark: eDark }, options) : {}; + + const [prim_css, prim_tokens] = [prim_var.declarations ?? '', prim_var.tokens]; + const [sRest_css, sRest_tokens] = [sRest_var.declarations ?? '', sRest_var.tokens || []]; + const [csRest_css, csRest_tokens] = [csRest_var.declarations ?? '', csRest_var.tokens || []]; + const [csDark_css, csDark_tokens] = [csDark_var.declarations ?? '', csDark_var.tokens || []]; + const [eRest_css, eRest_tokens] = [eRest_var.declarations ?? '', eRest_var.tokens || []]; + const [ecsRest_css, ecsRest_tokens] = [ecsRest_var.declarations ?? '', ecsRest_var.tokens || []]; + const [ecsDark_css, ecsDark_tokens] = [ecsDark_var.declarations ?? '', ecsDark_var.tokens || []]; + + primitive_css = this.transformCSS(name, prim_css, 'light', 'variable', options, set, defaults); + primitive_tokens = prim_tokens; + + const semantic_light_css = this.transformCSS(name, `${sRest_css}${csRest_css}`, 'light', 'variable', options, set, defaults); + const semantic_dark_css = this.transformCSS(name, `${csDark_css}`, 'dark', 'variable', options, set, defaults); + + semantic_css = `${semantic_light_css}${semantic_dark_css}`; + semantic_tokens = [...new Set([...sRest_tokens, ...csRest_tokens, ...csDark_tokens])]; + + const global_light_css = this.transformCSS(name, `${eRest_css}${ecsRest_css}color-scheme:light`, 'light', 'variable', options, set, defaults); + const global_dark_css = this.transformCSS(name, `${ecsDark_css}color-scheme:dark`, 'dark', 'variable', options, set, defaults); + + global_css = `${global_light_css}${global_dark_css}`; + global_tokens = [...new Set([...eRest_tokens, ...ecsRest_tokens, ...ecsDark_tokens])]; + + style = resolve(preset.css, { dt }) as string; + } + + return { + primitive: { + css: primitive_css, + tokens: primitive_tokens + }, + semantic: { + css: semantic_css, + tokens: semantic_tokens + }, + global: { + css: global_css, + tokens: global_tokens + }, + style + }; + }, + getPreset({ name = '', preset = {}, options, params: _params, set, defaults, selector }: any) { + let p_css, p_tokens, p_style; + + if (isNotEmpty(preset) && options.transform !== 'strict') { + const _name = name.replace('-directive', ''); + const { colorScheme, extend, css, ...vRest } = preset; + const { colorScheme: eColorScheme, ...evRest } = extend || {}; + const { dark, ...csRest } = colorScheme || {}; + const { dark: ecsDark, ...ecsRest } = eColorScheme || {}; + const vRest_var: any = isNotEmpty(vRest) ? this._toVariables({ [_name]: { ...vRest, ...evRest } }, options) : {}; + const csRest_var: any = isNotEmpty(csRest) ? this._toVariables({ [_name]: { ...csRest, ...ecsRest } }, options) : {}; + const csDark_var: any = isNotEmpty(dark) ? this._toVariables({ [_name]: { ...dark, ...ecsDark } }, options) : {}; + + const [vRest_css, vRest_tokens] = [vRest_var.declarations ?? '', vRest_var.tokens || []]; + const [csRest_css, csRest_tokens] = [csRest_var.declarations ?? '', csRest_var.tokens || []]; + const [csDark_css, csDark_tokens] = [csDark_var.declarations ?? '', csDark_var.tokens || []]; + + const light_variable_css = this.transformCSS(_name, `${vRest_css}${csRest_css}`, 'light', 'variable', options, set, defaults, selector); + const dark_variable_css = this.transformCSS(_name, csDark_css, 'dark', 'variable', options, set, defaults, selector); + + p_css = `${light_variable_css}${dark_variable_css}`; + p_tokens = [...new Set([...vRest_tokens, ...csRest_tokens, ...csDark_tokens])]; + + p_style = resolve(css, { dt }) as string; + } + + return { + css: p_css, + tokens: p_tokens, + style: p_style + }; + }, + getPresetC({ name = '', theme = {}, params, set, defaults }: any) { + const { preset, options } = theme; + const cPreset = preset?.components?.[name]; + + return this.getPreset({ name, preset: cPreset, options, params, set, defaults }); + }, + // @deprecated - use getPresetC instead + getPresetD({ name = '', theme = {}, params, set, defaults }: any) { + const dName = name.replace('-directive', ''); + const { preset, options } = theme; + const dPreset = preset?.components?.[dName] || preset?.directives?.[dName]; + + return this.getPreset({ name: dName, preset: dPreset, options, params, set, defaults }); + }, + applyDarkColorScheme(options: any) { + return !(options.darkModeSelector === 'none' || options.darkModeSelector === false); + }, + getColorSchemeOption(options: any, defaults: any) { + return this.applyDarkColorScheme(options) ? this.regex.resolve(options.darkModeSelector === true ? defaults.options.darkModeSelector : (options.darkModeSelector ?? defaults.options.darkModeSelector)) : []; + }, + getLayerOrder(_name: string, options: any = {}, params: any, _defaults: any) { + const { cssLayer } = options; + + if (cssLayer) { + const order = resolve(cssLayer.order || cssLayer.name || 'primeui', params); + + return `@layer ${order}`; + } + + return ''; + }, + getCommonStyleSheet({ name = '', theme = {}, params, props = {}, set, defaults }: any) { + const common = this.getCommon({ name, theme, params, set, defaults }); + const _props = Object.entries(props) + .reduce((acc: any, [k, v]) => acc.push(`${k}="${v}"`) && acc, []) + .join(' '); + + return Object.entries(common || {}) + .reduce((acc: any, [key, value]) => { + if (isObject(value) && Object.hasOwn(value, 'css')) { + const _css = minifyCSS((value as any).css); + const id = `${key}-variables`; + + acc.push(``); // @todo data-primevue -> data-primeui check in primevue usestyle + } + + return acc; + }, []) + .join(''); + }, + getStyleSheet({ name = '', theme = {}, params, props = {}, set, defaults }: any) { + const options = { name, theme, params, set, defaults }; + const preset_css = (name.includes('-directive') ? this.getPresetD(options) : this.getPresetC(options))?.css; + const _props = Object.entries(props) + .reduce((acc: any, [k, v]) => acc.push(`${k}="${v}"`) && acc, []) + .join(' '); + + return preset_css ? `` : ''; // @todo check + }, + createTokens(obj: any = {}, defaults: any, parentKey: string = '', parentPath: string = '', tokens: any = {}) { + const computedFn = function (this: any, colorScheme: string, tokenPathMap: any = {}, stack: string[] = []) { + if (stack.includes(this.path)) { + console.warn(`Circular reference detected at ${this.path}`); + + return { + colorScheme, + path: this.path, + paths: tokenPathMap, + value: undefined + }; + } + + stack.push(this.path); + tokenPathMap['name'] = this.path; + tokenPathMap['binding'] ||= {}; + + let computedValue: any = this.value; + + if (typeof this.value === 'string' && EXPR_REGEX.test(this.value)) { + const val = this.value.trim(); + const _val = val.replace(EXPR_REGEX, (v: any) => { + const refPath = v.slice(1, -1); + const refToken = this.tokens[refPath]; + + if (!refToken) { + console.warn(`Token not found for path: ${refPath}`); + + return `__UNRESOLVED__`; + } + + const computed = refToken.computed(colorScheme, tokenPathMap, stack); + + if (Array.isArray(computed) && computed.length === 2) { + return `light-dark(${computed[0].value},${computed[1].value})`; + } else { + return computed?.value ?? `__UNRESOLVED__`; + } + }); + + computedValue = CALC_REGEX.test(_val.replace(VAR_REGEX, '0')) ? `calc(${_val})` : _val; + } + + if (isEmpty(tokenPathMap['binding'])) { + delete tokenPathMap['binding']; + } + + stack.pop(); + + return { + colorScheme, + path: this.path, + paths: tokenPathMap, + value: computedValue.includes('__UNRESOLVED__') ? undefined : computedValue + }; + }; + + const traverse = (obj: any, parentKey: string, parentPath: string) => { + Object.entries(obj).forEach(([key, value]) => { + const currentKey = matchRegex(key, defaults.variable.excludedKeyRegex) ? parentKey : parentKey ? `${parentKey}.${toTokenKey(key)}` : toTokenKey(key); + + const currentPath = parentPath ? `${parentPath}.${key}` : key; + + if (isObject(value)) { + traverse(value, currentKey, currentPath); + } else { + if (!tokens[currentKey]) { + tokens[currentKey] = { + paths: [], + computed: (colorScheme: string, tokenPathMap: any = {}, stack: string[] = []) => { + if (tokens[currentKey].paths.length === 1) { + return tokens[currentKey].paths[0].computed(tokens[currentKey].paths[0].scheme, tokenPathMap['binding'], stack); + } else if (colorScheme && colorScheme !== 'none') { + for (let i = 0; i < tokens[currentKey].paths.length; i++) { + const p = tokens[currentKey].paths[i]; + + if (p.scheme === colorScheme) { + return p.computed(colorScheme, tokenPathMap['binding'], stack); + } + } + } + + return tokens[currentKey].paths.map((p: any) => p.computed(p.scheme, tokenPathMap[p.scheme], stack)); + } + }; + } + + tokens[currentKey].paths.push({ + path: currentPath, + value, + scheme: currentPath.includes('colorScheme.light') ? 'light' : currentPath.includes('colorScheme.dark') ? 'dark' : 'none', + computed: computedFn, + tokens + }); + } + }); + }; + + traverse(obj, parentKey, parentPath); + + return tokens; + }, + getTokenValue(tokens: any, path: string, defaults: any) { + const normalizePath = (str: string) => { + const strArr = str.split('.'); + + return strArr.filter((s) => !matchRegex(s.toLowerCase(), defaults.variable.excludedKeyRegex)).join('.'); + }; + + const token = normalizePath(path); + const colorScheme = path.includes('colorScheme.light') ? 'light' : path.includes('colorScheme.dark') ? 'dark' : undefined; + const computedValues = [tokens[token as any]?.computed(colorScheme)].flat().filter((computed) => computed); + + return computedValues.length === 1 + ? computedValues[0].value + : computedValues.reduce((acc = {}, computed) => { + const { colorScheme: cs, ...rest } = computed; + + acc[cs] = rest; + + return acc; + }, undefined); + }, + getSelectorRule(selector1: any, selector2: any, type: string, css: string) { + return type === 'class' || type === 'attr' ? getRule(isNotEmpty(selector2) ? `${selector1}${selector2},${selector1} ${selector2}` : selector1, css) : getRule(selector1, getRule(selector2 ?? ':root,:host', css)); + }, + transformCSS(name: string, css: string, mode?: string, type?: string, options: any = {}, set?: any, defaults?: any, selector?: string) { + if (isNotEmpty(css)) { + const { cssLayer } = options; + + if (type !== 'style') { + const colorSchemeOption = this.getColorSchemeOption(options, defaults); + + css = + mode === 'dark' + ? colorSchemeOption.reduce((acc, { type, selector: _selector }) => { + if (isNotEmpty(_selector)) { + acc += _selector.includes('[CSS]') ? _selector.replace('[CSS]', css) : this.getSelectorRule(_selector, selector, type, css); + } + + return acc; + }, '') + : getRule(selector ?? ':root,:host', css); + } + + if (cssLayer) { + const layerOptions = { + name: 'primeui', + order: 'primeui' + }; + + isObject(cssLayer) && (layerOptions.name = resolve((cssLayer as any).name, { name, type })); + + if (isNotEmpty(layerOptions.name)) { + css = getRule(`@layer ${layerOptions.name}`, css); + set?.layerNames(layerOptions.name); + } + } + + return css; + } + + return ''; + } +}; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/badge/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/badge/index.ts new file mode 100644 index 000000000..c946b2af2 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/badge/index.ts @@ -0,0 +1,82 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/badge/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-badge { + display: inline-flex; + border-radius: dt('badge.border.radius'); + align-items: center; + justify-content: center; + padding: dt('badge.padding'); + background: dt('badge.primary.background'); + color: dt('badge.primary.color'); + font-size: dt('badge.font.size'); + font-weight: dt('badge.font.weight'); + min-width: dt('badge.min.width'); + height: dt('badge.height'); + } + + .p-badge-dot { + width: dt('badge.dot.size'); + min-width: dt('badge.dot.size'); + height: dt('badge.dot.size'); + border-radius: 50%; + padding: 0; + } + + .p-badge-circle { + padding: 0; + border-radius: 50%; + } + + .p-badge-secondary { + background: dt('badge.secondary.background'); + color: dt('badge.secondary.color'); + } + + .p-badge-success { + background: dt('badge.success.background'); + color: dt('badge.success.color'); + } + + .p-badge-info { + background: dt('badge.info.background'); + color: dt('badge.info.color'); + } + + .p-badge-warn { + background: dt('badge.warn.background'); + color: dt('badge.warn.color'); + } + + .p-badge-danger { + background: dt('badge.danger.background'); + color: dt('badge.danger.color'); + } + + .p-badge-contrast { + background: dt('badge.contrast.background'); + color: dt('badge.contrast.color'); + } + + .p-badge-sm { + font-size: dt('badge.sm.font.size'); + min-width: dt('badge.sm.min.width'); + height: dt('badge.sm.height'); + } + + .p-badge-lg { + font-size: dt('badge.lg.font.size'); + min-width: dt('badge.lg.min.width'); + height: dt('badge.lg.height'); + } + + .p-badge-xl { + font-size: dt('badge.xl.font.size'); + min-width: dt('badge.xl.min.width'); + height: dt('badge.xl.height'); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/base/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/base/index.ts new file mode 100644 index 000000000..4d82433f4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/base/index.ts @@ -0,0 +1,119 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/base/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + *, + ::before, + ::after { + box-sizing: border-box; + } + + .p-collapsible-enter-active { + animation: p-animate-collapsible-expand 0.2s ease-out; + overflow: hidden; + } + + .p-collapsible-leave-active { + animation: p-animate-collapsible-collapse 0.2s ease-out; + overflow: hidden; + } + + @keyframes p-animate-collapsible-expand { + from { + grid-template-rows: 0fr; + } + to { + grid-template-rows: 1fr; + } + } + + @keyframes p-animate-collapsible-collapse { + from { + grid-template-rows: 1fr; + } + to { + grid-template-rows: 0fr; + } + } + + .p-disabled, + .p-disabled * { + cursor: default; + pointer-events: none; + user-select: none; + } + + .p-disabled, + .p-component:disabled { + opacity: dt('disabled.opacity'); + } + + .pi { + font-size: dt('icon.size'); + } + + .p-icon { + width: dt('icon.size'); + height: dt('icon.size'); + } + + .p-overlay-mask { + background: var(--px-mask-background, dt('mask.background')); + color: dt('mask.color'); + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + .p-overlay-mask-enter-active { + animation: p-animate-overlay-mask-enter dt('mask.transition.duration') forwards; + } + + .p-overlay-mask-leave-active { + animation: p-animate-overlay-mask-leave dt('mask.transition.duration') forwards; + } + + @keyframes p-animate-overlay-mask-enter { + from { + background: transparent; + } + to { + background: var(--px-mask-background, dt('mask.background')); + } + } + @keyframes p-animate-overlay-mask-leave { + from { + background: var(--px-mask-background, dt('mask.background')); + } + to { + background: transparent; + } + } + + .p-anchored-overlay-enter-active { + animation: p-animate-anchored-overlay-enter 300ms cubic-bezier(.19,1,.22,1); + } + + .p-anchored-overlay-leave-active { + animation: p-animate-anchored-overlay-leave 300ms cubic-bezier(.19,1,.22,1); + } + + @keyframes p-animate-anchored-overlay-enter { + from { + opacity: 0; + transform: scale(0.93); + } + } + + @keyframes p-animate-anchored-overlay-leave { + to { + opacity: 0; + transform: scale(0.93); + } + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/button/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/button/index.ts new file mode 100644 index 000000000..8b3926f88 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/button/index.ts @@ -0,0 +1,657 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/button/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-button { + display: inline-flex; + cursor: pointer; + user-select: none; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; + color: dt('button.primary.color'); + background: dt('button.primary.background'); + border: 1px solid dt('button.primary.border.color'); + padding: dt('button.padding.y') dt('button.padding.x'); + font-size: 1rem; + font-family: inherit; + font-feature-settings: inherit; + transition: + background dt('button.transition.duration'), + color dt('button.transition.duration'), + border-color dt('button.transition.duration'), + outline-color dt('button.transition.duration'), + box-shadow dt('button.transition.duration'); + border-radius: dt('button.border.radius'); + outline-color: transparent; + gap: dt('button.gap'); + } + + .p-button:disabled { + cursor: default; + } + + .p-button-icon-right { + order: 1; + } + + .p-button-icon-right:dir(rtl) { + order: -1; + } + + .p-button:not(.p-button-vertical) .p-button-icon:not(.p-button-icon-right):dir(rtl) { + order: 1; + } + + .p-button-icon-bottom { + order: 2; + } + + .p-button-icon-only { + width: dt('button.icon.only.width'); + padding-inline-start: 0; + padding-inline-end: 0; + gap: 0; + } + + .p-button-icon-only.p-button-rounded { + border-radius: 50%; + height: dt('button.icon.only.width'); + } + + .p-button-icon-only .p-button-label { + visibility: hidden; + width: 0; + } + + .p-button-icon-only::after { + content: "\u00A0"; + visibility: hidden; + width: 0; + } + + .p-button-sm { + font-size: dt('button.sm.font.size'); + padding: dt('button.sm.padding.y') dt('button.sm.padding.x'); + } + + .p-button-sm .p-button-icon { + font-size: dt('button.sm.font.size'); + } + + .p-button-sm.p-button-icon-only { + width: dt('button.sm.icon.only.width'); + } + + .p-button-sm.p-button-icon-only.p-button-rounded { + height: dt('button.sm.icon.only.width'); + } + + .p-button-lg { + font-size: dt('button.lg.font.size'); + padding: dt('button.lg.padding.y') dt('button.lg.padding.x'); + } + + .p-button-lg .p-button-icon { + font-size: dt('button.lg.font.size'); + } + + .p-button-lg.p-button-icon-only { + width: dt('button.lg.icon.only.width'); + } + + .p-button-lg.p-button-icon-only.p-button-rounded { + height: dt('button.lg.icon.only.width'); + } + + .p-button-vertical { + flex-direction: column; + } + + .p-button-label { + font-weight: dt('button.label.font.weight'); + } + + .p-button-fluid { + width: 100%; + } + + .p-button-fluid.p-button-icon-only { + width: dt('button.icon.only.width'); + } + + .p-button:not(:disabled):hover { + background: dt('button.primary.hover.background'); + border: 1px solid dt('button.primary.hover.border.color'); + color: dt('button.primary.hover.color'); + } + + .p-button:not(:disabled):active { + background: dt('button.primary.active.background'); + border: 1px solid dt('button.primary.active.border.color'); + color: dt('button.primary.active.color'); + } + + .p-button:focus-visible { + box-shadow: dt('button.primary.focus.ring.shadow'); + outline: dt('button.focus.ring.width') dt('button.focus.ring.style') dt('button.primary.focus.ring.color'); + outline-offset: dt('button.focus.ring.offset'); + } + + .p-button .p-badge { + min-width: dt('button.badge.size'); + height: dt('button.badge.size'); + line-height: dt('button.badge.size'); + } + + .p-button-raised { + box-shadow: dt('button.raised.shadow'); + } + + .p-button-rounded { + border-radius: dt('button.rounded.border.radius'); + } + + .p-button-secondary { + background: dt('button.secondary.background'); + border: 1px solid dt('button.secondary.border.color'); + color: dt('button.secondary.color'); + } + + .p-button-secondary:not(:disabled):hover { + background: dt('button.secondary.hover.background'); + border: 1px solid dt('button.secondary.hover.border.color'); + color: dt('button.secondary.hover.color'); + } + + .p-button-secondary:not(:disabled):active { + background: dt('button.secondary.active.background'); + border: 1px solid dt('button.secondary.active.border.color'); + color: dt('button.secondary.active.color'); + } + + .p-button-secondary:focus-visible { + outline-color: dt('button.secondary.focus.ring.color'); + box-shadow: dt('button.secondary.focus.ring.shadow'); + } + + .p-button-success { + background: dt('button.success.background'); + border: 1px solid dt('button.success.border.color'); + color: dt('button.success.color'); + } + + .p-button-success:not(:disabled):hover { + background: dt('button.success.hover.background'); + border: 1px solid dt('button.success.hover.border.color'); + color: dt('button.success.hover.color'); + } + + .p-button-success:not(:disabled):active { + background: dt('button.success.active.background'); + border: 1px solid dt('button.success.active.border.color'); + color: dt('button.success.active.color'); + } + + .p-button-success:focus-visible { + outline-color: dt('button.success.focus.ring.color'); + box-shadow: dt('button.success.focus.ring.shadow'); + } + + .p-button-info { + background: dt('button.info.background'); + border: 1px solid dt('button.info.border.color'); + color: dt('button.info.color'); + } + + .p-button-info:not(:disabled):hover { + background: dt('button.info.hover.background'); + border: 1px solid dt('button.info.hover.border.color'); + color: dt('button.info.hover.color'); + } + + .p-button-info:not(:disabled):active { + background: dt('button.info.active.background'); + border: 1px solid dt('button.info.active.border.color'); + color: dt('button.info.active.color'); + } + + .p-button-info:focus-visible { + outline-color: dt('button.info.focus.ring.color'); + box-shadow: dt('button.info.focus.ring.shadow'); + } + + .p-button-warn { + background: dt('button.warn.background'); + border: 1px solid dt('button.warn.border.color'); + color: dt('button.warn.color'); + } + + .p-button-warn:not(:disabled):hover { + background: dt('button.warn.hover.background'); + border: 1px solid dt('button.warn.hover.border.color'); + color: dt('button.warn.hover.color'); + } + + .p-button-warn:not(:disabled):active { + background: dt('button.warn.active.background'); + border: 1px solid dt('button.warn.active.border.color'); + color: dt('button.warn.active.color'); + } + + .p-button-warn:focus-visible { + outline-color: dt('button.warn.focus.ring.color'); + box-shadow: dt('button.warn.focus.ring.shadow'); + } + + .p-button-help { + background: dt('button.help.background'); + border: 1px solid dt('button.help.border.color'); + color: dt('button.help.color'); + } + + .p-button-help:not(:disabled):hover { + background: dt('button.help.hover.background'); + border: 1px solid dt('button.help.hover.border.color'); + color: dt('button.help.hover.color'); + } + + .p-button-help:not(:disabled):active { + background: dt('button.help.active.background'); + border: 1px solid dt('button.help.active.border.color'); + color: dt('button.help.active.color'); + } + + .p-button-help:focus-visible { + outline-color: dt('button.help.focus.ring.color'); + box-shadow: dt('button.help.focus.ring.shadow'); + } + + .p-button-danger { + background: dt('button.danger.background'); + border: 1px solid dt('button.danger.border.color'); + color: dt('button.danger.color'); + } + + .p-button-danger:not(:disabled):hover { + background: dt('button.danger.hover.background'); + border: 1px solid dt('button.danger.hover.border.color'); + color: dt('button.danger.hover.color'); + } + + .p-button-danger:not(:disabled):active { + background: dt('button.danger.active.background'); + border: 1px solid dt('button.danger.active.border.color'); + color: dt('button.danger.active.color'); + } + + .p-button-danger:focus-visible { + outline-color: dt('button.danger.focus.ring.color'); + box-shadow: dt('button.danger.focus.ring.shadow'); + } + + .p-button-contrast { + background: dt('button.contrast.background'); + border: 1px solid dt('button.contrast.border.color'); + color: dt('button.contrast.color'); + } + + .p-button-contrast:not(:disabled):hover { + background: dt('button.contrast.hover.background'); + border: 1px solid dt('button.contrast.hover.border.color'); + color: dt('button.contrast.hover.color'); + } + + .p-button-contrast:not(:disabled):active { + background: dt('button.contrast.active.background'); + border: 1px solid dt('button.contrast.active.border.color'); + color: dt('button.contrast.active.color'); + } + + .p-button-contrast:focus-visible { + outline-color: dt('button.contrast.focus.ring.color'); + box-shadow: dt('button.contrast.focus.ring.shadow'); + } + + .p-button-outlined { + background: transparent; + border-color: dt('button.outlined.primary.border.color'); + color: dt('button.outlined.primary.color'); + } + + .p-button-outlined:not(:disabled):hover { + background: dt('button.outlined.primary.hover.background'); + border-color: dt('button.outlined.primary.border.color'); + color: dt('button.outlined.primary.color'); + } + + .p-button-outlined:not(:disabled):active { + background: dt('button.outlined.primary.active.background'); + border-color: dt('button.outlined.primary.border.color'); + color: dt('button.outlined.primary.color'); + } + + .p-button-outlined.p-button-secondary { + border-color: dt('button.outlined.secondary.border.color'); + color: dt('button.outlined.secondary.color'); + } + + .p-button-outlined.p-button-secondary:not(:disabled):hover { + background: dt('button.outlined.secondary.hover.background'); + border-color: dt('button.outlined.secondary.border.color'); + color: dt('button.outlined.secondary.color'); + } + + .p-button-outlined.p-button-secondary:not(:disabled):active { + background: dt('button.outlined.secondary.active.background'); + border-color: dt('button.outlined.secondary.border.color'); + color: dt('button.outlined.secondary.color'); + } + + .p-button-outlined.p-button-success { + border-color: dt('button.outlined.success.border.color'); + color: dt('button.outlined.success.color'); + } + + .p-button-outlined.p-button-success:not(:disabled):hover { + background: dt('button.outlined.success.hover.background'); + border-color: dt('button.outlined.success.border.color'); + color: dt('button.outlined.success.color'); + } + + .p-button-outlined.p-button-success:not(:disabled):active { + background: dt('button.outlined.success.active.background'); + border-color: dt('button.outlined.success.border.color'); + color: dt('button.outlined.success.color'); + } + + .p-button-outlined.p-button-info { + border-color: dt('button.outlined.info.border.color'); + color: dt('button.outlined.info.color'); + } + + .p-button-outlined.p-button-info:not(:disabled):hover { + background: dt('button.outlined.info.hover.background'); + border-color: dt('button.outlined.info.border.color'); + color: dt('button.outlined.info.color'); + } + + .p-button-outlined.p-button-info:not(:disabled):active { + background: dt('button.outlined.info.active.background'); + border-color: dt('button.outlined.info.border.color'); + color: dt('button.outlined.info.color'); + } + + .p-button-outlined.p-button-warn { + border-color: dt('button.outlined.warn.border.color'); + color: dt('button.outlined.warn.color'); + } + + .p-button-outlined.p-button-warn:not(:disabled):hover { + background: dt('button.outlined.warn.hover.background'); + border-color: dt('button.outlined.warn.border.color'); + color: dt('button.outlined.warn.color'); + } + + .p-button-outlined.p-button-warn:not(:disabled):active { + background: dt('button.outlined.warn.active.background'); + border-color: dt('button.outlined.warn.border.color'); + color: dt('button.outlined.warn.color'); + } + + .p-button-outlined.p-button-help { + border-color: dt('button.outlined.help.border.color'); + color: dt('button.outlined.help.color'); + } + + .p-button-outlined.p-button-help:not(:disabled):hover { + background: dt('button.outlined.help.hover.background'); + border-color: dt('button.outlined.help.border.color'); + color: dt('button.outlined.help.color'); + } + + .p-button-outlined.p-button-help:not(:disabled):active { + background: dt('button.outlined.help.active.background'); + border-color: dt('button.outlined.help.border.color'); + color: dt('button.outlined.help.color'); + } + + .p-button-outlined.p-button-danger { + border-color: dt('button.outlined.danger.border.color'); + color: dt('button.outlined.danger.color'); + } + + .p-button-outlined.p-button-danger:not(:disabled):hover { + background: dt('button.outlined.danger.hover.background'); + border-color: dt('button.outlined.danger.border.color'); + color: dt('button.outlined.danger.color'); + } + + .p-button-outlined.p-button-danger:not(:disabled):active { + background: dt('button.outlined.danger.active.background'); + border-color: dt('button.outlined.danger.border.color'); + color: dt('button.outlined.danger.color'); + } + + .p-button-outlined.p-button-contrast { + border-color: dt('button.outlined.contrast.border.color'); + color: dt('button.outlined.contrast.color'); + } + + .p-button-outlined.p-button-contrast:not(:disabled):hover { + background: dt('button.outlined.contrast.hover.background'); + border-color: dt('button.outlined.contrast.border.color'); + color: dt('button.outlined.contrast.color'); + } + + .p-button-outlined.p-button-contrast:not(:disabled):active { + background: dt('button.outlined.contrast.active.background'); + border-color: dt('button.outlined.contrast.border.color'); + color: dt('button.outlined.contrast.color'); + } + + .p-button-outlined.p-button-plain { + border-color: dt('button.outlined.plain.border.color'); + color: dt('button.outlined.plain.color'); + } + + .p-button-outlined.p-button-plain:not(:disabled):hover { + background: dt('button.outlined.plain.hover.background'); + border-color: dt('button.outlined.plain.border.color'); + color: dt('button.outlined.plain.color'); + } + + .p-button-outlined.p-button-plain:not(:disabled):active { + background: dt('button.outlined.plain.active.background'); + border-color: dt('button.outlined.plain.border.color'); + color: dt('button.outlined.plain.color'); + } + + .p-button-text { + background: transparent; + border-color: transparent; + color: dt('button.text.primary.color'); + } + + .p-button-text:not(:disabled):hover { + background: dt('button.text.primary.hover.background'); + border-color: transparent; + color: dt('button.text.primary.color'); + } + + .p-button-text:not(:disabled):active { + background: dt('button.text.primary.active.background'); + border-color: transparent; + color: dt('button.text.primary.color'); + } + + .p-button-text.p-button-secondary { + background: transparent; + border-color: transparent; + color: dt('button.text.secondary.color'); + } + + .p-button-text.p-button-secondary:not(:disabled):hover { + background: dt('button.text.secondary.hover.background'); + border-color: transparent; + color: dt('button.text.secondary.color'); + } + + .p-button-text.p-button-secondary:not(:disabled):active { + background: dt('button.text.secondary.active.background'); + border-color: transparent; + color: dt('button.text.secondary.color'); + } + + .p-button-text.p-button-success { + background: transparent; + border-color: transparent; + color: dt('button.text.success.color'); + } + + .p-button-text.p-button-success:not(:disabled):hover { + background: dt('button.text.success.hover.background'); + border-color: transparent; + color: dt('button.text.success.color'); + } + + .p-button-text.p-button-success:not(:disabled):active { + background: dt('button.text.success.active.background'); + border-color: transparent; + color: dt('button.text.success.color'); + } + + .p-button-text.p-button-info { + background: transparent; + border-color: transparent; + color: dt('button.text.info.color'); + } + + .p-button-text.p-button-info:not(:disabled):hover { + background: dt('button.text.info.hover.background'); + border-color: transparent; + color: dt('button.text.info.color'); + } + + .p-button-text.p-button-info:not(:disabled):active { + background: dt('button.text.info.active.background'); + border-color: transparent; + color: dt('button.text.info.color'); + } + + .p-button-text.p-button-warn { + background: transparent; + border-color: transparent; + color: dt('button.text.warn.color'); + } + + .p-button-text.p-button-warn:not(:disabled):hover { + background: dt('button.text.warn.hover.background'); + border-color: transparent; + color: dt('button.text.warn.color'); + } + + .p-button-text.p-button-warn:not(:disabled):active { + background: dt('button.text.warn.active.background'); + border-color: transparent; + color: dt('button.text.warn.color'); + } + + .p-button-text.p-button-help { + background: transparent; + border-color: transparent; + color: dt('button.text.help.color'); + } + + .p-button-text.p-button-help:not(:disabled):hover { + background: dt('button.text.help.hover.background'); + border-color: transparent; + color: dt('button.text.help.color'); + } + + .p-button-text.p-button-help:not(:disabled):active { + background: dt('button.text.help.active.background'); + border-color: transparent; + color: dt('button.text.help.color'); + } + + .p-button-text.p-button-danger { + background: transparent; + border-color: transparent; + color: dt('button.text.danger.color'); + } + + .p-button-text.p-button-danger:not(:disabled):hover { + background: dt('button.text.danger.hover.background'); + border-color: transparent; + color: dt('button.text.danger.color'); + } + + .p-button-text.p-button-danger:not(:disabled):active { + background: dt('button.text.danger.active.background'); + border-color: transparent; + color: dt('button.text.danger.color'); + } + + .p-button-text.p-button-contrast { + background: transparent; + border-color: transparent; + color: dt('button.text.contrast.color'); + } + + .p-button-text.p-button-contrast:not(:disabled):hover { + background: dt('button.text.contrast.hover.background'); + border-color: transparent; + color: dt('button.text.contrast.color'); + } + + .p-button-text.p-button-contrast:not(:disabled):active { + background: dt('button.text.contrast.active.background'); + border-color: transparent; + color: dt('button.text.contrast.color'); + } + + .p-button-text.p-button-plain { + background: transparent; + border-color: transparent; + color: dt('button.text.plain.color'); + } + + .p-button-text.p-button-plain:not(:disabled):hover { + background: dt('button.text.plain.hover.background'); + border-color: transparent; + color: dt('button.text.plain.color'); + } + + .p-button-text.p-button-plain:not(:disabled):active { + background: dt('button.text.plain.active.background'); + border-color: transparent; + color: dt('button.text.plain.color'); + } + + .p-button-link { + background: transparent; + border-color: transparent; + color: dt('button.link.color'); + } + + .p-button-link:not(:disabled):hover { + background: transparent; + border-color: transparent; + color: dt('button.link.hover.color'); + } + + .p-button-link:not(:disabled):hover .p-button-label { + text-decoration: underline; + } + + .p-button-link:not(:disabled):active { + background: transparent; + border-color: transparent; + color: dt('button.link.active.color'); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/checkbox/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/checkbox/index.ts new file mode 100644 index 000000000..be3d75534 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/checkbox/index.ts @@ -0,0 +1,146 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/checkbox/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-checkbox { + position: relative; + display: inline-flex; + user-select: none; + vertical-align: bottom; + width: dt('checkbox.width'); + height: dt('checkbox.height'); + } + + .p-checkbox-input { + cursor: pointer; + appearance: none; + position: absolute; + inset-block-start: 0; + inset-inline-start: 0; + width: 100%; + height: 100%; + padding: 0; + margin: 0; + opacity: 0; + z-index: 1; + outline: 0 none; + border: 1px solid transparent; + border-radius: dt('checkbox.border.radius'); + } + + .p-checkbox-box { + display: flex; + justify-content: center; + align-items: center; + border-radius: dt('checkbox.border.radius'); + border: 1px solid dt('checkbox.border.color'); + background: dt('checkbox.background'); + width: dt('checkbox.width'); + height: dt('checkbox.height'); + transition: + background dt('checkbox.transition.duration'), + color dt('checkbox.transition.duration'), + border-color dt('checkbox.transition.duration'), + box-shadow dt('checkbox.transition.duration'), + outline-color dt('checkbox.transition.duration'); + outline-color: transparent; + box-shadow: dt('checkbox.shadow'); + } + + .p-checkbox-icon { + transition-duration: dt('checkbox.transition.duration'); + color: dt('checkbox.icon.color'); + font-size: dt('checkbox.icon.size'); + width: dt('checkbox.icon.size'); + height: dt('checkbox.icon.size'); + } + + .p-checkbox:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-box { + border-color: dt('checkbox.hover.border.color'); + } + + .p-checkbox-checked .p-checkbox-box { + border-color: dt('checkbox.checked.border.color'); + background: dt('checkbox.checked.background'); + } + + .p-checkbox-checked .p-checkbox-icon { + color: dt('checkbox.icon.checked.color'); + } + + .p-checkbox-checked:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-box { + background: dt('checkbox.checked.hover.background'); + border-color: dt('checkbox.checked.hover.border.color'); + } + + .p-checkbox-checked:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-icon { + color: dt('checkbox.icon.checked.hover.color'); + } + + .p-checkbox:not(.p-disabled):has(.p-checkbox-input:focus-visible) .p-checkbox-box { + border-color: dt('checkbox.focus.border.color'); + box-shadow: dt('checkbox.focus.ring.shadow'); + outline: dt('checkbox.focus.ring.width') dt('checkbox.focus.ring.style') dt('checkbox.focus.ring.color'); + outline-offset: dt('checkbox.focus.ring.offset'); + } + + .p-checkbox-checked:not(.p-disabled):has(.p-checkbox-input:focus-visible) .p-checkbox-box { + border-color: dt('checkbox.checked.focus.border.color'); + } + + .p-checkbox.p-invalid > .p-checkbox-box { + border-color: dt('checkbox.invalid.border.color'); + } + + .p-checkbox.p-variant-filled .p-checkbox-box { + background: dt('checkbox.filled.background'); + } + + .p-checkbox-checked.p-variant-filled .p-checkbox-box { + background: dt('checkbox.checked.background'); + } + + .p-checkbox-checked.p-variant-filled:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-box { + background: dt('checkbox.checked.hover.background'); + } + + .p-checkbox.p-disabled { + opacity: 1; + } + + .p-checkbox.p-disabled .p-checkbox-box { + background: dt('checkbox.disabled.background'); + border-color: dt('checkbox.checked.disabled.border.color'); + } + + .p-checkbox.p-disabled .p-checkbox-box .p-checkbox-icon { + color: dt('checkbox.icon.disabled.color'); + } + + .p-checkbox-sm, + .p-checkbox-sm .p-checkbox-box { + width: dt('checkbox.sm.width'); + height: dt('checkbox.sm.height'); + } + + .p-checkbox-sm .p-checkbox-icon { + font-size: dt('checkbox.icon.sm.size'); + width: dt('checkbox.icon.sm.size'); + height: dt('checkbox.icon.sm.size'); + } + + .p-checkbox-lg, + .p-checkbox-lg .p-checkbox-box { + width: dt('checkbox.lg.width'); + height: dt('checkbox.lg.height'); + } + + .p-checkbox-lg .p-checkbox-icon { + font-size: dt('checkbox.icon.lg.size'); + width: dt('checkbox.icon.lg.size'); + height: dt('checkbox.icon.lg.size'); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/datatable/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/datatable/index.ts new file mode 100644 index 000000000..60ed64b93 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/datatable/index.ts @@ -0,0 +1,614 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/datatable/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-datatable { + position: relative; + display: block; + } + + .p-datatable-table { + border-spacing: 0; + border-collapse: separate; + width: 100%; + } + + .p-datatable-scrollable > .p-datatable-table-container { + position: relative; + } + + .p-datatable-scrollable-table > .p-datatable-thead { + inset-block-start: 0; + z-index: 1; + } + + .p-datatable-scrollable-table > .p-datatable-frozen-tbody { + position: sticky; + z-index: 1; + } + + .p-datatable-scrollable-table > .p-datatable-tfoot { + inset-block-end: 0; + z-index: 1; + } + + .p-datatable-scrollable .p-datatable-frozen-column { + position: sticky; + } + + .p-datatable-scrollable th.p-datatable-frozen-column { + z-index: 1; + } + + .p-datatable-scrollable td.p-datatable-frozen-column { + background: inherit; + } + + .p-datatable-scrollable > .p-datatable-table-container > .p-datatable-table > .p-datatable-thead, + .p-datatable-scrollable > .p-datatable-table-container > .p-virtualscroller > .p-datatable-table > .p-datatable-thead { + background: dt('datatable.header.cell.background'); + } + + .p-datatable-scrollable > .p-datatable-table-container > .p-datatable-table > .p-datatable-tfoot, + .p-datatable-scrollable > .p-datatable-table-container > .p-virtualscroller > .p-datatable-table > .p-datatable-tfoot { + background: dt('datatable.footer.cell.background'); + } + + .p-datatable-flex-scrollable { + display: flex; + flex-direction: column; + height: 100%; + } + + .p-datatable-flex-scrollable > .p-datatable-table-container { + display: flex; + flex-direction: column; + flex: 1; + height: 100%; + } + + .p-datatable-scrollable-table > .p-datatable-tbody > .p-datatable-row-group-header { + position: sticky; + z-index: 1; + } + + .p-datatable-resizable-table > .p-datatable-thead > tr > th, + .p-datatable-resizable-table > .p-datatable-tfoot > tr > td, + .p-datatable-resizable-table > .p-datatable-tbody > tr > td { + overflow: hidden; + white-space: nowrap; + } + + .p-datatable-resizable-table > .p-datatable-thead > tr > th.p-datatable-resizable-column:not(.p-datatable-frozen-column) { + background-clip: padding-box; + position: relative; + } + + .p-datatable-resizable-table-fit > .p-datatable-thead > tr > th.p-datatable-resizable-column:last-child .p-datatable-column-resizer { + display: none; + } + + .p-datatable-column-resizer { + display: block; + position: absolute; + inset-block-start: 0; + inset-inline-end: 0; + margin: 0; + width: dt('datatable.column.resizer.width'); + height: 100%; + padding: 0; + cursor: col-resize; + border: 1px solid transparent; + } + + .p-datatable-column-header-content { + display: flex; + align-items: center; + gap: dt('datatable.header.cell.gap'); + } + + .p-datatable-column-resize-indicator { + width: dt('datatable.resize.indicator.width'); + position: absolute; + z-index: 10; + display: none; + background: dt('datatable.resize.indicator.color'); + } + + .p-datatable-row-reorder-indicator-up, + .p-datatable-row-reorder-indicator-down { + position: absolute; + display: none; + } + + .p-datatable-reorderable-column, + .p-datatable-reorderable-row-handle { + cursor: move; + } + + .p-datatable-mask { + position: absolute; + display: flex; + align-items: center; + justify-content: center; + z-index: 2; + } + + .p-datatable-inline-filter { + display: flex; + align-items: center; + width: 100%; + gap: dt('datatable.filter.inline.gap'); + } + + .p-datatable-inline-filter .p-datatable-filter-element-container { + flex: 1 1 auto; + width: 1%; + } + + .p-datatable-filter-overlay { + background: dt('datatable.filter.overlay.select.background'); + color: dt('datatable.filter.overlay.select.color'); + border: 1px solid dt('datatable.filter.overlay.select.border.color'); + border-radius: dt('datatable.filter.overlay.select.border.radius'); + box-shadow: dt('datatable.filter.overlay.select.shadow'); + min-width: 12.5rem; + } + + .p-datatable-filter-constraint-list { + margin: 0; + list-style: none; + display: flex; + flex-direction: column; + padding: dt('datatable.filter.constraint.list.padding'); + gap: dt('datatable.filter.constraint.list.gap'); + } + + .p-datatable-filter-constraint { + padding: dt('datatable.filter.constraint.padding'); + color: dt('datatable.filter.constraint.color'); + border-radius: dt('datatable.filter.constraint.border.radius'); + cursor: pointer; + transition: + background dt('datatable.transition.duration'), + color dt('datatable.transition.duration'), + border-color dt('datatable.transition.duration'), + box-shadow dt('datatable.transition.duration'); + } + + .p-datatable-filter-constraint-selected { + background: dt('datatable.filter.constraint.selected.background'); + color: dt('datatable.filter.constraint.selected.color'); + } + + .p-datatable-filter-constraint:not(.p-datatable-filter-constraint-selected):not(.p-disabled):hover { + background: dt('datatable.filter.constraint.focus.background'); + color: dt('datatable.filter.constraint.focus.color'); + } + + .p-datatable-filter-constraint:focus-visible { + outline: 0 none; + background: dt('datatable.filter.constraint.focus.background'); + color: dt('datatable.filter.constraint.focus.color'); + } + + .p-datatable-filter-constraint-selected:focus-visible { + outline: 0 none; + background: dt('datatable.filter.constraint.selected.focus.background'); + color: dt('datatable.filter.constraint.selected.focus.color'); + } + + .p-datatable-filter-constraint-separator { + border-block-start: 1px solid dt('datatable.filter.constraint.separator.border.color'); + } + + .p-datatable-popover-filter { + display: inline-flex; + margin-inline-start: auto; + } + + .p-datatable-filter-overlay-popover { + background: dt('datatable.filter.overlay.popover.background'); + color: dt('datatable.filter.overlay.popover.color'); + border: 1px solid dt('datatable.filter.overlay.popover.border.color'); + border-radius: dt('datatable.filter.overlay.popover.border.radius'); + box-shadow: dt('datatable.filter.overlay.popover.shadow'); + min-width: 12.5rem; + padding: dt('datatable.filter.overlay.popover.padding'); + display: flex; + flex-direction: column; + gap: dt('datatable.filter.overlay.popover.gap'); + } + + .p-datatable-filter-operator-dropdown { + width: 100%; + } + + .p-datatable-filter-rule-list, + .p-datatable-filter-rule { + display: flex; + flex-direction: column; + gap: dt('datatable.filter.overlay.popover.gap'); + } + + .p-datatable-filter-rule { + border-block-end: 1px solid dt('datatable.filter.rule.border.color'); + padding-bottom: dt('datatable.filter.overlay.popover.gap'); + } + + .p-datatable-filter-rule:last-child { + border-block-end: 0 none; + padding-bottom: 0; + } + + .p-datatable-filter-add-rule-button { + width: 100%; + } + + .p-datatable-filter-remove-rule-button { + width: 100%; + } + + .p-datatable-filter-buttonbar { + padding: 0; + display: flex; + align-items: center; + justify-content: space-between; + } + + .p-datatable-virtualscroller-spacer { + display: flex; + } + + .p-datatable .p-virtualscroller .p-virtualscroller-loading { + transform: none !important; + min-height: 0; + position: sticky; + inset-block-start: 0; + inset-inline-start: 0; + } + + .p-datatable-paginator-top { + border-color: dt('datatable.paginator.top.border.color'); + border-style: solid; + border-width: dt('datatable.paginator.top.border.width'); + } + + .p-datatable-paginator-bottom { + border-color: dt('datatable.paginator.bottom.border.color'); + border-style: solid; + border-width: dt('datatable.paginator.bottom.border.width'); + } + + .p-datatable-header { + background: dt('datatable.header.background'); + color: dt('datatable.header.color'); + border-color: dt('datatable.header.border.color'); + border-style: solid; + border-width: dt('datatable.header.border.width'); + padding: dt('datatable.header.padding'); + } + + .p-datatable-footer { + background: dt('datatable.footer.background'); + color: dt('datatable.footer.color'); + border-color: dt('datatable.footer.border.color'); + border-style: solid; + border-width: dt('datatable.footer.border.width'); + padding: dt('datatable.footer.padding'); + } + + .p-datatable-header-cell { + padding: dt('datatable.header.cell.padding'); + background: dt('datatable.header.cell.background'); + border-color: dt('datatable.header.cell.border.color'); + border-style: solid; + border-width: 0 0 1px 0; + color: dt('datatable.header.cell.color'); + font-weight: normal; + text-align: start; + transition: + background dt('datatable.transition.duration'), + color dt('datatable.transition.duration'), + border-color dt('datatable.transition.duration'), + outline-color dt('datatable.transition.duration'), + box-shadow dt('datatable.transition.duration'); + } + + .p-datatable-column-title { + font-weight: dt('datatable.column.title.font.weight'); + } + + .p-datatable-tbody > tr { + outline-color: transparent; + background: dt('datatable.row.background'); + color: dt('datatable.row.color'); + transition: + background dt('datatable.transition.duration'), + color dt('datatable.transition.duration'), + border-color dt('datatable.transition.duration'), + outline-color dt('datatable.transition.duration'), + box-shadow dt('datatable.transition.duration'); + } + + .p-datatable-tbody > tr > td { + text-align: start; + border-color: dt('datatable.body.cell.border.color'); + border-style: solid; + border-width: 0 0 1px 0; + padding: dt('datatable.body.cell.padding'); + } + + .p-datatable-hoverable .p-datatable-tbody > tr:not(.p-datatable-row-selected):hover { + background: dt('datatable.row.hover.background'); + color: dt('datatable.row.hover.color'); + } + + .p-datatable-tbody > tr.p-datatable-row-selected { + background: dt('datatable.row.selected.background'); + color: dt('datatable.row.selected.color'); + } + + .p-datatable-tbody > tr:has(+ .p-datatable-row-selected) > td { + border-block-end-color: dt('datatable.body.cell.selected.border.color'); + } + + .p-datatable-tbody > tr.p-datatable-row-selected > td { + border-block-end-color: dt('datatable.body.cell.selected.border.color'); + } + + .p-datatable-tbody > tr:focus-visible, + .p-datatable-tbody > tr.p-datatable-contextmenu-row-selected { + box-shadow: dt('datatable.row.focus.ring.shadow'); + outline: dt('datatable.row.focus.ring.width') dt('datatable.row.focus.ring.style') dt('datatable.row.focus.ring.color'); + outline-offset: dt('datatable.row.focus.ring.offset'); + } + + .p-datatable-tfoot > tr > td { + text-align: start; + padding: dt('datatable.footer.cell.padding'); + border-color: dt('datatable.footer.cell.border.color'); + border-style: solid; + border-width: 0 0 1px 0; + color: dt('datatable.footer.cell.color'); + background: dt('datatable.footer.cell.background'); + } + + .p-datatable-column-footer { + font-weight: dt('datatable.column.footer.font.weight'); + } + + .p-datatable-sortable-column { + cursor: pointer; + user-select: none; + outline-color: transparent; + } + + .p-datatable-column-title, + .p-datatable-sort-icon, + .p-datatable-sort-badge { + vertical-align: middle; + } + + .p-datatable-sort-icon { + color: dt('datatable.sort.icon.color'); + font-size: dt('datatable.sort.icon.size'); + width: dt('datatable.sort.icon.size'); + height: dt('datatable.sort.icon.size'); + transition: color dt('datatable.transition.duration'); + } + + .p-datatable-sortable-column:not(.p-datatable-column-sorted):hover { + background: dt('datatable.header.cell.hover.background'); + color: dt('datatable.header.cell.hover.color'); + } + + .p-datatable-sortable-column:not(.p-datatable-column-sorted):hover .p-datatable-sort-icon { + color: dt('datatable.sort.icon.hover.color'); + } + + .p-datatable-column-sorted { + background: dt('datatable.header.cell.selected.background'); + color: dt('datatable.header.cell.selected.color'); + } + + .p-datatable-column-sorted .p-datatable-sort-icon { + color: dt('datatable.header.cell.selected.color'); + } + + .p-datatable-sortable-column:focus-visible { + box-shadow: dt('datatable.header.cell.focus.ring.shadow'); + outline: dt('datatable.header.cell.focus.ring.width') dt('datatable.header.cell.focus.ring.style') dt('datatable.header.cell.focus.ring.color'); + outline-offset: dt('datatable.header.cell.focus.ring.offset'); + } + + .p-datatable-hoverable .p-datatable-selectable-row { + cursor: pointer; + } + + .p-datatable-tbody > tr.p-datatable-dragpoint-top > td { + box-shadow: inset 0 2px 0 0 dt('datatable.drop.point.color'); + } + + .p-datatable-tbody > tr.p-datatable-dragpoint-bottom > td { + box-shadow: inset 0 -2px 0 0 dt('datatable.drop.point.color'); + } + + .p-datatable-loading-icon { + font-size: dt('datatable.loading.icon.size'); + width: dt('datatable.loading.icon.size'); + height: dt('datatable.loading.icon.size'); + } + + .p-datatable-gridlines .p-datatable-header { + border-width: 1px 1px 0 1px; + } + + .p-datatable-gridlines .p-datatable-footer { + border-width: 0 1px 1px 1px; + } + + .p-datatable-gridlines .p-datatable-paginator-top { + border-width: 1px 1px 0 1px; + } + + .p-datatable-gridlines .p-datatable-paginator-bottom { + border-width: 0 1px 1px 1px; + } + + .p-datatable-gridlines .p-datatable-thead > tr > th { + border-width: 1px 0 1px 1px; + } + + .p-datatable-gridlines .p-datatable-thead > tr > th:last-child { + border-width: 1px; + } + + .p-datatable-gridlines .p-datatable-tbody > tr > td { + border-width: 1px 0 0 1px; + } + + .p-datatable-gridlines .p-datatable-tbody > tr > td:last-child { + border-width: 1px 1px 0 1px; + } + + .p-datatable-gridlines .p-datatable-tbody > tr:last-child > td { + border-width: 1px 0 1px 1px; + } + + .p-datatable-gridlines .p-datatable-tbody > tr:last-child > td:last-child { + border-width: 1px; + } + + .p-datatable-gridlines .p-datatable-tfoot > tr > td { + border-width: 1px 0 1px 1px; + } + + .p-datatable-gridlines .p-datatable-tfoot > tr > td:last-child { + border-width: 1px 1px 1px 1px; + } + + .p-datatable.p-datatable-gridlines .p-datatable-thead + .p-datatable-tfoot > tr > td { + border-width: 0 0 1px 1px; + } + + .p-datatable.p-datatable-gridlines .p-datatable-thead + .p-datatable-tfoot > tr > td:last-child { + border-width: 0 1px 1px 1px; + } + + .p-datatable.p-datatable-gridlines:has(.p-datatable-thead):has(.p-datatable-tbody) .p-datatable-tbody > tr > td { + border-width: 0 0 1px 1px; + } + + .p-datatable.p-datatable-gridlines:has(.p-datatable-thead):has(.p-datatable-tbody) .p-datatable-tbody > tr > td:last-child { + border-width: 0 1px 1px 1px; + } + + .p-datatable.p-datatable-gridlines:has(.p-datatable-tbody):has(.p-datatable-tfoot) .p-datatable-tbody > tr:last-child > td { + border-width: 0 0 0 1px; + } + + .p-datatable.p-datatable-gridlines:has(.p-datatable-tbody):has(.p-datatable-tfoot) .p-datatable-tbody > tr:last-child > td:last-child { + border-width: 0 1px 0 1px; + } + + .p-datatable.p-datatable-striped .p-datatable-tbody > tr.p-row-odd { + background: dt('datatable.row.striped.background'); + } + + .p-datatable.p-datatable-striped .p-datatable-tbody > tr.p-row-odd.p-datatable-row-selected { + background: dt('datatable.row.selected.background'); + color: dt('datatable.row.selected.color'); + } + + .p-datatable-striped.p-datatable-hoverable .p-datatable-tbody > tr:not(.p-datatable-row-selected):hover { + background: dt('datatable.row.hover.background'); + color: dt('datatable.row.hover.color'); + } + + .p-datatable.p-datatable-sm .p-datatable-header { + padding: dt('datatable.header.sm.padding'); + } + + .p-datatable.p-datatable-sm .p-datatable-thead > tr > th { + padding: dt('datatable.header.cell.sm.padding'); + } + + .p-datatable.p-datatable-sm .p-datatable-tbody > tr > td { + padding: dt('datatable.body.cell.sm.padding'); + } + + .p-datatable.p-datatable-sm .p-datatable-tfoot > tr > td { + padding: dt('datatable.footer.cell.sm.padding'); + } + + .p-datatable.p-datatable-sm .p-datatable-footer { + padding: dt('datatable.footer.sm.padding'); + } + + .p-datatable.p-datatable-lg .p-datatable-header { + padding: dt('datatable.header.lg.padding'); + } + + .p-datatable.p-datatable-lg .p-datatable-thead > tr > th { + padding: dt('datatable.header.cell.lg.padding'); + } + + .p-datatable.p-datatable-lg .p-datatable-tbody > tr > td { + padding: dt('datatable.body.cell.lg.padding'); + } + + .p-datatable.p-datatable-lg .p-datatable-tfoot > tr > td { + padding: dt('datatable.footer.cell.lg.padding'); + } + + .p-datatable.p-datatable-lg .p-datatable-footer { + padding: dt('datatable.footer.lg.padding'); + } + + .p-datatable-row-toggle-button { + display: inline-flex; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; + width: dt('datatable.row.toggle.button.size'); + height: dt('datatable.row.toggle.button.size'); + color: dt('datatable.row.toggle.button.color'); + border: 0 none; + background: transparent; + cursor: pointer; + border-radius: dt('datatable.row.toggle.button.border.radius'); + transition: + background dt('datatable.transition.duration'), + color dt('datatable.transition.duration'), + border-color dt('datatable.transition.duration'), + outline-color dt('datatable.transition.duration'), + box-shadow dt('datatable.transition.duration'); + outline-color: transparent; + user-select: none; + } + + .p-datatable-row-toggle-button:enabled:hover { + color: dt('datatable.row.toggle.button.hover.color'); + background: dt('datatable.row.toggle.button.hover.background'); + } + + .p-datatable-tbody > tr.p-datatable-row-selected .p-datatable-row-toggle-button:hover { + background: dt('datatable.row.toggle.button.selected.hover.background'); + color: dt('datatable.row.toggle.button.selected.hover.color'); + } + + .p-datatable-row-toggle-button:focus-visible { + box-shadow: dt('datatable.row.toggle.button.focus.ring.shadow'); + outline: dt('datatable.row.toggle.button.focus.ring.width') dt('datatable.row.toggle.button.focus.ring.style') dt('datatable.row.toggle.button.focus.ring.color'); + outline-offset: dt('datatable.row.toggle.button.focus.ring.offset'); + } + + .p-datatable-row-toggle-icon:dir(rtl) { + transform: rotate(180deg); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/datepicker/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/datepicker/index.ts new file mode 100644 index 000000000..86129212f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/datepicker/index.ts @@ -0,0 +1,467 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/datepicker/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-datepicker { + display: inline-flex; + max-width: 100%; + } + + .p-datepicker:has(.p-datepicker-dropdown) .p-datepicker-input { + border-start-end-radius: 0; + border-end-end-radius: 0; + } + + .p-datepicker-input { + flex: 1 1 auto; + width: 1%; + } + + .p-datepicker-dropdown { + cursor: pointer; + display: inline-flex; + user-select: none; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; + width: dt('datepicker.dropdown.width'); + border-start-end-radius: dt('datepicker.dropdown.border.radius'); + border-end-end-radius: dt('datepicker.dropdown.border.radius'); + background: dt('datepicker.dropdown.background'); + border: 1px solid dt('datepicker.dropdown.border.color'); + border-inline-start: 0 none; + color: dt('datepicker.dropdown.color'); + transition: + background dt('datepicker.transition.duration'), + color dt('datepicker.transition.duration'), + border-color dt('datepicker.transition.duration'), + outline-color dt('datepicker.transition.duration'); + outline-color: transparent; + } + + .p-datepicker-dropdown:not(:disabled):hover { + background: dt('datepicker.dropdown.hover.background'); + border-color: dt('datepicker.dropdown.hover.border.color'); + color: dt('datepicker.dropdown.hover.color'); + } + + .p-datepicker-dropdown:not(:disabled):active { + background: dt('datepicker.dropdown.active.background'); + border-color: dt('datepicker.dropdown.active.border.color'); + color: dt('datepicker.dropdown.active.color'); + } + + .p-datepicker-dropdown:focus-visible { + box-shadow: dt('datepicker.dropdown.focus.ring.shadow'); + outline: dt('datepicker.dropdown.focus.ring.width') dt('datepicker.dropdown.focus.ring.style') dt('datepicker.dropdown.focus.ring.color'); + outline-offset: dt('datepicker.dropdown.focus.ring.offset'); + } + + .p-datepicker:has(.p-datepicker-input-icon-container) { + position: relative; + } + + .p-datepicker:has(.p-datepicker-input-icon-container) .p-datepicker-input { + padding-inline-end: calc((dt('form.field.padding.x') * 2) + dt('icon.size')); + } + + .p-datepicker-input-icon-container { + cursor: pointer; + position: absolute; + top: 50%; + inset-inline-end: dt('form.field.padding.x'); + margin-block-start: calc(-1 * (dt('icon.size') / 2)); + color: dt('datepicker.input.icon.color'); + line-height: 1; + z-index: 1; + } + + .p-datepicker:has(.p-datepicker-input:disabled) .p-datepicker-input-icon-container { + cursor: default; + } + + .p-datepicker-fluid { + display: flex; + } + + .p-datepicker .p-datepicker-panel { + min-width: 100%; + } + + .p-datepicker-panel { + width: auto; + padding: dt('datepicker.panel.padding'); + background: dt('datepicker.panel.background'); + color: dt('datepicker.panel.color'); + border: 1px solid dt('datepicker.panel.border.color'); + border-radius: dt('datepicker.panel.border.radius'); + box-shadow: dt('datepicker.panel.shadow'); + } + + .p-datepicker-panel-inline { + display: inline-block; + overflow-x: auto; + box-shadow: none; + } + + .p-datepicker-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: dt('datepicker.header.padding'); + background: dt('datepicker.header.background'); + color: dt('datepicker.header.color'); + border-block-end: 1px solid dt('datepicker.header.border.color'); + } + + .p-datepicker-next-button:dir(rtl) { + order: -1; + } + + .p-datepicker-prev-button:dir(rtl) { + order: 1; + } + + .p-datepicker-title { + display: flex; + align-items: center; + justify-content: space-between; + gap: dt('datepicker.title.gap'); + font-weight: dt('datepicker.title.font.weight'); + } + + .p-datepicker-select-year, + .p-datepicker-select-month { + border: none; + background: transparent; + margin: 0; + cursor: pointer; + font-weight: inherit; + transition: + background dt('datepicker.transition.duration'), + color dt('datepicker.transition.duration'), + border-color dt('datepicker.transition.duration'), + outline-color dt('datepicker.transition.duration'), + box-shadow dt('datepicker.transition.duration'); + } + + .p-datepicker-select-month { + padding: dt('datepicker.select.month.padding'); + color: dt('datepicker.select.month.color'); + border-radius: dt('datepicker.select.month.border.radius'); + } + + .p-datepicker-select-year { + padding: dt('datepicker.select.year.padding'); + color: dt('datepicker.select.year.color'); + border-radius: dt('datepicker.select.year.border.radius'); + } + + .p-datepicker-select-month:enabled:hover { + background: dt('datepicker.select.month.hover.background'); + color: dt('datepicker.select.month.hover.color'); + } + + .p-datepicker-select-year:enabled:hover { + background: dt('datepicker.select.year.hover.background'); + color: dt('datepicker.select.year.hover.color'); + } + + .p-datepicker-select-month:focus-visible, + .p-datepicker-select-year:focus-visible { + box-shadow: dt('datepicker.date.focus.ring.shadow'); + outline: dt('datepicker.date.focus.ring.width') dt('datepicker.date.focus.ring.style') dt('datepicker.date.focus.ring.color'); + outline-offset: dt('datepicker.date.focus.ring.offset'); + } + + .p-datepicker-calendar-container { + display: flex; + } + + .p-datepicker-calendar-container .p-datepicker-calendar { + flex: 1 1 auto; + border-inline-start: 1px solid dt('datepicker.group.border.color'); + padding-inline-end: dt('datepicker.group.gap'); + padding-inline-start: dt('datepicker.group.gap'); + } + + .p-datepicker-calendar-container .p-datepicker-calendar:first-child { + padding-inline-start: 0; + border-inline-start: 0 none; + } + + .p-datepicker-calendar-container .p-datepicker-calendar:last-child { + padding-inline-end: 0; + } + + .p-datepicker-day-view { + width: 100%; + border-collapse: collapse; + font-size: 1rem; + margin: dt('datepicker.day.view.margin'); + } + + .p-datepicker-weekday-cell { + padding: dt('datepicker.week.day.padding'); + } + + .p-datepicker-weekday { + font-weight: dt('datepicker.week.day.font.weight'); + color: dt('datepicker.week.day.color'); + } + + .p-datepicker-day-cell { + padding: dt('datepicker.date.padding'); + } + + .p-datepicker-day { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + margin: 0 auto; + overflow: hidden; + position: relative; + width: dt('datepicker.date.width'); + height: dt('datepicker.date.height'); + border-radius: dt('datepicker.date.border.radius'); + transition: + background dt('datepicker.transition.duration'), + color dt('datepicker.transition.duration'), + border-color dt('datepicker.transition.duration'), + box-shadow dt('datepicker.transition.duration'), + outline-color dt('datepicker.transition.duration'); + border: 1px solid transparent; + outline-color: transparent; + color: dt('datepicker.date.color'); + } + + .p-datepicker-day:not(.p-datepicker-day-selected):not(.p-disabled):hover { + background: dt('datepicker.date.hover.background'); + color: dt('datepicker.date.hover.color'); + } + + .p-datepicker-day:focus-visible { + box-shadow: dt('datepicker.date.focus.ring.shadow'); + outline: dt('datepicker.date.focus.ring.width') dt('datepicker.date.focus.ring.style') dt('datepicker.date.focus.ring.color'); + outline-offset: dt('datepicker.date.focus.ring.offset'); + } + + .p-datepicker-day-selected { + background: dt('datepicker.date.selected.background'); + color: dt('datepicker.date.selected.color'); + } + + .p-datepicker-day-selected-range { + background: dt('datepicker.date.range.selected.background'); + color: dt('datepicker.date.range.selected.color'); + } + + .p-datepicker-today > .p-datepicker-day { + background: dt('datepicker.today.background'); + color: dt('datepicker.today.color'); + } + + .p-datepicker-today > .p-datepicker-day-selected { + background: dt('datepicker.date.selected.background'); + color: dt('datepicker.date.selected.color'); + } + + .p-datepicker-today > .p-datepicker-day-selected-range { + background: dt('datepicker.date.range.selected.background'); + color: dt('datepicker.date.range.selected.color'); + } + + .p-datepicker-weeknumber { + text-align: center; + } + + .p-datepicker-month-view { + margin: dt('datepicker.month.view.margin'); + } + + .p-datepicker-month { + width: 33.3%; + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + overflow: hidden; + position: relative; + padding: dt('datepicker.month.padding'); + transition: + background dt('datepicker.transition.duration'), + color dt('datepicker.transition.duration'), + border-color dt('datepicker.transition.duration'), + box-shadow dt('datepicker.transition.duration'), + outline-color dt('datepicker.transition.duration'); + border-radius: dt('datepicker.month.border.radius'); + outline-color: transparent; + color: dt('datepicker.date.color'); + } + + .p-datepicker-month:not(.p-disabled):not(.p-datepicker-month-selected):hover { + color: dt('datepicker.date.hover.color'); + background: dt('datepicker.date.hover.background'); + } + + .p-datepicker-month-selected { + color: dt('datepicker.date.selected.color'); + background: dt('datepicker.date.selected.background'); + } + + .p-datepicker-month:not(.p-disabled):focus-visible { + box-shadow: dt('datepicker.date.focus.ring.shadow'); + outline: dt('datepicker.date.focus.ring.width') dt('datepicker.date.focus.ring.style') dt('datepicker.date.focus.ring.color'); + outline-offset: dt('datepicker.date.focus.ring.offset'); + } + + .p-datepicker-year-view { + margin: dt('datepicker.year.view.margin'); + } + + .p-datepicker-year { + width: 50%; + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + overflow: hidden; + position: relative; + padding: dt('datepicker.year.padding'); + transition: + background dt('datepicker.transition.duration'), + color dt('datepicker.transition.duration'), + border-color dt('datepicker.transition.duration'), + box-shadow dt('datepicker.transition.duration'), + outline-color dt('datepicker.transition.duration'); + border-radius: dt('datepicker.year.border.radius'); + outline-color: transparent; + color: dt('datepicker.date.color'); + } + + .p-datepicker-year:not(.p-disabled):not(.p-datepicker-year-selected):hover { + color: dt('datepicker.date.hover.color'); + background: dt('datepicker.date.hover.background'); + } + + .p-datepicker-year-selected { + color: dt('datepicker.date.selected.color'); + background: dt('datepicker.date.selected.background'); + } + + .p-datepicker-year:not(.p-disabled):focus-visible { + box-shadow: dt('datepicker.date.focus.ring.shadow'); + outline: dt('datepicker.date.focus.ring.width') dt('datepicker.date.focus.ring.style') dt('datepicker.date.focus.ring.color'); + outline-offset: dt('datepicker.date.focus.ring.offset'); + } + + .p-datepicker-buttonbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: dt('datepicker.buttonbar.padding'); + border-block-start: 1px solid dt('datepicker.buttonbar.border.color'); + } + + .p-datepicker-buttonbar .p-button { + width: auto; + } + + .p-datepicker-time-picker { + display: flex; + justify-content: center; + align-items: center; + border-block-start: 1px solid dt('datepicker.time.picker.border.color'); + padding: 0; + gap: dt('datepicker.time.picker.gap'); + } + + .p-datepicker-calendar-container + .p-datepicker-time-picker { + padding: dt('datepicker.time.picker.padding'); + } + + .p-datepicker-time-picker > div { + display: flex; + align-items: center; + flex-direction: column; + gap: dt('datepicker.time.picker.button.gap'); + } + + .p-datepicker-time-picker span { + font-size: 1rem; + } + + .p-datepicker-timeonly .p-datepicker-time-picker { + border-block-start: 0 none; + } + + .p-datepicker-time-picker:dir(rtl) { + flex-direction: row-reverse; + } + + .p-datepicker:has(.p-inputtext-sm) .p-datepicker-dropdown { + width: dt('datepicker.dropdown.sm.width'); + } + + .p-datepicker:has(.p-inputtext-sm) .p-datepicker-dropdown .p-icon, + .p-datepicker:has(.p-inputtext-sm) .p-datepicker-input-icon { + font-size: dt('form.field.sm.font.size'); + width: dt('form.field.sm.font.size'); + height: dt('form.field.sm.font.size'); + } + + .p-datepicker:has(.p-inputtext-lg) .p-datepicker-dropdown { + width: dt('datepicker.dropdown.lg.width'); + } + + .p-datepicker:has(.p-inputtext-lg) .p-datepicker-dropdown .p-icon, + .p-datepicker:has(.p-inputtext-lg) .p-datepicker-input-icon { + font-size: dt('form.field.lg.font.size'); + width: dt('form.field.lg.font.size'); + height: dt('form.field.lg.font.size'); + } + + .p-datepicker-clear-icon { + position: absolute; + top: 50%; + margin-top: -0.5rem; + cursor: pointer; + color: dt('form.field.icon.color'); + inset-inline-end: dt('form.field.padding.x'); + } + + .p-datepicker:has(.p-datepicker-dropdown) .p-datepicker-clear-icon { + inset-inline-end: calc(dt('datepicker.dropdown.width') + dt('form.field.padding.x')); + } + + .p-datepicker:has(.p-datepicker-input-icon-container) .p-datepicker-clear-icon { + inset-inline-end: calc((dt('form.field.padding.x') * 2) + dt('icon.size')); + } + + .p-datepicker:has(.p-datepicker-clear-icon) .p-datepicker-input { + padding-inline-end: calc((dt('form.field.padding.x') * 2) + dt('icon.size')); + } + + .p-datepicker:has(.p-datepicker-input-icon-container):has(.p-datepicker-clear-icon) .p-datepicker-input { + padding-inline-end: calc((dt('form.field.padding.x') * 3) + calc(dt('icon.size') * 2)); + } + + .p-inputgroup .p-datepicker-dropdown { + border-radius: 0; + } + + .p-inputgroup > .p-datepicker:last-child:has(.p-datepicker-dropdown) > .p-datepicker-input { + border-start-end-radius: 0; + border-end-end-radius: 0; + } + + .p-inputgroup > .p-datepicker:last-child .p-datepicker-dropdown { + border-start-end-radius: dt('datepicker.dropdown.border.radius'); + border-end-end-radius: dt('datepicker.dropdown.border.radius'); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/iconfield/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/iconfield/index.ts new file mode 100644 index 000000000..a0f7de3d8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/iconfield/index.ts @@ -0,0 +1,52 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/iconfield/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-iconfield { + position: relative; + display: block; + } + + .p-inputicon { + position: absolute; + top: 50%; + margin-top: calc(-1 * (dt('icon.size') / 2)); + color: dt('iconfield.icon.color'); + line-height: 1; + z-index: 1; + } + + .p-iconfield .p-inputicon:first-child { + inset-inline-start: dt('form.field.padding.x'); + } + + .p-iconfield .p-inputicon:last-child { + inset-inline-end: dt('form.field.padding.x'); + } + + .p-iconfield .p-inputtext:not(:first-child), + .p-iconfield .p-inputwrapper:not(:first-child) .p-inputtext { + padding-inline-start: calc((dt('form.field.padding.x') * 2) + dt('icon.size')); + } + + .p-iconfield .p-inputtext:not(:last-child) { + padding-inline-end: calc((dt('form.field.padding.x') * 2) + dt('icon.size')); + } + + .p-iconfield:has(.p-inputfield-sm) .p-inputicon { + font-size: dt('form.field.sm.font.size'); + width: dt('form.field.sm.font.size'); + height: dt('form.field.sm.font.size'); + margin-top: calc(-1 * (dt('form.field.sm.font.size') / 2)); + } + + .p-iconfield:has(.p-inputfield-lg) .p-inputicon { + font-size: dt('form.field.lg.font.size'); + width: dt('form.field.lg.font.size'); + height: dt('form.field.lg.font.size'); + margin-top: calc(-1 * (dt('form.field.lg.font.size') / 2)); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/inputnumber/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/inputnumber/index.ts new file mode 100644 index 000000000..27ca3d7ae --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/inputnumber/index.ts @@ -0,0 +1,199 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/inputnumber/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-inputnumber { + display: inline-flex; + position: relative; + } + + .p-inputnumber-button { + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + cursor: pointer; + background: dt('inputnumber.button.background'); + color: dt('inputnumber.button.color'); + width: dt('inputnumber.button.width'); + transition: + background dt('inputnumber.transition.duration'), + color dt('inputnumber.transition.duration'), + border-color dt('inputnumber.transition.duration'), + outline-color dt('inputnumber.transition.duration'); + } + + .p-inputnumber-button:disabled { + cursor: auto; + } + + .p-inputnumber-button:not(:disabled):hover { + background: dt('inputnumber.button.hover.background'); + color: dt('inputnumber.button.hover.color'); + } + + .p-inputnumber-button:not(:disabled):active { + background: dt('inputnumber.button.active.background'); + color: dt('inputnumber.button.active.color'); + } + + .p-inputnumber-stacked .p-inputnumber-button { + position: relative; + flex: 1 1 auto; + border: 0 none; + } + + .p-inputnumber-stacked .p-inputnumber-button-group { + display: flex; + flex-direction: column; + position: absolute; + inset-block-start: 1px; + inset-inline-end: 1px; + height: calc(100% - 2px); + z-index: 1; + } + + .p-inputnumber-stacked .p-inputnumber-increment-button { + padding: 0; + border-start-end-radius: calc(dt('inputnumber.button.border.radius') - 1px); + } + + .p-inputnumber-stacked .p-inputnumber-decrement-button { + padding: 0; + border-end-end-radius: calc(dt('inputnumber.button.border.radius') - 1px); + } + + .p-inputnumber-stacked .p-inputnumber-input { + padding-inline-end: calc(dt('inputnumber.button.width') + dt('form.field.padding.x')); + } + + .p-inputnumber-horizontal .p-inputnumber-button { + border: 1px solid dt('inputnumber.button.border.color'); + } + + .p-inputnumber-horizontal .p-inputnumber-button:hover { + border-color: dt('inputnumber.button.hover.border.color'); + } + + .p-inputnumber-horizontal .p-inputnumber-button:active { + border-color: dt('inputnumber.button.active.border.color'); + } + + .p-inputnumber-horizontal .p-inputnumber-increment-button { + order: 3; + border-start-end-radius: dt('inputnumber.button.border.radius'); + border-end-end-radius: dt('inputnumber.button.border.radius'); + border-inline-start: 0 none; + } + + .p-inputnumber-horizontal .p-inputnumber-input { + order: 2; + border-radius: 0; + } + + .p-inputnumber-horizontal .p-inputnumber-decrement-button { + order: 1; + border-start-start-radius: dt('inputnumber.button.border.radius'); + border-end-start-radius: dt('inputnumber.button.border.radius'); + border-inline-end: 0 none; + } + + .p-floatlabel:has(.p-inputnumber-horizontal) label { + margin-inline-start: dt('inputnumber.button.width'); + } + + .p-inputnumber-vertical { + flex-direction: column; + } + + .p-inputnumber-vertical .p-inputnumber-button { + border: 1px solid dt('inputnumber.button.border.color'); + padding: dt('inputnumber.button.vertical.padding'); + } + + .p-inputnumber-vertical .p-inputnumber-button:hover { + border-color: dt('inputnumber.button.hover.border.color'); + } + + .p-inputnumber-vertical .p-inputnumber-button:active { + border-color: dt('inputnumber.button.active.border.color'); + } + + .p-inputnumber-vertical .p-inputnumber-increment-button { + order: 1; + border-start-start-radius: dt('inputnumber.button.border.radius'); + border-start-end-radius: dt('inputnumber.button.border.radius'); + width: 100%; + border-block-end: 0 none; + } + + .p-inputnumber-vertical .p-inputnumber-input { + order: 2; + border-radius: 0; + text-align: center; + } + + .p-inputnumber-vertical .p-inputnumber-decrement-button { + order: 3; + border-end-start-radius: dt('inputnumber.button.border.radius'); + border-end-end-radius: dt('inputnumber.button.border.radius'); + width: 100%; + border-block-start: 0 none; + } + + .p-inputnumber-input { + flex: 1 1 auto; + } + + .p-inputnumber-fluid { + width: 100%; + } + + .p-inputnumber-fluid .p-inputnumber-input { + width: 1%; + } + + .p-inputnumber-fluid.p-inputnumber-vertical .p-inputnumber-input { + width: 100%; + } + + .p-inputnumber:has(.p-inputtext-sm) .p-inputnumber-button .p-icon { + font-size: dt('form.field.sm.font.size'); + width: dt('form.field.sm.font.size'); + height: dt('form.field.sm.font.size'); + } + + .p-inputnumber:has(.p-inputtext-lg) .p-inputnumber-button .p-icon { + font-size: dt('form.field.lg.font.size'); + width: dt('form.field.lg.font.size'); + height: dt('form.field.lg.font.size'); + } + + .p-inputnumber-clear-icon { + position: absolute; + top: 50%; + margin-top: -0.5rem; + cursor: pointer; + inset-inline-end: dt('form.field.padding.x'); + color: dt('form.field.icon.color'); + } + + .p-inputnumber:has(.p-inputnumber-clear-icon) .p-inputnumber-input { + padding-inline-end: calc((dt('form.field.padding.x') * 2) + dt('icon.size')); + } + + .p-inputnumber-stacked .p-inputnumber-clear-icon { + inset-inline-end: calc(dt('inputnumber.button.width') + dt('form.field.padding.x')); + } + + .p-inputnumber-stacked:has(.p-inputnumber-clear-icon) .p-inputnumber-input { + padding-inline-end: calc(dt('inputnumber.button.width') + (dt('form.field.padding.x') * 2) + dt('icon.size')); + } + + .p-inputnumber-horizontal .p-inputnumber-clear-icon { + inset-inline-end: calc(dt('inputnumber.button.width') + dt('form.field.padding.x')); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/inputtext/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/inputtext/index.ts new file mode 100644 index 000000000..cfd99ecd8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/inputtext/index.ts @@ -0,0 +1,85 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/inputtext/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-inputtext { + font-family: inherit; + font-feature-settings: inherit; + font-size: 1rem; + color: dt('inputtext.color'); + background: dt('inputtext.background'); + padding-block: dt('inputtext.padding.y'); + padding-inline: dt('inputtext.padding.x'); + border: 1px solid dt('inputtext.border.color'); + transition: + background dt('inputtext.transition.duration'), + color dt('inputtext.transition.duration'), + border-color dt('inputtext.transition.duration'), + outline-color dt('inputtext.transition.duration'), + box-shadow dt('inputtext.transition.duration'); + appearance: none; + border-radius: dt('inputtext.border.radius'); + outline-color: transparent; + box-shadow: dt('inputtext.shadow'); + } + + .p-inputtext:enabled:hover { + border-color: dt('inputtext.hover.border.color'); + } + + .p-inputtext:enabled:focus { + border-color: dt('inputtext.focus.border.color'); + box-shadow: dt('inputtext.focus.ring.shadow'); + outline: dt('inputtext.focus.ring.width') dt('inputtext.focus.ring.style') dt('inputtext.focus.ring.color'); + outline-offset: dt('inputtext.focus.ring.offset'); + } + + .p-inputtext.p-invalid { + border-color: dt('inputtext.invalid.border.color'); + } + + .p-inputtext.p-variant-filled { + background: dt('inputtext.filled.background'); + } + + .p-inputtext.p-variant-filled:enabled:hover { + background: dt('inputtext.filled.hover.background'); + } + + .p-inputtext.p-variant-filled:enabled:focus { + background: dt('inputtext.filled.focus.background'); + } + + .p-inputtext:disabled { + opacity: 1; + background: dt('inputtext.disabled.background'); + color: dt('inputtext.disabled.color'); + } + + .p-inputtext::placeholder { + color: dt('inputtext.placeholder.color'); + } + + .p-inputtext.p-invalid::placeholder { + color: dt('inputtext.invalid.placeholder.color'); + } + + .p-inputtext-sm { + font-size: dt('inputtext.sm.font.size'); + padding-block: dt('inputtext.sm.padding.y'); + padding-inline: dt('inputtext.sm.padding.x'); + } + + .p-inputtext-lg { + font-size: dt('inputtext.lg.font.size'); + padding-block: dt('inputtext.lg.padding.y'); + padding-inline: dt('inputtext.lg.padding.x'); + } + + .p-inputtext-fluid { + width: 100%; + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/paginator/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/paginator/index.ts new file mode 100644 index 000000000..6907f15af --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/paginator/index.ts @@ -0,0 +1,108 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/paginator/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-paginator { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + background: dt('paginator.background'); + color: dt('paginator.color'); + padding: dt('paginator.padding'); + border-radius: dt('paginator.border.radius'); + gap: dt('paginator.gap'); + } + + .p-paginator-content { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + gap: dt('paginator.gap'); + } + + .p-paginator-content-start { + margin-inline-end: auto; + } + + .p-paginator-content-end { + margin-inline-start: auto; + } + + .p-paginator-page, + .p-paginator-next, + .p-paginator-last, + .p-paginator-first, + .p-paginator-prev { + cursor: pointer; + display: inline-flex; + align-items: center; + justify-content: center; + line-height: 1; + user-select: none; + overflow: hidden; + position: relative; + background: dt('paginator.nav.button.background'); + border: 0 none; + color: dt('paginator.nav.button.color'); + min-width: dt('paginator.nav.button.width'); + height: dt('paginator.nav.button.height'); + transition: + background dt('paginator.transition.duration'), + color dt('paginator.transition.duration'), + outline-color dt('paginator.transition.duration'), + box-shadow dt('paginator.transition.duration'); + border-radius: dt('paginator.nav.button.border.radius'); + padding: 0; + margin: 0; + } + + .p-paginator-page:focus-visible, + .p-paginator-next:focus-visible, + .p-paginator-last:focus-visible, + .p-paginator-first:focus-visible, + .p-paginator-prev:focus-visible { + box-shadow: dt('paginator.nav.button.focus.ring.shadow'); + outline: dt('paginator.nav.button.focus.ring.width') dt('paginator.nav.button.focus.ring.style') dt('paginator.nav.button.focus.ring.color'); + outline-offset: dt('paginator.nav.button.focus.ring.offset'); + } + + .p-paginator-page:not(.p-disabled):not(.p-paginator-page-selected):hover, + .p-paginator-first:not(.p-disabled):hover, + .p-paginator-prev:not(.p-disabled):hover, + .p-paginator-next:not(.p-disabled):hover, + .p-paginator-last:not(.p-disabled):hover { + background: dt('paginator.nav.button.hover.background'); + color: dt('paginator.nav.button.hover.color'); + } + + .p-paginator-page.p-paginator-page-selected { + background: dt('paginator.nav.button.selected.background'); + color: dt('paginator.nav.button.selected.color'); + } + + .p-paginator-current { + color: dt('paginator.current.page.report.color'); + } + + .p-paginator-pages { + display: flex; + align-items: center; + gap: dt('paginator.gap'); + } + + .p-paginator-jtp-input .p-inputtext { + max-width: dt('paginator.jump.to.page.input.max.width'); + } + + .p-paginator-first:dir(rtl), + .p-paginator-prev:dir(rtl), + .p-paginator-next:dir(rtl), + .p-paginator-last:dir(rtl) { + transform: rotate(180deg); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/radiobutton/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/radiobutton/index.ts new file mode 100644 index 000000000..395d801de --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/radiobutton/index.ts @@ -0,0 +1,151 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/radiobutton/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-radiobutton { + position: relative; + display: inline-flex; + user-select: none; + vertical-align: bottom; + width: dt('radiobutton.width'); + height: dt('radiobutton.height'); + } + + .p-radiobutton-input { + cursor: pointer; + appearance: none; + position: absolute; + top: 0; + inset-inline-start: 0; + width: 100%; + height: 100%; + padding: 0; + margin: 0; + opacity: 0; + z-index: 1; + outline: 0 none; + border: 1px solid transparent; + border-radius: 50%; + } + + .p-radiobutton-box { + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + border: 1px solid dt('radiobutton.border.color'); + background: dt('radiobutton.background'); + width: dt('radiobutton.width'); + height: dt('radiobutton.height'); + transition: + background dt('radiobutton.transition.duration'), + color dt('radiobutton.transition.duration'), + border-color dt('radiobutton.transition.duration'), + box-shadow dt('radiobutton.transition.duration'), + outline-color dt('radiobutton.transition.duration'); + outline-color: transparent; + box-shadow: dt('radiobutton.shadow'); + } + + .p-radiobutton-icon { + transition-duration: dt('radiobutton.transition.duration'); + background: transparent; + font-size: dt('radiobutton.icon.size'); + width: dt('radiobutton.icon.size'); + height: dt('radiobutton.icon.size'); + border-radius: 50%; + backface-visibility: hidden; + transform: translateZ(0) scale(0.1); + } + + .p-radiobutton:not(.p-disabled):has(.p-radiobutton-input:hover) .p-radiobutton-box { + border-color: dt('radiobutton.hover.border.color'); + } + + .p-radiobutton-checked .p-radiobutton-box { + border-color: dt('radiobutton.checked.border.color'); + background: dt('radiobutton.checked.background'); + } + + .p-radiobutton-checked .p-radiobutton-box .p-radiobutton-icon { + background: dt('radiobutton.icon.checked.color'); + transform: translateZ(0) scale(1, 1); + visibility: visible; + } + + .p-radiobutton-checked:not(.p-disabled):has(.p-radiobutton-input:hover) .p-radiobutton-box { + border-color: dt('radiobutton.checked.hover.border.color'); + background: dt('radiobutton.checked.hover.background'); + } + + .p-radiobutton:not(.p-disabled):has(.p-radiobutton-input:hover).p-radiobutton-checked .p-radiobutton-box .p-radiobutton-icon { + background: dt('radiobutton.icon.checked.hover.color'); + } + + .p-radiobutton:not(.p-disabled):has(.p-radiobutton-input:focus-visible) .p-radiobutton-box { + border-color: dt('radiobutton.focus.border.color'); + box-shadow: dt('radiobutton.focus.ring.shadow'); + outline: dt('radiobutton.focus.ring.width') dt('radiobutton.focus.ring.style') dt('radiobutton.focus.ring.color'); + outline-offset: dt('radiobutton.focus.ring.offset'); + } + + .p-radiobutton-checked:not(.p-disabled):has(.p-radiobutton-input:focus-visible) .p-radiobutton-box { + border-color: dt('radiobutton.checked.focus.border.color'); + } + + .p-radiobutton.p-invalid > .p-radiobutton-box { + border-color: dt('radiobutton.invalid.border.color'); + } + + .p-radiobutton.p-variant-filled .p-radiobutton-box { + background: dt('radiobutton.filled.background'); + } + + .p-radiobutton.p-variant-filled.p-radiobutton-checked .p-radiobutton-box { + background: dt('radiobutton.checked.background'); + } + + .p-radiobutton.p-variant-filled:not(.p-disabled):has(.p-radiobutton-input:hover).p-radiobutton-checked .p-radiobutton-box { + background: dt('radiobutton.checked.hover.background'); + } + + .p-radiobutton.p-disabled { + opacity: 1; + } + + .p-radiobutton.p-disabled .p-radiobutton-box { + background: dt('radiobutton.disabled.background'); + border-color: dt('radiobutton.checked.disabled.border.color'); + } + + .p-radiobutton-checked.p-disabled .p-radiobutton-box .p-radiobutton-icon { + background: dt('radiobutton.icon.disabled.color'); + } + + .p-radiobutton-sm, + .p-radiobutton-sm .p-radiobutton-box { + width: dt('radiobutton.sm.width'); + height: dt('radiobutton.sm.height'); + } + + .p-radiobutton-sm .p-radiobutton-icon { + font-size: dt('radiobutton.icon.sm.size'); + width: dt('radiobutton.icon.sm.size'); + height: dt('radiobutton.icon.sm.size'); + } + + .p-radiobutton-lg, + .p-radiobutton-lg .p-radiobutton-box { + width: dt('radiobutton.lg.width'); + height: dt('radiobutton.lg.height'); + } + + .p-radiobutton-lg .p-radiobutton-icon { + font-size: dt('radiobutton.icon.lg.size'); + width: dt('radiobutton.icon.lg.size'); + height: dt('radiobutton.icon.lg.size'); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/ripple/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/ripple/index.ts new file mode 100644 index 000000000..3c6487142 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/ripple/index.ts @@ -0,0 +1,27 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/ripple/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-ink { + display: block; + position: absolute; + background: dt('ripple.background'); + border-radius: 100%; + transform: scale(0); + pointer-events: none; + } + + .p-ink-active { + animation: ripple 0.4s linear; + } + + @keyframes ripple { + 100% { + opacity: 0; + transform: scale(2.5); + } + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/select/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/select/index.ts new file mode 100644 index 000000000..fcedfbf2d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/select/index.ts @@ -0,0 +1,248 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/select/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-select { + display: inline-flex; + cursor: pointer; + position: relative; + user-select: none; + background: dt('select.background'); + border: 1px solid dt('select.border.color'); + transition: + background dt('select.transition.duration'), + color dt('select.transition.duration'), + border-color dt('select.transition.duration'), + outline-color dt('select.transition.duration'), + box-shadow dt('select.transition.duration'); + border-radius: dt('select.border.radius'); + outline-color: transparent; + box-shadow: dt('select.shadow'); + } + + .p-select:not(.p-disabled):hover { + border-color: dt('select.hover.border.color'); + } + + .p-select:not(.p-disabled).p-focus { + border-color: dt('select.focus.border.color'); + box-shadow: dt('select.focus.ring.shadow'); + outline: dt('select.focus.ring.width') dt('select.focus.ring.style') dt('select.focus.ring.color'); + outline-offset: dt('select.focus.ring.offset'); + } + + .p-select.p-variant-filled { + background: dt('select.filled.background'); + } + + .p-select.p-variant-filled:not(.p-disabled):hover { + background: dt('select.filled.hover.background'); + } + + .p-select.p-variant-filled:not(.p-disabled).p-focus { + background: dt('select.filled.focus.background'); + } + + .p-select.p-invalid { + border-color: dt('select.invalid.border.color'); + } + + .p-select.p-disabled { + opacity: 1; + background: dt('select.disabled.background'); + } + + .p-select-clear-icon { + align-self: center; + color: dt('select.clear.icon.color'); + inset-inline-end: dt('select.dropdown.width'); + } + + .p-select-dropdown { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + background: transparent; + color: dt('select.dropdown.color'); + width: dt('select.dropdown.width'); + border-start-end-radius: dt('select.border.radius'); + border-end-end-radius: dt('select.border.radius'); + } + + .p-select-label { + display: block; + white-space: nowrap; + overflow: hidden; + flex: 1 1 auto; + width: 1%; + padding: dt('select.padding.y') dt('select.padding.x'); + text-overflow: ellipsis; + cursor: pointer; + color: dt('select.color'); + background: transparent; + border: 0 none; + outline: 0 none; + font-size: 1rem; + } + + .p-select-label.p-placeholder { + color: dt('select.placeholder.color'); + } + + .p-select.p-invalid .p-select-label.p-placeholder { + color: dt('select.invalid.placeholder.color'); + } + + .p-select.p-disabled .p-select-label { + color: dt('select.disabled.color'); + } + + .p-select-label-empty { + overflow: hidden; + opacity: 0; + } + + input.p-select-label { + cursor: default; + } + + .p-select-overlay { + position: absolute; + top: 0; + left: 0; + background: dt('select.overlay.background'); + color: dt('select.overlay.color'); + border: 1px solid dt('select.overlay.border.color'); + border-radius: dt('select.overlay.border.radius'); + box-shadow: dt('select.overlay.shadow'); + min-width: 100%; + transform-origin: inherit; + will-change: transform; + } + + .p-select-header { + padding: dt('select.list.header.padding'); + } + + .p-select-filter { + width: 100%; + } + + .p-select-list-container { + overflow: auto; + } + + .p-select-option-group { + cursor: auto; + margin: 0; + padding: dt('select.option.group.padding'); + background: dt('select.option.group.background'); + color: dt('select.option.group.color'); + font-weight: dt('select.option.group.font.weight'); + } + + .p-select-list { + margin: 0; + padding: 0; + list-style-type: none; + padding: dt('select.list.padding'); + gap: dt('select.list.gap'); + display: flex; + flex-direction: column; + } + + .p-select-option { + cursor: pointer; + font-weight: normal; + white-space: nowrap; + position: relative; + overflow: hidden; + display: flex; + align-items: center; + padding: dt('select.option.padding'); + border: 0 none; + color: dt('select.option.color'); + background: transparent; + transition: + background dt('select.transition.duration'), + color dt('select.transition.duration'), + border-color dt('select.transition.duration'), + box-shadow dt('select.transition.duration'), + outline-color dt('select.transition.duration'); + border-radius: dt('select.option.border.radius'); + } + + .p-select-option:not(.p-select-option-selected):not(.p-disabled).p-focus { + background: dt('select.option.focus.background'); + color: dt('select.option.focus.color'); + } + + .p-select-option:not(.p-select-option-selected):not(.p-disabled):hover { + background: dt('select.option.focus.background'); + color: dt('select.option.focus.color'); + } + + .p-select-option.p-select-option-selected { + background: dt('select.option.selected.background'); + color: dt('select.option.selected.color'); + } + + .p-select-option.p-select-option-selected.p-focus { + background: dt('select.option.selected.focus.background'); + color: dt('select.option.selected.focus.color'); + } + + .p-select-option-blank-icon { + flex-shrink: 0; + } + + .p-select-option-check-icon { + position: relative; + flex-shrink: 0; + margin-inline-start: dt('select.checkmark.gutter.start'); + margin-inline-end: dt('select.checkmark.gutter.end'); + color: dt('select.checkmark.color'); + } + + .p-select-empty-message { + padding: dt('select.empty.message.padding'); + } + + .p-select-fluid { + display: flex; + width: 100%; + } + + .p-select-sm .p-select-label { + font-size: dt('select.sm.font.size'); + padding-block: dt('select.sm.padding.y'); + padding-inline: dt('select.sm.padding.x'); + } + + .p-select-sm .p-select-dropdown .p-icon { + font-size: dt('select.sm.font.size'); + width: dt('select.sm.font.size'); + height: dt('select.sm.font.size'); + } + + .p-select-lg .p-select-label { + font-size: dt('select.lg.font.size'); + padding-block: dt('select.lg.padding.y'); + padding-inline: dt('select.lg.padding.x'); + } + + .p-select-lg .p-select-dropdown .p-icon { + font-size: dt('select.lg.font.size'); + width: dt('select.lg.font.size'); + height: dt('select.lg.font.size'); + } + + .p-floatlabel-in .p-select-filter { + padding-block-start: dt('select.padding.y'); + padding-block-end: dt('select.padding.y'); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/selectbutton/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/selectbutton/index.ts new file mode 100644 index 000000000..de6faed0a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/selectbutton/index.ts @@ -0,0 +1,49 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/selectbutton/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-selectbutton { + display: inline-flex; + user-select: none; + vertical-align: bottom; + outline-color: transparent; + border-radius: dt('selectbutton.border.radius'); + } + + .p-selectbutton .p-togglebutton { + border-radius: 0; + border-width: 1px 1px 1px 0; + } + + .p-selectbutton .p-togglebutton:focus-visible { + position: relative; + z-index: 1; + } + + .p-selectbutton .p-togglebutton:first-child { + border-inline-start-width: 1px; + border-start-start-radius: dt('selectbutton.border.radius'); + border-end-start-radius: dt('selectbutton.border.radius'); + } + + .p-selectbutton .p-togglebutton:last-child { + border-start-end-radius: dt('selectbutton.border.radius'); + border-end-end-radius: dt('selectbutton.border.radius'); + } + + .p-selectbutton.p-invalid { + outline: 1px solid dt('selectbutton.invalid.border.color'); + outline-offset: 0; + } + + .p-selectbutton-fluid { + width: 100%; + } + + .p-selectbutton-fluid .p-togglebutton { + flex: 1 1 0; + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/togglebutton/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/togglebutton/index.ts new file mode 100644 index 000000000..a05e4c57e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/togglebutton/index.ts @@ -0,0 +1,126 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/togglebutton/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-togglebutton { + display: inline-flex; + cursor: pointer; + user-select: none; + overflow: hidden; + position: relative; + color: dt('togglebutton.color'); + background: dt('togglebutton.background'); + border: 1px solid dt('togglebutton.border.color'); + padding: dt('togglebutton.padding'); + font-size: 1rem; + font-family: inherit; + font-feature-settings: inherit; + transition: + background dt('togglebutton.transition.duration'), + color dt('togglebutton.transition.duration'), + border-color dt('togglebutton.transition.duration'), + outline-color dt('togglebutton.transition.duration'), + box-shadow dt('togglebutton.transition.duration'); + border-radius: dt('togglebutton.border.radius'); + outline-color: transparent; + font-weight: dt('togglebutton.font.weight'); + } + + .p-togglebutton-content { + display: inline-flex; + flex: 1 1 auto; + align-items: center; + justify-content: center; + gap: dt('togglebutton.gap'); + padding: dt('togglebutton.content.padding'); + background: transparent; + border-radius: dt('togglebutton.content.border.radius'); + transition: + background dt('togglebutton.transition.duration'), + color dt('togglebutton.transition.duration'), + border-color dt('togglebutton.transition.duration'), + outline-color dt('togglebutton.transition.duration'), + box-shadow dt('togglebutton.transition.duration'); + } + + .p-togglebutton:not(:disabled):not(.p-togglebutton-checked):hover { + background: dt('togglebutton.hover.background'); + color: dt('togglebutton.hover.color'); + } + + .p-togglebutton.p-togglebutton-checked { + background: dt('togglebutton.checked.background'); + border-color: dt('togglebutton.checked.border.color'); + color: dt('togglebutton.checked.color'); + } + + .p-togglebutton-checked .p-togglebutton-content { + background: dt('togglebutton.content.checked.background'); + box-shadow: dt('togglebutton.content.checked.shadow'); + } + + .p-togglebutton:focus-visible { + box-shadow: dt('togglebutton.focus.ring.shadow'); + outline: dt('togglebutton.focus.ring.width') dt('togglebutton.focus.ring.style') dt('togglebutton.focus.ring.color'); + outline-offset: dt('togglebutton.focus.ring.offset'); + } + + .p-togglebutton.p-invalid { + border-color: dt('togglebutton.invalid.border.color'); + } + + .p-togglebutton:disabled { + opacity: 1; + cursor: default; + background: dt('togglebutton.disabled.background'); + border-color: dt('togglebutton.disabled.border.color'); + color: dt('togglebutton.disabled.color'); + } + + .p-togglebutton-label, + .p-togglebutton-icon { + position: relative; + transition: none; + } + + .p-togglebutton-icon { + color: dt('togglebutton.icon.color'); + } + + .p-togglebutton:not(:disabled):not(.p-togglebutton-checked):hover .p-togglebutton-icon { + color: dt('togglebutton.icon.hover.color'); + } + + .p-togglebutton.p-togglebutton-checked .p-togglebutton-icon { + color: dt('togglebutton.icon.checked.color'); + } + + .p-togglebutton:disabled .p-togglebutton-icon { + color: dt('togglebutton.icon.disabled.color'); + } + + .p-togglebutton-sm { + padding: dt('togglebutton.sm.padding'); + font-size: dt('togglebutton.sm.font.size'); + } + + .p-togglebutton-sm .p-togglebutton-content { + padding: dt('togglebutton.content.sm.padding'); + } + + .p-togglebutton-lg { + padding: dt('togglebutton.lg.padding'); + font-size: dt('togglebutton.lg.font.size'); + } + + .p-togglebutton-lg .p-togglebutton-content { + padding: dt('togglebutton.content.lg.padding'); + } + + .p-togglebutton-fluid { + width: 100%; + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/tooltip/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/tooltip/index.ts new file mode 100644 index 000000000..48c108c82 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/tooltip/index.ts @@ -0,0 +1,67 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/tooltip/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-tooltip { + position: absolute; + display: none; + max-width: dt('tooltip.max.width'); + } + + .p-tooltip-right, + .p-tooltip-left { + padding: 0 dt('tooltip.gutter'); + } + + .p-tooltip-top, + .p-tooltip-bottom { + padding: dt('tooltip.gutter') 0; + } + + .p-tooltip-text { + white-space: pre-line; + word-break: break-word; + background: dt('tooltip.background'); + color: dt('tooltip.color'); + padding: dt('tooltip.padding'); + box-shadow: dt('tooltip.shadow'); + border-radius: dt('tooltip.border.radius'); + } + + .p-tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } + + .p-tooltip-right .p-tooltip-arrow { + margin-top: calc(-1 * dt('tooltip.gutter')); + border-width: dt('tooltip.gutter') dt('tooltip.gutter') dt('tooltip.gutter') 0; + border-right-color: dt('tooltip.background'); + } + + .p-tooltip-left .p-tooltip-arrow { + margin-top: calc(-1 * dt('tooltip.gutter')); + border-width: dt('tooltip.gutter') 0 dt('tooltip.gutter') dt('tooltip.gutter'); + border-left-color: dt('tooltip.background'); + } + + .p-tooltip-top .p-tooltip-arrow { + margin-left: calc(-1 * dt('tooltip.gutter')); + border-width: dt('tooltip.gutter') dt('tooltip.gutter') 0 dt('tooltip.gutter'); + border-top-color: dt('tooltip.background'); + border-bottom-color: dt('tooltip.background'); + } + + .p-tooltip-bottom .p-tooltip-arrow { + margin-left: calc(-1 * dt('tooltip.gutter')); + border-width: 0 dt('tooltip.gutter') dt('tooltip.gutter') dt('tooltip.gutter'); + border-top-color: dt('tooltip.background'); + border-bottom-color: dt('tooltip.background'); + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/tree/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/tree/index.ts new file mode 100644 index 000000000..964e3cf0a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/styles/src/tree/index.ts @@ -0,0 +1,194 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/styles/src/tree/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export const style = /*css*/ ` + .p-tree { + display: block; + background: dt('tree.background'); + color: dt('tree.color'); + padding: dt('tree.padding'); + position: relative; + } + + .p-tree-root-children, + .p-tree-node-children { + display: flex; + list-style-type: none; + flex-direction: column; + margin: 0; + gap: dt('tree.gap'); + } + + .p-tree-root-children { + padding: 0; + padding-block-start: dt('tree.gap'); + } + + .p-tree-node-children { + padding: 0; + padding-block-start: dt('tree.gap'); + padding-inline-start: dt('tree.indent'); + } + + .p-tree-node { + padding: 0; + outline: 0 none; + } + + .p-tree-node-content { + border-radius: dt('tree.node.border.radius'); + padding: dt('tree.node.padding'); + display: flex; + align-items: center; + outline-color: transparent; + color: dt('tree.node.color'); + gap: dt('tree.node.gap'); + transition: + background dt('tree.transition.duration'), + color dt('tree.transition.duration'), + outline-color dt('tree.transition.duration'), + box-shadow dt('tree.transition.duration'); + } + + .p-tree-node-content[data-p-dragging] { + outline: 1px dashed dt('primary.color'); + outline-offset: -1px; + } + + .p-tree-node-content[data-pc-section="drag-image"] { + background: dt('tree.background'); + } + + .p-tree-node:focus-visible > .p-tree-node-content { + box-shadow: dt('tree.node.focus.ring.shadow'); + outline: dt('tree.node.focus.ring.width') dt('tree.node.focus.ring.style') dt('tree.node.focus.ring.color'); + outline-offset: dt('tree.node.focus.ring.offset'); + } + + .p-tree-node-content.p-tree-node-selectable:not(.p-tree-node-selected):hover { + background: dt('tree.node.hover.background'); + color: dt('tree.node.hover.color'); + } + + .p-tree-node-content.p-tree-node-selectable:not(.p-tree-node-selected):hover .p-tree-node-icon { + color: dt('tree.node.icon.hover.color'); + } + + .p-tree-node-content.p-tree-node-selected { + background: dt('tree.node.selected.background'); + color: dt('tree.node.selected.color'); + } + + .p-tree-node-content.p-tree-node-selected .p-tree-node-toggle-button { + color: inherit; + } + + .p-tree-node-content.p-tree-node-dragover { + background: dt('tree.node.hover.background'); + color: dt('tree.node.hover.color'); + } + + .p-tree-node-content:focus-visible, + .p-tree-node-content.p-tree-node-contextmenu-selected { + box-shadow: dt('tree.node.focus.ring.shadow'); + outline: dt('tree.node.focus.ring.width') dt('tree.node.focus.ring.style') dt('tree.node.focus.ring.color'); + outline-offset: dt('tree.node.focus.ring.offset'); + } + + .p-tree-node-drop-point { + outline: 1px solid dt('primary.color'); + } + + .p-tree-node-toggle-button { + cursor: pointer; + user-select: none; + display: inline-flex; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; + flex-shrink: 0; + width: dt('tree.node.toggle.button.size'); + height: dt('tree.node.toggle.button.size'); + color: dt('tree.node.toggle.button.color'); + border: 0 none; + background: transparent; + border-radius: dt('tree.node.toggle.button.border.radius'); + transition: + background dt('tree.transition.duration'), + color dt('tree.transition.duration'), + border-color dt('tree.transition.duration'), + outline-color dt('tree.transition.duration'), + box-shadow dt('tree.transition.duration'); + outline-color: transparent; + padding: 0; + } + + .p-tree-node-toggle-button:enabled:hover { + background: dt('tree.node.toggle.button.hover.background'); + color: dt('tree.node.toggle.button.hover.color'); + } + + .p-tree-node-content.p-tree-node-selected .p-tree-node-toggle-button:hover { + background: dt('tree.node.toggle.button.selected.hover.background'); + color: dt('tree.node.toggle.button.selected.hover.color'); + } + + .p-tree-root { + overflow: auto; + } + + .p-tree-node-selectable { + cursor: pointer; + user-select: none; + } + + .p-tree-node-leaf > .p-tree-node-content .p-tree-node-toggle-button { + visibility: hidden; + } + + .p-tree-node-icon { + color: dt('tree.node.icon.color'); + transition: color dt('tree.transition.duration'); + } + + .p-tree-node-content.p-tree-node-selected .p-tree-node-icon { + color: dt('tree.node.icon.selected.color'); + } + + .p-tree-filter { + margin: dt('tree.filter.margin'); + } + + .p-tree-filter-input { + width: 100%; + } + + .p-tree-loading-icon { + font-size: dt('tree.loading.icon.size'); + width: dt('tree.loading.icon.size'); + height: dt('tree.loading.icon.size'); + } + + .p-tree .p-tree-mask { + position: absolute; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + } + + .p-tree-flex-scrollable { + display: flex; + flex: 1; + height: 100%; + flex-direction: column; + } + + .p-tree-flex-scrollable .p-tree-root { + flex: 1; + } +`; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/classnames/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/classnames/index.ts new file mode 100644 index 000000000..e8bee1282 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/classnames/index.ts @@ -0,0 +1,42 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/classnames/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export function cn(...args: any[]): string | undefined { + if (args) { + let classes: any = []; + + for (let i = 0; i < args.length; i++) { + const className = args[i]; + + if (!className) { + continue; + } + + const type = typeof className; + + if (type === 'string' || type === 'number') { + classes.push(className); + } else if (type === 'object') { + const _classes = Array.isArray(className) ? [cn(...className)] : Object.entries(className).map(([key, value]) => (value ? key : undefined)); + + classes = _classes.length ? classes.concat(_classes.filter((c) => !!c)) : classes; + } + } + + return classes.join(' ').trim(); + } + + return undefined; +} + +/** + * @deprecated Use `cn` instead. + * @param args + * @returns + */ +export function classNames(...args: any[]): string | undefined { + return cn(...args); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/helpers/blockBodyScroll.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/helpers/blockBodyScroll.ts new file mode 100644 index 000000000..9a08e90c5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/helpers/blockBodyScroll.ts @@ -0,0 +1,22 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/helpers/blockBodyScroll.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import addClass from '../methods/addClass'; +import calculateBodyScrollbarWidth from '../methods/calculateBodyScrollbarWidth'; + +export interface BlockBodyScrollOptions { + className?: string; + variableName?: string; +} + +export default function blockBodyScroll(option: string | BlockBodyScrollOptions | undefined): void { + if (typeof option === 'string') { + addClass(document.body, option || 'p-overflow-hidden'); + } else { + option?.variableName && document.body.style.setProperty(option.variableName, calculateBodyScrollbarWidth() + 'px'); + addClass(document.body, option?.className || 'p-overflow-hidden'); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/helpers/unblockBodyScroll.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/helpers/unblockBodyScroll.ts new file mode 100644 index 000000000..7d662adb0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/helpers/unblockBodyScroll.ts @@ -0,0 +1,21 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/helpers/unblockBodyScroll.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import removeClass from '../methods/removeClass'; + +export interface UnblockBodyScrollOptions { + className?: string; + variableName?: string; +} + +export default function unblockBodyScroll(option: string | UnblockBodyScrollOptions | undefined): void { + if (typeof option === 'string') { + removeClass(document.body, option || 'p-overflow-hidden'); + } else { + if (option?.variableName) document.body.style.removeProperty(option.variableName); + removeClass(document.body, option?.className || 'p-overflow-hidden'); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/index.ts new file mode 100644 index 000000000..c68a557b9 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/index.ts @@ -0,0 +1,61 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export { default as blockBodyScroll } from './helpers/blockBodyScroll'; +export { default as unblockBodyScroll } from './helpers/unblockBodyScroll'; +export { default as absolutePosition } from './methods/absolutePosition'; +export { default as addClass } from './methods/addClass'; +export { default as addStyle } from './methods/addStyle'; +export { default as appendChild } from './methods/appendChild'; +export { default as calculateBodyScrollbarWidth } from './methods/calculateBodyScrollbarWidth'; +export { default as calculateScrollbarHeight } from './methods/calculateScrollbarHeight'; +export { default as calculateScrollbarWidth } from './methods/calculateScrollbarWidth'; +export { default as clearSelection } from './methods/clearSelection'; +export { default as createElement } from './methods/createElement'; +export { default as fadeIn } from './methods/fadeIn'; +export { default as find } from './methods/find'; +export { default as findSingle } from './methods/findSingle'; +export { default as focus } from './methods/focus'; +export { default as getAttribute } from './methods/getAttribute'; +export { default as getCSSVariableByRegex } from './methods/getCSSVariableByRegex'; +export { default as getFirstFocusableElement } from './methods/getFirstFocusableElement'; +export { default as getFocusableElements } from './methods/getFocusableElements'; +export { default as getHeight } from './methods/getHeight'; +export { default as getHiddenElementDimensions } from './methods/getHiddenElementDimensions'; +export { default as getHiddenElementOuterHeight } from './methods/getHiddenElementOuterHeight'; +export { default as getHiddenElementOuterWidth } from './methods/getHiddenElementOuterWidth'; +export { default as getIndex } from './methods/getIndex'; +export { default as getLastFocusableElement } from './methods/getLastFocusableElement'; +export { default as getOffset } from './methods/getOffset'; +export { default as getOuterHeight } from './methods/getOuterHeight'; +export { default as getOuterWidth } from './methods/getOuterWidth'; +export { default as getParentNode } from './methods/getParentNode'; +export { default as getScrollLeft } from './methods/getScrollLeft'; +export { default as getSelection } from './methods/getSelection'; +export { default as getTargetElement } from './methods/getTargetElement'; +export { default as getViewport } from './methods/getViewport'; +export { default as getWidth } from './methods/getWidth'; +export { default as getWindowScrollLeft } from './methods/getWindowScrollLeft'; +export { default as getWindowScrollTop } from './methods/getWindowScrollTop'; +export { default as hasClass } from './methods/hasClass'; +export { default as invokeElementMethod } from './methods/invokeElementMethod'; +export { default as isClickable } from './methods/isClickable'; +export { default as isElement } from './methods/isElement'; +export { default as isExist } from './methods/isExist'; +export { default as isPrefersReducedMotion } from './methods/isPrefersReducedMotion'; +export { default as isRTL } from './methods/isRTL'; +export { default as isTouchDevice } from './methods/isTouchDevice'; +export { default as isVisible } from './methods/isVisible'; +export { default as nextFrame } from './methods/nextFrame'; +export { default as relativePosition } from './methods/relativePosition'; +export { default as remove } from './methods/remove'; +export { default as removeChild } from './methods/removeChild'; +export { default as removeClass } from './methods/removeClass'; +export { default as scrollInView } from './methods/scrollInView'; +export { default as setAttribute } from './methods/setAttribute'; +export { default as setAttributes } from './methods/setAttributes'; +export { default as setCSSProperty } from './methods/setCSSProperty'; +export { default as toElement } from './methods/toElement'; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/absolutePosition.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/absolutePosition.ts new file mode 100644 index 000000000..5d0833e8c --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/absolutePosition.ts @@ -0,0 +1,53 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/absolutePosition.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getCSSVariableByRegex from './getCSSVariableByRegex'; +import getHiddenElementDimensions from './getHiddenElementDimensions'; +import getViewport from './getViewport'; +import getWindowScrollLeft from './getWindowScrollLeft'; +import getWindowScrollTop from './getWindowScrollTop'; +import isRTL from './isRTL'; + +export default function absolutePosition(element: HTMLElement, target: HTMLElement, gutter: boolean = true): void { + if (element) { + const elementDimensions = element.offsetParent ? { width: element.offsetWidth, height: element.offsetHeight } : getHiddenElementDimensions(element); + const elementOuterHeight = elementDimensions.height; + const elementOuterWidth = elementDimensions.width; + const targetOuterHeight = target.offsetHeight; + const targetOuterWidth = target.offsetWidth; + const targetOffset = target.getBoundingClientRect(); + const windowScrollTop = getWindowScrollTop(); + const windowScrollLeft = getWindowScrollLeft(); + const viewport = getViewport(); + let top, + left, + origin = 'top'; + + if (targetOffset.top + targetOuterHeight + elementOuterHeight > viewport.height) { + top = targetOffset.top + windowScrollTop - elementOuterHeight; + origin = 'bottom'; + + if (top < 0) { + top = windowScrollTop; + } + } else { + top = targetOuterHeight + targetOffset.top + windowScrollTop; + } + + if (targetOffset.left + elementOuterWidth > viewport.width) left = Math.max(0, targetOffset.left + windowScrollLeft + targetOuterWidth - elementOuterWidth); + else left = targetOffset.left + windowScrollLeft; + + if (isRTL(element)) { + element.style.insetInlineEnd = left + 'px'; + } else { + element.style.insetInlineStart = left + 'px'; + } + + element.style.top = top + 'px'; + element.style.transformOrigin = origin; + if (gutter) element.style.marginTop = origin === 'bottom' ? `calc(${getCSSVariableByRegex(/-anchor-gutter$/)?.value ?? '2px'} * -1)` : (getCSSVariableByRegex(/-anchor-gutter$/)?.value ?? ''); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/addClass.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/addClass.ts new file mode 100644 index 000000000..a98447010 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/addClass.ts @@ -0,0 +1,23 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/addClass.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import hasClass from './hasClass'; + +export default function addClass(element: Element, className: string | undefined | null | (string | undefined | null)[]): void { + if (element && className) { + const fn = (_className: string) => { + if (!hasClass(element, _className)) { + if (element.classList) element.classList.add(_className); + else element.className += ' ' + _className; + } + }; + + [className] + .flat() + .filter(Boolean) + .forEach((_classNames) => (_classNames as string).split(' ').forEach(fn)); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/addStyle.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/addStyle.ts new file mode 100644 index 000000000..9f5696887 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/addStyle.ts @@ -0,0 +1,15 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/addStyle.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function addStyle(element: HTMLElement, style: string | object): void { + if (element) { + if (typeof style === 'string') { + element.style.cssText = style; + } else { + Object.entries(style || {}).forEach(([key, value]: [string, string]) => ((element.style as any)[key] = value)); + } + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/appendChild.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/appendChild.ts new file mode 100644 index 000000000..104d2c2db --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/appendChild.ts @@ -0,0 +1,14 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/appendChild.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getTargetElement from './getTargetElement'; + +export default function appendChild(element: unknown, child: Node | Element) { + const target: Document | Element | null | undefined = getTargetElement(element, child as Element) as Exclude, Window>; + + if (target) target.appendChild(child); + else throw new Error('Cannot append ' + child + ' to ' + element); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/calculateBodyScrollbarWidth.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/calculateBodyScrollbarWidth.ts new file mode 100644 index 000000000..b89ca00de --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/calculateBodyScrollbarWidth.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/calculateBodyScrollbarWidth.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function calculateBodyScrollbarWidth(): number { + return window.innerWidth - document.documentElement.offsetWidth; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/calculateScrollbarHeight.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/calculateScrollbarHeight.ts new file mode 100644 index 000000000..b69c90722 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/calculateScrollbarHeight.ts @@ -0,0 +1,38 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/calculateScrollbarHeight.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import addStyle from './addStyle'; + +let calculatedScrollbarHeight: number | undefined = undefined; + +export default function calculateScrollbarHeight(element?: HTMLElement): number { + if (element) { + const style = getComputedStyle(element); + + return element.offsetHeight - element.clientHeight - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth); + } else { + if (calculatedScrollbarHeight != null) return calculatedScrollbarHeight; + + const scrollDiv = document.createElement('div'); + + addStyle(scrollDiv, { + width: '100px', + height: '100px', + overflow: 'scroll', + position: 'absolute', + top: '-9999px' + }); + document.body.appendChild(scrollDiv); + + const scrollbarHeight = scrollDiv.offsetHeight - scrollDiv.clientHeight; + + document.body.removeChild(scrollDiv); + + calculatedScrollbarHeight = scrollbarHeight; + + return scrollbarHeight; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/calculateScrollbarWidth.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/calculateScrollbarWidth.ts new file mode 100644 index 000000000..3cf6cf7b0 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/calculateScrollbarWidth.ts @@ -0,0 +1,38 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/calculateScrollbarWidth.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import addStyle from './addStyle'; + +let calculatedScrollbarWidth: number | undefined = undefined; + +export default function calculateScrollbarWidth(element?: HTMLElement): number { + if (element) { + const style = getComputedStyle(element); + + return element.offsetWidth - element.clientWidth - parseFloat(style.borderLeftWidth) - parseFloat(style.borderRightWidth); + } else { + if (calculatedScrollbarWidth != null) return calculatedScrollbarWidth; + + const scrollDiv = document.createElement('div'); + + addStyle(scrollDiv, { + width: '100px', + height: '100px', + overflow: 'scroll', + position: 'absolute', + top: '-9999px' + }); + document.body.appendChild(scrollDiv); + + const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; + + document.body.removeChild(scrollDiv); + + calculatedScrollbarWidth = scrollbarWidth; + + return scrollbarWidth; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/clearSelection.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/clearSelection.ts new file mode 100644 index 000000000..cf8c507e7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/clearSelection.ts @@ -0,0 +1,17 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/clearSelection.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function clearSelection(): void { + if (window.getSelection) { + const selection: any = window.getSelection() || {}; + + if (selection.empty) { + selection.empty(); + } else if (selection.removeAllRanges && selection.rangeCount > 0 && selection.getRangeAt(0).getClientRects().length > 0) { + selection.removeAllRanges(); + } + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/createElement.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/createElement.ts new file mode 100644 index 000000000..84ede29fe --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/createElement.ts @@ -0,0 +1,20 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/createElement.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import setAttributes from './setAttributes'; + +export default function createElement(type: string, attributes: Record = {}, ...children: (string | Node)[]): HTMLElement | undefined { + if (type) { + const element = document.createElement(type); + + setAttributes(element, attributes); + element.append(...children); + + return element; + } + + return undefined; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/fadeIn.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/fadeIn.ts new file mode 100644 index 000000000..669eb4f94 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/fadeIn.ts @@ -0,0 +1,27 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/fadeIn.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function fadeIn(element: HTMLElement, duration: number): void { + if (element) { + element.style.opacity = '0'; + + let last = +new Date(); + let opacity = '0'; + + const tick = function () { + opacity = `${+element.style.opacity + (new Date().getTime() - last) / duration}`; + element.style.opacity = opacity; + last = +new Date(); + + if (+opacity < 1) { + if ('requestAnimationFrame' in window) requestAnimationFrame(tick); + else setTimeout(tick, 16); + } + }; + + tick(); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/find.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/find.ts new file mode 100644 index 000000000..e73613a38 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/find.ts @@ -0,0 +1,11 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/find.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isElement from './isElement'; + +export default function find(element: Element, selector: string): Element[] { + return isElement(element) ? Array.from(element.querySelectorAll(selector)) : []; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/findSingle.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/findSingle.ts new file mode 100644 index 000000000..5c32ca52a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/findSingle.ts @@ -0,0 +1,11 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/findSingle.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isElement from './isElement'; + +export default function findSingle(element: Element, selector: string): Element | null { + return isElement(element) ? (element.matches(selector) ? element : element.querySelector(selector)) : null; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/focus.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/focus.ts new file mode 100644 index 000000000..dcdef3ed5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/focus.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/focus.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function focus(element: HTMLElement, options?: FocusOptions): void { + if (element && document.activeElement !== element) element.focus(options); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getAttribute.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getAttribute.ts new file mode 100644 index 000000000..ac388199f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getAttribute.ts @@ -0,0 +1,25 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getAttribute.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isElement from './isElement'; + +export default function getAttribute(element: Element, name: string): any { + if (isElement(element)) { + const value = element.getAttribute(name); + + if (!isNaN(value as any)) { + return +(value as string); + } + + if (value === 'true' || value === 'false') { + return value === 'true'; + } + + return value; + } + + return undefined; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getCSSVariableByRegex.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getCSSVariableByRegex.ts new file mode 100644 index 000000000..05f25cd67 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getCSSVariableByRegex.ts @@ -0,0 +1,21 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getCSSVariableByRegex.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getCSSVariableByRegex(variableRegex: RegExp): { name: string | undefined; value: string | undefined } | null { + for (const sheet of document?.styleSheets) { + try { + for (const rule of sheet?.cssRules) { + for (const property of (rule as CSSStyleRule)?.style) { + if (variableRegex.test(property)) { + return { name: property, value: (rule as CSSStyleRule).style.getPropertyValue(property).trim() }; + } + } + } + } catch {} + } + + return null; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getFirstFocusableElement.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getFirstFocusableElement.ts new file mode 100644 index 000000000..67587b4f9 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getFirstFocusableElement.ts @@ -0,0 +1,13 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getFirstFocusableElement.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getFocusableElements from './getFocusableElements'; + +export default function getFirstFocusableElement(element: Element, selector?: string): Element | null { + const focusableElements = getFocusableElements(element, selector); + + return focusableElements.length > 0 ? focusableElements[0] : null; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getFocusableElements.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getFocusableElements.ts new file mode 100644 index 000000000..8ca5523e2 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getFocusableElements.ts @@ -0,0 +1,28 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getFocusableElements.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import find from './find'; + +export default function getFocusableElements(element: Element, selector: string = ''): Element[] { + const focusableElements = find( + element, + `button:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + [href]:not([tabindex = "-1"]):not([style*="display:none"]):not([hidden])${selector}, + input:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + select:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + textarea:not([tabindex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + [tabIndex]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}, + [contenteditable]:not([tabIndex = "-1"]):not([disabled]):not([style*="display:none"]):not([hidden])${selector}` + ); + + const visibleFocusableElements: Element[] = []; + + for (const focusableElement of focusableElements) { + if (getComputedStyle(focusableElement).display != 'none' && getComputedStyle(focusableElement).visibility != 'hidden') visibleFocusableElements.push(focusableElement); + } + + return visibleFocusableElements; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHeight.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHeight.ts new file mode 100644 index 000000000..1c6312dfc --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHeight.ts @@ -0,0 +1,18 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getHeight.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getHeight(element: HTMLElement): number { + if (element) { + let height = element.offsetHeight; + const style = getComputedStyle(element); + + height -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom) + parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth); + + return height; + } + + return 0; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHiddenElementDimensions.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHiddenElementDimensions.ts new file mode 100644 index 000000000..c2a4996e6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHiddenElementDimensions.ts @@ -0,0 +1,24 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getHiddenElementDimensions.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getHiddenElementDimensions(element?: HTMLElement): { width: number; height: number } { + const dimensions: { width: number; height: number } = { width: 0, height: 0 }; + + if (element) { + const [visibility, display] = [element.style.visibility, element.style.display]; + const rect = element.getBoundingClientRect(); + + // Temporarily hide the element to get its dimensions + element.style.visibility = 'hidden'; + element.style.display = 'block'; + dimensions.width = rect.width || element.offsetWidth; + dimensions.height = rect.height || element.offsetHeight; + element.style.display = display; + element.style.visibility = visibility; + } + + return dimensions; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHiddenElementOuterHeight.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHiddenElementOuterHeight.ts new file mode 100644 index 000000000..27ef1208e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHiddenElementOuterHeight.ts @@ -0,0 +1,23 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getHiddenElementOuterHeight.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getHiddenElementOuterHeight(element: HTMLElement): number { + if (element) { + const [visibility, display] = [element.style.visibility, element.style.display]; + + // Temporarily hide the element to get its outer height + element.style.visibility = 'hidden'; + element.style.display = 'block'; + const elementHeight = element.offsetHeight; + + element.style.display = display; + element.style.visibility = visibility; + + return elementHeight; + } + + return 0; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHiddenElementOuterWidth.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHiddenElementOuterWidth.ts new file mode 100644 index 000000000..f5d4e08ac --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getHiddenElementOuterWidth.ts @@ -0,0 +1,23 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getHiddenElementOuterWidth.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getHiddenElementOuterWidth(element: HTMLElement): number { + if (element) { + const [visibility, display] = [element.style.visibility, element.style.display]; + + // Temporarily hide the element to get its outer width + element.style.visibility = 'hidden'; + element.style.display = 'block'; + const elementWidth = element.offsetWidth; + + element.style.display = display; + element.style.visibility = visibility; + + return elementWidth; + } + + return 0; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getIndex.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getIndex.ts new file mode 100644 index 000000000..e2801bf6a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getIndex.ts @@ -0,0 +1,23 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getIndex.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getParentNode from './getParentNode'; + +export default function getIndex(element: HTMLElement): number { + if (element) { + const children = getParentNode(element)?.childNodes; + let num = 0; + + if (children) { + for (let i = 0; i < children.length; i++) { + if (children[i] === element) return num; + if (children[i].nodeType === 1) num++; + } + } + } + + return -1; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getLastFocusableElement.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getLastFocusableElement.ts new file mode 100644 index 000000000..c3267b982 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getLastFocusableElement.ts @@ -0,0 +1,13 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getLastFocusableElement.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getFocusableElements from './getFocusableElements'; + +export default function getLastFocusableElement(element: Element, selector?: string): Element | null { + const focusableElements = getFocusableElements(element, selector); + + return focusableElements.length > 0 ? focusableElements[focusableElements.length - 1] : null; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getOffset.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getOffset.ts new file mode 100644 index 000000000..75d96f1da --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getOffset.ts @@ -0,0 +1,23 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getOffset.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getScrollLeft from './getScrollLeft'; + +export default function getOffset(element?: Element | null): { top: number | string; left: number | string } { + if (element) { + const rect = element.getBoundingClientRect(); + + return { + top: rect.top + (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0), + left: rect.left + (window.pageXOffset || getScrollLeft(document.documentElement) || getScrollLeft(document.body) || 0) + }; + } + + return { + top: 'auto', + left: 'auto' + }; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getOuterHeight.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getOuterHeight.ts new file mode 100644 index 000000000..db0af9a27 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getOuterHeight.ts @@ -0,0 +1,21 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getOuterHeight.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getOuterHeight(element: HTMLElement, margin?: boolean): number { + if (element) { + let height = element.offsetHeight; + + if (margin) { + const style = getComputedStyle(element); + + height += parseFloat(style.marginTop) + parseFloat(style.marginBottom); + } + + return height; + } + + return 0; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getOuterWidth.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getOuterWidth.ts new file mode 100644 index 000000000..539ecc9af --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getOuterWidth.ts @@ -0,0 +1,21 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getOuterWidth.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getOuterWidth(element: unknown, margin?: boolean): number { + if (element instanceof HTMLElement) { + let width = element.offsetWidth; + + if (margin) { + const style = getComputedStyle(element); + + width += parseFloat(style.marginLeft) + parseFloat(style.marginRight); + } + + return width; + } + + return 0; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getParentNode.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getParentNode.ts new file mode 100644 index 000000000..c2515b2be --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getParentNode.ts @@ -0,0 +1,19 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getParentNode.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getParentNode(element: Node): ParentNode | null { + if (element) { + let parent = element.parentNode; + + if (parent && parent instanceof ShadowRoot && parent.host) { + parent = parent.host; + } + + return parent; + } + + return null; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getScrollLeft.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getScrollLeft.ts new file mode 100644 index 000000000..15ecbca4b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getScrollLeft.ts @@ -0,0 +1,10 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getScrollLeft.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getScrollLeft(element?: HTMLElement): number { + // for RTL scrollLeft should be negative + return element ? Math.abs(element.scrollLeft) : 0; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getSelection.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getSelection.ts new file mode 100644 index 000000000..13d1fa510 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getSelection.ts @@ -0,0 +1,12 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getSelection.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getSelection(): string | undefined { + if (window.getSelection) return (window.getSelection() as any).toString(); + else if (document.getSelection) return (document.getSelection() as any).toString(); + + return undefined; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getTargetElement.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getTargetElement.ts new file mode 100644 index 000000000..e2ea56b07 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getTargetElement.ts @@ -0,0 +1,54 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getTargetElement.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isExist from './isExist'; +import toElement from './toElement'; + +export default function getTargetElement(target: unknown, currentElement?: Element): Window | Document | Element | null | undefined { + if (!target) return undefined; + + switch (target) { + case 'document': + return document; + case 'window': + return window; + case 'body': + return document.body; + case '@next': + return currentElement?.nextElementSibling; + case '@prev': + return currentElement?.previousElementSibling; + case '@first': + return currentElement?.firstElementChild; + case '@last': + return currentElement?.lastElementChild; + case '@child': + return currentElement?.children?.[0]; + case '@parent': + return currentElement?.parentElement; + case '@grandparent': + return currentElement?.parentElement?.parentElement; + + default: { + if (typeof target === 'string') { + // child selector + const match = target.match(/^@child\[(\d+)]/); + + if (match) { + return currentElement?.children?.[parseInt(match[1], 10)] || null; + } + + return document.querySelector(target) || null; + } + + const isFunction = (value: unknown): value is (...args: unknown[]) => unknown => typeof value === 'function' && 'call' in value && 'apply' in value; + const computedTarget = isFunction(target) ? target() : target; + const element = toElement(computedTarget); + + return isExist(element as Element) ? (element as Element) : (computedTarget as Document)?.nodeType === 9 ? (computedTarget as Document) : undefined; + } + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getViewport.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getViewport.ts new file mode 100644 index 000000000..0476ee95f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getViewport.ts @@ -0,0 +1,16 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getViewport.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getViewport(): { width: number; height: number } { + const win = window, + d = document, + e = d.documentElement, + g = d.getElementsByTagName('body')[0], + w = win.innerWidth || e.clientWidth || g.clientWidth, + h = win.innerHeight || e.clientHeight || g.clientHeight; + + return { width: w, height: h }; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getWidth.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getWidth.ts new file mode 100644 index 000000000..c7c7d35b6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getWidth.ts @@ -0,0 +1,18 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getWidth.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getWidth(element: HTMLElement): number { + if (element) { + let width = element.offsetWidth; + const style = getComputedStyle(element); + + width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) + parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth); + + return width; + } + + return 0; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getWindowScrollLeft.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getWindowScrollLeft.ts new file mode 100644 index 000000000..109cf8c27 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getWindowScrollLeft.ts @@ -0,0 +1,13 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getWindowScrollLeft.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getScrollLeft from './getScrollLeft'; + +export default function getWindowScrollLeft(): number { + const doc = document.documentElement; + + return (window.pageXOffset || getScrollLeft(doc)) - (doc.clientLeft || 0); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getWindowScrollTop.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getWindowScrollTop.ts new file mode 100644 index 000000000..2d640ca96 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/getWindowScrollTop.ts @@ -0,0 +1,11 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/getWindowScrollTop.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function getWindowScrollTop(): number { + const doc = document.documentElement; + + return (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/hasClass.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/hasClass.ts new file mode 100644 index 000000000..9d0ee5a0d --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/hasClass.ts @@ -0,0 +1,14 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/hasClass.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function hasClass(element: Element, className: string): boolean { + if (element) { + if (element.classList) return element.classList.contains(className); + else return new RegExp('(^| )' + className + '( |$)', 'gi').test(element.className); + } + + return false; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/invokeElementMethod.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/invokeElementMethod.ts new file mode 100644 index 000000000..a4fd1daeb --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/invokeElementMethod.ts @@ -0,0 +1,13 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/invokeElementMethod.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function invokeElementMethod(element: Element, methodName: T, args?: unknown[]): void { + const method = element[methodName]; + + if (typeof method === 'function') { + (method as (...args: unknown[]) => void).apply(element, args ?? []); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isClickable.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isClickable.ts new file mode 100644 index 000000000..5aea61e55 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isClickable.ts @@ -0,0 +1,26 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/isClickable.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isClickable(element: Element): boolean { + if (element) { + const targetNode = element.nodeName; + const parentNode = element.parentElement && element.parentElement.nodeName; + + return ( + targetNode === 'INPUT' || + targetNode === 'TEXTAREA' || + targetNode === 'BUTTON' || + targetNode === 'A' || + parentNode === 'INPUT' || + parentNode === 'TEXTAREA' || + parentNode === 'BUTTON' || + parentNode === 'A' || + !!element.closest('.p-button, .p-checkbox, .p-radiobutton') // @todo Add [data-pc-section="button"] + ); + } + + return false; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isElement.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isElement.ts new file mode 100644 index 000000000..d33f679e5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isElement.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/isElement.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isElement(element: unknown): element is Element { + return typeof Element !== 'undefined' ? element instanceof Element : element !== null && typeof element === 'object' && (element as Element).nodeType === 1 && typeof (element as Element).nodeName === 'string'; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isExist.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isExist.ts new file mode 100644 index 000000000..fff876186 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isExist.ts @@ -0,0 +1,11 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/isExist.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getParentNode from './getParentNode'; + +export default function isExist(element: Node): boolean { + return !!(element !== null && typeof element !== 'undefined' && element.nodeName && getParentNode(element)); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isPrefersReducedMotion.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isPrefersReducedMotion.ts new file mode 100644 index 000000000..19eb03ee9 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isPrefersReducedMotion.ts @@ -0,0 +1,15 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/isPrefersReducedMotion.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isPrefersReducedMotion(): boolean { + if (typeof window === 'undefined' || !window.matchMedia) { + return false; + } + + const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)'); + + return mediaQuery.matches; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isRTL.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isRTL.ts new file mode 100644 index 000000000..fed0be585 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isRTL.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/isRTL.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isRTL(element?: HTMLElement): boolean { + return element ? getComputedStyle(element).direction === 'rtl' : false; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isTouchDevice.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isTouchDevice.ts new file mode 100644 index 000000000..15661b69b --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isTouchDevice.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/isTouchDevice.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isTouchDevice(): boolean { + return 'ontouchstart' in window || navigator.maxTouchPoints > 0 || (navigator as Partial).msMaxTouchPoints! > 0; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isVisible.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isVisible.ts new file mode 100644 index 000000000..cfbceb8da --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/isVisible.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/isVisible.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isVisible(element?: HTMLElement): boolean { + return !!(element && element.offsetParent != null); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/nextFrame.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/nextFrame.ts new file mode 100644 index 000000000..eb7aca070 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/nextFrame.ts @@ -0,0 +1,13 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/nextFrame.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function nextFrame(): Promise { + return new Promise((resolve) => { + requestAnimationFrame(() => { + requestAnimationFrame(resolve as () => void); + }); + }); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/relativePosition.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/relativePosition.ts new file mode 100644 index 000000000..836f2d6e8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/relativePosition.ts @@ -0,0 +1,53 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/relativePosition.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getCSSVariableByRegex from './getCSSVariableByRegex'; +import getHiddenElementDimensions from './getHiddenElementDimensions'; +import getViewport from './getViewport'; + +export default function relativePosition(element: HTMLElement, target: HTMLElement, gutter: boolean = true, fixedOrigin: 'top' | 'bottom' | undefined = undefined): void { + if (element) { + const elementDimensions = element.offsetParent ? { width: element.offsetWidth, height: element.offsetHeight } : getHiddenElementDimensions(element); + const targetHeight = target.offsetHeight; + const targetOffset = target.getBoundingClientRect(); + const viewport = getViewport(); + let top, + left, + origin = fixedOrigin ?? 'top'; + + if (!fixedOrigin && targetOffset.top + targetHeight + elementDimensions.height > viewport.height) { + top = -1 * elementDimensions.height; + origin = 'bottom'; + + if (targetOffset.top + top < 0) { + top = -1 * targetOffset.top; + } + } else { + top = targetHeight; + } + + if (elementDimensions.width > viewport.width) { + // element wider then viewport and cannot fit on screen (align at left side of viewport) + left = targetOffset.left * -1; + } else if (targetOffset.left + elementDimensions.width > viewport.width) { + // element wider then viewport but can be fit on screen (align at right side of viewport) + left = (targetOffset.left + elementDimensions.width - viewport.width) * -1; + } else { + // element fits on screen (align with target) + left = 0; + } + + element.style.top = top + 'px'; + element.style.insetInlineStart = left + 'px'; + element.style.transformOrigin = origin; + + if (gutter) { + const gutterValue = getCSSVariableByRegex(/-anchor-gutter$/)?.value; + + element.style.marginTop = origin === 'bottom' ? `calc(${gutterValue ?? '2px'} * -1)` : (gutterValue ?? ''); + } + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/remove.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/remove.ts new file mode 100644 index 000000000..0b047b218 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/remove.ts @@ -0,0 +1,12 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/remove.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function remove(element: Element) { + if (element) { + if (!('remove' in Element.prototype)) element.parentNode?.removeChild(element); + else element.remove(); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/removeChild.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/removeChild.ts new file mode 100644 index 000000000..3bc254388 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/removeChild.ts @@ -0,0 +1,14 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/removeChild.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import toElement from './toElement'; + +export default function removeChild(element: unknown, child: Node) { + const target = toElement(element); + + if (target) target.removeChild(child); + else throw new Error('Cannot remove ' + child + ' from ' + element); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/removeClass.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/removeClass.ts new file mode 100644 index 000000000..9c284b01a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/removeClass.ts @@ -0,0 +1,19 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/removeClass.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function removeClass(element: Element, className: string | undefined | null | (string | undefined | null)[]): void { + if (element && className) { + const fn = (_className: string) => { + if (element.classList) element.classList.remove(_className); + else element.className = element.className.replace(new RegExp('(^|\\b)' + _className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); + }; + + [className] + .flat() + .filter(Boolean) + .forEach((_classNames) => (_classNames as string).split(' ').forEach(fn)); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/scrollInView.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/scrollInView.ts new file mode 100644 index 000000000..0b0f5dbe6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/scrollInView.ts @@ -0,0 +1,26 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/scrollInView.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import getOuterHeight from './getOuterHeight'; + +export default function scrollInView(container: HTMLElement, item: HTMLElement): void { + const borderTopValue = getComputedStyle(container).getPropertyValue('borderTopWidth'); + const borderTop = borderTopValue ? parseFloat(borderTopValue) : 0; + const paddingTopValue = getComputedStyle(container).getPropertyValue('paddingTop'); + const paddingTop = paddingTopValue ? parseFloat(paddingTopValue) : 0; + const containerRect = container.getBoundingClientRect(); + const itemRect = item.getBoundingClientRect(); + const offset = itemRect.top + document.body.scrollTop - (containerRect.top + document.body.scrollTop) - borderTop - paddingTop; + const scroll = container.scrollTop; + const elementHeight = container.clientHeight; + const itemHeight = getOuterHeight(item); + + if (offset < 0) { + container.scrollTop = scroll + offset; + } else if (offset + itemHeight > elementHeight) { + container.scrollTop = scroll + offset - elementHeight + itemHeight; + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/setAttribute.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/setAttribute.ts new file mode 100644 index 000000000..4d48d7da1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/setAttribute.ts @@ -0,0 +1,13 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/setAttribute.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isElement from './isElement'; + +export default function setAttribute(element: HTMLElement, attribute: string = '', value: any): void { + if (isElement(element) && value !== null && value !== undefined) { + element.setAttribute(attribute, value); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/setAttributes.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/setAttributes.ts new file mode 100644 index 000000000..4aeeba170 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/setAttributes.ts @@ -0,0 +1,47 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/setAttributes.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isElement from './isElement'; + +export default function setAttributes(element: HTMLElement, attributes: { [key: string]: any } = {}): void { + if (isElement(element)) { + const computedStyles = (rule: string, value: any): string[] => { + const styles = (element as any)?.$attrs?.[rule] ? [(element as any)?.$attrs?.[rule]] : []; + + return [value].flat().reduce((cv, v) => { + if (v !== null && v !== undefined) { + const type = typeof v; + + if (type === 'string' || type === 'number') { + cv.push(v); + } else if (type === 'object') { + const _cv = Array.isArray(v) ? computedStyles(rule, v) : Object.entries(v).map(([_k, _v]) => (rule === 'style' && (!!_v || _v === 0) ? `${_k.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}:${_v}` : _v ? _k : undefined)); + + cv = _cv.length ? cv.concat(_cv.filter((c) => !!c)) : cv; + } + } + + return cv; + }, styles); + }; + + Object.entries(attributes).forEach(([key, value]) => { + if (value !== undefined && value !== null) { + const matchedEvent = key.match(/^on(.+)/); + + if (matchedEvent) { + element.addEventListener(matchedEvent[1].toLowerCase(), value); + } else if (key === 'p-bind' || key === 'pBind') { + setAttributes(element, value); + } else { + value = key === 'class' ? [...new Set(computedStyles('class', value))].join(' ').trim() : key === 'style' ? computedStyles('style', value).join(';').trim() : value; + ((element as any).$attrs = (element as any).$attrs || {}) && ((element as any).$attrs[key] = value); + element.setAttribute(key, value); + } + } + }); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/setCSSProperty.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/setCSSProperty.ts new file mode 100644 index 000000000..7df433096 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/setCSSProperty.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/setCSSProperty.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function setCSSProperty(element?: HTMLElement, property?: string, value: any = null, priority?: string): void { + property && element?.style?.setProperty(property, value, priority); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/toElement.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/toElement.ts new file mode 100644 index 000000000..faf4fa9c5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/dom/methods/toElement.ts @@ -0,0 +1,32 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/dom/methods/toElement.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isElement from './isElement'; + +type ReactElement = { current: Element | null | undefined }; +type VueElement = { el: Element | null | undefined }; +type AngularElement = { el: { nativeElement: Element | undefined } }; + +export default function toElement(element: unknown): Element | null | undefined { + let target = element; + + if (element && typeof element === 'object') { + if (Object.hasOwn(element, 'current')) { + // For React + target = (element as ReactElement).current; + } else if (Object.hasOwn(element, 'el')) { + if (Object.hasOwn((element as AngularElement).el, 'nativeElement')) { + // For Angular + target = (element as AngularElement).el.nativeElement; + } else { + // For Vue + target = (element as VueElement).el; + } + } + } + + return isElement(target) ? target : undefined; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/eventbus/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/eventbus/index.ts new file mode 100644 index 000000000..938b3c1c8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/eventbus/index.ts @@ -0,0 +1,52 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/eventbus/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export type Handler = (evt: unknown) => void; + +export interface EventBusOptions { + on(type: string, handler: Handler): void; + off(type: string, handler: Handler): void; + emit(type: string, evt?: unknown): void; + clear(): void; +} + +export function EventBus(): EventBusOptions { + const allHandlers = new Map(); + + return { + on(type: string, handler: Handler) { + let handlers = allHandlers.get(type); + + if (!handlers) handlers = [handler]; + else handlers.push(handler); + + allHandlers.set(type, handlers); + + return this; + }, + off(type: string, handler: Handler) { + const handlers = allHandlers.get(type); + + if (handlers) { + handlers.splice(handlers.indexOf(handler) >>> 0, 1); + } + + return this; + }, + emit(type: string, evt?: unknown) { + const handlers = allHandlers.get(type); + + if (handlers) { + handlers.forEach((handler) => { + handler(evt); + }); + } + }, + clear() { + allHandlers.clear(); + } + }; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/index.ts new file mode 100644 index 000000000..8c22a8168 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/index.ts @@ -0,0 +1,12 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/index.ts + * Modified: import paths rewritten to resolve locally. See ../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export * from './classnames/index'; +export * from './dom/index'; +export * from './eventbus/index'; +export * from './mergeprops/index'; +export * from './object/index'; +export * from './uuid/index'; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/mergeprops/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/mergeprops/index.ts new file mode 100644 index 000000000..054f748c1 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/mergeprops/index.ts @@ -0,0 +1,45 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/mergeprops/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import { cn } from '../classnames'; +import { isFunction } from '../object'; + +function _mergeProps({ skipUndefined = false }, ...props: any[]): object | undefined { + return props?.reduce((merged, ps = {}) => { + for (const key in ps) { + const value = ps[key]; + + if (skipUndefined && value === undefined) continue; + + if (key === 'style') { + merged['style'] = { ...merged['style'], ...ps['style'] }; + } else if (key === 'class' || key === 'className') { + merged[key] = cn(merged[key], ps[key]); + } else if (isFunction(value)) { + const fn = merged[key]; + + merged[key] = fn + ? (...args: any[]) => { + fn(...args); + value(...args); + } + : value; + } else { + merged[key] = value; + } + } + + return merged; + }, {}); +} + +export function mergeProps(...props: any[]): object | undefined { + return _mergeProps({ skipUndefined: false }, ...props); +} + +export function mergeDefaultProps(...props: any[]): object | undefined { + return _mergeProps({ skipUndefined: true }, ...props); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/index.ts new file mode 100644 index 000000000..bc942aab5 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/index.ts @@ -0,0 +1,29 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export { default as contains } from './methods/contains'; +export { default as deepEquals } from './methods/deepEquals'; +export { default as equals } from './methods/equals'; +export { default as findLastIndex } from './methods/findLastIndex'; +export { default as getKeyValue } from './methods/getKeyValue'; +export { default as isArray } from './methods/isArray'; +export { default as isDate } from './methods/isDate'; +export { default as isEmpty } from './methods/isEmpty'; +export { default as isFunction } from './methods/isFunction'; +export { default as isNotEmpty } from './methods/isNotEmpty'; +export { default as isNumber } from './methods/isNumber'; +export { default as isObject } from './methods/isObject'; +export { default as isPrintableCharacter } from './methods/isPrintableCharacter'; +export { default as isString } from './methods/isString'; +export { default as matchRegex } from './methods/matchRegex'; +export { default as minifyCSS } from './methods/minifyCSS'; +export { default as removeAccents } from './methods/removeAccents'; +export { default as reorderArray } from './methods/reorderArray'; +export { default as resolve } from './methods/resolve'; +export { default as resolveFieldData } from './methods/resolveFieldData'; +export { default as toFlatCase } from './methods/toFlatCase'; +export { default as toKebabCase } from './methods/toKebabCase'; +export { default as toMs } from './methods/toMs'; diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/contains.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/contains.ts new file mode 100644 index 000000000..90bc89940 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/contains.ts @@ -0,0 +1,17 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/contains.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import equals from './equals'; + +export default function contains(value: T, list: T[]): boolean { + if (value != null && list && list.length) { + for (const val of list) { + if (equals(value, val)) return true; + } + } + + return false; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/deepEquals.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/deepEquals.ts new file mode 100644 index 000000000..2270a728f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/deepEquals.ts @@ -0,0 +1,64 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/deepEquals.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +function _deepEquals(obj1: unknown, obj2: unknown, visited: WeakSet = new WeakSet()): boolean { + // Base case: same object reference + if (obj1 === obj2) return true; + + // If one of them is null or not an object, directly return false + if (!obj1 || !obj2 || typeof obj1 !== 'object' || typeof obj2 !== 'object') return false; + + // Check for circular references + if (visited.has(obj1) || visited.has(obj2)) return false; + + // Add objects to the visited set + visited.add(obj1).add(obj2); + + const arrObj1 = Array.isArray(obj1); + const arrObj2 = Array.isArray(obj2); + let i, length, key; + + if (arrObj1 && arrObj2) { + length = obj1.length; + if (length != obj2.length) return false; + for (i = length; i-- !== 0; ) if (!_deepEquals(obj1[i], obj2[i], visited)) return false; + + return true; + } + + if (arrObj1 != arrObj2) return false; + + const dateObj1 = obj1 instanceof Date, + dateObj2 = obj2 instanceof Date; + + if (dateObj1 != dateObj2) return false; + if (dateObj1 && dateObj2) return obj1.getTime() == obj2.getTime(); + + const regexpObj1 = obj1 instanceof RegExp, + regexpObj2 = obj2 instanceof RegExp; + + if (regexpObj1 != regexpObj2) return false; + if (regexpObj1 && regexpObj2) return obj1.toString() == obj2.toString(); + + const keys = Object.keys(obj1); + + length = keys.length; + + if (length !== Object.keys(obj2).length) return false; + + for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(obj2, keys[i])) return false; + + for (i = length; i-- !== 0; ) { + key = keys[i]; + if (!_deepEquals((obj1 as Record)[key], (obj2 as Record)[key], visited)) return false; + } + + return true; +} + +export default function deepEquals(obj1: unknown, obj2: unknown): boolean { + return _deepEquals(obj1, obj2); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/equals.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/equals.ts new file mode 100644 index 000000000..3d3dbc393 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/equals.ts @@ -0,0 +1,13 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/equals.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import deepEquals from './deepEquals'; +import resolveFieldData from './resolveFieldData'; + +export default function equals(obj1: any, obj2: any, field?: string): boolean { + if (field) return resolveFieldData(obj1, field) === resolveFieldData(obj2, field); + else return deepEquals(obj1, obj2); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/findLastIndex.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/findLastIndex.ts new file mode 100644 index 000000000..9d5b23eb6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/findLastIndex.ts @@ -0,0 +1,25 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/findLastIndex.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isNotEmpty from './isNotEmpty'; + +/** + * Firefox-v103 does not currently support the "findLastIndex" method. It is stated that this method will be supported with Firefox-v104. + * https://caniuse.com/mdn-javascript_builtins_array_findlastindex + */ +export default function findLastIndex(arr: T[], callback: (value: T, index: number, array: T[]) => boolean): number { + let index = -1; + + if (isNotEmpty(arr)) { + try { + index = (arr as any).findLastIndex(callback); + } catch { + index = arr.lastIndexOf([...arr].reverse().find(callback) as T); + } + } + + return index; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/getKeyValue.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/getKeyValue.ts new file mode 100644 index 000000000..09d5c01c4 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/getKeyValue.ts @@ -0,0 +1,26 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/getKeyValue.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isObject from './isObject'; +import resolve from './resolve'; +import toFlatCase from './toFlatCase'; + +export default function getKeyValue>(obj: T | undefined, key: string = '', params: unknown = {}): unknown { + const fKeys = toFlatCase(key).split('.'); + const fKey = fKeys.shift(); + + if (fKey) { + if (isObject(obj)) { + const matchedKey = Object.keys(obj).find((k) => toFlatCase(k) === fKey) || ''; + + return getKeyValue(resolve(obj[matchedKey], params) as Record, fKeys.join('.'), params); + } + + return undefined; + } + + return resolve(obj, params); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isArray.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isArray.ts new file mode 100644 index 000000000..7d60c4f14 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isArray.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/isArray.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isArray(value: any, empty: boolean = true): boolean { + return Array.isArray(value) && (empty || value.length !== 0); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isDate.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isDate.ts new file mode 100644 index 000000000..f498e27fc --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isDate.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/isDate.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isDate(value: unknown): value is Date { + return value instanceof Date; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isEmpty.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isEmpty.ts new file mode 100644 index 000000000..b6c7ffcb7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isEmpty.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/isEmpty.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isEmpty(value: any): boolean { + return value === null || value === undefined || value === '' || (Array.isArray(value) && value.length === 0) || (!(value instanceof Date) && typeof value === 'object' && Object.keys(value).length === 0); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isFunction.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isFunction.ts new file mode 100644 index 000000000..4344cdf37 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isFunction.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/isFunction.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isFunction(value: unknown): value is (...args: unknown[]) => unknown { + return typeof value === 'function' && 'call' in value && 'apply' in value; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isNotEmpty.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isNotEmpty.ts new file mode 100644 index 000000000..53084e559 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isNotEmpty.ts @@ -0,0 +1,11 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/isNotEmpty.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isEmpty from './isEmpty'; + +export default function isNotEmpty(value: any): boolean { + return !isEmpty(value); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isNumber.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isNumber.ts new file mode 100644 index 000000000..b802aac88 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isNumber.ts @@ -0,0 +1,11 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/isNumber.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isNotEmpty from './isNotEmpty'; + +export default function isNumber(value: unknown): boolean { + return isNotEmpty(value) && !isNaN(value as number); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isObject.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isObject.ts new file mode 100644 index 000000000..2127db6b9 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isObject.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/isObject.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isObject(value: unknown, empty: boolean = true): value is object { + return value instanceof Object && value.constructor === Object && (empty || Object.keys(value).length !== 0); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isPrintableCharacter.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isPrintableCharacter.ts new file mode 100644 index 000000000..b120a8e82 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isPrintableCharacter.ts @@ -0,0 +1,11 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/isPrintableCharacter.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isNotEmpty from './isNotEmpty'; + +export default function isPrintableCharacter(char: string = ''): boolean { + return isNotEmpty(char) && char.length === 1 && !!char.match(/\S| /); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isString.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isString.ts new file mode 100644 index 000000000..998f42972 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/isString.ts @@ -0,0 +1,9 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/isString.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function isString(value: unknown, empty: boolean = true): value is string { + return typeof value === 'string' && (empty || value !== ''); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/matchRegex.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/matchRegex.ts new file mode 100644 index 000000000..edee9bd73 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/matchRegex.ts @@ -0,0 +1,17 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/matchRegex.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function matchRegex(str: string, regex?: RegExp): boolean { + if (regex) { + const match = regex.test(str); + + regex.lastIndex = 0; + + return match; + } + + return false; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/minifyCSS.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/minifyCSS.ts new file mode 100644 index 000000000..a3969675e --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/minifyCSS.ts @@ -0,0 +1,18 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/minifyCSS.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function minifyCSS(css?: string): string | undefined { + return css + ? css + .replace(/\/\*(?:(?!\*\/)[\s\S])*\*\/|[\r\n\t]+/g, '') + .replace(/ {2,}/g, ' ') + .replace(/ ([{:}]) /g, '$1') + .replace(/([;,]) /g, '$1') + .replace(/ !/g, '!') + .replace(/: /g, ':') + .trim() + : css; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/removeAccents.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/removeAccents.ts new file mode 100644 index 000000000..369855884 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/removeAccents.ts @@ -0,0 +1,66 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/removeAccents.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function removeAccents(str: string): string { + // Regular expression to check for any accented characters 'Latin-1 Supplement' and 'Latin Extended-A' + const accentCheckRegex = /[\xC0-\xFF\u0100-\u017E]/; + + if (str && accentCheckRegex.test(str)) { + const accentsMap: { [key: string]: RegExp } = { + A: /[\xC0-\xC5\u0100\u0102\u0104]/g, + AE: /[\xC6]/g, + C: /[\xC7\u0106\u0108\u010A\u010C]/g, + D: /[\xD0\u010E\u0110]/g, + E: /[\xC8-\xCB\u0112\u0114\u0116\u0118\u011A]/g, + G: /[\u011C\u011E\u0120\u0122]/g, + H: /[\u0124\u0126]/g, + I: /[\xCC-\xCF\u0128\u012A\u012C\u012E\u0130]/g, + IJ: /[\u0132]/g, + J: /[\u0134]/g, + K: /[\u0136]/g, + L: /[\u0139\u013B\u013D\u013F\u0141]/g, + N: /[\xD1\u0143\u0145\u0147\u014A]/g, + O: /[\xD2-\xD6\xD8\u014C\u014E\u0150]/g, + OE: /[\u0152]/g, + R: /[\u0154\u0156\u0158]/g, + S: /[\u015A\u015C\u015E\u0160]/g, + T: /[\u0162\u0164\u0166]/g, + U: /[\xD9-\xDC\u0168\u016A\u016C\u016E\u0170\u0172]/g, + W: /[\u0174]/g, + Y: /[\xDD\u0176\u0178]/g, + Z: /[\u0179\u017B\u017D]/g, + + a: /[\xE0-\xE5\u0101\u0103\u0105]/g, + ae: /[\xE6]/g, + c: /[\xE7\u0107\u0109\u010B\u010D]/g, + d: /[\u010F\u0111]/g, + e: /[\xE8-\xEB\u0113\u0115\u0117\u0119\u011B]/g, + g: /[\u011D\u011F\u0121\u0123]/g, + i: /[\xEC-\xEF\u0129\u012B\u012D\u012F\u0131]/g, + ij: /[\u0133]/g, + j: /[\u0135]/g, + k: /[\u0137,\u0138]/g, + l: /[\u013A\u013C\u013E\u0140\u0142]/g, + n: /[\xF1\u0144\u0146\u0148\u014B]/g, + p: /[\xFE]/g, + o: /[\xF2-\xF6\xF8\u014D\u014F\u0151]/g, + oe: /[\u0153]/g, + r: /[\u0155\u0157\u0159]/g, + s: /[\u015B\u015D\u015F\u0161]/g, + t: /[\u0163\u0165\u0167]/g, + u: /[\xF9-\xFC\u0169\u016B\u016D\u016F\u0171\u0173]/g, + w: /[\u0175]/g, + y: /[\xFD\xFF\u0177]/g, + z: /[\u017A\u017C\u017E]/g + }; + + for (const key in accentsMap) { + str = str.replace(accentsMap[key], key); + } + } + + return str; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/reorderArray.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/reorderArray.ts new file mode 100644 index 000000000..7e7cef47f --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/reorderArray.ts @@ -0,0 +1,16 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/reorderArray.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function reorderArray(value: T[], from: number, to: number): void { + if (value && from !== to) { + if (to >= value.length) { + to %= value.length; + from %= value.length; + } + + value.splice(to, 0, value.splice(from, 1)[0]); + } +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/resolve.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/resolve.ts new file mode 100644 index 000000000..9c4d983e6 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/resolve.ts @@ -0,0 +1,11 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/resolve.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isFunction from './isFunction'; + +export default function resolve(obj: T | ((...params: P) => R), ...params: P): T | R { + return isFunction(obj) ? (obj as (...params: P) => R)(...params) : (obj as T); +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/resolveFieldData.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/resolveFieldData.ts new file mode 100644 index 000000000..1cc881ebe --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/resolveFieldData.ts @@ -0,0 +1,47 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/resolveFieldData.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isFunction from './isFunction'; +import isNotEmpty from './isNotEmpty'; + +export default function resolveFieldData(data: any, field: any): any { + if (!data || !field) { + // short circuit if there is nothing to resolve + return null; + } + + try { + const value = data[field]; + + if (isNotEmpty(value)) return value; + } catch { + // Performance optimization: https://github.com/primefaces/primereact/issues/4797 + // do nothing and continue to other methods to resolve field data + } + + if (Object.keys(data).length) { + if (isFunction(field)) { + return field(data); + } else if (field.indexOf('.') === -1) { + return data[field]; + } else { + const fields = field.split('.'); + let value = data; + + for (let i = 0, len = fields.length; i < len; ++i) { + if (value == null) { + return null; + } + + value = value[fields[i]]; + } + + return value; + } + } + + return null; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/toFlatCase.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/toFlatCase.ts new file mode 100644 index 000000000..67fdd285a --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/toFlatCase.ts @@ -0,0 +1,12 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/toFlatCase.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isString from './isString'; + +export default function toFlatCase(str: string): string { + // convert snake, kebab, camel and pascal cases to flat case + return isString(str) ? str.replace(/(-|_)/g, '').toLowerCase() : str; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/toKebabCase.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/toKebabCase.ts new file mode 100644 index 000000000..7821282d7 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/toKebabCase.ts @@ -0,0 +1,17 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/toKebabCase.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +import isString from './isString'; + +export default function toKebabCase(str: string): string { + // convert snake, camel and pascal cases to kebab case + return isString(str) + ? str + .replace(/(_)/g, '-') + .replace(/([a-z])([A-Z])/g, '$1-$2') + .toLowerCase() + : str; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/toMs.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/toMs.ts new file mode 100644 index 000000000..d87099ba8 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/object/methods/toMs.ts @@ -0,0 +1,13 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/object/methods/toMs.ts + * Modified: import paths rewritten to resolve locally. See ../../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +export default function toMs(value: string | number): number { + if (value === 'auto') return 0; + + if (typeof value === 'number') return value; + + return Number(value.replace(/[^\d.]/g, '').replace(',', '.')) * 1000; +} diff --git a/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/uuid/index.ts b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/uuid/index.ts new file mode 100644 index 000000000..0de9ecb12 --- /dev/null +++ b/projects/cps-ui-kit/src/lib/primeuix-temp/utils/src/uuid/index.ts @@ -0,0 +1,17 @@ +/** + * Vendored from primeuix (https://github.com/primefaces/primeuix, commit b9467bc448d35738d4f651dbc3caa4d4cb9a6a96). + * Original file: packages/utils/src/uuid/index.ts + * Modified: import paths rewritten to resolve locally. See ../../../NOTICE.md. + * Original license: MIT, Copyright (c) 2025 PrimeTek. + */ +const lastIds: { [key: string]: number } = {}; + +export function uuid(prefix: string = 'pui_id_'): string { + if (!Object.hasOwn(lastIds, prefix)) { + lastIds[prefix] = 0; + } + + lastIds[prefix]++; + + return `${prefix}${lastIds[prefix]}`; +} diff --git a/projects/cps-ui-kit/src/lib/services/cps-dialog/cps-dialog.service.spec.ts b/projects/cps-ui-kit/src/lib/services/cps-dialog/cps-dialog.service.spec.ts index 18730321c..ce70c876b 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-dialog/cps-dialog.service.spec.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-dialog/cps-dialog.service.spec.ts @@ -1,4 +1,5 @@ import { + ChangeDetectionStrategy, ApplicationRef, Component, EnvironmentInjector, @@ -8,11 +9,14 @@ import { TestBed } from '@angular/core/testing'; import { provideNoopAnimations } from '@angular/platform-browser/animations'; import { Subject } from 'rxjs'; import { CpsDialogService } from './cps-dialog.service'; -import { CpsDialogConfig } from './utils/cps-dialog-config'; +import type { CpsDialogConfig } from './utils/cps-dialog-config'; import { CpsDialogRef } from './utils/cps-dialog-ref/cps-dialog-ref'; import { CpsConfirmationComponent } from './internal/components/cps-confirmation/cps-confirmation.component'; -@Component({ template: '' }) +@Component({ + changeDetection: ChangeDetectionStrategy.Eager, + template: '' +}) class TestContentComponent {} function makeMockDialogComponentInstance() { @@ -127,24 +131,24 @@ describe('CpsDialogService', () => { describe('open()', () => { it('should return a CpsDialogRef', () => { - const ref = service.open(TestContentComponent, new CpsDialogConfig()); + const ref = service.open(TestContentComponent, {}); expect(ref).toBeInstanceOf(CpsDialogRef); }); it('should add the ref to openDialogs', () => { - service.open(TestContentComponent, new CpsDialogConfig()); + service.open(TestContentComponent, {}); expect(service.openDialogs).toHaveLength(1); }); it('should set childComponentType on the dialog instance', () => { - service.open(TestContentComponent, new CpsDialogConfig()); + service.open(TestContentComponent, {}); expect(lastCreatedMockRef.instance.childComponentType).toBe( TestContentComponent ); }); it('should call ApplicationRef.attachView with the component host view', () => { - service.open(TestContentComponent, new CpsDialogConfig()); + service.open(TestContentComponent, {}); expect(appRef.attachView).toHaveBeenCalledWith( lastCreatedMockRef.hostView ); @@ -152,18 +156,18 @@ describe('CpsDialogService', () => { it('should append a DOM element to document.body', () => { const beforeCount = document.body.children.length; - service.open(TestContentComponent, new CpsDialogConfig()); + service.open(TestContentComponent, {}); expect(document.body.children.length).toBe(beforeCount + 1); }); it('should store the component ref in dialogComponentRefMap', () => { - const ref = service.open(TestContentComponent, new CpsDialogConfig()); + const ref = service.open(TestContentComponent, {}); expect(service.dialogComponentRefMap.get(ref)).toBe(lastCreatedMockRef); }); it('should open multiple dialogs independently', () => { - service.open(TestContentComponent, new CpsDialogConfig()); - service.open(TestContentComponent, new CpsDialogConfig()); + service.open(TestContentComponent, {}); + service.open(TestContentComponent, {}); expect(service.openDialogs).toHaveLength(2); }); @@ -172,7 +176,7 @@ describe('CpsDialogService', () => { CpsDialogRef.prototype, '_setContainerInstance' ); - service.open(TestContentComponent, new CpsDialogConfig()); + service.open(TestContentComponent, {}); expect(spySet).toHaveBeenCalledWith(lastCreatedMockRef.instance); }); @@ -180,85 +184,83 @@ describe('CpsDialogService', () => { jest .spyOn(service as any, 'appendDialogComponentToBody') .mockImplementation(() => new CpsDialogRef()); - expect(() => - service.open(TestContentComponent, new CpsDialogConfig()) - ).not.toThrow(); + expect(() => service.open(TestContentComponent, {})).not.toThrow(); }); }); describe('openConfirmationDialog()', () => { it('should return a CpsDialogRef', () => { - const ref = service.openConfirmationDialog(new CpsDialogConfig()); + const ref = service.openConfirmationDialog({}); expect(ref).toBeInstanceOf(CpsDialogRef); }); it('should set default headerTitle when not provided', () => { - const config = new CpsDialogConfig(); + const config: CpsDialogConfig = {}; service.openConfirmationDialog(config); expect(config.headerTitle).toBe('Confirm the action'); }); it('should not override headerTitle when already set', () => { - const config = new CpsDialogConfig(); + const config: CpsDialogConfig = {}; config.headerTitle = 'Custom Title'; service.openConfirmationDialog(config); expect(config.headerTitle).toBe('Custom Title'); }); it('should set default headerIcon to "warning"', () => { - const config = new CpsDialogConfig(); + const config: CpsDialogConfig = {}; service.openConfirmationDialog(config); expect(config.headerIcon).toBe('warning'); }); it('should not override headerIcon when already set', () => { - const config = new CpsDialogConfig(); - config.headerIcon = 'info'; + const config: CpsDialogConfig = {}; + config.headerIcon = 'info-circle'; service.openConfirmationDialog(config); - expect(config.headerIcon).toBe('info'); + expect(config.headerIcon).toBe('info-circle'); }); it('should set default headerIconColor to "calm"', () => { - const config = new CpsDialogConfig(); + const config: CpsDialogConfig = {}; service.openConfirmationDialog(config); expect(config.headerIconColor).toBe('calm'); }); it('should not override headerIconColor when already set', () => { - const config = new CpsDialogConfig(); + const config: CpsDialogConfig = {}; config.headerIconColor = 'warn'; service.openConfirmationDialog(config); expect(config.headerIconColor).toBe('warn'); }); it('should set default minWidth to "25rem"', () => { - const config = new CpsDialogConfig(); + const config: CpsDialogConfig = {}; service.openConfirmationDialog(config); expect(config.minWidth).toBe('25rem'); }); it('should not override minWidth when already set', () => { - const config = new CpsDialogConfig(); + const config: CpsDialogConfig = {}; config.minWidth = '30rem'; service.openConfirmationDialog(config); expect(config.minWidth).toBe('30rem'); }); it('should set default maxWidth to "37.5rem"', () => { - const config = new CpsDialogConfig(); + const config: CpsDialogConfig = {}; service.openConfirmationDialog(config); expect(config.maxWidth).toBe('37.5rem'); }); it('should not override maxWidth when already set', () => { - const config = new CpsDialogConfig(); + const config: CpsDialogConfig = {}; config.maxWidth = '50rem'; service.openConfirmationDialog(config); expect(config.maxWidth).toBe('50rem'); }); it('should set childComponentType to CpsConfirmationComponent', () => { - service.openConfirmationDialog(new CpsDialogConfig()); + service.openConfirmationDialog({}); expect(lastCreatedMockRef.instance.childComponentType).toBe( CpsConfirmationComponent ); @@ -268,21 +270,19 @@ describe('CpsDialogService', () => { jest .spyOn(service as any, 'appendDialogComponentToBody') .mockImplementation(() => new CpsDialogRef()); - expect(() => - service.openConfirmationDialog(new CpsDialogConfig()) - ).not.toThrow(); + expect(() => service.openConfirmationDialog({})).not.toThrow(); }); it('should add the ref to openDialogs', () => { - service.openConfirmationDialog(new CpsDialogConfig()); + service.openConfirmationDialog({}); expect(service.openDialogs).toHaveLength(1); }); }); describe('closeAll()', () => { it('should call close() on each open dialog', () => { - const ref1 = service.open(TestContentComponent, new CpsDialogConfig()); - const ref2 = service.open(TestContentComponent, new CpsDialogConfig()); + const ref1 = service.open(TestContentComponent, {}); + const ref2 = service.open(TestContentComponent, {}); const closeSpy1 = jest.spyOn(ref1, 'close'); const closeSpy2 = jest.spyOn(ref2, 'close'); service.closeAll(); @@ -292,8 +292,8 @@ describe('CpsDialogService', () => { it('should call close() in reverse order', () => { const order: number[] = []; - const ref1 = service.open(TestContentComponent, new CpsDialogConfig()); - const ref2 = service.open(TestContentComponent, new CpsDialogConfig()); + const ref1 = service.open(TestContentComponent, {}); + const ref2 = service.open(TestContentComponent, {}); jest.spyOn(ref1, 'close').mockImplementation(() => order.push(1)); jest.spyOn(ref2, 'close').mockImplementation(() => order.push(2)); service.closeAll(); @@ -301,8 +301,8 @@ describe('CpsDialogService', () => { }); it('should call destroy() instead of close() when force is true', () => { - const ref1 = service.open(TestContentComponent, new CpsDialogConfig()); - const ref2 = service.open(TestContentComponent, new CpsDialogConfig()); + const ref1 = service.open(TestContentComponent, {}); + const ref2 = service.open(TestContentComponent, {}); const destroySpy1 = jest .spyOn(ref1, 'destroy') .mockImplementation(jest.fn()); @@ -325,28 +325,28 @@ describe('CpsDialogService', () => { describe('dialog cleanup on destroy signal', () => { it('should remove ref from openDialogs when onDestroy fires', () => { - const ref = service.open(TestContentComponent, new CpsDialogConfig()); + const ref = service.open(TestContentComponent, {}); expect(service.openDialogs).toHaveLength(1); ref.destroy(); expect(service.openDialogs).toHaveLength(0); }); it('should remove entry from dialogComponentRefMap when onDestroy fires', () => { - const ref = service.open(TestContentComponent, new CpsDialogConfig()); + const ref = service.open(TestContentComponent, {}); expect(service.dialogComponentRefMap.has(ref)).toBe(true); ref.destroy(); expect(service.dialogComponentRefMap.has(ref)).toBe(false); }); it('should call detachView on ApplicationRef when onDestroy fires', () => { - service.open(TestContentComponent, new CpsDialogConfig()); + service.open(TestContentComponent, {}); const capturedRef = lastCreatedMockRef; service.openDialogs[0].destroy(); expect(appRef.detachView).toHaveBeenCalledWith(capturedRef.hostView); }); it('should call destroy on the component ref when onDestroy fires', () => { - service.open(TestContentComponent, new CpsDialogConfig()); + service.open(TestContentComponent, {}); const capturedRef = lastCreatedMockRef; service.openDialogs[0].destroy(); expect(capturedRef.destroy).toHaveBeenCalled(); @@ -358,14 +358,14 @@ describe('CpsDialogService', () => { }); it('should only remove the destroyed ref from openDialogs', () => { - const ref1 = service.open(TestContentComponent, new CpsDialogConfig()); - service.open(TestContentComponent, new CpsDialogConfig()); + const ref1 = service.open(TestContentComponent, {}); + service.open(TestContentComponent, {}); ref1.destroy(); expect(service.openDialogs).toHaveLength(1); }); it('should not throw when the ref is registered in the map but already absent from openDialogs', () => { - const ref = service.open(TestContentComponent, new CpsDialogConfig()); + const ref = service.open(TestContentComponent, {}); service.openDialogs.length = 0; expect(() => (service as any).removeDialogComponentFromBody(ref) @@ -376,7 +376,7 @@ describe('CpsDialogService', () => { describe('onClose subscription', () => { it('should call close() on the dialog component instance when dialogRef.close() is called', () => { - const ref = service.open(TestContentComponent, new CpsDialogConfig()); + const ref = service.open(TestContentComponent, {}); const capturedRef = lastCreatedMockRef; ref.close(); expect(capturedRef.instance.close).toHaveBeenCalled(); @@ -407,10 +407,9 @@ describe('CpsDialogService', () => { it('should create and attach a real CpsDialogComponent to document.body', () => { const beforeCount = document.body.children.length; - const ref = realService.open( - TestContentComponent, - Object.assign(new CpsDialogConfig(), { headerTitle: 'Test' }) - ); + const ref = realService.open(TestContentComponent, { + headerTitle: 'Test' + }); realAppRef.tick(); expect(document.body.children.length).toBeGreaterThan(beforeCount); @@ -419,10 +418,9 @@ describe('CpsDialogService', () => { }); it('should remove the DOM element and map entry when the ref is destroyed', () => { - const ref = realService.open( - TestContentComponent, - Object.assign(new CpsDialogConfig(), { headerTitle: 'Test' }) - ); + const ref = realService.open(TestContentComponent, { + headerTitle: 'Test' + }); realAppRef.tick(); expect(realService.dialogComponentRefMap.has(ref)).toBe(true); const domElem = document.body.querySelector('.cps-dialog'); @@ -444,10 +442,9 @@ describe('CpsDialogService', () => { }); it('should be a no-op to call removeDialogComponentFromBody twice for the same ref', () => { - const ref = realService.open( - TestContentComponent, - Object.assign(new CpsDialogConfig(), { headerTitle: 'Test' }) - ); + const ref = realService.open(TestContentComponent, { + headerTitle: 'Test' + }); realAppRef.tick(); ref.destroy(); expect(() => @@ -456,10 +453,9 @@ describe('CpsDialogService', () => { }); it('should close the real dialog component instance when the ref is closed', () => { - const ref = realService.open( - TestContentComponent, - Object.assign(new CpsDialogConfig(), { headerTitle: 'Test' }) - ); + const ref = realService.open(TestContentComponent, { + headerTitle: 'Test' + }); realAppRef.tick(); const instance = realService.dialogComponentRefMap.get(ref)?.instance; expect(instance?.visible).toBe(true); @@ -480,10 +476,9 @@ describe('CpsDialogService', () => { undefined as unknown as CpsDialogService ); - const ref = sameInjectorService.open( - TestContentComponent, - Object.assign(new CpsDialogConfig(), { headerTitle: 'Test' }) - ); + const ref = sameInjectorService.open(TestContentComponent, { + headerTitle: 'Test' + }); realAppRef.tick(); expect(sameInjectorService.dialogComponentRefMap.has(ref)).toBe(true); @@ -493,8 +488,8 @@ describe('CpsDialogService', () => { describe('ngOnDestroy()', () => { it('should destroy all dialogs at this level', () => { - const ref1 = service.open(TestContentComponent, new CpsDialogConfig()); - const ref2 = service.open(TestContentComponent, new CpsDialogConfig()); + const ref1 = service.open(TestContentComponent, {}); + const ref2 = service.open(TestContentComponent, {}); const destroySpy1 = jest .spyOn(ref1, 'destroy') .mockImplementation(jest.fn()); @@ -508,8 +503,8 @@ describe('CpsDialogService', () => { it('should destroy dialogs in reverse order', () => { const order: number[] = []; - const ref1 = service.open(TestContentComponent, new CpsDialogConfig()); - const ref2 = service.open(TestContentComponent, new CpsDialogConfig()); + const ref1 = service.open(TestContentComponent, {}); + const ref2 = service.open(TestContentComponent, {}); jest.spyOn(ref1, 'destroy').mockImplementation(() => order.push(1)); jest.spyOn(ref2, 'destroy').mockImplementation(() => order.push(2)); service.ngOnDestroy(); diff --git a/projects/cps-ui-kit/src/lib/services/cps-dialog/cps-dialog.service.ts b/projects/cps-ui-kit/src/lib/services/cps-dialog/cps-dialog.service.ts index 4cc284f83..87b66430a 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-dialog/cps-dialog.service.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-dialog/cps-dialog.service.ts @@ -15,7 +15,10 @@ import { } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { CpsDialogRef } from './utils/cps-dialog-ref/cps-dialog-ref'; -import { CpsDialogConfig } from './utils/cps-dialog-config'; +import { + CPS_DIALOG_CONFIG, + type CpsDialogConfig +} from './utils/cps-dialog-config'; import { CpsDialogComponent } from './internal/components/cps-dialog/cps-dialog.component'; import { CpsConfirmationComponent } from './internal/components/cps-confirmation/cps-confirmation.component'; @@ -112,7 +115,7 @@ export class CpsDialogService implements OnDestroy { const componentRef = createComponent(CpsDialogComponent, { environmentInjector: createEnvironmentInjector( [ - { provide: CpsDialogConfig, useValue: config }, + { provide: CPS_DIALOG_CONFIG, useValue: config }, { provide: CpsDialogRef, useValue: dialogRef } ], this._environmentInjector diff --git a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.spec.ts b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.spec.ts index 144b873c1..1cc2e24ea 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.spec.ts @@ -1,7 +1,10 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { CpsConfirmationComponent } from './cps-confirmation.component'; import { CpsDialogRef } from '../../../utils/cps-dialog-ref/cps-dialog-ref'; -import { CpsDialogConfig } from '../../../utils/cps-dialog-config'; +import { + CPS_DIALOG_CONFIG, + type CpsDialogConfig +} from '../../../utils/cps-dialog-config'; describe('CpsConfirmationComponent', () => { let component: CpsConfirmationComponent; @@ -17,7 +20,7 @@ describe('CpsConfirmationComponent', () => { imports: [CpsConfirmationComponent], providers: [ { provide: CpsDialogRef, useValue: mockDialogRef }, - { provide: CpsDialogConfig, useValue: mockDialogConfig } + { provide: CPS_DIALOG_CONFIG, useValue: mockDialogConfig } ] }); diff --git a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.ts b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.ts index 639580e83..aa0754c8a 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.ts @@ -1,12 +1,16 @@ -import { Component } from '@angular/core'; +import { Component, Inject, ChangeDetectionStrategy } from '@angular/core'; import { CpsButtonComponent } from '../../../../../components/cps-button/cps-button.component'; import { CpsDialogRef } from '../../../utils/cps-dialog-ref/cps-dialog-ref'; -import { CpsDialogConfig } from '../../../utils/cps-dialog-config'; +import { + CPS_DIALOG_CONFIG, + CpsDialogConfig +} from '../../../utils/cps-dialog-config'; @Component({ imports: [CpsButtonComponent], selector: 'cps-confirmation', templateUrl: './cps-confirmation.component.html', + changeDetection: ChangeDetectionStrategy.Eager, styleUrls: ['./cps-confirmation.component.scss'] }) export class CpsConfirmationComponent { @@ -14,7 +18,7 @@ export class CpsConfirmationComponent { constructor( private _dialogRef: CpsDialogRef, - private _config: CpsDialogConfig + @Inject(CPS_DIALOG_CONFIG) private _config: CpsDialogConfig ) { this.subtitle = this._config.data?.subtitle; } diff --git a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.scss b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.scss index c95a814b1..3631073dc 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.scss +++ b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.scss @@ -112,6 +112,7 @@ $animation-duration: 150ms; .cps-dialog { .cps-dialog-header { overflow: hidden; + box-sizing: border-box; border-bottom: 0 none; background: #ffffff; color: var(--cps-color-text-dark); diff --git a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.spec.ts b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.spec.ts index 726d224d8..0b58dd832 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.spec.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ComponentFixture, TestBed, @@ -6,15 +6,21 @@ import { tick } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { PrimeNG } from 'primeng/config'; -import { DomHandler } from 'primeng/dom'; -import { ZIndexUtils } from 'primeng/utils'; +import { PrimeNG } from '../../../../../primeng-temp/config/public_api'; +import { DomHandler } from '../../../../../primeng-temp/dom/public_api'; +import { ZIndexUtils } from '../../../../../primeng-temp/utils/public_api'; import { CpsDialogComponent } from './cps-dialog.component'; -import { CpsDialogConfig } from '../../../utils/cps-dialog-config'; +import { + CPS_DIALOG_CONFIG, + type CpsDialogConfig +} from '../../../utils/cps-dialog-config'; import { CpsDialogRef } from '../../../utils/cps-dialog-ref/cps-dialog-ref'; import { CPS_ROOT_FONT_SIZE_SERVICE } from '../../../../cps-root-font-size/cps-root-font-size.service'; -@Component({ template: '' }) +@Component({ + changeDetection: ChangeDetectionStrategy.Eager, + template: '' +}) class TestChildComponent {} const mockRootFontSizeService = { @@ -44,13 +50,13 @@ describe('CpsDialogComponent', () => { componentInstance: null }; - config = Object.assign(new CpsDialogConfig(), configOverrides); + config = { ...configOverrides }; TestBed.configureTestingModule({ imports: [CpsDialogComponent, NoopAnimationsModule], providers: [ { provide: CpsDialogRef, useValue: mockDialogRef }, - { provide: CpsDialogConfig, useValue: config }, + { provide: CPS_DIALOG_CONFIG, useValue: config }, { provide: CPS_ROOT_FONT_SIZE_SERVICE, useValue: mockRootFontSizeService diff --git a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.ts b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.ts index 1f76cbfbc..e0bb49319 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.ts @@ -28,16 +28,19 @@ import { ViewEncapsulation, ViewRef } from '@angular/core'; -import { SharedModule } from 'primeng/api'; -import { DomHandler } from 'primeng/dom'; -import { ZIndexUtils } from 'primeng/utils'; -import { PrimeNG } from 'primeng/config'; +import { SharedModule } from '../../../../../primeng-temp/api/public_api'; +import { DomHandler } from '../../../../../primeng-temp/dom/public_api'; +import { ZIndexUtils } from '../../../../../primeng-temp/utils/public_api'; +import { PrimeNG } from '../../../../../primeng-temp/config/public_api'; import { convertSize, parseSize } from '../../../../../utils/internal/size-utils/size-utils'; import { CpsDialogContentDirective } from '../../directives/cps-dialog-content.directive'; -import { CpsDialogConfig } from '../../../utils/cps-dialog-config'; +import { + CPS_DIALOG_CONFIG, + CpsDialogConfig +} from '../../../utils/cps-dialog-config'; import { CpsDialogRef } from '../../../utils/cps-dialog-ref/cps-dialog-ref'; import { CpsButtonComponent } from '../../../../../components/cps-button/cps-button.component'; import { CpsInfoCircleComponent } from '../../../../../components/cps-info-circle/cps-info-circle.component'; @@ -81,7 +84,7 @@ const MIN_DRAG_VISIBLE_REM = 3; transition('visible => void', [useAnimation(hideAnimation)]) ]) ], - changeDetection: ChangeDetectionStrategy.Default, + changeDetection: ChangeDetectionStrategy.Eager, encapsulation: ViewEncapsulation.None }) export class CpsDialogComponent implements OnInit, AfterViewInit, OnDestroy { @@ -239,7 +242,7 @@ export class CpsDialogComponent implements OnInit, AfterViewInit, OnDestroy { private _dialogRef: CpsDialogRef, private _cdRef: ChangeDetectorRef, public renderer: Renderer2, - public config: CpsDialogConfig, + @Inject(CPS_DIALOG_CONFIG) public config: CpsDialogConfig, public zone: NgZone, public primeNG: PrimeNG ) {} diff --git a/projects/cps-ui-kit/src/lib/services/cps-dialog/utils/cps-dialog-config.ts b/projects/cps-ui-kit/src/lib/services/cps-dialog/utils/cps-dialog-config.ts index 3640c6e95..e8da5f066 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-dialog/utils/cps-dialog-config.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-dialog/utils/cps-dialog-config.ts @@ -1,4 +1,6 @@ -import { CpsTooltipPosition } from '../../../directives/cps-tooltip/cps-tooltip.directive'; +import { InjectionToken } from '@angular/core'; +import type { CpsTooltipPosition } from '../../../directives/cps-tooltip/cps-tooltip.directive'; +import type { CpsIconType } from '../../../components/cps-icon/cps-icon.component'; /** * Defines the auto-focus target when the dialog opens. @@ -12,7 +14,7 @@ export type CpsDialogAutoFocusTarget = 'dialog' | 'first-tabbable'; * Configuration for the dialog service. * @group Interface */ -export class CpsDialogConfig { +export interface CpsDialogConfig { /** * An object to pass to the component loaded inside the Dialog. */ @@ -36,7 +38,7 @@ export class CpsDialogConfig { /** * Header icon. */ - headerIcon?: string; + headerIcon?: CpsIconType; /** * Header icon color. */ @@ -190,3 +192,24 @@ export class CpsDialogConfig { | 'bottom-left' | 'bottom-right'; } + +/** + * Injection token used to provide/inject a {@link CpsDialogConfig} value. + * + * There is no default — it is provided per-dialog-instance by + * `CpsDialogService`, so it should only be injected from within a + * dialog's component tree. + * + * @example + * ```ts + * providers: [{ provide: CPS_DIALOG_CONFIG, useValue: myConfig }] + * ``` + * ```ts + * constructor(@Inject(CPS_DIALOG_CONFIG) private config: CpsDialogConfig) {} + * ``` + * + * @group Tokens + */ +export const CPS_DIALOG_CONFIG = new InjectionToken( + 'CPS_DIALOG_CONFIG' +); diff --git a/projects/cps-ui-kit/src/lib/services/cps-dialog/utils/cps-dialog-ref/cps-dialog-ref.ts b/projects/cps-ui-kit/src/lib/services/cps-dialog/utils/cps-dialog-ref/cps-dialog-ref.ts index ecb7ab57b..af54f519b 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-dialog/utils/cps-dialog-ref/cps-dialog-ref.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-dialog/utils/cps-dialog-ref/cps-dialog-ref.ts @@ -1,5 +1,5 @@ import { Observable, Subject, take } from 'rxjs'; -import { CpsDialogComponent } from '../../internal/components/cps-dialog/cps-dialog.component'; +import type { CpsDialogComponent } from '../../internal/components/cps-dialog/cps-dialog.component'; /** * Reference to an opened dialog, returned by CpsDialogService.open() and CpsDialogService.openConfirmationDialog(). diff --git a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.spec.ts b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.spec.ts index bf1a39fcd..fa21c7535 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { PrimeNG } from 'primeng/config'; -import { ZIndexUtils } from 'primeng/utils'; +import { PrimeNG } from '../../../../../primeng-temp/config/public_api'; +import { ZIndexUtils } from '../../../../../primeng-temp/utils/public_api'; import { CpsNotificationContainerComponent } from './cps-notification-container.component'; import { CpsNotificationAppearance, diff --git a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.ts b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.ts index ed6979c6e..7f05cc9f6 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.ts @@ -9,10 +9,11 @@ import { OnDestroy, Output, ViewChild, - ViewEncapsulation + ViewEncapsulation, + ChangeDetectionStrategy } from '@angular/core'; -import { SharedModule } from 'primeng/api'; -import { ZIndexUtils } from 'primeng/utils'; +import { SharedModule } from '../../../../../primeng-temp/api/public_api'; +import { ZIndexUtils } from '../../../../../primeng-temp/utils/public_api'; import { type CpsNotificationConfig, CpsNotificationPosition @@ -20,7 +21,7 @@ import { import type { CpsNotificationData } from '../../../utils/internal/cps-notification-data'; import { CpsToastComponent } from '../cps-toast/cps-toast.component'; import { animateChild, query, transition, trigger } from '@angular/animations'; -import { PrimeNG } from 'primeng/config'; +import { PrimeNG } from '../../../../../primeng-temp/config/public_api'; type Nullable = T | null | undefined; @@ -30,6 +31,7 @@ type Nullable = T | null | undefined; templateUrl: './cps-notification-container.component.html', styleUrls: ['./cps-notification-container.component.scss'], encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.Eager, animations: [ trigger('notificationAnimation', [ transition(':enter, :leave', [query('@*', animateChild())]) diff --git a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.html b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.html index d195433a3..4ec7d9b7f 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.html +++ b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.html @@ -27,7 +27,7 @@ [class.filled]="filled" aria-hidden="true"> diff --git a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.spec.ts b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.spec.ts index e53b426e4..25ee26320 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.spec.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.spec.ts @@ -144,6 +144,31 @@ describe('CpsToastComponent', () => { expect(component.color).toBe(CpsNotificationType.ERROR); }); + it('should set icon to "toast-info" for INFO type', () => { + setup(defaultConfig, { type: CpsNotificationType.INFO }); + expect(component.icon).toBe('toast-info'); + }); + + it('should set icon to "toast-success" for SUCCESS type', () => { + setup(defaultConfig, { type: CpsNotificationType.SUCCESS }); + expect(component.icon).toBe('toast-success'); + }); + + it('should set icon to "toast-warning" for WARNING type', () => { + setup(defaultConfig, { type: CpsNotificationType.WARNING }); + expect(component.icon).toBe('toast-warning'); + }); + + it('should set icon to "toast-error" for ERROR type', () => { + setup(defaultConfig, { type: CpsNotificationType.ERROR }); + expect(component.icon).toBe('toast-error'); + }); + + it('should default icon to "toast-error" when data has no type', () => { + setup(defaultConfig, {}); + expect(component.icon).toBe('toast-error'); + }); + it('should set maxWidth when config.maxWidth is provided', () => { setup({ ...defaultConfig, maxWidth: '400px' }); expect(component.maxWidth).toBeTruthy(); diff --git a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.ts b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.ts index 7861666ba..445abdd95 100644 --- a/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.ts +++ b/projects/cps-ui-kit/src/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.ts @@ -7,10 +7,14 @@ import { NgZone, OnDestroy, OnInit, - Output + Output, + ChangeDetectionStrategy } from '@angular/core'; import { CpsButtonComponent } from '../../../../../components/cps-button/cps-button.component'; -import { CpsIconComponent } from '../../../../../components/cps-icon/cps-icon.component'; +import { + CpsIconComponent, + type CpsIconType +} from '../../../../../components/cps-icon/cps-icon.component'; import { convertSize } from '../../../../../utils/internal/size-utils/size-utils'; import { CpsNotificationAppearance, @@ -37,6 +41,7 @@ import { selector: 'cps-toast', templateUrl: './cps-toast.component.html', styleUrls: ['./cps-toast.component.scss'], + changeDetection: ChangeDetectionStrategy.Eager, animations: [ trigger('toastState', [ state( @@ -82,22 +87,25 @@ export class CpsToastComponent implements OnInit, AfterViewInit, OnDestroy { */ @Output() closed = new EventEmitter(); - timeout: any; + timeout: ReturnType | null = null; maxWidth: string | undefined; filled = true; color = ''; + icon: CpsIconType = 'toast-error'; srAnnouncement = ''; + private readonly _zone = inject(NgZone); + get isPolite(): boolean { - if (this.data?.type === CpsNotificationType.ERROR) - return !!this.config?.politeError; - if (this.data?.type === CpsNotificationType.WARNING) - return !!this.config?.politeWarning; + if (this.data.type === CpsNotificationType.ERROR) + return !!this.config.politeError; + if (this.data.type === CpsNotificationType.WARNING) + return !!this.config.politeWarning; return true; } get closeAriaLabel(): string { - const type = this.data?.type; + const type = this.data.type; return `Close ${type ? type + ' ' : ''}notification`; } @@ -109,23 +117,29 @@ export class CpsToastComponent implements OnInit, AfterViewInit, OnDestroy { return prefersReducedMotion() ? REDUCED_MOTION_DURATION : '200ms ease-in'; } - private readonly _zone = inject(NgZone); - ngOnInit(): void { - this.maxWidth = convertSize(this.config?.maxWidth || ''); - this.filled = this.config?.appearance === CpsNotificationAppearance.FILLED; + this.maxWidth = convertSize(this.config.maxWidth || ''); + this.filled = this.config.appearance === CpsNotificationAppearance.FILLED; this.color = - this.data?.type === CpsNotificationType.WARNING + this.data.type === CpsNotificationType.WARNING ? 'warn' - : this.data?.type || CpsNotificationType.ERROR; + : this.data.type || CpsNotificationType.ERROR; + this.icon = ( + { + [CpsNotificationType.ERROR]: 'toast-error', + [CpsNotificationType.WARNING]: 'toast-warning', + [CpsNotificationType.INFO]: 'toast-info', + [CpsNotificationType.SUCCESS]: 'toast-success' + } as const + )[this.data.type ?? CpsNotificationType.ERROR]; } ngAfterViewInit(): void { this.initiateTimeout(); setTimeout(() => { - const type = this.data?.type; - const details = this.data?.details; - this.srAnnouncement = `${type ? type + ': ' : ''}${this.data?.message ?? ''}${details ? '. ' + details : ''}`; + const type = this.data.type; + const details = this.data.details; + this.srAnnouncement = `${type ? type + ': ' : ''}${this.data.message ?? ''}${details ? '. ' + details : ''}`; }); } @@ -139,11 +153,11 @@ export class CpsToastComponent implements OnInit, AfterViewInit, OnDestroy { } initiateTimeout() { - if (this.config?.timeout === 0) return; + if (this.config.timeout === 0) return; this._zone.runOutsideAngular(() => { this.timeout = setTimeout(() => { this.close(); - }, this.config?.timeout || 5000); + }, this.config.timeout || 5000); }); } diff --git a/projects/cps-ui-kit/styles/styles.scss b/projects/cps-ui-kit/styles/styles.scss index 13e15d1bb..e352a5ad7 100644 --- a/projects/cps-ui-kit/styles/styles.scss +++ b/projects/cps-ui-kit/styles/styles.scss @@ -3,13 +3,6 @@ @use './_colors-dark.scss'; @use './_fonts.scss'; @use './_cps-tooltip-style.scss'; -@use 'primeicons/primeicons.css'; - -*, -*::before, -*::after { - box-sizing: border-box; -} // See https://github.com/primefaces/primeng/issues/17437 .p-scrollbar-measure { diff --git a/projects/cps-ui-kit/tsconfig.lib.json b/projects/cps-ui-kit/tsconfig.lib.json index ee824f033..8ec53dc22 100644 --- a/projects/cps-ui-kit/tsconfig.lib.json +++ b/projects/cps-ui-kit/tsconfig.lib.json @@ -9,5 +9,13 @@ "inlineSources": true, "types": [] }, - "exclude": ["**/*.spec.ts", "**/*.cy.ts"] + "exclude": ["**/*.spec.ts", "**/*.cy.ts"], + "angularCompilerOptions": { + "extendedDiagnostics": { + "checks": { + "nullishCoalescingNotNullable": "suppress", + "optionalChainNotNullable": "suppress" + } + } + } } diff --git a/projects/cps-ui-kit/tsconfig.lib.prod.json b/projects/cps-ui-kit/tsconfig.lib.prod.json index 06de549e1..9fb436e8a 100644 --- a/projects/cps-ui-kit/tsconfig.lib.prod.json +++ b/projects/cps-ui-kit/tsconfig.lib.prod.json @@ -5,6 +5,12 @@ "declarationMap": false }, "angularCompilerOptions": { - "compilationMode": "partial" + "compilationMode": "partial", + "extendedDiagnostics": { + "checks": { + "nullishCoalescingNotNullable": "suppress", + "optionalChainNotNullable": "suppress" + } + } } } diff --git a/tsconfig.json b/tsconfig.json index 74db8e0fe..f8c74ca9c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,6 @@ "compileOnSave": false, "compilerOptions": { "resolveJsonModule": true, - "baseUrl": "./", "paths": { "cps-ui-kit": ["./projects/cps-ui-kit/src/public-api.ts"] }, "esModuleInterop": true, "outDir": "./dist/out-tsc",