From 56c087bc3a82b1fb7b4d6b680d08c525df5c83cd Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Thu, 18 Dec 2025 15:27:22 +0000 Subject: [PATCH] feat(catalog): add ContractEditor and many editor subcomponents; implement SignPad and SignBox; update README and bump dependencies --- .playwright-mcp/contract-editor-badge.png | Bin 0 -> 48098 bytes changelog.md | 11 + package.json | 26 +- pnpm-lock.yaml | 3725 +++++++++-------- readme.md | 250 +- ts_web/00_commitinfo_data.ts | 2 +- ts_web/elements/index.ts | 20 +- .../sdig-contract-attachments/index.ts | 1 + .../sdig-contract-attachments.ts | 806 ++++ ts_web/elements/sdig-contract-audit/index.ts | 1 + .../sdig-contract-audit.ts | 772 ++++ .../sdig-contract-collaboration/index.ts | 1 + .../sdig-contract-collaboration.ts | 972 +++++ .../elements/sdig-contract-content/index.ts | 1 + .../sdig-contract-content.ts | 920 ++++ ts_web/elements/sdig-contract-header/index.ts | 1 + .../sdig-contract-header.ts | 558 +++ .../elements/sdig-contract-metadata/index.ts | 1 + .../sdig-contract-metadata.ts | 820 ++++ .../elements/sdig-contract-parties/index.ts | 1 + .../sdig-contract-parties.ts | 736 ++++ .../sdig-contract-signatures/index.ts | 1 + .../sdig-contract-signatures.ts | 840 ++++ ts_web/elements/sdig-contract-terms/index.ts | 1 + .../sdig-contract-terms.ts | 873 ++++ ts_web/elements/sdig-contracteditor.ts | 42 - ts_web/elements/sdig-contracteditor/index.ts | 8 + .../sdig-contracteditor.ts | 839 ++++ ts_web/elements/sdig-contracteditor/state.ts | 407 ++ ts_web/elements/sdig-contracteditor/types.ts | 228 + ts_web/elements/sdig-signbox/index.ts | 1 + .../{ => sdig-signbox}/sdig-signbox.ts | 2 +- ts_web/elements/sdig-signpad/index.ts | 1 + .../{ => sdig-signpad}/sdig-signpad.ts | 2 +- tsconfig.json | 3 +- 35 files changed, 10914 insertions(+), 1959 deletions(-) create mode 100644 .playwright-mcp/contract-editor-badge.png create mode 100644 ts_web/elements/sdig-contract-attachments/index.ts create mode 100644 ts_web/elements/sdig-contract-attachments/sdig-contract-attachments.ts create mode 100644 ts_web/elements/sdig-contract-audit/index.ts create mode 100644 ts_web/elements/sdig-contract-audit/sdig-contract-audit.ts create mode 100644 ts_web/elements/sdig-contract-collaboration/index.ts create mode 100644 ts_web/elements/sdig-contract-collaboration/sdig-contract-collaboration.ts create mode 100644 ts_web/elements/sdig-contract-content/index.ts create mode 100644 ts_web/elements/sdig-contract-content/sdig-contract-content.ts create mode 100644 ts_web/elements/sdig-contract-header/index.ts create mode 100644 ts_web/elements/sdig-contract-header/sdig-contract-header.ts create mode 100644 ts_web/elements/sdig-contract-metadata/index.ts create mode 100644 ts_web/elements/sdig-contract-metadata/sdig-contract-metadata.ts create mode 100644 ts_web/elements/sdig-contract-parties/index.ts create mode 100644 ts_web/elements/sdig-contract-parties/sdig-contract-parties.ts create mode 100644 ts_web/elements/sdig-contract-signatures/index.ts create mode 100644 ts_web/elements/sdig-contract-signatures/sdig-contract-signatures.ts create mode 100644 ts_web/elements/sdig-contract-terms/index.ts create mode 100644 ts_web/elements/sdig-contract-terms/sdig-contract-terms.ts delete mode 100644 ts_web/elements/sdig-contracteditor.ts create mode 100644 ts_web/elements/sdig-contracteditor/index.ts create mode 100644 ts_web/elements/sdig-contracteditor/sdig-contracteditor.ts create mode 100644 ts_web/elements/sdig-contracteditor/state.ts create mode 100644 ts_web/elements/sdig-contracteditor/types.ts create mode 100644 ts_web/elements/sdig-signbox/index.ts rename ts_web/elements/{ => sdig-signbox}/sdig-signbox.ts (98%) create mode 100644 ts_web/elements/sdig-signpad/index.ts rename ts_web/elements/{ => sdig-signpad}/sdig-signpad.ts (98%) diff --git a/.playwright-mcp/contract-editor-badge.png b/.playwright-mcp/contract-editor-badge.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e1f64f7a82faeaa7201f750c33b1db67980766 GIT binary patch literal 48098 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

G^4=RcSPXoVrO8Y9%wTju3w(D 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%0DABfJ$&j$A$B+$MN|Gs(bP(EGVrHwB} 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 literal 0 HcmV?d00001 diff --git a/changelog.md b/changelog.md index 6465cd3..7627efe 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,16 @@ # Changelog +## 2025-12-18 - 1.1.0 - feat(catalog) +add ContractEditor and many editor subcomponents; implement SignPad and SignBox; update README and bump dependencies + +- New contract editor module with many subcomponents added (header, metadata, parties, content, terms, signatures, attachments, collaboration, audit) +- Implemented signature UI components: sdig-signpad and sdig-signbox (canvas-based signature capture, undo/clear/export APIs) +- Reorganized exports (ts_web/elements/index.ts) to expose new submodules and barrel files +- Added editor types and smartstate store (ts_web/elements/sdig-contracteditor/types.ts and state.ts) for editor state management, undo/redo and events +- Large README overhaul: improved usage examples, API docs, security/issue reporting section, theming and integration examples +- Dependencies bumped in package.json (notable bumps: @design.estate/* packages, @git.zone tooling, signature_pad) and pnpm overrides added +- tsconfig.json compiler options modified (removed experimentalDecorators and useDefineForClassFields) — may affect local build configurations + ## 2024-12-19 - 1.0.59 - fix(dependencies) Update package dependencies and project metadata diff --git a/package.json b/package.json index 8cee391..3c06eb4 100644 --- a/package.json +++ b/package.json @@ -15,18 +15,18 @@ "author": "Task Venture Capital GmbH", "license": "MIT", "dependencies": { - "@design.estate/dees-catalog": "^1.3.3", - "@design.estate/dees-domtools": "^2.0.65", - "@design.estate/dees-element": "^2.0.39", - "@design.estate/dees-wcctools": "^1.0.90", - "@git.zone/tsrun": "^1.3.3", + "@design.estate/dees-catalog": "^3.3.1", + "@design.estate/dees-domtools": "^2.3.6", + "@design.estate/dees-element": "^2.1.3", + "@design.estate/dees-wcctools": "^2.0.1", + "@git.zone/tsrun": "^2.0.1", "@signature.digital/tools": "^1.1.0", - "signature_pad": "^5.0.4" + "signature_pad": "^5.1.3" }, "devDependencies": { - "@git.zone/tsbuild": "^2.2.0", - "@git.zone/tsbundle": "^2.1.0", - "@git.zone/tswatch": "^2.0.37", + "@git.zone/tsbuild": "^4.0.2", + "@git.zone/tsbundle": "^2.6.3", + "@git.zone/tswatch": "^2.3.13", "@push.rocks/projectinfo": "^5.0.2" }, "files": [ @@ -58,5 +58,11 @@ "custom elements", "electronic signing", "npm package" - ] + ], + "pnpm": { + "overrides": { + "@push.rocks/smartrequest": "^5.0.1", + "agentkeepalive": "^4.6.0" + } + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad7aadc..e9667eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,41 +4,45 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@push.rocks/smartrequest': ^5.0.1 + agentkeepalive: ^4.6.0 + importers: .: dependencies: '@design.estate/dees-catalog': - specifier: ^1.3.3 - version: 1.3.3 + specifier: ^3.3.1 + version: 3.3.1(@tiptap/pm@2.27.1) '@design.estate/dees-domtools': - specifier: ^2.0.65 - version: 2.0.65 + specifier: ^2.3.6 + version: 2.3.6 '@design.estate/dees-element': - specifier: ^2.0.39 - version: 2.0.39 + specifier: ^2.1.3 + version: 2.1.3 '@design.estate/dees-wcctools': - specifier: ^1.0.90 - version: 1.0.90 + specifier: ^2.0.1 + version: 2.0.1 '@git.zone/tsrun': - specifier: ^1.3.3 - version: 1.3.3 + specifier: ^2.0.1 + version: 2.0.1 '@signature.digital/tools': specifier: ^1.1.0 version: 1.1.0 signature_pad: - specifier: ^5.0.4 - version: 5.0.4 + specifier: ^5.1.3 + version: 5.1.3 devDependencies: '@git.zone/tsbuild': - specifier: ^2.2.0 - version: 2.2.0 + specifier: ^4.0.2 + version: 4.0.2 '@git.zone/tsbundle': - specifier: ^2.1.0 - version: 2.1.0 + specifier: ^2.6.3 + version: 2.6.3 '@git.zone/tswatch': - specifier: ^2.0.37 - version: 2.0.37 + specifier: ^2.3.13 + version: 2.3.13(@tiptap/pm@2.27.1) '@push.rocks/projectinfo': specifier: ^5.0.2 version: 5.0.2 @@ -54,11 +58,16 @@ packages: '@api.global/typedrequest@3.1.10': resolution: {integrity: sha512-EiCp44XVcMjBvEs4oM1nMUaeY4ySU0Pzt3+mDwVG5DNP6EV87Nwancbr2jKScvaFNel9eeDgGtgEnFBKjOnApA==} - '@api.global/typedserver@3.0.51': - resolution: {integrity: sha512-NbvCDB/Td8jr1Y9whUrkuQ1viy57q3EoG7H1/LgCZpJJD2nzoNpmRK1Gnujz60UmTDoxIEWq8QfteiU3n7yvZg==} + '@api.global/typedrequest@3.2.5': + resolution: {integrity: sha512-LM/sUTuYnU5xY4gNZrN6ERMiKr+SpDZuSxJkAZz1YazC7ymGfo6uQ8sCnN8eNNQNFqIOkC+BtfYRayfbGwYLLg==} - '@api.global/typedsocket@3.0.1': - resolution: {integrity: sha512-xojiAVNXtHoxkpBo8U2HHJG8FrVXXuLvDNndSHXwx4C9VslUwDn5zSCI+PdBl8iAg+ZuBmKjqkpZZ9sL6DC5yQ==} + '@api.global/typedserver@7.11.1': + resolution: {integrity: sha512-1vQUJ2/DszDFHVkCmqqBy/qNiIP/jltFN3KxHtoNLxjbdBZYfw1Zd1Odjs6YSPalAD0p8wQ/alJblJEAewNQVg==} + + '@api.global/typedsocket@4.1.0': + resolution: {integrity: sha512-ttmoU5BNHmLAkAF/o+Ta8F5O4F7CUmkFo6LK7NKHQvuYJvodPMYWdhJ6yCINTF4pfCgljkMDUqoVKobm6ea4mQ==} + peerDependencies: + '@push.rocks/smartserve': '>=1.1.0' '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} @@ -227,369 +236,288 @@ packages: resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} engines: {node: '>=6.9.0'} - '@cloudflare/workers-types@4.20241218.0': - resolution: {integrity: sha512-Y0brjmJHcAZBXOPI7lU5hbiXglQWniA1kQjot2ata+HFimyjPPcz+4QWBRrmWcMPo0OadR2Vmac7WStDLpvz0w==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} - '@design.estate/dees-catalog@1.3.3': - resolution: {integrity: sha512-pE2BUFks2lWjjAm4wgby+5aBwtd3VrgCsvwbE3k39DMQpcgxNB64lZa5tUV4XUxwMluECfDluI2uQuslTUQqvQ==} + '@borewit/text-codec@0.1.1': + resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} + + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + + '@cloudflare/workers-types@4.20251217.0': + resolution: {integrity: sha512-qdVSqCza5Bv23E0DFET+8SEl9fM1F16WHC0HGoYLlDAyWF7rK2HhkPCdUEOp8DsJXwANWvNOkFdJfE1kLYGHYg==} + + '@configvault.io/interfaces@1.0.17': + resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==} + + '@design.estate/dees-catalog@3.3.1': + resolution: {integrity: sha512-QNIjAElIMm04Jz7VZTY/F1NjBIXCEYJ0VGK/wHE8ppzsSpSw93uLV47GFyAoEnwFp665IJpfS4HzRh7epwIArA==} '@design.estate/dees-comms@1.0.27': resolution: {integrity: sha512-GvzTUwkV442LD60T08iqSoqvhA02Mou5lFvvqBPc4yBUiU7cZISqBx+76xvMgMIEI9Dx9JfTl4/2nW8MoVAanw==} - '@design.estate/dees-domtools@2.0.65': - resolution: {integrity: sha512-BA+xfCqiCr3fDt2BLaUgW979083Vfm01W6QJ8IclcbINggSDBmAEhfU+CVdxeogwa/d9/ctxY12suG77dqBjaA==} + '@design.estate/dees-comms@1.0.30': + resolution: {integrity: sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==} - '@design.estate/dees-element@2.0.39': - resolution: {integrity: sha512-AQdGU/+GmWmU5M5pDf+GWT7GU8UN073WZvtIkfqQZemxd35HYU1vpi629m8/PjKd5dIHAU7QN2mKb6IQ8anPgw==} + '@design.estate/dees-domtools@2.3.6': + resolution: {integrity: sha512-cKaPNtSpp/ZuuXVx2dXO3K2FU3/HjC4ZkqtXb8Kl6yy9rNDbgtjcI4PuOk9Ux1SJzw7FgcxqVh7OSEV60htbmg==} - '@design.estate/dees-wcctools@1.0.90': - resolution: {integrity: sha512-EHYWHiOe+P261e9fBbOBmkD7lIsOpD+tu4VZQr20oc8vhsFjeUGJqYeBm/Ghwg+Gck/dto+K9zyJNIyQ642cEw==} + '@design.estate/dees-element@2.1.3': + resolution: {integrity: sha512-TjXWxVcdSPaT1IOk31ckfxvAZnJLuTxhFGsNCKoh63/UE2FVf6slp8//UFvN+ADigiA9ZsY0azkY99XbJCwDDA==} - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + '@design.estate/dees-wcctools@2.0.1': + resolution: {integrity: sha512-1DaQtvoMmD+uH9cjSrL4szk7h0nbBlT/ZBmz+qvWCOqzZXE3wPOAdgASZ73NeQlehLx4KGbfJTCG15DSB0W3LQ==} + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} engines: {node: '>=18'} - cpu: [x64] - os: [linux] + cpu: [arm64] + os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} engines: {node: '>=18'} cpu: [arm64] - os: [openbsd] + os: [openharmony] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@fortawesome/fontawesome-common-types@6.7.2': - resolution: {integrity: sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==} + '@fortawesome/fontawesome-common-types@7.1.0': + resolution: {integrity: sha512-l/BQM7fYntsCI//du+6sEnHOP6a74UixFyOYUyz2DLMXKx+6DEhfR3F2NYGE45XH1JJuIamacb4IZs9S0ZOWLA==} engines: {node: '>=6'} - '@fortawesome/fontawesome-svg-core@6.7.2': - resolution: {integrity: sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==} + '@fortawesome/fontawesome-svg-core@7.1.0': + resolution: {integrity: sha512-fNxRUk1KhjSbnbuBxlWSnBLKLBNun52ZBTcs22H/xEEzM6Ap81ZFTQ4bZBxVQGQgVY0xugKGoRcCbaKjLQ3XZA==} engines: {node: '>=6'} - '@fortawesome/free-brands-svg-icons@6.7.2': - resolution: {integrity: sha512-zu0evbcRTgjKfrr77/2XX+bU+kuGfjm0LbajJHVIgBWNIDzrhpRxiCPNT8DW5AdmSsq7Mcf9D1bH0aSeSUSM+Q==} + '@fortawesome/free-brands-svg-icons@7.1.0': + resolution: {integrity: sha512-9byUd9bgNfthsZAjBl6GxOu1VPHgBuRUP9juI7ZoM98h8xNPTCTagfwUFyYscdZq4Hr7gD1azMfM9s5tIWKZZA==} engines: {node: '>=6'} - '@fortawesome/free-regular-svg-icons@6.7.2': - resolution: {integrity: sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g==} + '@fortawesome/free-regular-svg-icons@7.1.0': + resolution: {integrity: sha512-0e2fdEyB4AR+e6kU4yxwA/MonnYcw/CsMEP9lH82ORFi9svA6/RhDyhxIv5mlJaldmaHLLYVTb+3iEr+PDSZuQ==} engines: {node: '>=6'} - '@fortawesome/free-solid-svg-icons@6.7.2': - resolution: {integrity: sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==} + '@fortawesome/free-solid-svg-icons@7.1.0': + resolution: {integrity: sha512-Udu3K7SzAo9N013qt7qmm22/wo2hADdheXtBfxFTecp+ogsc0caQNRKEb7pkvvagUGOpG9wJC1ViH6WXs8oXIA==} engines: {node: '>=6'} - '@git.zone/tsbuild@2.2.0': - resolution: {integrity: sha512-lsF1VvqzTjrcOPW7mvsK0E6jlQJ9UHF37s6Z0JhVS/COXWtPdRT4Dm7/hhbwqH62yu44B+mRz1gJhc7NgBoA5Q==} + '@git.zone/tsbuild@4.0.2': + resolution: {integrity: sha512-LcRlFnDbcUe53Pdoob585iXq9TAT90TyEaYl/wml/etFoPeBX+oQLm6GryejUPXrUP7i1opyTonadkQN1OyXOA==} hasBin: true - '@git.zone/tsbundle@2.1.0': - resolution: {integrity: sha512-O6aAO29B3IP+o4USNx2YuMwQ0N9aUmG5Ye7n0UY0ssJxDGolwzJi8xnoMOilTl0qwZP5Lob8R7lYM2X7Ir70WA==} + '@git.zone/tsbundle@2.6.3': + resolution: {integrity: sha512-YD1qMYA/4eOuF57V0ccR+xo6ww1+QOYFA2K5gBPFBDNh9VdfvWxxDhOUybja8lT9PVMoli8PHG5WA5tKJkdXIQ==} hasBin: true - '@git.zone/tspublish@1.7.7': - resolution: {integrity: sha512-NPDRLhcDVxq1P0jBYQMzmZhhEZ40KdHgtohQ65I5euCYac7I7GnPK8D/o0wujZqX9+aA2o+7PHh1GRUy2a5GFA==} + '@git.zone/tspublish@1.11.0': + resolution: {integrity: sha512-dkgaDBTzZJ53lAV72r7OW/W7l/KqpkncFuPojr11JO35OKAbjjDhZbAwPv4oGX9NplyXrhC5VJRPNX/orqNTHA==} hasBin: true - '@git.zone/tsrun@1.3.3': - resolution: {integrity: sha512-DDzWunkxXLtXJTxBf4EioXLwhuqdA2VzdTmOzWrw4Z4Qnms/YM67q36yajwNohAajPYyRz5DayU0ikrceFXyVw==} + '@git.zone/tsrun@2.0.1': + resolution: {integrity: sha512-NEcnsjvlC1o3Z6SS3VhKCf6Ev+Sh4EAinmggslrIR/ppMrvjDbXNFXoyr3PB+GLeSAR0JRZ1fGvVYjpEzjBdIg==} hasBin: true - '@git.zone/tswatch@2.0.37': - resolution: {integrity: sha512-LvrODTTGMLllfc/EcVJirxnGEx7/gon6iMQS6mM/fbRbtONif+rRMlCrBMOF4QRVYSJtjFeQ9/FHO7+iqPfYPw==} + '@git.zone/tswatch@2.3.13': + resolution: {integrity: sha512-43995OlWl8UzCA+cX3ehYba/ksm6CqHbMljHKjosrDRpx8EU+LY4bWTc8JT/Ldgwsw3iW9vur2bBqpgMmdeJJw==} hasBin: true '@happy-dom/global-registrator@15.11.7': resolution: {integrity: sha512-mfOoUlIw8VBiJYPrl5RZfMzkXC/z7gbSpi2ecycrj/gRWLq2CMV+Q+0G+JPjeOmuNFgg0skEIzkVFzVYFP6URw==} engines: {node: '>=18.0.0'} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@lit-labs/ssr-dom-shim@1.2.1': - resolution: {integrity: sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==} + '@lit-labs/ssr-dom-shim@1.4.0': + resolution: {integrity: sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==} - '@lit/reactive-element@2.0.4': - resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} + '@lit/reactive-element@2.1.1': + resolution: {integrity: sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==} '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + '@module-federation/error-codes@0.21.6': + resolution: {integrity: sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ==} + + '@module-federation/runtime-core@0.21.6': + resolution: {integrity: sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw==} + + '@module-federation/runtime-tools@0.21.6': + resolution: {integrity: sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q==} + + '@module-federation/runtime@0.21.6': + resolution: {integrity: sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ==} + + '@module-federation/sdk@0.21.6': + resolution: {integrity: sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw==} + + '@module-federation/webpack-bundler-runtime@0.21.6': + resolution: {integrity: sha512-7zIp3LrcWbhGuFDTUMLJ2FJvcwjlddqhWGxi/MW3ur1a+HaO8v5tF2nl+vElKmbG1DFLU/52l3PElVcWf/YcsQ==} + '@napi-rs/canvas-android-arm64@0.1.65': resolution: {integrity: sha512-ZYwqFYEKcT5Zr8lbiaJNJj/poLaeK2TncolY914r+gD2TJNeP7ZqvE7A2SX/1C9MB4E3DQEwm3YhL3WEf0x3MQ==} engines: {node: '>= 10'} @@ -654,6 +582,15 @@ packages: resolution: {integrity: sha512-YcFhXQcp+b2d38zFOJNbpyPHnIL7KAEkhJQ+UeeKI5IpE9B8Cpf/M6RiHPQXSsSqnYbrfFylnW49dyh2oeSblQ==} engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@napi-rs/wasm-runtime@1.1.0': + resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + + '@oxc-project/types@0.99.0': + resolution: {integrity: sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -673,6 +610,9 @@ packages: '@push.rocks/consolecolor@2.0.2': resolution: {integrity: sha512-IBwxCLX+YF3f5wB2N4LfuvFqm9WPlBMiEeSAfjN8YQCyYec6u1hlrR3EIj8vT300pppjeGrybJHK+GyjdGXZJw==} + '@push.rocks/consolecolor@2.0.3': + resolution: {integrity: sha512-hA+m0BMqEwZNSAS7c2aQFfoPkpX/dNdsHzkdLdeERUOy7BLacb9ItTUofGtjtginP0yDj4NSpqSjNYyX3Y8Y/w==} + '@push.rocks/early@4.0.4': resolution: {integrity: sha512-ak6/vqZ1PlFV08fSFQ6UwiBrr+K6IsfieZWWzT7eex1Ls6GvWEi8wZ3REFDPJq/qckNLWSgEy0EsqzRtltkaCA==} @@ -691,11 +631,20 @@ packages: '@push.rocks/lik@6.1.0': resolution: {integrity: sha512-BoSAIRFNryQ8Sd5EP+35ZBj6vAQ1C60/XjZIO2O65XDyLG8xz7xJ+u5Wm8/fjIJ0WX3h8GkkaCz2tJM34nFT3A==} + '@push.rocks/lik@6.2.2': + resolution: {integrity: sha512-j64FFPPyMXeeUorjKJVF6PWaJUfiIrF3pc41iJH4lOh0UUpBAHpcNzHVxTR58orwbVA/h3Hz+DQd4b1Rq0dFDQ==} + + '@push.rocks/npmextra@5.3.3': + resolution: {integrity: sha512-snLpSHwaQ5OXlZzF1KX/FY71W5LwajjBzor82Vue0smjEPnSeUPY5/JcVdMwtdprdJe13pc/EQQuIiL/zw4/yg==} + '@push.rocks/projectinfo@5.0.2': resolution: {integrity: sha512-zzieCal6jwR++o+fDl8gMpWkNV2cGEsbT96vCNZu/H9kr0iqRmapOiA4DFadkhOnhlDqvRr6TPaXESu2YUbI8Q==} - '@push.rocks/smartarchive@3.0.8': - resolution: {integrity: sha512-1jPmR0b7hXmjYQoRiTlRXrIbZcdcFmSdGOfznufjcDpGPe86Km0d8TBnzqghTx4dTihzKC67IxAaz/DM3lvxpA==} + '@push.rocks/qenv@6.1.3': + resolution: {integrity: sha512-+z2hsAU/7CIgpYLFqvda8cn9rUBMHqLdQLjsFfRn5jPoD7dJ5rFlpkbhfM4Ws8mHMniwWaxGKo+q/YBhtzRBLg==} + + '@push.rocks/smartarchive@4.2.4': + resolution: {integrity: sha512-uiqVAXPxmr8G5rv3uZvZFMOCt8l7cZC3nzvsy4YQqKf/VkPhKIEX+b7LkAeNlxPSYUiBQUkNRoawg9+5BaMcHg==} '@push.rocks/smartbucket@3.3.7': resolution: {integrity: sha512-RiOuEtwHJ+HFbV1nlZgh5VuMvP6PXElX6rVe7OSQsyNCBybRQa/d1qDic92+2Ejx852DGeHlyREELQCxd/a/7w==} @@ -706,11 +655,11 @@ packages: '@push.rocks/smartcache@1.0.16': resolution: {integrity: sha512-UAXf74eDuH4/RebJhydIbHlYVR3ACYJjniEY/9ZePblu7bIPgwFZqLBE9g1lcKVogbH9yY62dk3rSpgBzenyfQ==} - '@push.rocks/smartchok@1.0.34': - resolution: {integrity: sha512-YzFjUbyzYREFDc4khcySObLzB21R98yIRFvpu3cB2kRmhEfVD2IEO6Wzp4aWFMhkq5A/dDBJRNmRPtgMVGNqKA==} + '@push.rocks/smartcli@4.0.19': + resolution: {integrity: sha512-s1jZSgDZWi/az26AY4TJ2HPuG1qZzGC5R9fKWaECLmwnSpk6y9JXL5dnJAUohcdu50kdXCWEcRmLfYxOt81vEA==} - '@push.rocks/smartcli@4.0.11': - resolution: {integrity: sha512-KDWfUqWBoUZsOEtsDx36d6qc8GG7Zo5E+HHamYY68KVDO8BMu6jbBucoUUPDksczLEmbXKLmroBP1mn/xozQOA==} + '@push.rocks/smartclickhouse@2.0.17': + resolution: {integrity: sha512-IYO8Obor/Ruam2KQ2B/+5uQ+rL0exU5KZoSgOc3jkkrfjn+zZenN2xoV8lVqavAtxZVfG7MfxFrcv6I7I9ZMmA==} '@push.rocks/smartdelay@3.0.5': resolution: {integrity: sha512-mUuI7kj2f7ztjpic96FvRIlf2RsKBa5arw81AHNsndbxO6asRcxuWL8dTVxouEIK8YsBUlj0AsrCkHhMbLQdHw==} @@ -718,11 +667,17 @@ packages: '@push.rocks/smartenv@5.0.12': resolution: {integrity: sha512-tDEFwywzq0FNzRYc9qY2dRl2pgQuZG0G2/yml2RLWZWSW+Fn1EHshnKOGHz8o77W7zvu4hTgQQX42r/JY5XHTg==} + '@push.rocks/smartenv@5.0.13': + resolution: {integrity: sha512-ACXmUcHZHl2CF2jnVuRw9saRRrZvJblCRs2d+K5aLR1DfkYFX3eA21kcMlKeLisI3aGNbIj9vz/rowN5qkRkfA==} + + '@push.rocks/smartenv@6.0.0': + resolution: {integrity: sha512-ktW5MqOFs0492sB4vrvl4lgRFQ/sQ4AyREgB+sCIzGqszHWGVvGXR95Y2a3z66jkLPYML2CUWHzmMlfv8fkG+A==} + '@push.rocks/smartexit@1.0.23': resolution: {integrity: sha512-WmwKYcwbHBByoABhHHB+PAjr5475AtD/xBh1mDcqPrFsOOUOZq3BBUdpq25wI3ccu/SZB5IwaimiVzadls6HkA==} - '@push.rocks/smartfeed@1.0.11': - resolution: {integrity: sha512-02uhXxQamgfBo3T12FsAdfyElnpoWuDUb08B2AE60DbIaukVx/7Mi17xwobApY1flNSr5StZDt8N8vxPhBhIXw==} + '@push.rocks/smartfeed@1.4.0': + resolution: {integrity: sha512-bvj/3cGQI6TbbjbqrgC1uufcqprd/VthefuIsS8KHiHyCqYD5Z6RTjrbQY9WOCsmub/dcuMavfXQZqe9g2+OrQ==} '@push.rocks/smartfile-interfaces@1.0.7': resolution: {integrity: sha512-MeOl/200UOvSO4Pgq/DVFiBVZpL9gjOBQM+4XYNjSxda8c6VBvchHAntaFLQUlO8U1ckNaP9i+nMO4O4/0ymyw==} @@ -730,8 +685,14 @@ packages: '@push.rocks/smartfile@10.0.41': resolution: {integrity: sha512-xOOy0duI34M2qrJZggpk51EHGXmg9+mBL1Q55tNiQKXzfx89P3coY1EAZG8tvmep3qB712QEKe7T+u04t42Kjg==} - '@push.rocks/smartfile@11.0.23': - resolution: {integrity: sha512-+tP/ydhNapve/bVDGMoloZmB6eBFvamHVx5uP05GLCKh0KFffNJuMKTHX4DgC0y3BmNm+Bii7jhpQblY+R99kQ==} + '@push.rocks/smartfile@11.2.7': + resolution: {integrity: sha512-8Yp7/sAgPpWJBHohV92ogHWKzRomI5MEbSG6b5W2n18tqwfAmjMed0rQvsvGrSBlnEWCKgoOrYIIZbLO61+J0Q==} + + '@push.rocks/smartfile@13.1.2': + resolution: {integrity: sha512-DaEhwmnGEpX4coeeToaw4cZe3pNBhH7CY1iGr+d3pIXihozREvzzAR9/0i2r7bUXXL5+Lgy8YYIk5ZS+fwxMKA==} + + '@push.rocks/smartfs@1.3.1': + resolution: {integrity: sha512-ZSduVS8tM+/erbyCTvRRvc9gLWwbpqN5xdIIkMr+gub7fowSeJb7tR2rnGwySa63DyimU0q2KTp79VV9YqGLeg==} '@push.rocks/smartguard@3.1.0': resolution: {integrity: sha512-J23q84f1O+TwFGmd4lrO9XLHUh2DaLXo9PN/9VmTWYzTkQDv5JehmifXVI0esophXcCIfbdIu6hbt7/aHlDF4A==} @@ -739,6 +700,9 @@ packages: '@push.rocks/smarthash@3.0.4': resolution: {integrity: sha512-HJ/fSx41jm0CvSaqMLa6b2nuNK5rHAqAeAq3dAB7Sq9BCPm2M0J5ZVDTzEAH8pS91XYniUiwuE0jwPERNn9hmw==} + '@push.rocks/smarthash@3.2.6': + resolution: {integrity: sha512-Mq/WNX0Tjjes3X1gHd/ZBwOOKSrAG/Z3Xoc0OcCm3P20WKpniihkMpsnlE7wGjvpHLi/ZRe/XkB3KC3d5r9X4g==} + '@push.rocks/smarti18n@1.0.4': resolution: {integrity: sha512-bHIi9Iuzp2cbux9q79ZK5jOQYPsYJ9zDDS4p/xEPQH31gr0mcFRosLSQb1kvDQDVmUhI0ADlQMqr2ui9zEXQHA==} @@ -748,6 +712,9 @@ packages: '@push.rocks/smartjson@5.0.20': resolution: {integrity: sha512-ogGBLyOTluphZVwBYNyjhm5sziPGuiAwWihW07OSRxD4HQUyqj9Ek6r1pqH07JUG5EbtRYivM1Yt1cCwnu3JVQ==} + '@push.rocks/smartjson@5.2.0': + resolution: {integrity: sha512-710e8UwovRfPgUtaBHcd6unaODUjV5fjxtGcGCqtaTcmvOV6VpasdVfT66xMDzQmWH2E9ZfHDJeso9HdDQzNQA==} + '@push.rocks/smartlog-destination-devtools@1.0.12': resolution: {integrity: sha512-zvsIkrqByc0JRaBgIyhh+PSz2SY/e/bmhZdUcr/OW6pudgAcqe2sso68EzrKux0w9OMl1P9ZnzF3FpCZPFWD/A==} @@ -757,8 +724,8 @@ packages: '@push.rocks/smartlog-interfaces@3.0.2': resolution: {integrity: sha512-8hGRTJehbsFSJxLhCQkA018mZtXVPxPTblbg9VaE/EqISRzUw+eosJ2EJV7M4Qu0eiTJZjnWnNLn8CkD77ziWw==} - '@push.rocks/smartlog@3.0.7': - resolution: {integrity: sha512-WHOw0iHHjCEbYY4KGX40iFtLI11QJvvWIbC9yFn3Mt+nrdupMnry7Ztc5v/PqO8lu33Q6xDBMXiNQ9yNY0HVGw==} + '@push.rocks/smartlog@3.1.10': + resolution: {integrity: sha512-5pf5JyzOE2WTCUislNIW4EHePo1a7hiXB+jbil38+N5hW71AEwcPFe6oGxbp5w9ALlz66hV2+E+25R0SsxN+fQ==} '@push.rocks/smartmanifest@2.0.2': resolution: {integrity: sha512-QGc5C9vunjfUbYsPGz5bynV/mVmPHkrQDkWp8ZO8VJtK1GZe+njgbrNyxn2SUHR0IhSAbSXl1j4JvBqYf5eTVg==} @@ -775,8 +742,8 @@ packages: '@push.rocks/smartmime@2.0.4': resolution: {integrity: sha512-mG6lRBLr5nF+GLZmgCcdjhdDsmTtJWBFZDCa1eJ8Au9TvUzbPW0fY5aqJBb3UwfyZzH6St8Th9cJSXjagOQkYA==} - '@push.rocks/smartnpm@2.0.4': - resolution: {integrity: sha512-ljRPqnUsXzL5qnuAEt5POy0NnfKs7eYPuuJPJjYiK9VUdP/CyF4h14qTB4H816vNEuF7VU/ASRtz0qDlXmrztg==} + '@push.rocks/smartnpm@2.0.6': + resolution: {integrity: sha512-7anKDOjX6gXWs1IAc+YWz9ZZ8gDsTwaLh+CxRnGHjAawOmK788NrrgVCg2Fb3qojrPnoxecc46F8Ivp1BT7Izw==} '@push.rocks/smartntml@2.0.8': resolution: {integrity: sha512-LIYeOQbmav2m2kZQz4pGS74xvWAm4YAGQnbPkofA2oas4RW9SGR1JTRpFd9pxGCOXd6djYdNGsZZ/xz+k/vRPQ==} @@ -793,38 +760,47 @@ packages: '@push.rocks/smartpath@5.0.18': resolution: {integrity: sha512-kIyRTlOoeEth5b4Qp8KPUxNOGNdvhb2aD0hbHfF3oGTQ0xnDdgB1l03/4bIoapHG48OrTgh4uQ5tUorykgdOzw==} + '@push.rocks/smartpath@6.0.0': + resolution: {integrity: sha512-r94u1MbBaIOSy+517PZp2P7SuZPSe9LkwJ8l3dXQKHeIOri/zDxk/RQPiFM+j4N9301ztkRyhvRj7xgUDroOsg==} + '@push.rocks/smartpromise@4.0.3': resolution: {integrity: sha512-z3lIso4/6KK3c6NFTVGZ7AOBsGURf8ha3qQtX/OxjZFk5dqS//8PLd0XqghVdIaUlRGmJ7Sfds/efZERWn1tAg==} '@push.rocks/smartpromise@4.0.4': resolution: {integrity: sha512-Mbh+DnX4+rVPEZgYU7LtTJI/AYoNn7+h27AycEFpPJW41DCfjTiXiI0+ecNdyO1AfbcL0Q02RQjoEauEWx5FQg==} - '@push.rocks/smartrequest@2.0.21': - resolution: {integrity: sha512-btk9GbiMNxNcEgJEqTq9qMFJ/6ua6oG4q49v+8ujKAXU50vFn1WQ/H0VAyeu9LMa5GCcRwUhNNDdwpLVGVbrBg==} + '@push.rocks/smartpromise@4.2.3': + resolution: {integrity: sha512-Ycg/TJR+tMt+S3wSFurOpEoW6nXv12QBtKXgBcjMZ4RsdO28geN46U09osPn9N9WuwQy1PkmTV5J/V4F9U8qEw==} - '@push.rocks/smartrequest@2.0.23': - resolution: {integrity: sha512-y+gtOwXFpmPL+mIQblYPdFuHufxHi5lMV0LKm5bPYgGdMq3/+QlnEqNEAumeMHjvXgxur7x30QiHSwpJGK5g9w==} + '@push.rocks/smartrequest@5.0.1': + resolution: {integrity: sha512-gZQQF6HVt3LwTBxaPh6hHObd4VF76PUYQcs5pHD7f0VXaEewmrNAQSnccoinOY7fi45+0dOf04PJOXu9MibPzQ==} - '@push.rocks/smartrouter@1.3.2': - resolution: {integrity: sha512-JtkxClN4CaHXMSeLDNvfWPwiVEPdEoQVSX2ee3gLgbXNO9dt9hvXdIhFrnFeLwyeA6M8nJdb9SqjrjZroYJsxw==} + '@push.rocks/smartrouter@1.3.3': + resolution: {integrity: sha512-1+xZEnWlhzqLWAaJ1zFNhQ0zgbfCWQl1DBT72LygLxTs+P0K8AwJKgqo/IX6CT55kGCFnPAZIYSbVJlGsgrB0w==} + + '@push.rocks/smartrx@3.0.10': + resolution: {integrity: sha512-USjIYcsSfzn14cwOsxgq/bBmWDTTzy3ouWAnW5NdMyRRzEbmeNrvmy6TRqNeDlJ2PsYNTt1rr/zGUqvIy72ITg==} '@push.rocks/smartrx@3.0.7': resolution: {integrity: sha512-qCWy0s3RLAgGSnaw/Gu0BNaJ59CsI6RK5OJDCCqxc7P2X/S755vuLtnAR5/0dEjdhCHXHX9ytPZx+o9g/CNiyA==} + '@push.rocks/smartserve@1.4.0': + resolution: {integrity: sha512-cEoXZQSBX3pOv9AyhxRPkrMAWzs2XQhTBmW95BFtTSNzZdji0XgqUu92p7iuF+NVuTFX1QZ8+dbCClLCoRRW7g==} + '@push.rocks/smartshell@3.2.2': resolution: {integrity: sha512-zMTVJ2ca1pDiqyRQpByz/T2HtoRYLCbXFo6TSA663nuGmnGsIn/DHFZMQYUJGdDi6LSjVxPsQMsY5Bwc4hL6og==} - '@push.rocks/smartsitemap@2.0.3': - resolution: {integrity: sha512-jIcms8V1b2mt3dS4PKNlLR1DRC8pCDWMRVbnyM/2+snZOJZonQRlQzAyX8No0EfLbfdrfnxv2IjPX13X29Re6g==} + '@push.rocks/smartshell@3.3.0': + resolution: {integrity: sha512-m0w618H6YBs+vXGz1CgS4nPi5CUAnqRtckcS9/koGwfcIx1IpjqmiP47BoCTbdgcv0IPUxQVBG1IXTHPuZ8Z5g==} - '@push.rocks/smartsocket@2.0.27': - resolution: {integrity: sha512-planM3EkBvx/+guLLWHLBNnNp4mcWDwp1k9G0It0ul7IhdaBQsSWzKSQJxym3Bx2dypgA2UIeT3/hRvSa5Nqdw==} + '@push.rocks/smartsitemap@2.0.4': + resolution: {integrity: sha512-76dYWG/o/EjV4vYCK7ZKM35T9xgrI+oHEiiIE6E2MDaFIU6QnSfciTfbscH5nc0vxx8Ah+I0HPEJO94BM2S39w==} '@push.rocks/smartspawn@3.0.3': resolution: {integrity: sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==} - '@push.rocks/smartstate@2.0.19': - resolution: {integrity: sha512-Rx2/2n8YaSBW6b4Ww+lYceq5dwkD+QzcnRwAjQDXlsEe8K+KU2T6revTZyf9PchBoC9pNFaAJofIZNebEGMzYA==} + '@push.rocks/smartstate@2.0.27': + resolution: {integrity: sha512-q4UKir7GV3hakJWXQR4DoA4tUVwT5GRkJ/MtanHYF0wZLHfS19+nGmyO9y974zk3eT9hmy3+Lq5cKtU2W6+Y3w==} '@push.rocks/smartstream@2.0.8': resolution: {integrity: sha512-GlF/9cCkvBHwKa3DK4DO5wjfSgqkj6gAS4TrY9uD5NMHu9RQv4WiNrElTYj7iCEpnZgUnLO3tzw1JA3NRIMnnA==} @@ -838,6 +814,9 @@ packages: '@push.rocks/smartstring@4.0.9': resolution: {integrity: sha512-VB0jzKmI4ZpdzEZe79M8rKVjAReNWGMG6ktzS0R5FeH96SSk3jvfOezgz/RJ7JbRN3UcyR0Ra/mXlpyeqJUHvw==} + '@push.rocks/smartstring@4.1.0': + resolution: {integrity: sha512-Q4py/Nm3KTDhQ9EiC75yBtSTLR0KLMwhKM+8gGcutgKotZT6wJ3gncjmtD8LKFfNhb4lSaFMgPJgLrCHTOH6Iw==} + '@push.rocks/smarttime@4.0.6': resolution: {integrity: sha512-1whOow0YJw/TbN758TedRRxApoZbsvyxCVpoGjXh7DE/fEEgs7RCr4vVF5jYpyXNQuNMLpKJcTsSfyQ6RvH4Aw==} @@ -847,27 +826,37 @@ packages: '@push.rocks/smartunique@3.0.9': resolution: {integrity: sha512-q6DYQgT7/dqdWi9HusvtWCjdsFzLFXY9LTtaZV6IYNJt6teZOonoygxTdNt9XLn6niBSbLYrHSKvJNTRH/uK+g==} - '@push.rocks/smarturl@3.0.7': - resolution: {integrity: sha512-nx4EWjQD9JeO7QVbOsxd1PFeDQYoSQOOOYCZ+r7QWXHLJG52iYzgvJDCQyX6p705HDkYMJWozW2ZzhR22qLKbw==} - '@push.rocks/smarturl@3.1.0': resolution: {integrity: sha512-ij73Q4GERojdPSHxAvYKvspimcpAJC6GGQCWsC4b+1sAiOSByjfmkUHK8yiEEOPRU9AeGuyaIVqK6ZzKLEZ3vA==} '@push.rocks/smartversion@3.0.5': resolution: {integrity: sha512-8MZSo1yqyaKxKq0Q5N188l4un++9GFWVbhCAX5mXJwewZHn97ujffTeL+eOQYpWFTEpUhaq1QhL4NhqObBCt1Q==} - '@push.rocks/smartxml@1.0.8': - resolution: {integrity: sha512-idrPsBj9t6oxkLZJZgWtyZK6PnQ5BVDbBErk0UfGanXgSWJc+ZEKNYjVqr850+Na3+y0CT6AQdug7pnaokygwg==} + '@push.rocks/smartwatch@6.3.0': + resolution: {integrity: sha512-TeZ1PGBoBMpC4/CK8StIj5InEiFfKp7xWJSm3aYMjB/uaoeRP0vXqv1ORIC/TKYGJuEDuAXUsit8tZVjn0qT1Q==} + engines: {node: '>=20.0.0'} + + '@push.rocks/smartxml@2.0.0': + resolution: {integrity: sha512-1d06zYJX4Zt8s5w5qFOUg2LAEz9ykrh9d6CQPK4WAgOBIefb1xzVEWHc7yoxicc2OkzNgC3IBCEg3s6BncZKWw==} '@push.rocks/smartyaml@2.0.5': resolution: {integrity: sha512-tBcf+HaOIfeEsTMwgUZDtZERCxXQyRsWO8Ar5DjBdiSRchbhVGZQEBzXswMS0W5ZoRenjgPK+4tPW3JQGRTfbg==} + '@push.rocks/smartyaml@3.0.4': + resolution: {integrity: sha512-1JRt+hnoc2zHw3AW+vXKlCdSVwqOmY/01fu+2HBviS0UDjoZCa+/rp6E3GaQb5lEEafKi8ENbffAfjXXp3N2xQ==} + '@push.rocks/taskbuffer@3.1.7': resolution: {integrity: sha512-QktGVJPucqQmW/QNGnscf4FAigT1H7JWKFGFdRuDEaOHKFh9qN+PXG3QY7DtZ4jfXdGLxPN4yAufDuPSAJYFnw==} + '@push.rocks/taskbuffer@3.5.0': + resolution: {integrity: sha512-Y9WwIEIyp6oVFdj06j84tfrZIvjhbMb3DF52rYxlTeYLk3W7RPhSg1bGPCbtkXWeKdBrSe37V90BkOG7Qq8Pqg==} + '@push.rocks/webrequest@3.0.37': resolution: {integrity: sha512-fLN7kP6GeHFxE4UH4r9C9pjcQb0QkJxHeAMwXvbOqB9hh0MFNKhtGU7GoaTn8SVRGRMPc9UqZVNwo6u5l8Wn0A==} + '@push.rocks/webrequest@4.0.1': + resolution: {integrity: sha512-I60XZZLVf8W5I7YdmUVVu4G92teE3rg3/aKaV00BRg8vJ3VXx3wc59Qj4em7zxQ5o0HvL8m1Aezw3RFMDPyVgA==} + '@push.rocks/websetup@3.0.19': resolution: {integrity: sha512-iKJDwXdMmQdu5siOIgziPRxM51lN1AU9HOr+yMteu1YMDkZT7HKCyisDAr4gC9WZ9a7FzsG8zgthm4dMeA8NTw==} @@ -933,6 +922,159 @@ packages: resolution: {integrity: sha512-5SpUqD3X/2IZCTezCpk48Ss7cDc9QOuQAkeAYnJrRjDL4UCLakA3lBeHXRD/rsIB7S1smtXlayQ/vizfYzdbfw==} deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarttime + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + + '@rolldown/binding-android-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MBGIgysimZPqTDcLXI+i9VveijkP5C3EAncEogXhqfax6YXj1Tr2LY3DVuEOMIjWfMPMhtQSPup4fSTAmgjqIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MmKeoLnKu1d9j6r19K8B+prJnIZ7u+zQ+zGQ3YHXGnr41rzE3eqQLovlkvoZnRoxDGPA4ps0pGiwXy6YE3lJyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.52': + resolution: {integrity: sha512-qpHedvQBmIjT8zdnjN3nWPR2qjQyJttbXniCEKKdHeAbZG9HyNPBUzQF7AZZGwmS9coQKL+hWg9FhWzh2dZ2IA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + resolution: {integrity: sha512-dDp7WbPapj/NVW0LSiH/CLwMhmLwwKb3R7mh2kWX+QW85X1DGVnIEyKh9PmNJjB/+suG1dJygdtdNPVXK1hylg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + resolution: {integrity: sha512-9e4l6vy5qNSliDPqNfR6CkBOAx6PH7iDV4OJiEJzajajGrVy8gc/IKKJUsoE52G8ud8MX6r3PMl97NfwgOzB7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-V48oDR84feRU2KRuzpALp594Uqlx27+zFsT6+BgTcXOtu7dWy350J1G28ydoCwKB+oxwsRPx2e7aeQnmd3YJbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-ENLmSQCWqSA/+YN45V2FqTIemg7QspaiTjlm327eUAMeOLdqmSOVVyrQexJGNTQ5M8sDYCgVAig2Kk01Ggmqaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-klahlb2EIFltSUubn/VLjuc3qxp1E7th8ukayPfdkcKvvYcQ5rJztgx8JsJSuAKVzKtNTqUGOhy4On71BuyV8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-UuA+JqQIgqtkgGN2c/AQ5wi8M6mJHrahz/wciENPTeI6zEIbbLGoth5XN+sQe2pJDejEVofN9aOAp0kaazwnVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-1BNQW8u4ro8bsN1+tgKENJiqmvc+WfuaUhXzMImOVSMw28pkBKdfZtX2qJPADV3terx+vNJtlsgSGeb3+W6Jiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': + resolution: {integrity: sha512-K/p7clhCqJOQpXGykrFaBX2Dp9AUVIDHGc+PtFGBwg7V+mvBTv/tsm3LC3aUmH02H2y3gz4y+nUTQ0MLpofEEg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-a4EkXBtnYYsKipjS7QOhEBM4bU5IlR9N1hU+JcVEVeuTiaslIyhWVKsvf7K2YkQHyVAJ+7/A9BtrGqORFcTgng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-5ZXcYyd4GxPA6QfbGrNcQjmjbuLGvfz6728pZMsQvGHI+06LT06M6TPtXvFvLgXtexc+OqvFe1yAIXJU1gob/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-tzpnRQXJrSzb8Z9sm97UD3cY0toKOImx+xRKsDLX4zHaAlRXWh7jbaKBePJXEN7gNw7Nm03PBNwphdtA8KSUYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.52': + resolution: {integrity: sha512-/L0htLJZbaZFL1g9OHOblTxbCYIGefErJjtYOwgl9ZqNx27P3L0SDfjhhHIss32gu5NWgnxuT2a2Hnnv6QGHKA==} + + '@rspack/binding-darwin-arm64@1.6.8': + resolution: {integrity: sha512-e8CTQtzaeGnf+BIzR7wRMUwKfIg0jd/sxMRc1Vd0bCMHBhSN9EsGoMuJJaKeRrSmy2nwMCNWHIG+TvT1CEKg+A==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.6.8': + resolution: {integrity: sha512-ku1XpTEPt6Za11zhpFWhfwrTQogcgi9RJrOUVC4FESiPO9aKyd4hJ+JiPgLY0MZOqsptK6vEAgOip+uDVXrCpg==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.6.8': + resolution: {integrity: sha512-fvZX6xZPvBT8qipSpvkKMX5M7yd2BSpZNCZXcefw6gA3uC7LI3gu+er0LrDXY1PtPzVuHTyDx+abwWpagV3PiQ==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.6.8': + resolution: {integrity: sha512-++XMKcMNrt59HcFBLnRaJcn70k3X0GwkAegZBVpel8xYIAgvoXT5+L8P1ExId/yTFxqedaz8DbcxQnNmMozviw==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.6.8': + resolution: {integrity: sha512-tv3BWkTE1TndfX+DsE1rSTg8fBevCxujNZ3MlfZ22Wfy9x1FMXTJlWG8VIOXmaaJ1wUHzv8S7cE2YUUJ2LuiCg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.6.8': + resolution: {integrity: sha512-DCGgZ5/in1O3FjHWqXnDsncRy+48cMhfuUAAUyl0yDj1NpsZu9pP+xfGLvGcQTiYrVl7IH9Aojf1eShP/77WGA==} + cpu: [x64] + os: [linux] + + '@rspack/binding-wasm32-wasi@1.6.8': + resolution: {integrity: sha512-VUwdhl/lI4m6o1OGCZ9JwtMjTV/yLY5VZTQdEPKb40JMTlmZ5MBlr5xk7ByaXXYHr6I+qnqEm73iMKQvg6iknw==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.6.8': + resolution: {integrity: sha512-23YX7zlOZlub+nPGDBUzktb4D5D6ETUAluKjXEeHIZ9m7fSlEYBnGL66YE+3t1DHXGd0OqsdwlvrNGcyo6EXDQ==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.6.8': + resolution: {integrity: sha512-cFgRE3APxrY4AEdooVk2LtipwNNT/9mrnjdC5lVbsIsz+SxvGbZR231bxDJEqP15+RJOaD07FO1sIjINFqXMEg==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.6.8': + resolution: {integrity: sha512-cIuhVsZYd3o3Neo1JSAhJYw6BDvlxaBoqvgwRkG1rs0ExFmEmgYyG7ip9pFKnKNWph/tmW3rDYypmEfjs1is7g==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.6.8': + resolution: {integrity: sha512-lUeL4mbwGo+nqRKqFDCm9vH2jv9FNMVt1X8jqayWRcOCPlj/2UVMEFgqjR7Pp2vlvnTKq//31KbDBJmDZq31RQ==} + + '@rspack/core@1.6.8': + resolution: {integrity: sha512-FolcIAH5FW4J2FET+qwjd1kNeFbCkd0VLuIHO0thyolEjaPSxw5qxG67DA7BZGm6PVcoiSgPLks1DL6eZ8c+fA==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.1.0': + resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} + '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -1146,8 +1288,30 @@ packages: resolution: {integrity: sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==} engines: {node: '>=16.0.0'} - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@svgdotjs/svg.draggable.js@3.0.6': + resolution: {integrity: sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 + + '@svgdotjs/svg.filter.js@3.0.9': + resolution: {integrity: sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==} + engines: {node: '>= 0.8.0'} + + '@svgdotjs/svg.js@3.2.5': + resolution: {integrity: sha512-/VNHWYhNu+BS7ktbYoVGrCmsXDh+chFMaONMwGNdIBcFHrWqk2jY8fNyr3DLdtQUIalvkPfM554ZSFa3dm3nxQ==} + + '@svgdotjs/svg.resize.js@2.0.5': + resolution: {integrity: sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==} + engines: {node: '>= 14.18'} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 + '@svgdotjs/svg.select.js': ^4.0.1 + + '@svgdotjs/svg.select.js@4.0.3': + resolution: {integrity: sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg==} + engines: {node: '>= 14.18'} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -1156,20 +1320,153 @@ packages: '@tempfix/idb@8.0.3': resolution: {integrity: sha512-hPJQKO7+oAIY+pDNImrZ9QAINbz9KmwT+yO4iRVwdPanok2YKpaUxdJzIvCUwY0YgAawlvYdffbLvRLV5hbs2g==} - '@tempfix/watcher@2.3.0': - resolution: {integrity: sha512-a2qVQffcrnetehvwsN+LdipxQ6jejwZLgAvS9/91+C0gP4CKyikY01c0tSs0I4tSL7qHdCw1Fx0quLw+A9uyLA==} + '@tiptap/core@2.27.1': + resolution: {integrity: sha512-nkerkl8syHj44ZzAB7oA2GPmmZINKBKCa79FuNvmGJrJ4qyZwlkDzszud23YteFZEytbc87kVd/fP76ROS6sLg==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-blockquote@2.27.1': + resolution: {integrity: sha512-QrUX3muElDrNjKM3nqCSAtm3H3pT33c6ON8kwRiQboOAjT/9D57Cs7XEVY7r6rMaJPeKztrRUrNVF9w/w/6B0A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bold@2.27.1': + resolution: {integrity: sha512-g4l4p892x/r7mhea8syp3fNYODxsDrimgouQ+q4DKXIgQmm5+uNhyuEPexP3I8TFNXqQ4DlMNFoM9yCqk97etQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bullet-list@2.27.1': + resolution: {integrity: sha512-5FmnfXkJ76wN4EbJNzBhAlmQxho8yEMIJLchTGmXdsD/n/tsyVVtewnQYaIOj/Z7naaGySTGDmjVtLgTuQ+Sxw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-code-block@2.27.1': + resolution: {integrity: sha512-wCI5VIOfSAdkenCWFvh4m8FFCJ51EOK+CUmOC/PWUjyo2Dgn8QC8HMi015q8XF7886T0KvYVVoqxmxJSUDAYNg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code@2.27.1': + resolution: {integrity: sha512-i65wUGJevzBTIIUBHBc1ggVa27bgemvGl/tY1/89fEuS/0Xmre+OQjw8rCtSLevoHSiYYLgLRlvjtUSUhE4kgg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-document@2.27.1': + resolution: {integrity: sha512-NtJzJY7Q/6XWjpOm5OXKrnEaofrcc1XOTYlo/SaTwl8k2bZo918Vl0IDBWhPVDsUN7kx767uHwbtuQZ+9I82hA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-dropcursor@2.27.1': + resolution: {integrity: sha512-3MBQRGHHZ0by3OT0CWbLKS7J3PH9PpobrXjmIR7kr0nde7+bHqxXiVNuuIf501oKU9rnEUSedipSHkLYGkmfsA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-gapcursor@2.27.1': + resolution: {integrity: sha512-A9e1jr+jGhDWzNSXtIO6PYVYhf5j/udjbZwMja+wCE/3KvZU9V3IrnGKz1xNW+2Q2BDOe1QO7j5uVL9ElR6nTA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-hard-break@2.27.1': + resolution: {integrity: sha512-W4hHa4Io6QCTwpyTlN6UAvqMIQ7t56kIUByZhyY9EWrg/+JpbfpxE1kXFLPB4ZGgwBknFOw+e4bJ1j3oAbTJFw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-heading@2.27.1': + resolution: {integrity: sha512-6xoC7igZlW1EmnQ5WVH9IL7P1nCQb3bBUaIDLvk7LbweEogcTUECI4Xg1vxMOVmj9tlDe1I4BsgfcKpB5KEsZw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-history@2.27.1': + resolution: {integrity: sha512-K8PHC9gegSAt0wzSlsd4aUpoEyIJYOmVVeyniHr1P1mIblW1KYEDbRGbDlrLALTyUEfMcBhdIm8zrB9X2Nihvg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-horizontal-rule@2.27.1': + resolution: {integrity: sha512-WxXWGEEsqDmGIF2o9av+3r9Qje4CKrqrpeQY6aRO5bxvWX9AabQCfasepayBok6uwtvNzh3Xpsn9zbbSk09dNA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-italic@2.27.1': + resolution: {integrity: sha512-rcm0GyniWW0UhcNI9+1eIK64GqWQLyIIrWGINslvqSUoBc+WkfocLvv4CMpRkzKlfsAxwVIBuH2eLxHKDtAREA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-link@2.27.1': + resolution: {integrity: sha512-cCwWPZsnVh9MXnGOqSIRXPPuUixRDK8eMN2TvqwbxUBb1TU7b/HtNvfMU4tAOqAuMRJ0aJkFuf3eB0Gi8LVb1g==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-list-item@2.27.1': + resolution: {integrity: sha512-dtsxvtzxfwOJP6dKGf0vb2MJAoDF2NxoiWzpq0XTvo7NGGYUHfuHjX07Zp0dYqb4seaDXjwsi5BIQUOp3+WMFQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-ordered-list@2.27.1': + resolution: {integrity: sha512-U1/sWxc2TciozQsZjH35temyidYUjvroHj3PUPzPyh19w2fwKh1NSbFybWuoYs6jS3XnMSwnM2vF52tOwvfEmA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-paragraph@2.27.1': + resolution: {integrity: sha512-R3QdrHcUdFAsdsn2UAIvhY0yWyHjqGyP/Rv8RRdN0OyFiTKtwTPqreKMHKJOflgX4sMJl/OpHTpNG1Kaf7Lo2A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-strike@2.27.1': + resolution: {integrity: sha512-S9I//K8KPgfFTC5I5lorClzXk0g4lrAv9y5qHzHO5EOWt7AFl0YTg2oN8NKSIBK4bHRnPIrjJJKv+dDFnUp5jQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-align@2.27.1': + resolution: {integrity: sha512-D7dLPk7y5mDn9ZNANQ4K2gCq4vy+Emm5AdeWOGzNeqJsYrBotiQYXd9rb1QYjdup2kzAoKduMTUXV92ujo5cEg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-style@2.27.1': + resolution: {integrity: sha512-NagQ9qLk0Ril83gfrk+C65SvTqPjL3WVnLF2arsEVnCrxcx3uDOvdJW67f/K5HEwEHsoqJ4Zq9Irco/koXrOXA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text@2.27.1': + resolution: {integrity: sha512-a4GCT+GZ9tUwl82F4CEum9/+WsuW0/De9Be/NqrMmi7eNfAwbUTbLCTFU0gEvv25WMHCoUzaeNk/qGmzeVPJ1Q==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-typography@2.27.1': + resolution: {integrity: sha512-jAZU5IuWH9CtZlolQ1gRhV+bT75s19SXjadQwkk18gMMiapcaIVVTxUDWY6ycv9ge4cjRoaP3lqBviW3cGqhOA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-underline@2.27.1': + resolution: {integrity: sha512-fPTmfJFAQWg1O/os1pYSPVdtvly6eW/w5sDofG7pre+bdQUN+8s1cZYelSuj/ltNVioRaB2Ws7tvNgnHL0aAJQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/pm@2.27.1': + resolution: {integrity: sha512-ijKo3+kIjALthYsnBmkRXAuw2Tswd9gd7BUR5OMfIcjGp8v576vKxOxrRfuYiUM78GPt//P0sVc1WV82H5N0PQ==} + + '@tiptap/starter-kit@2.27.1': + resolution: {integrity: sha512-uQQlP0Nmn9eq19qm8YoOeloEfmcGbPpB1cujq54Q6nPgxaBozR7rE7tXbFTinxRW2+Hr7XyNWhpjB7DMNkdU2Q==} + + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - '@tsclass/tsclass@3.0.48': - resolution: {integrity: sha512-hC65UvDlp9qvsl6OcIZXz0JNiWZ0gyzsTzbXpg215sGxopgbkOLCr6E0s4qCTnweYm95gt2AdY95uP7M7kExaQ==} - '@tsclass/tsclass@4.2.0': resolution: {integrity: sha512-34p1jFzpOXapfsD95VN+Kq/qW/XDbyCi/qDMcZp3aUCYIv6dlzY3+6s+GOIQSzkL1YW1uKCij88J+jNsWGijbA==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@tsclass/tsclass@9.3.0': + resolution: {integrity: sha512-KD3oTUN3RGu67tgjNHgWWZGsdYipr1RUDxQ9MMKSgIJ6oNZ4q5m2rg0ibrgyHWkAjTPlHVa6kHP3uVOY+8bnHw==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/buffer-json@2.0.3': resolution: {integrity: sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==} @@ -1177,24 +1474,9 @@ packages: '@types/clean-css@4.2.11': resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/cookie@0.4.1': - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - - '@types/cors@2.8.17': - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - '@types/from2@2.3.5': resolution: {integrity: sha512-giavnjf3kNlJnE+HpZA1CQ3UKHxgehzsTuIMGda8pGMbOiLYGVNADEskey44OZcADHm/HOoBany8IV+0x28XFw==} @@ -1204,21 +1486,15 @@ packages: '@types/glob@8.1.0': resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} - '@types/gunzip-maybe@1.4.2': - resolution: {integrity: sha512-2uqXZg1jTCKE1Pjbab8qb74+f2+i9h/jz8rQ+jRR+zaNJF75zWwrpbX8/TjF4m56m3KFOg9umHdCJ074KwiVxg==} - '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/html-minifier@4.0.5': - resolution: {integrity: sha512-LfE7f7MFd+YUfZnlBz8W43P4NgSObWiqyKapANsWCj63Aqeqli8/9gVsGP4CwC8jPpTTYlTopKCk9rJSuht/ew==} + '@types/html-minifier@4.0.6': + resolution: {integrity: sha512-1Dcf38DkVMYo8SIOkUka7GxI+0BztCVsnfiG2Sxb6G8ShHDQTWQb1WKps/eb3O074HNDCn8wU7LMl5N99nNG+Q==} '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - '@types/js-yaml@3.12.10': resolution: {integrity: sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==} @@ -1228,15 +1504,21 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/mime-types@2.1.4': resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} @@ -1249,32 +1531,20 @@ packages: '@types/node@22.10.2': resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} - '@types/qs@6.9.17': - resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} - '@types/randomatic@3.1.5': resolution: {integrity: sha512-VCwCTw6qh1pRRw+5rNTAwqPmf6A+hdrkdM7dBpZVmhl7g+em3ONXlYK/bWPVKqVGMWgP0d1bog8Vc/X6zRwRRQ==} - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/relateurl@0.2.33': resolution: {integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - '@types/symbol-tree@3.2.5': resolution: {integrity: sha512-zXnnyENt1TYQcS21MkPaJCVjfcPq7p7yc5mo5JACuumXp6sly5jnlS0IokHd+xmmuCbx6V7JqkMBpswR+nZAcw==} - '@types/tar-stream@2.2.3': - resolution: {integrity: sha512-if3mugZfjVkXOMZdFjIHySxY13r6GXPpyOlsDmLffvyI7tLz9wXE8BFjNivXsvUeyJ1KNlOpfLnag+ISmxgxPw==} + '@types/tar-stream@3.1.4': + resolution: {integrity: sha512-921gW0+g29mCJX0fRvqeHzBlE/XclDaAG0Ousy1LCghsOhvaKacDeRGEVzQP9IPfKn8Vysy7FEXAIxycpc/CMg==} '@types/through2@2.0.41': resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==} @@ -1306,12 +1576,8 @@ packages: '@yr/monotone-cubic-spline@1.0.3': resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} ansi-256-colors@1.1.0: @@ -1334,8 +1600,8 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - apexcharts@3.54.1: - resolution: {integrity: sha512-E4et0h/J1U3r3EwS/WlqJCQIbepKbp6wGUmaAwJOMjHUP4Ci0gxanLa7FR3okx6p9coi4st6J853/Cb1NP0vpA==} + apexcharts@5.3.6: + resolution: {integrity: sha512-sVEPw+J0Gp0IHQabKu8cfdsxlfME0e36Wid7RIaPclGM2OUt+O7O4+6mfAmTUYhy5bDk8cNHzEhPfVtLCIXEJA==} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1343,9 +1609,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-flatten@1.1.1: - resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} - asynckit@0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} @@ -1364,14 +1627,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} @@ -1384,11 +1639,8 @@ packages: broadcast-channel@7.0.0: resolution: {integrity: sha512-a2tW0Ia1pajcPBOGUF2jXlDnvE9d5/dg6BG9h60OmRUcZVr/veUrU8vEQFwwQIhwG3KVzYwSk3v2nRRGFgQDXQ==} - browserify-zlib@0.1.4: - resolution: {integrity: sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + broadcast-channel@7.2.0: + resolution: {integrity: sha512-JgraikEriG/TxBUi2W/w2O0jhHjXZUtXAvCZH0Yr3whjxYVgAg0hSe6r/teM+I5H5Q/q6RhyuKdC2pHNlFyepQ==} buffer-json@2.0.0: resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==} @@ -1396,10 +1648,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -1438,9 +1686,9 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} clean-css@4.2.4: resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} @@ -1473,31 +1721,11 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - cookie-signature@1.0.6: - resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} - - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} croner@5.7.0: resolution: {integrity: sha512-9pSLe+tDJnmNak2JeMkz6ZmTCXP5p6vCxSd4kvDqrTJkqAP62j2uAEIZjf8cPDZIakStujqVzh5Y5MIWH3yYAw==} @@ -1532,16 +1760,8 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1549,8 +1769,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1589,18 +1809,10 @@ packages: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1608,46 +1820,15 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ee-first@1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@1.0.2: - resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} - engines: {node: '>= 0.8'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - engine.io-client@6.5.4: - resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} - - engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} - - engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} - engines: {node: '>=10.2.0'} - - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1664,18 +1845,18 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - - escape-html@1.0.3: - resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} @@ -1690,21 +1871,9 @@ packages: engines: {node: '>=4'} hasBin: true - etag@1.8.1: - resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} - engines: {node: '>= 0.6'} - eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - express-force-ssl@0.3.2: - resolution: {integrity: sha1-AbK0mK5v0uQRUrIrV6Phc3c69n4=} - engines: {node: '>=0.2.2'} - - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1733,20 +1902,23 @@ packages: resolution: {integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==} hasBin: true + fast-xml-parser@5.3.3: + resolution: {integrity: sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA==} + hasBin: true + fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - feed@4.2.2: - resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} - engines: {node: '>=0.4.0'} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} file-type@19.6.0: resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} engines: {node: '>=18'} - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} + file-type@21.1.1: + resolution: {integrity: sha512-ifJXo8zUqbQ/bLbl9sFoqHNTNWbnPY1COImFfM6CCy7z+E+jC1eY9YfOKkx0fckIg+VljAy2/87T61fp0+eEkg==} + engines: {node: '>=20'} foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} @@ -1756,34 +1928,22 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} format@0.2.2: resolution: {integrity: sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=} engines: {node: '>=0.4.x'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@0.5.2: - resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} - engines: {node: '>= 0.6'} - from2@2.3.0: resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=} @@ -1791,14 +1951,10 @@ packages: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} @@ -1833,8 +1989,8 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - glob@11.0.0: - resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} hasBin: true @@ -1858,10 +2014,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - happy-dom@15.11.7: resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} engines: {node: '>=18.0.0'} @@ -1881,6 +2033,10 @@ packages: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} @@ -1902,8 +2058,8 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - highlight.js@11.10.0: - resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} html-minifier@4.0.0: @@ -1917,10 +2073,6 @@ packages: http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -1931,10 +2083,6 @@ packages: ibantools@4.5.1: resolution: {integrity: sha512-DfKQpLlFq9yEUIEnFuCJzss3XavD7iHZTU5PyqXiAJ+rmaMp+NFP3hboumHKuK8nZjuOJg93WemTzcQ5b9jOZA==} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -1947,13 +2095,6 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-deflate@1.0.0: - resolution: {integrity: sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -1963,10 +2104,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-gzip@1.0.0: - resolution: {integrity: sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=} - engines: {node: '>=0.10.0'} - is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -2009,8 +2146,8 @@ packages: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} - jackspeak@4.0.2: - resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} js-base64@3.7.5: @@ -2040,51 +2177,38 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - lit-element@4.1.1: - resolution: {integrity: sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==} + lenis@1.3.16: + resolution: {integrity: sha512-KULpna+5TgRCDMSPx4SzJwtsjlz7EeoFCp4IDCXrlM73rLBAj34Egcl7GCLz/6+hXFOYt3DTBeTtJvTu45dJNA==} + peerDependencies: + '@nuxt/kit': '>=3.0.0' + react: '>=17.0.0' + vue: '>=3.0.0' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + react: + optional: true + vue: + optional: true - lit-html@3.2.1: - resolution: {integrity: sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lit@3.2.1: - resolution: {integrity: sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==} + linkifyjs@4.3.2: + resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} - lodash._baseassign@3.2.0: - resolution: {integrity: sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=} + lit-element@4.2.1: + resolution: {integrity: sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==} - lodash._basecopy@3.0.1: - resolution: {integrity: sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=} + lit-html@3.3.1: + resolution: {integrity: sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==} - lodash._bindcallback@3.0.1: - resolution: {integrity: sha1-5THCdkTPi1epnhftlbNcdIeJOS4=} - - lodash._createassigner@3.1.1: - resolution: {integrity: sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=} - - lodash._getnative@3.9.1: - resolution: {integrity: sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=} - - lodash._isiterateecall@3.0.9: - resolution: {integrity: sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=} - - lodash.assign@3.2.0: - resolution: {integrity: sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=} + lit@3.3.1: + resolution: {integrity: sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==} lodash.clonedeep@4.5.0: resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} - lodash.isarguments@3.1.0: - resolution: {integrity: sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=} - - lodash.isarray@3.0.4: - resolution: {integrity: sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=} - - lodash.keys@3.1.2: - resolution: {integrity: sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=} - - lodash.restparam@3.6.1: - resolution: {integrity: sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -2103,6 +2227,9 @@ packages: resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} engines: {node: 20 || >=22} + lucide@0.560.0: + resolution: {integrity: sha512-w7++Pwdz0NxxMtC4ugLmsy66Ar95HnDIMjzJZdHl0kQKIHto3icgI+lbOZMlovZ1Mo4RGITWGhYn1ro7hcY/UA==} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -2113,6 +2240,10 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -2166,16 +2297,8 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - media-typer@0.3.0: - resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} - engines: {node: '>= 0.6'} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - methods@1.1.2: - resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} - engines: {node: '>= 0.6'} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} micromark-core-commonmark@2.0.2: resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} @@ -2272,11 +2395,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mime@4.0.6: resolution: {integrity: sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==} engines: {node: '>=16'} @@ -2294,8 +2412,8 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -2312,14 +2430,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} @@ -2328,21 +2438,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - monaco-editor@0.52.2: resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} - ms@2.0.0: - resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2351,10 +2449,6 @@ packages: engines: {node: ^14 || ^16 || >=18} hasBin: true - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} @@ -2366,10 +2460,6 @@ packages: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} - object-assign@4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} - engines: {node: '>=0.10.0'} - object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -2385,13 +2475,13 @@ packages: resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} engines: {node: '>=16'} + oblivious-set@2.0.0: + resolution: {integrity: sha512-QOUH5Xrsced9fKXaQTjWoDGKeS/Or7E2jB0FN63N4mkAO4qJdB7WR7e6qWAOHM5nk25FJ8TGjhP7DH4l6vFVLg==} + engines: {node: '>=16'} + observable-fns@0.6.1: resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} @@ -2399,6 +2489,9 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -2422,9 +2515,6 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} - pako@0.2.9: - resolution: {integrity: sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=} - param-case@2.1.1: resolution: {integrity: sha1-35T9jPZTHs915r75oIWPvHK+Ikc=} @@ -2436,10 +2526,6 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-is-absolute@1.0.1: resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} engines: {node: '>=0.10.0'} @@ -2456,23 +2542,21 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@8.2.0: resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} - pdfjs-dist@4.9.155: - resolution: {integrity: sha512-epRZn6DQQKCOEqbmFsxkiMBm1MHaNrnr6T4VBNP0bsDvdJdmrWcZbS5cgJXW68P0d3uJTlFhF6Wms2tlSgPYig==} + pdfjs-dist@4.10.38: + resolution: {integrity: sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==} engines: {node: '>=20'} peek-readable@5.3.1: resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} engines: {node: '>=14.16'} - peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} pretty-ms@8.0.0: resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} @@ -2488,18 +2572,70 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + + prosemirror-gapcursor@1.4.0: + resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + + prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + + prosemirror-markdown@1.13.2: + resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + + prosemirror-menu@1.2.5: + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} + + prosemirror-model@1.25.4: + resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + + prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + + prosemirror-tables@1.8.3: + resolution: {integrity: sha512-wbqCR/RlRPRe41a4LFtmhKElzBEfBTdtAYWNIGHM6X2e24NN/MTNUKyXjjphfAfdQce37Kh/5yf765mLPYDe7Q==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.10.5: + resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + + prosemirror-view@1.41.4: + resolution: {integrity: sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==} + proto-list@1.2.4: resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - - pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} punycode@1.4.1: resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} @@ -2508,10 +2644,6 @@ packages: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - qs@6.13.1: resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} engines: {node: '>=0.6'} @@ -2527,14 +2659,6 @@ packages: resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} engines: {node: '>= 0.10.0'} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -2546,6 +2670,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -2594,8 +2722,13 @@ packages: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true - rss-parser@3.13.0: - resolution: {integrity: sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==} + rolldown@1.0.0-beta.52: + resolution: {integrity: sha512-Hbnpljue+JhMJrlOjQ1ixp9me7sUec7OjFvS+A1Qm8k8Xyxmw3ZhxFu7LlSXW1s9AX3POE9W9o2oqCEeR5uDmg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -2606,12 +2739,6 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2621,21 +2748,10 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} - set-function-length@1.1.1: resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2670,23 +2786,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - signature_pad@5.0.4: - resolution: {integrity: sha512-nngOixbwLAUOuH3QnZwlgwmynQblxmo4iWacKFwfymJfiY+Qt+9icNtcIe/okqXKun4hJ5QTFmHyC7dmv6lf2w==} - - socket.io-adapter@2.5.5: - resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} - - socket.io-client@4.7.5: - resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} - engines: {node: '>=10.0.0'} - - socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - - socket.io@4.7.5: - resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} - engines: {node: '>=10.2.0'} + signature_pad@5.1.3: + resolution: {integrity: sha512-zyxW5vuJVnQdGcU+kAj9FYl7WaAunY3kA5S7mPg0xJiujL9+sPAWfSQHS5tXaJXDUa4FuZeKhfdCDQ6K3wfkpQ==} source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -2702,13 +2803,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamx@2.21.1: resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} @@ -2748,44 +2842,17 @@ packages: strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + strtok3@9.1.1: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} - stubborn-fs@1.2.5: - resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} - - svg.draggable.js@2.2.2: - resolution: {integrity: sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==} - engines: {node: '>= 0.8.0'} - - svg.easing.js@2.0.0: - resolution: {integrity: sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==} - engines: {node: '>= 0.8.0'} - - svg.filter.js@2.0.2: - resolution: {integrity: sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==} - engines: {node: '>= 0.8.0'} - - svg.js@2.7.1: - resolution: {integrity: sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==} - - svg.pathmorphing.js@0.1.3: - resolution: {integrity: sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==} - engines: {node: '>= 0.8.0'} - - svg.resize.js@1.4.3: - resolution: {integrity: sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==} - engines: {node: '>= 0.8.0'} - - svg.select.js@2.1.2: - resolution: {integrity: sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==} - engines: {node: '>= 0.8.0'} - - svg.select.js@3.0.1: - resolution: {integrity: sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==} - engines: {node: '>= 0.8.0'} - sweet-scroll@4.0.0: resolution: {integrity: sha512-mR6fRsAQANtm3zpzhUE73KAOt2aT4ZsWzNSggiEsSqdO6Zh4gM7ioJG81EngrZEl0XAc3ZvzEfhxggOoEBc8jA==} @@ -2795,33 +2862,26 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} threads@1.7.0: resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} tiny-worker@2.3.0: resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - token-types@6.0.0: resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} engines: {node: '>=14.16'} + token-types@6.1.1: + resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} + engines: {node: '>=14.16'} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -2838,8 +2898,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.19.2: - resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} hasBin: true @@ -2857,15 +2917,18 @@ packages: resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} engines: {node: '>=16'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -2906,10 +2969,6 @@ packages: unload@2.4.1: resolution: {integrity: sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==} - unpipe@1.0.0: - resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} - engines: {node: '>= 0.8'} - upper-case@1.1.3: resolution: {integrity: sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=} @@ -2923,24 +2982,19 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} - utils-merge@1.0.1: - resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} - engines: {node: '>= 0.4.0'} - uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - vary@1.1.2: - resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} - engines: {node: '>= 0.8'} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -2970,20 +3024,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2994,26 +3036,6 @@ packages: utf-8-validate: optional: true - xml-js@1.6.11: - resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} - hasBin: true - - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - - xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - xterm-addon-fit@0.8.0: resolution: {integrity: sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==} peerDependencies: @@ -3022,12 +3044,14 @@ packages: xterm@5.3.0: resolution: {integrity: sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -3042,29 +3066,42 @@ snapshots: dependencies: '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/isounique': 1.0.5 - '@push.rocks/lik': 6.1.0 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartbuffer': 3.0.4 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartguard': 3.1.0 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstream': 1.0.10 - '@api.global/typedserver@3.0.51': + '@api.global/typedrequest@3.2.5': dependencies: - '@api.global/typedrequest': 3.1.10 '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedsocket': 3.0.1 - '@cloudflare/workers-types': 4.20241218.0 - '@design.estate/dees-comms': 1.0.27 - '@push.rocks/lik': 6.1.0 - '@push.rocks/smartchok': 1.0.34 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartbuffer': 3.0.4 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartenv': 5.0.12 - '@push.rocks/smartfeed': 1.0.11 - '@push.rocks/smartfile': 11.0.23 - '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartguard': 3.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webstream': 1.0.10 + + '@api.global/typedserver@7.11.1(@tiptap/pm@2.27.1)': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedsocket': 4.1.0(@push.rocks/smartserve@1.4.0) + '@cloudflare/workers-types': 4.20251217.0 + '@design.estate/dees-catalog': 3.3.1(@tiptap/pm@2.27.1) + '@design.estate/dees-comms': 1.0.30 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartfeed': 1.4.0 + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartlog': 3.1.10 '@push.rocks/smartlog-destination-devtools': 1.0.12 '@push.rocks/smartlog-interfaces': 3.0.2 '@push.rocks/smartmanifest': 2.0.2 @@ -3072,42 +3109,41 @@ snapshots: '@push.rocks/smartmime': 2.0.4 '@push.rocks/smartntml': 2.0.8 '@push.rocks/smartopen': 2.0.0 - '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrequest': 2.0.23 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smartsitemap': 2.0.3 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 5.0.1 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartserve': 1.4.0 + '@push.rocks/smartsitemap': 2.0.4 '@push.rocks/smartstream': 3.2.5 '@push.rocks/smarttime': 4.1.1 - '@push.rocks/taskbuffer': 3.1.7 - '@push.rocks/webrequest': 3.0.37 + '@push.rocks/smartwatch': 6.3.0 + '@push.rocks/taskbuffer': 3.5.0 + '@push.rocks/webrequest': 4.0.1 '@push.rocks/webstore': 2.0.20 - '@tsclass/tsclass': 4.2.0 - '@types/express': 4.17.21 - body-parser: 1.20.3 - cors: 2.8.5 - express: 4.21.2 - express-force-ssl: 0.3.2 - lit: 3.2.1 + '@tsclass/tsclass': 9.3.0 + lit: 3.3.1 transitivePeerDependencies: + - '@nuxt/kit' + - '@tiptap/pm' - bufferutil + - react - supports-color - utf-8-validate + - vue - '@api.global/typedsocket@3.0.1': + '@api.global/typedsocket@4.1.0(@push.rocks/smartserve@1.4.0)': dependencies: - '@api.global/typedrequest': 3.1.10 + '@api.global/typedrequest': 3.2.5 '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/isohash': 2.0.1 - '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smartsocket': 2.0.27 - '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartserve': 1.4.0 + '@push.rocks/smartstring': 4.1.0 '@push.rocks/smarturl': 3.1.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate '@aws-crypto/crc32@5.2.0': dependencies: @@ -3620,31 +3656,53 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@cloudflare/workers-types@4.20241218.0': {} + '@babel/runtime@7.28.4': {} - '@design.estate/dees-catalog@1.3.3': + '@borewit/text-codec@0.1.1': {} + + '@cfworker/json-schema@4.1.1': {} + + '@cloudflare/workers-types@4.20251217.0': {} + + '@configvault.io/interfaces@1.0.17': dependencies: - '@design.estate/dees-domtools': 2.0.65 - '@design.estate/dees-element': 2.0.39 - '@design.estate/dees-wcctools': 1.0.90 - '@fortawesome/fontawesome-svg-core': 6.7.2 - '@fortawesome/free-brands-svg-icons': 6.7.2 - '@fortawesome/free-regular-svg-icons': 6.7.2 - '@fortawesome/free-solid-svg-icons': 6.7.2 + '@api.global/typedrequest-interfaces': 3.0.19 + + '@design.estate/dees-catalog@3.3.1(@tiptap/pm@2.27.1)': + dependencies: + '@design.estate/dees-domtools': 2.3.6 + '@design.estate/dees-element': 2.1.3 + '@design.estate/dees-wcctools': 2.0.1 + '@fortawesome/fontawesome-svg-core': 7.1.0 + '@fortawesome/free-brands-svg-icons': 7.1.0 + '@fortawesome/free-regular-svg-icons': 7.1.0 + '@fortawesome/free-solid-svg-icons': 7.1.0 '@push.rocks/smarti18n': 1.0.4 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartstring': 4.0.15 - '@tsclass/tsclass': 4.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.1.0 + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/extension-link': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-text-align': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-typography': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-underline': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/starter-kit': 2.27.1 + '@tsclass/tsclass': 9.3.0 '@webcontainer/api': 1.2.0 - apexcharts: 3.54.1 - highlight.js: 11.10.0 + apexcharts: 5.3.6 + highlight.js: 11.11.1 ibantools: 4.5.1 + lit: 3.3.1 + lucide: 0.560.0 monaco-editor: 0.52.2 - pdfjs-dist: 4.9.155 + pdfjs-dist: 4.10.38 xterm: 5.3.0 xterm-addon-fit: 0.8.0(xterm@5.3.0) transitivePeerDependencies: + - '@nuxt/kit' + - '@tiptap/pm' + - react - supports-color + - vue '@design.estate/dees-comms@1.0.27': dependencies: @@ -3653,282 +3711,270 @@ snapshots: '@push.rocks/smartdelay': 3.0.5 broadcast-channel: 7.0.0 - '@design.estate/dees-domtools@2.0.65': + '@design.estate/dees-comms@1.0.30': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/smartdelay': 3.0.5 + broadcast-channel: 7.2.0 + + '@design.estate/dees-domtools@2.3.6': dependencies: '@api.global/typedrequest': 3.1.10 '@design.estate/dees-comms': 1.0.27 - '@push.rocks/lik': 6.1.0 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartjson': 5.2.0 '@push.rocks/smartmarkdown': 3.0.3 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrouter': 1.3.2 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smartstate': 2.0.19 - '@push.rocks/smartstring': 4.0.15 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrouter': 1.3.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstate': 2.0.27 + '@push.rocks/smartstring': 4.1.0 '@push.rocks/smarturl': 3.1.0 '@push.rocks/webrequest': 3.0.37 '@push.rocks/websetup': 3.0.19 '@push.rocks/webstore': 2.0.20 - lit: 3.2.1 + lenis: 1.3.16 + lit: 3.3.1 sweet-scroll: 4.0.0 transitivePeerDependencies: + - '@nuxt/kit' + - react - supports-color + - vue - '@design.estate/dees-element@2.0.39': + '@design.estate/dees-element@2.1.3': dependencies: - '@design.estate/dees-domtools': 2.0.65 + '@design.estate/dees-domtools': 2.3.6 '@push.rocks/isounique': 1.0.5 - '@push.rocks/smartrx': 3.0.7 - lit: 3.2.1 + '@push.rocks/smartrx': 3.0.10 + lit: 3.3.1 transitivePeerDependencies: + - '@nuxt/kit' + - react - supports-color + - vue - '@design.estate/dees-wcctools@1.0.90': + '@design.estate/dees-wcctools@2.0.1': dependencies: - '@design.estate/dees-domtools': 2.0.65 - '@design.estate/dees-element': 2.0.39 + '@design.estate/dees-domtools': 2.3.6 + '@design.estate/dees-element': 2.1.3 '@push.rocks/smartdelay': 3.0.5 - lit: 3.2.1 + lit: 3.3.1 transitivePeerDependencies: + - '@nuxt/kit' + - react - supports-color + - vue - '@esbuild/aix-ppc64@0.23.1': - optional: true - - '@esbuild/aix-ppc64@0.24.0': - optional: true - - '@esbuild/android-arm64@0.23.1': - optional: true - - '@esbuild/android-arm64@0.24.0': - optional: true - - '@esbuild/android-arm@0.23.1': - optional: true - - '@esbuild/android-arm@0.24.0': - optional: true - - '@esbuild/android-x64@0.23.1': - optional: true - - '@esbuild/android-x64@0.24.0': - optional: true - - '@esbuild/darwin-arm64@0.23.1': - optional: true - - '@esbuild/darwin-arm64@0.24.0': - optional: true - - '@esbuild/darwin-x64@0.23.1': - optional: true - - '@esbuild/darwin-x64@0.24.0': - optional: true - - '@esbuild/freebsd-arm64@0.23.1': - optional: true - - '@esbuild/freebsd-arm64@0.24.0': - optional: true - - '@esbuild/freebsd-x64@0.23.1': - optional: true - - '@esbuild/freebsd-x64@0.24.0': - optional: true - - '@esbuild/linux-arm64@0.23.1': - optional: true - - '@esbuild/linux-arm64@0.24.0': - optional: true - - '@esbuild/linux-arm@0.23.1': - optional: true - - '@esbuild/linux-arm@0.24.0': - optional: true - - '@esbuild/linux-ia32@0.23.1': - optional: true - - '@esbuild/linux-ia32@0.24.0': - optional: true - - '@esbuild/linux-loong64@0.23.1': - optional: true - - '@esbuild/linux-loong64@0.24.0': - optional: true - - '@esbuild/linux-mips64el@0.23.1': - optional: true - - '@esbuild/linux-mips64el@0.24.0': - optional: true - - '@esbuild/linux-ppc64@0.23.1': - optional: true - - '@esbuild/linux-ppc64@0.24.0': - optional: true - - '@esbuild/linux-riscv64@0.23.1': - optional: true - - '@esbuild/linux-riscv64@0.24.0': - optional: true - - '@esbuild/linux-s390x@0.23.1': - optional: true - - '@esbuild/linux-s390x@0.24.0': - optional: true - - '@esbuild/linux-x64@0.23.1': - optional: true - - '@esbuild/linux-x64@0.24.0': - optional: true - - '@esbuild/netbsd-x64@0.23.1': - optional: true - - '@esbuild/netbsd-x64@0.24.0': - optional: true - - '@esbuild/openbsd-arm64@0.23.1': - optional: true - - '@esbuild/openbsd-arm64@0.24.0': - optional: true - - '@esbuild/openbsd-x64@0.23.1': - optional: true - - '@esbuild/openbsd-x64@0.24.0': - optional: true - - '@esbuild/sunos-x64@0.23.1': - optional: true - - '@esbuild/sunos-x64@0.24.0': - optional: true - - '@esbuild/win32-arm64@0.23.1': - optional: true - - '@esbuild/win32-arm64@0.24.0': - optional: true - - '@esbuild/win32-ia32@0.23.1': - optional: true - - '@esbuild/win32-ia32@0.24.0': - optional: true - - '@esbuild/win32-x64@0.23.1': - optional: true - - '@esbuild/win32-x64@0.24.0': - optional: true - - '@fortawesome/fontawesome-common-types@6.7.2': {} - - '@fortawesome/fontawesome-svg-core@6.7.2': + '@emnapi/core@1.7.1': dependencies: - '@fortawesome/fontawesome-common-types': 6.7.2 + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true - '@fortawesome/free-brands-svg-icons@6.7.2': + '@emnapi/runtime@1.7.1': dependencies: - '@fortawesome/fontawesome-common-types': 6.7.2 + tslib: 2.8.1 + optional: true - '@fortawesome/free-regular-svg-icons@6.7.2': + '@emnapi/wasi-threads@1.1.0': dependencies: - '@fortawesome/fontawesome-common-types': 6.7.2 + tslib: 2.8.1 + optional: true - '@fortawesome/free-solid-svg-icons@6.7.2': - dependencies: - '@fortawesome/fontawesome-common-types': 6.7.2 + '@esbuild/aix-ppc64@0.27.2': + optional: true - '@git.zone/tsbuild@2.2.0': + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@fortawesome/fontawesome-common-types@7.1.0': {} + + '@fortawesome/fontawesome-svg-core@7.1.0': dependencies: - '@git.zone/tspublish': 1.7.7 + '@fortawesome/fontawesome-common-types': 7.1.0 + + '@fortawesome/free-brands-svg-icons@7.1.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.1.0 + + '@fortawesome/free-regular-svg-icons@7.1.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.1.0 + + '@fortawesome/free-solid-svg-icons@7.1.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.1.0 + + '@git.zone/tsbuild@4.0.2': + dependencies: + '@git.zone/tspublish': 1.11.0 '@push.rocks/early': 4.0.4 - '@push.rocks/smartcli': 4.0.11 + '@push.rocks/smartcli': 4.0.19 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.0.23 - '@push.rocks/smartlog': 3.0.7 - '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 - typescript: 5.6.3 + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + typescript: 5.9.3 transitivePeerDependencies: - aws-crt + - supports-color - '@git.zone/tsbundle@2.1.0': + '@git.zone/tsbundle@2.6.3': dependencies: '@push.rocks/early': 4.0.4 - '@push.rocks/smartcli': 4.0.11 + '@push.rocks/smartcli': 4.0.19 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.0.23 - '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartlog': 3.1.10 '@push.rocks/smartlog-destination-local': 9.0.2 - '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartspawn': 3.0.3 - '@types/html-minifier': 4.0.5 - esbuild: 0.24.0 + '@rspack/core': 1.6.8 + '@types/html-minifier': 4.0.6 + esbuild: 0.27.2 html-minifier: 4.0.0 - typescript: 5.6.3 + rolldown: 1.0.0-beta.52 + typescript: 5.9.3 transitivePeerDependencies: + - '@swc/helpers' - supports-color - '@git.zone/tspublish@1.7.7': + '@git.zone/tspublish@1.11.0': dependencies: - '@push.rocks/smartcli': 4.0.11 + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/npmextra': 5.3.3 + '@push.rocks/smartcli': 4.0.19 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.0.23 - '@push.rocks/smartlog': 3.0.7 - '@push.rocks/smartnpm': 2.0.4 - '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartshell': 3.2.2 + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartnpm': 2.0.6 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartrequest': 5.0.1 + '@push.rocks/smartshell': 3.3.0 transitivePeerDependencies: - aws-crt + - supports-color - '@git.zone/tsrun@1.3.3': + '@git.zone/tsrun@2.0.1': dependencies: - '@push.rocks/smartfile': 11.0.23 + '@push.rocks/smartfile': 13.1.2 '@push.rocks/smartshell': 3.2.2 - tsx: 4.19.2 + tsx: 4.21.0 - '@git.zone/tswatch@2.0.37': + '@git.zone/tswatch@2.3.13(@tiptap/pm@2.27.1)': dependencies: - '@api.global/typedserver': 3.0.51 - '@git.zone/tsbundle': 2.1.0 - '@git.zone/tsrun': 1.3.3 + '@api.global/typedserver': 7.11.1(@tiptap/pm@2.27.1) + '@git.zone/tsbundle': 2.6.3 + '@git.zone/tsrun': 2.0.1 '@push.rocks/early': 4.0.4 - '@push.rocks/lik': 6.1.0 - '@push.rocks/smartchok': 1.0.34 - '@push.rocks/smartcli': 4.0.11 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartcli': 4.0.19 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.0.23 - '@push.rocks/smartlog': 3.0.7 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartlog': 3.1.10 '@push.rocks/smartlog-destination-local': 9.0.2 - '@push.rocks/smartshell': 3.2.2 - '@push.rocks/taskbuffer': 3.1.7 + '@push.rocks/smartshell': 3.3.0 + '@push.rocks/smartwatch': 6.3.0 + '@push.rocks/taskbuffer': 3.5.0 transitivePeerDependencies: + - '@nuxt/kit' + - '@swc/helpers' + - '@tiptap/pm' - bufferutil + - react - supports-color - utf-8-validate + - vue '@happy-dom/global-registrator@15.11.7': dependencies: happy-dom: 15.11.7 + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -3938,14 +3984,39 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@lit-labs/ssr-dom-shim@1.2.1': {} + '@lit-labs/ssr-dom-shim@1.4.0': {} - '@lit/reactive-element@2.0.4': + '@lit/reactive-element@2.1.1': dependencies: - '@lit-labs/ssr-dom-shim': 1.2.1 + '@lit-labs/ssr-dom-shim': 1.4.0 '@mixmark-io/domino@2.2.0': {} + '@module-federation/error-codes@0.21.6': {} + + '@module-federation/runtime-core@0.21.6': + dependencies: + '@module-federation/error-codes': 0.21.6 + '@module-federation/sdk': 0.21.6 + + '@module-federation/runtime-tools@0.21.6': + dependencies: + '@module-federation/runtime': 0.21.6 + '@module-federation/webpack-bundler-runtime': 0.21.6 + + '@module-federation/runtime@0.21.6': + dependencies: + '@module-federation/error-codes': 0.21.6 + '@module-federation/runtime-core': 0.21.6 + '@module-federation/sdk': 0.21.6 + + '@module-federation/sdk@0.21.6': {} + + '@module-federation/webpack-bundler-runtime@0.21.6': + dependencies: + '@module-federation/runtime': 0.21.6 + '@module-federation/sdk': 0.21.6 + '@napi-rs/canvas-android-arm64@0.1.65': optional: true @@ -3990,6 +4061,22 @@ snapshots: '@napi-rs/canvas-win32-x64-msvc': 0.1.65 optional: true + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.1.0': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/types@0.99.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -4009,10 +4096,14 @@ snapshots: dependencies: ansi-256-colors: 1.1.0 + '@push.rocks/consolecolor@2.0.3': + dependencies: + ansi-256-colors: 1.1.0 + '@push.rocks/early@4.0.4': dependencies: '@push.rocks/consolecolor': 2.0.2 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/isohash@2.0.1': dependencies: @@ -4028,10 +4119,10 @@ snapshots: '@push.rocks/smartcache': 1.0.16 '@push.rocks/smartenv': 5.0.12 '@push.rocks/smartexit': 1.0.23 - '@push.rocks/smartfile': 11.0.23 + '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.0.20 '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartstring': 4.0.15 '@push.rocks/smartunique': 3.0.9 '@push.rocks/taskbuffer': 3.1.7 @@ -4043,7 +4134,7 @@ snapshots: dependencies: '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartmatch': 2.0.0 - '@push.rocks/smartpromise': 4.0.3 + '@push.rocks/smartpromise': 4.0.4 '@push.rocks/smartrx': 3.0.7 '@push.rocks/smarttime': 4.0.6 '@types/minimatch': 5.1.2 @@ -4051,6 +4142,17 @@ snapshots: symbol-tree: 3.2.4 '@push.rocks/lik@6.1.0': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smarttime': 4.1.1 + '@types/minimatch': 5.1.2 + '@types/symbol-tree': 3.2.5 + symbol-tree: 3.2.4 + + '@push.rocks/lik@6.2.2': dependencies: '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartmatch': 2.0.0 @@ -4061,6 +4163,18 @@ snapshots: '@types/symbol-tree': 3.2.5 symbol-tree: 3.2.4 + '@push.rocks/npmextra@5.3.3': + dependencies: + '@push.rocks/qenv': 6.1.3 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/taskbuffer': 3.1.7 + '@tsclass/tsclass': 9.3.0 + '@push.rocks/projectinfo@5.0.2': dependencies: '@push.rocks/smartfile': 10.0.41 @@ -4068,27 +4182,38 @@ snapshots: '@push.rocks/smartpromise': 4.0.3 '@push.rocks/smartstring': 4.0.9 - '@push.rocks/smartarchive@3.0.8': + '@push.rocks/qenv@6.1.3': dependencies: - '@push.rocks/smartfile': 10.0.41 - '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrequest': 2.0.23 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smartstream': 2.0.8 + '@api.global/typedrequest': 3.1.10 + '@configvault.io/interfaces': 1.0.17 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpath': 6.0.0 + + '@push.rocks/smartarchive@4.2.4': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 5.0.1 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream': 3.2.5 '@push.rocks/smartunique': 3.0.9 - '@types/gunzip-maybe': 1.4.2 - '@types/tar-stream': 2.2.3 - gunzip-maybe: 1.4.2 - tar: 6.2.1 + '@push.rocks/smarturl': 3.1.0 + '@types/tar-stream': 3.1.4 + fflate: 0.8.2 + file-type: 21.1.1 tar-stream: 3.1.7 + transitivePeerDependencies: + - supports-color '@push.rocks/smartbucket@3.3.7': dependencies: '@aws-sdk/client-s3': 3.715.0 '@push.rocks/smartmime': 2.0.4 '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.7 '@push.rocks/smartstream': 3.2.5 '@push.rocks/smartstring': 4.0.15 @@ -4109,30 +4234,40 @@ snapshots: '@pushrocks/smartpromise': 3.1.10 '@pushrocks/smarttime': 4.0.1 - '@push.rocks/smartchok@1.0.34': + '@push.rocks/smartcli@4.0.19': dependencies: - '@push.rocks/lik': 6.1.0 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 - '@tempfix/watcher': 2.3.0 - - '@push.rocks/smartcli@4.0.11': - dependencies: - '@push.rocks/lik': 6.1.0 - '@push.rocks/smartlog': 3.0.7 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartlog': 3.1.10 '@push.rocks/smartobject': 1.0.12 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + yargs-parser: 22.0.0 + + '@push.rocks/smartclickhouse@2.0.17': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartobject': 1.0.12 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.7 - yargs-parser: 21.1.1 + '@push.rocks/smarturl': 3.1.0 + '@push.rocks/webrequest': 3.0.37 '@push.rocks/smartdelay@3.0.5': dependencies: - '@push.rocks/smartpromise': 4.0.3 + '@push.rocks/smartpromise': 4.0.4 '@push.rocks/smartenv@5.0.12': dependencies: '@push.rocks/smartpromise': 4.0.3 + '@push.rocks/smartenv@5.0.13': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/smartenv@6.0.0': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartexit@1.0.23': dependencies: '@push.rocks/lik': 6.1.0 @@ -4140,11 +4275,10 @@ snapshots: '@push.rocks/smartpromise': 4.0.4 tree-kill: 1.2.2 - '@push.rocks/smartfeed@1.0.11': + '@push.rocks/smartfeed@1.4.0': dependencies: - '@tsclass/tsclass': 3.0.48 - feed: 4.2.2 - rss-parser: 3.13.0 + '@tsclass/tsclass': 9.3.0 + fast-xml-parser: 4.5.1 '@push.rocks/smartfile-interfaces@1.0.7': {} @@ -4158,7 +4292,7 @@ snapshots: '@push.rocks/smartmime': 1.0.6 '@push.rocks/smartpath': 5.0.11 '@push.rocks/smartpromise': 4.0.3 - '@push.rocks/smartrequest': 2.0.21 + '@push.rocks/smartrequest': 5.0.1 '@push.rocks/smartstream': 2.0.8 '@types/fs-extra': 11.0.4 '@types/glob': 8.1.0 @@ -4167,34 +4301,62 @@ snapshots: glob: 10.3.10 js-yaml: 4.1.0 - '@push.rocks/smartfile@11.0.23': + '@push.rocks/smartfile@11.2.7': dependencies: - '@push.rocks/lik': 6.1.0 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile-interfaces': 1.0.7 - '@push.rocks/smarthash': 3.0.4 + '@push.rocks/smarthash': 3.2.6 '@push.rocks/smartjson': 5.0.20 '@push.rocks/smartmime': 2.0.4 - '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrequest': 2.0.23 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 5.0.1 '@push.rocks/smartstream': 3.2.5 '@types/fs-extra': 11.0.4 - '@types/glob': 8.1.0 '@types/js-yaml': 4.0.9 - fs-extra: 11.2.0 - glob: 11.0.0 + fs-extra: 11.3.2 + glob: 11.1.0 js-yaml: 4.1.0 + '@push.rocks/smartfile@13.1.2': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 5.0.1 + '@push.rocks/smartstream': 3.2.5 + '@types/js-yaml': 4.0.9 + glob: 11.1.0 + js-yaml: 4.1.0 + + '@push.rocks/smartfs@1.3.1': + dependencies: + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartguard@3.1.0': dependencies: - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrequest': 2.0.23 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 5.0.1 '@push.rocks/smarthash@3.0.4': dependencies: '@push.rocks/smartjson': 5.0.10 - '@push.rocks/smartpromise': 4.0.3 + '@push.rocks/smartpromise': 4.0.4 + '@types/through2': 2.0.41 + through2: 4.0.2 + + '@push.rocks/smarthash@3.2.6': + dependencies: + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 '@types/through2': 2.0.41 through2: 4.0.2 @@ -4215,6 +4377,13 @@ snapshots: fast-json-stable-stringify: 2.1.0 lodash.clonedeep: 4.5.0 + '@push.rocks/smartjson@5.2.0': + dependencies: + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartstring': 4.1.0 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + '@push.rocks/smartlog-destination-devtools@1.0.12': dependencies: '@push.rocks/smartlog-interfaces': 3.0.2 @@ -4223,17 +4392,25 @@ snapshots: dependencies: '@push.rocks/consolecolor': 2.0.2 '@push.rocks/smartlog-interfaces': 3.0.2 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartlog-interfaces@3.0.2': dependencies: '@api.global/typedrequest-interfaces': 2.0.2 '@tsclass/tsclass': 4.2.0 - '@push.rocks/smartlog@3.0.7': + '@push.rocks/smartlog@3.1.10': dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/isounique': 1.0.5 - '@push.rocks/smartlog-interfaces': 3.0.2 + '@push.rocks/smartclickhouse': 2.0.17 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/webrequest': 3.0.37 + '@tsclass/tsclass': 9.3.0 '@push.rocks/smartmanifest@2.0.2': {} @@ -4267,29 +4444,33 @@ snapshots: file-type: 19.6.0 mime: 4.0.6 - '@push.rocks/smartnpm@2.0.4': + '@push.rocks/smartnpm@2.0.6': dependencies: - '@push.rocks/consolecolor': 2.0.2 + '@push.rocks/consolecolor': 2.0.3 '@push.rocks/levelcache': 3.1.1 - '@push.rocks/smartarchive': 3.0.8 - '@push.rocks/smartfile': 10.0.41 - '@push.rocks/smartpath': 5.0.18 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrequest': 2.0.23 + '@push.rocks/smartarchive': 4.2.4 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 5.0.1 '@push.rocks/smarttime': 4.1.1 '@push.rocks/smartversion': 3.0.5 package-json: 8.1.1 transitivePeerDependencies: - aws-crt + - supports-color '@push.rocks/smartntml@2.0.8': dependencies: - '@design.estate/dees-element': 2.0.39 + '@design.estate/dees-element': 2.1.3 '@happy-dom/global-registrator': 15.11.7 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 fake-indexeddb: 6.0.0 transitivePeerDependencies: + - '@nuxt/kit' + - react - supports-color + - vue '@push.rocks/smartobject@1.0.12': dependencies: @@ -4304,35 +4485,52 @@ snapshots: '@push.rocks/smartpath@5.0.18': {} + '@push.rocks/smartpath@6.0.0': {} + '@push.rocks/smartpromise@4.0.3': {} '@push.rocks/smartpromise@4.0.4': {} - '@push.rocks/smartrequest@2.0.21': - dependencies: - '@push.rocks/smartpromise': 4.0.3 - '@push.rocks/smarturl': 3.0.7 - agentkeepalive: 4.5.0 - form-data: 4.0.0 + '@push.rocks/smartpromise@4.2.3': {} - '@push.rocks/smartrequest@2.0.23': + '@push.rocks/smartrequest@5.0.1': dependencies: - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smarturl': 3.1.0 - agentkeepalive: 4.5.0 - form-data: 4.0.1 + agentkeepalive: 4.6.0 + form-data: 4.0.5 - '@push.rocks/smartrouter@1.3.2': + '@push.rocks/smartrouter@1.3.3': dependencies: - '@push.rocks/lik': 6.1.0 - '@push.rocks/smartrx': 3.0.7 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartrx': 3.0.10 path-to-regexp: 8.2.0 + '@push.rocks/smartrx@3.0.10': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + rxjs: 7.8.1 + '@push.rocks/smartrx@3.0.7': dependencies: - '@push.rocks/smartpromise': 4.0.3 + '@push.rocks/smartpromise': 4.0.4 rxjs: 7.8.1 + '@push.rocks/smartserve@1.4.0': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@cfworker/json-schema': 4.1.1 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpath': 6.0.0 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@push.rocks/smartshell@3.2.2': dependencies: '@push.rocks/smartdelay': 3.0.5 @@ -4342,58 +4540,45 @@ snapshots: tree-kill: 1.2.2 which: 5.0.0 - '@push.rocks/smartsitemap@2.0.3': + '@push.rocks/smartshell@3.3.0': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartexit': 1.0.23 + '@push.rocks/smartpromise': 4.2.3 + '@types/which': 3.0.4 + tree-kill: 1.2.2 + which: 5.0.0 + + '@push.rocks/smartsitemap@2.0.4': dependencies: '@push.rocks/smartcache': 1.0.16 - '@push.rocks/smartfeed': 1.0.11 - '@push.rocks/smartxml': 1.0.8 - '@push.rocks/smartyaml': 2.0.5 - '@push.rocks/webrequest': 3.0.37 - '@tsclass/tsclass': 4.2.0 - - '@push.rocks/smartsocket@2.0.27': - dependencies: - '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedserver': 3.0.51 - '@push.rocks/isohash': 2.0.1 - '@push.rocks/isounique': 1.0.5 - '@push.rocks/lik': 6.1.0 - '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartenv': 5.0.12 - '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartlog': 3.0.7 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smarttime': 4.1.1 - engine.io: 6.5.4 - socket.io: 4.7.5 - socket.io-client: 4.7.5 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + '@push.rocks/smartfeed': 1.4.0 + '@push.rocks/smartxml': 2.0.0 + '@push.rocks/smartyaml': 3.0.4 + '@push.rocks/webrequest': 4.0.1 + '@tsclass/tsclass': 9.3.0 '@push.rocks/smartspawn@3.0.3': dependencies: - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 spawn-wrap: 2.0.0 threads: 1.7.0 tiny-worker: 2.3.0 transitivePeerDependencies: - supports-color - '@push.rocks/smartstate@2.0.19': + '@push.rocks/smartstate@2.0.27': dependencies: - '@push.rocks/isohash': 2.0.1 - '@push.rocks/lik': 6.1.0 - '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 '@push.rocks/webstore': 2.0.20 '@push.rocks/smartstream@2.0.8': dependencies: - '@push.rocks/smartpromise': 4.0.3 + '@push.rocks/smartpromise': 4.0.4 '@push.rocks/smartrx': 3.0.7 '@types/from2': 2.3.5 '@types/through2': 2.0.41 @@ -4402,9 +4587,9 @@ snapshots: '@push.rocks/smartstream@3.2.5': dependencies: - '@push.rocks/lik': 6.1.0 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartenv': 5.0.12 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.7 '@push.rocks/smartstring@4.0.15': @@ -4431,11 +4616,15 @@ snapshots: strip-indent: 4.0.0 url: 0.11.3 + '@push.rocks/smartstring@4.1.0': + dependencies: + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smarttime@4.0.6': dependencies: '@push.rocks/lik': 6.0.12 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartpromise': 4.0.3 + '@push.rocks/smartpromise': 4.0.4 croner: 7.0.5 dayjs: 1.11.10 is-nan: 1.3.2 @@ -4445,7 +4634,7 @@ snapshots: dependencies: '@push.rocks/lik': 6.1.0 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartpromise': 4.2.3 croner: 9.0.0 date-fns: 4.1.0 dayjs: 1.11.13 @@ -4458,8 +4647,6 @@ snapshots: nanoid: 4.0.2 uuid: 9.0.1 - '@push.rocks/smarturl@3.0.7': {} - '@push.rocks/smarturl@3.1.0': {} '@push.rocks/smartversion@3.0.5': @@ -4467,31 +4654,68 @@ snapshots: '@types/semver': 7.5.8 semver: 7.6.3 - '@push.rocks/smartxml@1.0.8': + '@push.rocks/smartwatch@6.3.0': dependencies: - fast-xml-parser: 4.5.1 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + chokidar: 5.0.0 + picomatch: 4.0.3 + + '@push.rocks/smartxml@2.0.0': + dependencies: + fast-xml-parser: 5.3.3 '@push.rocks/smartyaml@2.0.5': dependencies: '@types/js-yaml': 3.12.10 js-yaml: 3.14.1 + '@push.rocks/smartyaml@3.0.4': + dependencies: + yaml: 2.8.2 + '@push.rocks/taskbuffer@3.1.7': dependencies: '@push.rocks/lik': 6.1.0 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.0.7 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 '@push.rocks/smarttime': 4.1.1 '@push.rocks/smartunique': 3.0.9 + '@push.rocks/taskbuffer@3.5.0': + dependencies: + '@design.estate/dees-element': 2.1.3 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartunique': 3.0.9 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + '@push.rocks/webrequest@3.0.37': dependencies: '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 5.0.12 - '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpromise': 4.0.4 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webstore': 2.0.20 + + '@push.rocks/webrequest@4.0.1': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.12 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/webstore': 2.0.20 '@push.rocks/websetup@3.0.19': @@ -4503,11 +4727,11 @@ snapshots: '@push.rocks/webstore@2.0.20': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 - '@push.rocks/lik': 6.1.0 + '@push.rocks/lik': 6.2.2 '@push.rocks/smartenv': 5.0.12 - '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpromise': 4.0.4 - '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 '@tempfix/idb': 8.0.3 fake-indexeddb: 5.0.2 @@ -4596,6 +4820,107 @@ snapshots: is-nan: 1.3.2 pretty-ms: 8.0.0 + '@remirror/core-constants@3.0.0': {} + + '@rolldown/binding-android-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': + dependencies: + '@napi-rs/wasm-runtime': 1.1.0 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.52': {} + + '@rspack/binding-darwin-arm64@1.6.8': + optional: true + + '@rspack/binding-darwin-x64@1.6.8': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.6.8': + optional: true + + '@rspack/binding-linux-arm64-musl@1.6.8': + optional: true + + '@rspack/binding-linux-x64-gnu@1.6.8': + optional: true + + '@rspack/binding-linux-x64-musl@1.6.8': + optional: true + + '@rspack/binding-wasm32-wasi@1.6.8': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.6.8': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.6.8': + optional: true + + '@rspack/binding-win32-x64-msvc@1.6.8': + optional: true + + '@rspack/binding@1.6.8': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.6.8 + '@rspack/binding-darwin-x64': 1.6.8 + '@rspack/binding-linux-arm64-gnu': 1.6.8 + '@rspack/binding-linux-arm64-musl': 1.6.8 + '@rspack/binding-linux-x64-gnu': 1.6.8 + '@rspack/binding-linux-x64-musl': 1.6.8 + '@rspack/binding-wasm32-wasi': 1.6.8 + '@rspack/binding-win32-arm64-msvc': 1.6.8 + '@rspack/binding-win32-ia32-msvc': 1.6.8 + '@rspack/binding-win32-x64-msvc': 1.6.8 + + '@rspack/core@1.6.8': + dependencies: + '@module-federation/runtime-tools': 0.21.6 + '@rspack/binding': 1.6.8 + '@rspack/lite-tapable': 1.1.0 + + '@rspack/lite-tapable@1.1.0': {} + '@sec-ant/readable-stream@0.4.1': {} '@signature.digital/tools@1.1.0': @@ -4935,7 +5260,24 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 - '@socket.io/component-emitter@3.1.2': {} + '@svgdotjs/svg.draggable.js@3.0.6(@svgdotjs/svg.js@3.2.5)': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + + '@svgdotjs/svg.filter.js@3.0.9': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + + '@svgdotjs/svg.js@3.2.5': {} + + '@svgdotjs/svg.resize.js@2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5))': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) + + '@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)': + dependencies: + '@svgdotjs/svg.js': 3.2.5 '@szmarczak/http-timer@5.0.1': dependencies: @@ -4943,24 +5285,175 @@ snapshots: '@tempfix/idb@8.0.3': {} - '@tempfix/watcher@2.3.0': + '@tiptap/core@2.27.1(@tiptap/pm@2.27.1)': dependencies: - stubborn-fs: 1.2.5 + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-blockquote@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-bold@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-bullet-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-code-block@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-code@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-document@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-dropcursor@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-gapcursor@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-hard-break@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-heading@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-history@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-horizontal-rule@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-italic@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-link@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + linkifyjs: 4.3.2 + + '@tiptap/extension-list-item@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-ordered-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-paragraph@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-strike@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-text-align@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-text-style@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-text@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-typography@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-underline@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/pm@2.27.1': + dependencies: + prosemirror-changeset: 2.3.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.0 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.3 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4) + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + '@tiptap/starter-kit@2.27.1': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/extension-blockquote': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-bold': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-bullet-list': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-code': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-code-block': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-document': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-dropcursor': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-gapcursor': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-hard-break': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-heading': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-history': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-horizontal-rule': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-italic': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-list-item': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-ordered-list': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-paragraph': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-strike': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-text': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-text-style': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/pm': 2.27.1 + + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.1 + transitivePeerDependencies: + - supports-color '@tokenizer/token@0.3.0': {} - '@tsclass/tsclass@3.0.48': - dependencies: - type-fest: 2.19.0 - '@tsclass/tsclass@4.2.0': dependencies: type-fest: 4.30.2 - '@types/body-parser@1.19.5': + '@tsclass/tsclass@9.3.0': dependencies: - '@types/connect': 3.4.38 - '@types/node': 22.10.2 + type-fest: 4.41.0 + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true '@types/buffer-json@2.0.3': {} @@ -4969,34 +5462,10 @@ snapshots: '@types/node': 22.10.2 source-map: 0.6.1 - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.10.2 - - '@types/cookie@0.4.1': {} - - '@types/cors@2.8.17': - dependencies: - '@types/node': 22.10.2 - '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - '@types/express-serve-static-core@4.19.6': - dependencies: - '@types/node': 22.10.2 - '@types/qs': 6.9.17 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.17 - '@types/serve-static': 1.15.7 - '@types/from2@2.3.5': dependencies: '@types/node': 20.10.0 @@ -5011,15 +5480,11 @@ snapshots: '@types/minimatch': 5.1.2 '@types/node': 20.10.0 - '@types/gunzip-maybe@1.4.2': - dependencies: - '@types/node': 22.10.2 - '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 - '@types/html-minifier@4.0.5': + '@types/html-minifier@4.0.6': dependencies: '@types/clean-css': 4.2.11 '@types/relateurl': 0.2.33 @@ -5027,8 +5492,6 @@ snapshots: '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.4': {} - '@types/js-yaml@3.12.10': {} '@types/js-yaml@4.0.9': {} @@ -5037,13 +5500,20 @@ snapshots: dependencies: '@types/node': 20.10.0 + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/mime-types@2.1.4': {} + '@types/mdurl@2.0.0': {} - '@types/mime@1.3.5': {} + '@types/mime-types@2.1.4': {} '@types/minimatch@5.1.2': {} @@ -5057,30 +5527,15 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/qs@6.9.17': {} - '@types/randomatic@3.1.5': {} - '@types/range-parser@1.2.7': {} - '@types/relateurl@0.2.33': {} '@types/semver@7.5.8': {} - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 22.10.2 - - '@types/serve-static@1.15.7': - dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.10.2 - '@types/send': 0.17.4 - '@types/symbol-tree@3.2.5': {} - '@types/tar-stream@2.2.3': + '@types/tar-stream@3.1.4': dependencies: '@types/node': 22.10.2 @@ -5108,12 +5563,7 @@ snapshots: '@yr/monotone-cubic-spline@1.0.3': {} - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - agentkeepalive@4.5.0: + agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 @@ -5129,15 +5579,14 @@ snapshots: ansi-styles@6.2.1: {} - apexcharts@3.54.1: + apexcharts@5.3.6: dependencies: + '@svgdotjs/svg.draggable.js': 3.0.6(@svgdotjs/svg.js@3.2.5) + '@svgdotjs/svg.filter.js': 3.0.9 + '@svgdotjs/svg.js': 3.2.5 + '@svgdotjs/svg.resize.js': 2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)) + '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) '@yr/monotone-cubic-spline': 1.0.3 - svg.draggable.js: 2.2.2 - svg.easing.js: 2.0.0 - svg.filter.js: 2.0.2 - svg.pathmorphing.js: 0.1.3 - svg.resize.js: 1.4.3 - svg.select.js: 3.0.1 argparse@1.0.10: dependencies: @@ -5145,8 +5594,6 @@ snapshots: argparse@2.0.1: {} - array-flatten@1.1.1: {} - asynckit@0.4.0: {} b4a@1.6.7: {} @@ -5160,25 +5607,6 @@ snapshots: base64-js@1.5.1: {} - base64id@2.0.0: {} - - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - bowser@2.11.0: {} brace-expansion@1.1.11: @@ -5197,11 +5625,12 @@ snapshots: p-queue: 6.6.2 unload: 2.4.1 - browserify-zlib@0.1.4: + broadcast-channel@7.2.0: dependencies: - pako: 0.2.9 - - buffer-from@1.1.2: {} + '@babel/runtime': 7.28.4 + oblivious-set: 2.0.0 + p-queue: 6.6.2 + unload: 2.4.1 buffer-json@2.0.0: {} @@ -5210,8 +5639,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bytes@3.1.2: {} - cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -5255,7 +5682,9 @@ snapshots: character-entities@2.0.2: {} - chownr@2.0.0: {} + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 clean-css@4.2.4: dependencies: @@ -5284,24 +5713,9 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - cookie-signature@1.0.6: {} - - cookie@0.4.2: {} - - cookie@0.7.1: {} - core-util-is@1.0.3: {} - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 + crelt@1.0.6: {} croner@5.7.0: {} @@ -5331,15 +5745,11 @@ snapshots: dayjs@1.11.13: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.3: dependencies: ms: 2.1.3 @@ -5371,12 +5781,8 @@ snapshots: delayed-stream@1.0.0: {} - depd@2.0.0: {} - dequal@2.0.3: {} - destroy@1.2.0: {} - devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -5387,62 +5793,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - eastasianwidth@0.2.0: {} - ee-first@1.1.1: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - encodeurl@1.0.2: {} - - encodeurl@2.0.0: {} - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - - engine.io-client@6.5.4: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - engine.io-parser: 5.2.3 - ws: 8.17.1 - xmlhttprequest-ssl: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - engine.io-parser@5.2.3: {} - - engine.io@6.5.4: - dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.17 - '@types/node': 22.10.2 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.4.2 - cors: 2.8.5 - debug: 4.3.7 - engine.io-parser: 5.2.3 - ws: 8.11.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - entities@2.2.0: {} - entities@4.5.0: {} es-define-property@1.0.1: {} @@ -5453,61 +5809,43 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild@0.23.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + has-tostringtag: 1.0.2 + hasown: 2.0.2 - esbuild@0.24.0: + esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 - escape-html@1.0.3: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -5515,50 +5853,8 @@ snapshots: esprima@4.0.1: {} - etag@1.8.1: {} - eventemitter3@4.0.7: {} - express-force-ssl@0.3.2: - dependencies: - lodash.assign: 3.2.0 - - express@4.21.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - extend@3.0.2: {} fake-indexeddb@5.0.2: {} @@ -5579,13 +5875,15 @@ snapshots: dependencies: strnum: 1.0.5 + fast-xml-parser@5.3.3: + dependencies: + strnum: 2.1.2 + fault@2.0.1: dependencies: format: 0.2.2 - feed@4.2.2: - dependencies: - xml-js: 1.6.11 + fflate@0.8.2: {} file-type@19.6.0: dependencies: @@ -5594,15 +5892,12 @@ snapshots: token-types: 6.0.0 uint8array-extras: 1.4.0 - finalhandler@1.3.1: + file-type@21.1.1: dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.4 + token-types: 6.1.1 + uint8array-extras: 1.4.0 transitivePeerDependencies: - supports-color @@ -5616,31 +5911,23 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 form-data-encoder@2.1.4: {} - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@4.0.1: + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 format@0.2.2: {} - forwarded@0.2.0: {} - - fresh@0.5.2: {} - from2@2.3.0: dependencies: inherits: 2.0.4 @@ -5652,16 +5939,12 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.2.0: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -5708,11 +5991,11 @@ snapshots: minipass: 7.0.4 path-scurry: 1.10.1 - glob@11.0.0: + glob@11.1.0: dependencies: - foreground-child: 3.3.0 - jackspeak: 4.0.2 - minimatch: 10.0.1 + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -5750,15 +6033,6 @@ snapshots: graceful-fs@4.2.11: {} - gunzip-maybe@1.4.2: - dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - happy-dom@15.11.7: dependencies: entities: 4.5.0 @@ -5775,6 +6049,10 @@ snapshots: has-symbols@1.1.0: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasown@2.0.0: dependencies: function-bind: 1.1.2 @@ -5809,7 +6087,7 @@ snapshots: he@1.2.0: {} - highlight.js@11.10.0: {} + highlight.js@11.11.1: {} html-minifier@4.0.0: dependencies: @@ -5825,14 +6103,6 @@ snapshots: http-cache-semantics@4.1.1: {} - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -5844,10 +6114,6 @@ snapshots: ibantools@4.5.1: {} - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - ieee754@1.2.1: {} inflight@1.0.6: @@ -5859,16 +6125,10 @@ snapshots: ini@1.3.8: {} - ipaddr.js@1.9.1: {} - - is-deflate@1.0.0: {} - is-docker@2.2.1: {} is-fullwidth-code-point@3.0.0: {} - is-gzip@1.0.0: {} - is-nan@1.3.2: dependencies: call-bind: 1.0.5 @@ -5900,7 +6160,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.0.2: + jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 @@ -5931,61 +6191,32 @@ snapshots: kind-of@6.0.3: {} - lit-element@4.1.1: - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.1 - '@lit/reactive-element': 2.0.4 - lit-html: 3.2.1 + lenis@1.3.16: {} - lit-html@3.2.1: + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.3.2: {} + + lit-element@4.2.1: + dependencies: + '@lit-labs/ssr-dom-shim': 1.4.0 + '@lit/reactive-element': 2.1.1 + lit-html: 3.3.1 + + lit-html@3.3.1: dependencies: '@types/trusted-types': 2.0.7 - lit@3.2.1: + lit@3.3.1: dependencies: - '@lit/reactive-element': 2.0.4 - lit-element: 4.1.1 - lit-html: 3.2.1 - - lodash._baseassign@3.2.0: - dependencies: - lodash._basecopy: 3.0.1 - lodash.keys: 3.1.2 - - lodash._basecopy@3.0.1: {} - - lodash._bindcallback@3.0.1: {} - - lodash._createassigner@3.1.1: - dependencies: - lodash._bindcallback: 3.0.1 - lodash._isiterateecall: 3.0.9 - lodash.restparam: 3.6.1 - - lodash._getnative@3.9.1: {} - - lodash._isiterateecall@3.0.9: {} - - lodash.assign@3.2.0: - dependencies: - lodash._baseassign: 3.2.0 - lodash._createassigner: 3.1.1 - lodash.keys: 3.1.2 + '@lit/reactive-element': 2.1.1 + lit-element: 4.2.1 + lit-html: 3.3.1 lodash.clonedeep@4.5.0: {} - lodash.isarguments@3.1.0: {} - - lodash.isarray@3.0.4: {} - - lodash.keys@3.1.2: - dependencies: - lodash._getnative: 3.9.1 - lodash.isarguments: 3.1.0 - lodash.isarray: 3.0.4 - - lodash.restparam@3.6.1: {} - longest-streak@3.1.0: {} lower-case@1.1.4: {} @@ -5996,6 +6227,8 @@ snapshots: lru-cache@11.0.2: {} + lucide@0.560.0: {} + make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -6006,6 +6239,15 @@ snapshots: make-error@1.3.6: {} + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + markdown-table@3.0.4: {} matcher@5.0.0: @@ -6141,11 +6383,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - media-typer@0.3.0: {} - - merge-descriptors@1.0.3: {} - - methods@1.1.2: {} + mdurl@2.0.0: {} micromark-core-commonmark@2.0.2: dependencies: @@ -6351,8 +6589,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mime@1.6.0: {} - mime@4.0.6: {} mimic-response@3.1.0: {} @@ -6361,9 +6597,9 @@ snapshots: min-indent@1.0.1: {} - minimatch@10.0.1: + minimatch@10.1.1: dependencies: - brace-expansion: 2.0.1 + '@isaacs/brace-expansion': 5.0.0 minimatch@3.1.2: dependencies: @@ -6379,33 +6615,16 @@ snapshots: minimist@1.2.8: {} - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.0.4: {} minipass@7.1.2: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mkdirp@1.0.4: {} - monaco-editor@0.52.2: {} - ms@2.0.0: {} - ms@2.1.3: {} nanoid@4.0.2: {} - negotiator@0.6.3: {} - no-case@2.3.2: dependencies: lower-case: 1.1.4 @@ -6416,8 +6635,6 @@ snapshots: normalize-url@8.0.1: {} - object-assign@4.1.1: {} - object-inspect@1.13.1: {} object-inspect@1.13.3: {} @@ -6426,11 +6643,9 @@ snapshots: oblivious-set@1.4.0: {} - observable-fns@0.6.1: {} + oblivious-set@2.0.0: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 + observable-fns@0.6.1: {} once@1.4.0: dependencies: @@ -6442,6 +6657,8 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + orderedmap@2.1.1: {} + p-cancelable@3.0.0: {} p-finally@1.0.0: {} @@ -6464,8 +6681,6 @@ snapshots: registry-url: 6.0.1 semver: 7.6.3 - pako@0.2.9: {} - param-case@2.1.1: dependencies: no-case: 2.3.2 @@ -6474,8 +6689,6 @@ snapshots: parse-ms@4.0.0: {} - parseurl@1.3.3: {} - path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -6490,21 +6703,15 @@ snapshots: lru-cache: 11.0.2 minipass: 7.1.2 - path-to-regexp@0.1.12: {} - path-to-regexp@8.2.0: {} - pdfjs-dist@4.9.155: + pdfjs-dist@4.10.38: optionalDependencies: '@napi-rs/canvas': 0.1.65 peek-readable@5.3.1: {} - peek-stream@1.1.3: - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 + picomatch@4.0.3: {} pretty-ms@8.0.0: dependencies: @@ -6518,23 +6725,112 @@ snapshots: property-information@6.5.0: {} + prosemirror-changeset@2.3.1: + dependencies: + prosemirror-transform: 1.10.5 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.4 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + prosemirror-gapcursor@1.4.0: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + + prosemirror-history@1.5.0: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-keymap@1.2.3: + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.2: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.25.4 + + prosemirror-menu@1.2.5: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.5.0 + prosemirror-state: 1.4.4 + + prosemirror-model@1.25.4: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-state@1.4.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + prosemirror-tables@1.8.3: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + + prosemirror-transform@1.10.5: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-view@1.41.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + proto-list@1.2.4: {} - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - pump@2.0.1: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - pumpify@1.5.1: - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 + punycode.js@2.3.1: {} punycode@1.4.1: {} @@ -6542,10 +6838,6 @@ snapshots: dependencies: side-channel: 1.0.4 - qs@6.13.0: - dependencies: - side-channel: 1.1.0 - qs@6.13.1: dependencies: side-channel: 1.1.0 @@ -6560,15 +6852,6 @@ snapshots: kind-of: 6.0.3 math-random: 1.0.4 - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -6592,6 +6875,8 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdirp@5.0.0: {} + regenerator-runtime@0.14.1: {} registry-auth-token@5.0.3: @@ -6661,10 +6946,27 @@ snapshots: dependencies: glob: 7.2.3 - rss-parser@3.13.0: + rolldown@1.0.0-beta.52: dependencies: - entities: 2.2.0 - xml2js: 0.5.0 + '@oxc-project/types': 0.99.0 + '@rolldown/pluginutils': 1.0.0-beta.52 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-x64': 1.0.0-beta.52 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.52 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.52 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.52 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.52 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.52 + + rope-sequence@1.3.4: {} rxjs@7.8.1: dependencies: @@ -6674,41 +6976,10 @@ snapshots: safe-buffer@5.2.1: {} - safer-buffer@2.1.2: {} - - sax@1.4.1: {} - semver@6.3.1: {} semver@7.6.3: {} - send@0.19.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - set-function-length@1.1.1: dependencies: define-data-property: 1.1.1 @@ -6716,8 +6987,6 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.1 - setprototypeof@1.2.0: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -6762,48 +7031,7 @@ snapshots: signal-exit@4.1.0: {} - signature_pad@5.0.4: {} - - socket.io-adapter@2.5.5: - dependencies: - debug: 4.3.7 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-client@4.7.5: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - engine.io-client: 6.5.4 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-parser@4.2.4: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - socket.io@4.7.5: - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.5 - debug: 4.3.7 - engine.io: 6.5.4 - socket.io-adapter: 2.5.5 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + signature_pad@5.1.3: {} source-map@0.6.1: {} @@ -6820,10 +7048,6 @@ snapshots: sprintf-js@1.0.3: {} - statuses@2.0.1: {} - - stream-shift@1.0.3: {} - streamx@2.21.1: dependencies: fast-fifo: 1.3.2 @@ -6873,44 +7097,17 @@ snapshots: strnum@1.0.5: {} + strnum@2.1.2: {} + + strtok3@10.3.4: + dependencies: + '@tokenizer/token': 0.3.0 + strtok3@9.1.1: dependencies: '@tokenizer/token': 0.3.0 peek-readable: 5.3.1 - stubborn-fs@1.2.5: {} - - svg.draggable.js@2.2.2: - dependencies: - svg.js: 2.7.1 - - svg.easing.js@2.0.0: - dependencies: - svg.js: 2.7.1 - - svg.filter.js@2.0.2: - dependencies: - svg.js: 2.7.1 - - svg.js@2.7.1: {} - - svg.pathmorphing.js@0.1.3: - dependencies: - svg.js: 2.7.1 - - svg.resize.js@1.4.3: - dependencies: - svg.js: 2.7.1 - svg.select.js: 2.1.2 - - svg.select.js@2.1.2: - dependencies: - svg.js: 2.7.1 - - svg.select.js@3.0.1: - dependencies: - svg.js: 2.7.1 - sweet-scroll@4.0.0: {} symbol-tree@3.2.4: {} @@ -6921,15 +7118,6 @@ snapshots: fast-fifo: 1.3.2 streamx: 2.21.1 - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - text-decoder@1.2.3: dependencies: b4a: 1.6.7 @@ -6945,11 +7133,6 @@ snapshots: transitivePeerDependencies: - supports-color - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - through2@4.0.2: dependencies: readable-stream: 3.6.2 @@ -6958,13 +7141,17 @@ snapshots: dependencies: esm: 3.2.25 - toidentifier@1.0.1: {} - token-types@6.0.0: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + token-types@6.1.1: + dependencies: + '@borewit/text-codec': 0.1.1 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -6975,9 +7162,9 @@ snapshots: tslib@2.8.1: {} - tsx@4.19.2: + tsx@4.21.0: dependencies: - esbuild: 0.23.1 + esbuild: 0.27.2 get-tsconfig: 4.8.1 optionalDependencies: fsevents: 2.3.3 @@ -6992,12 +7179,11 @@ snapshots: type-fest@4.30.2: {} - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 + type-fest@4.41.0: {} - typescript@5.6.3: {} + typescript@5.9.3: {} + + uc.micro@2.1.0: {} uglify-js@3.19.3: {} @@ -7044,8 +7230,6 @@ snapshots: unload@2.4.1: {} - unpipe@1.0.0: {} - upper-case@1.1.3: {} url@0.11.3: @@ -7060,12 +7244,8 @@ snapshots: util-deprecate@1.0.2: {} - utils-merge@1.0.1: {} - uuid@9.0.1: {} - vary@1.1.2: {} - vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -7076,6 +7256,8 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + w3c-keyname@2.2.8: {} + webidl-conversions@7.0.0: {} whatwg-mimetype@3.0.0: {} @@ -7102,24 +7284,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.11.0: {} - - ws@8.17.1: {} - - xml-js@1.6.11: - dependencies: - sax: 1.4.1 - - xml2js@0.5.0: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} - - xmlhttprequest-ssl@2.0.0: {} - - xtend@4.0.2: {} + ws@8.18.3: {} xterm-addon-fit@0.8.0(xterm@5.3.0): dependencies: @@ -7127,8 +7292,8 @@ snapshots: xterm@5.3.0: {} - yallist@4.0.0: {} + yaml@2.8.2: {} - yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} zwitch@2.0.4: {} diff --git a/readme.md b/readme.md index bb6e581..ca03b43 100644 --- a/readme.md +++ b/readme.md @@ -1,164 +1,176 @@ # @signature.digital/catalog -A catalog containing components for e-signing, built using modern web technologies for seamless integration and functionality. + +A comprehensive catalog of customizable web components designed for building and managing e-signature applications. Built with modern web technologies using LitElement and TypeScript. + +## Issue Reporting and Security + +For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly. ## Install -To add `@signature.digital/catalog` to your project, run the following command in your terminal: ```shell npm install @signature.digital/catalog +# or +pnpm install @signature.digital/catalog ``` -This command will install `@signature.digital/catalog` along with its required peer dependencies. Ensure that your project is set up for ECMAScript Modules (ESM). +## 🎯 Overview -## Usage +This package provides three main components for e-signature workflows: -The `@signature.digital/catalog` package provides a set of web components specifically designed for building e-signature applications. These components can be used for capturing, displaying, and managing electronic signatures. The primary components offered in this package include `SignPad`, `SignBox`, and `ContractEditor`. +| Component | Tag | Description | +|-----------|-----|-------------| +| **SignPad** | `` | Canvas-based signature capture pad | +| **SignBox** | `` | Complete signing interface with controls | +| **ContractEditor** | `` | Contract document management component | -### Setting Up the Environment +## 📦 Usage -To make the most of `@signature.digital/catalog`, you'll want to ensure you have your environment ready to use web components. If you're using a standard web setup with a module bundler like Webpack, Rollup, or Vite, make sure your build process supports ECMAScript modules. - -### Basic Example of `SignPad` - -The `SignPad` component is a customizable signature pad that can be used to capture user signatures. Here's how to implement it in your HTML: +### Basic Import ```typescript -import '@signature.digital/catalog/element'; - -class MySignatureComponent extends HTMLElement { - connectedCallback() { - this.innerHTML = ''; - } -} - -customElements.define('my-signature-component', MySignatureComponent); +import '@signature.digital/catalog'; ``` -In this example, a simple HTML element is constructed that includes the `sdig-signpad` custom element. This signature pad allows users to draw their signatures directly in the browser. +This registers all custom elements and makes them available for use in your HTML. -### Advanced Usage with `SignBox` +### SignPad Component -The `SignBox` component wraps `SignPad` with additional controls for signing actions like clear and undo. This provides a complete signing interface out of the box. +The `` is a canvas-based signature capture component that allows users to draw their signatures directly in the browser. -```typescript -import '@signature.digital/catalog/element'; - -class MyCompleteSignatureBox extends HTMLElement { - connectedCallback() { - this.innerHTML = ``; - this.querySelector('sdig-signbox').addEventListener('signature', (e) => { - const signatureData = e.detail.signature; - console.log('Signature data:', signatureData); - }); - } -} - -customElements.define('my-complete-signature-box', MyCompleteSignatureBox); +```html + ``` -In this setup, `SignBox` also manages the signature data and emits a custom event once the signature is submitted. You can listen for this event to gather the signature data for storage or further processing. - -### Integrating `ContractEditor` - -ContractEditor allows for manipulating contract details and integrating signature capabilities directly into documents. This component communicates with its state using Smartstate, an inbuilt state management system. +**API Methods:** ```typescript -import '@signature.digital/catalog/element'; -import { IPortableContract } from '@signature.digital/tools/interfaces'; +const signpad = document.querySelector('sdig-signpad'); -class MyContractEditor extends HTMLElement { - editContract(contract: IPortableContract) { - const editor = this.querySelector('sdig-contracteditor'); - editor.contract = contract; - } - - connectedCallback() { - this.innerHTML = ``; - } -} +// Get signature data as point arrays +const data = await signpad.toData(); -customElements.define('my-contract-editor', MyContractEditor); +// Load signature from data +await signpad.fromData(data); + +// Export signature as SVG string +const svg = await signpad.toSVG(); + +// Undo last stroke +await signpad.undo(); + +// Clear the signature pad +await signpad.clear(); ``` -`ContractEditor` can be dynamically updated by changing the `contract` property. This component expects contract definitions compatible with the `IPortableContract` interface, offering an adaptable and customizable editing solution. +### SignBox Component -### Example Application +The `` wraps `SignPad` with a complete UI including Clear, Undo, and Submit buttons. -Below is an integrated example showing how all of these components can be put together to form a basic signature application. - -```typescript -import '@signature.digital/catalog/element'; -import { IPortableContract } from '@signature.digital/tools/interfaces'; -import { demoContract } from '@signature.digital/tools/demodata'; - -class CombinedSignatureApp extends HTMLElement { - - private contract: IPortableContract = demoContract; - - constructor() { - super(); - } - - render() { - this.innerHTML = ` - - - `; - this.querySelector('my-contract-editor').editContract(this.contract); - } - - connectedCallback() { - this.render(); - } -} - -customElements.define('combined-signature-app', CombinedSignatureApp); +```html + ``` -In a real-world scenario, `CombinedSignatureApp` could be binding multiple processes around collecting and displaying signatures, including validation logic, storage mechanisms, and user feedback systems. - -### Handling Signatures - -Once you have a user signature, you can convert it between different formats like `Data`, `SVG` or simply clear or undo modifications. Here is how you can handle these activities within your JavaScript: +**Events:** ```typescript -document.querySelector('sdig-signpad').addEventListener('signature', async (event) => { - const signaturePad = event.target as SignPad; - - console.log(await signaturePad.toData()); // Get signature data - console.log(await signaturePad.toSVG()); // Convert to SVG +const signbox = document.querySelector('sdig-signbox'); - await signaturePad.undo(); // Undo last action - await signaturePad.clear(); // Clear the signature pad +signbox.addEventListener('signature', (event) => { + const signatureData = event.detail.signature; + console.log('Signature captured:', signatureData); }); ``` -This versatile use of `sdig-signpad` demonstrates how diverse use case scenarios for signatures can be developed, be it collecting, transforming, or editing current user inputs. +### ContractEditor Component -### Responsive Design Considerations - -When building applications that include e-signature capabilities, you must ensure your components respond well to different screen sizes. Components in `@signature.digital/catalog` are designed with CSS variables and flexible dimensions, but specific implementations can benefit from additional CSS media queries. - -### Custom Styling - -Each component is styled using Light DOM scoped styles. Components like `sdig-signpad` come with default styles, but they are capable of overriding these styles for consistent design alignment within your project. For example: +The `` provides contract viewing and editing capabilities using the `IPortableContract` interface from `@signature.digital/tools`. ```typescript -const style = document.createElement('style'); -style.textContent = ` - sdig-signpad, sdig-signbox { - --main-background-color: #fff; - --line-color: #000; - --button-color: #007bff; - } -`; +import '@signature.digital/catalog'; +import { IPortableContract } from '@signature.digital/tools/interfaces'; +import { demoContract } from '@signature.digital/tools/demodata'; -document.head.appendChild(style); +const editor = document.querySelector('sdig-contracteditor'); +editor.contract = demoContract; ``` -These CSS custom properties modify component styles, from appearance to behavior, creating a cohesive look with the rest of your site's aesthetics. +## 🔧 Integration Example -### Conclusion +Here's a complete example showing all components working together: -With `@signature.digital/catalog`, developers have a comprehensive toolkit for integrating sophisticated e-signature functionalities into their web applications. Its wide array of customizable components, flexibility, and ease of use out of the box makes it an indispensable inclusion for building modern digital signature workflows. Whether for simple signature capture or complex contract management, this package has you covered. Explore more advanced topics and extend the capabilities to fit unique business needs in your applications. -undefined \ No newline at end of file +```typescript +import '@signature.digital/catalog'; +import { LitElement, html, css } from 'lit'; +import { customElement } from 'lit/decorators.js'; + +@customElement('my-signature-app') +class MySignatureApp extends LitElement { + static styles = css` + :host { + display: block; + max-width: 800px; + margin: 0 auto; + } + `; + + render() { + return html` +

Please sign below

+ + `; + } + + private handleSignature(e: CustomEvent) { + console.log('Signature submitted:', e.detail.signature); + // Process or store the signature + } +} +``` + +## 🎨 Theming + +Components support automatic light/dark theme detection and can be customized using CSS custom properties: + +```css +sdig-signpad, sdig-signbox { + --main-background-color: #ffffff; + --line-color: #000000; + --button-color: #007bff; +} +``` + +The components use `cssManager.bdTheme()` for automatic theme switching based on system preferences. + +## 📋 Requirements + +- Modern browser with Custom Elements V1 support +- ECMAScript Modules (ESM) compatible environment +- TypeScript 5.0+ (for development) + +## 🔗 Dependencies + +- `@design.estate/dees-element` - LitElement-based component framework +- `@signature.digital/tools` - Contract interfaces and demo data +- `signature_pad` - Canvas signature capture library + +## License and Legal Information + +This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file. + +**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file. + +### Trademarks + +This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein. + +Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar. + +### Company Information + +Task Venture Capital GmbH +Registered at District Court Bremen HRB 35230 HB, Germany + +For any legal inquiries or further information, please contact us via email at hello@task.vc. + +By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works. diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts index 9583c22..66d8e8f 100644 --- a/ts_web/00_commitinfo_data.ts +++ b/ts_web/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@signature.digital/catalog', - version: '1.0.59', + version: '1.1.0', description: 'A comprehensive catalog of customizable web components designed for building and managing e-signature applications.' } diff --git a/ts_web/elements/index.ts b/ts_web/elements/index.ts index 2cfc537..873bd7a 100644 --- a/ts_web/elements/index.ts +++ b/ts_web/elements/index.ts @@ -1,3 +1,17 @@ -export * from './sdig-contracteditor.js'; -export * from './sdig-signbox.js'; -export * from './sdig-signpad.js'; +// Contract Editor (main module) +export * from './sdig-contracteditor/index.js'; + +// Contract sub-components +export * from './sdig-contract-header/index.js'; +export * from './sdig-contract-metadata/index.js'; +export * from './sdig-contract-parties/index.js'; +export * from './sdig-contract-content/index.js'; +export * from './sdig-contract-terms/index.js'; +export * from './sdig-contract-signatures/index.js'; +export * from './sdig-contract-attachments/index.js'; +export * from './sdig-contract-collaboration/index.js'; +export * from './sdig-contract-audit/index.js'; + +// Signature components +export * from './sdig-signbox/index.js'; +export * from './sdig-signpad/index.js'; diff --git a/ts_web/elements/sdig-contract-attachments/index.ts b/ts_web/elements/sdig-contract-attachments/index.ts new file mode 100644 index 0000000..a742952 --- /dev/null +++ b/ts_web/elements/sdig-contract-attachments/index.ts @@ -0,0 +1 @@ +export * from './sdig-contract-attachments.js'; diff --git a/ts_web/elements/sdig-contract-attachments/sdig-contract-attachments.ts b/ts_web/elements/sdig-contract-attachments/sdig-contract-attachments.ts new file mode 100644 index 0000000..5f902ed --- /dev/null +++ b/ts_web/elements/sdig-contract-attachments/sdig-contract-attachments.ts @@ -0,0 +1,806 @@ +/** + * @file sdig-contract-attachments.ts + * @description Contract attachments and prior contracts manager + */ + +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + state, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contract-attachments': SdigContractAttachments; + } +} + +// Attachment interface +interface IAttachment { + id: string; + name: string; + type: 'document' | 'image' | 'spreadsheet' | 'pdf' | 'other'; + mimeType: string; + size: number; + uploadedAt: number; + uploadedBy: string; + description?: string; + url?: string; +} + +// File type configuration +const FILE_TYPES = { + document: { icon: 'lucide:file-text', color: '#3b82f6', label: 'Document' }, + image: { icon: 'lucide:image', color: '#10b981', label: 'Image' }, + spreadsheet: { icon: 'lucide:sheet', color: '#22c55e', label: 'Spreadsheet' }, + pdf: { icon: 'lucide:file-type', color: '#ef4444', label: 'PDF' }, + other: { icon: 'lucide:file', color: '#6b7280', label: 'File' }, +}; + +@customElement('sdig-contract-attachments') +export class SdigContractAttachments extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + } + + .attachments-container { + display: flex; + flex-direction: column; + gap: 24px; + } + + /* Section card */ + .section-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + overflow: hidden; + } + + .section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .section-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .section-title dees-icon { + font-size: 18px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .section-count { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .section-content { + padding: 20px; + } + + /* Upload zone */ + .upload-zone { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 20px; + border: 2px dashed ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 12px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + cursor: pointer; + transition: all 0.15s ease; + } + + .upload-zone:hover { + border-color: ${cssManager.bdTheme('#9ca3af', '#52525b')}; + background: ${cssManager.bdTheme('#f3f4f6', '#18181b')}; + } + + .upload-zone.dragging { + border-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + background: ${cssManager.bdTheme('#eff6ff', '#172554')}; + } + + .upload-zone-icon { + width: 64px; + height: 64px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + font-size: 28px; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + margin-bottom: 16px; + } + + .upload-zone-title { + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + margin-bottom: 8px; + } + + .upload-zone-subtitle { + font-size: 14px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + margin-bottom: 16px; + } + + .upload-zone-hint { + font-size: 12px; + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + } + + /* Attachments list */ + .attachments-list { + display: flex; + flex-direction: column; + gap: 12px; + } + + .attachment-item { + display: flex; + align-items: center; + gap: 14px; + padding: 14px 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + transition: all 0.15s ease; + } + + .attachment-item:hover { + border-color: ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + } + + .attachment-icon { + width: 44px; + height: 44px; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + flex-shrink: 0; + } + + .attachment-info { + flex: 1; + min-width: 0; + } + + .attachment-name { + font-size: 14px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + margin-bottom: 4px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .attachment-meta { + display: flex; + flex-wrap: wrap; + gap: 12px; + font-size: 12px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .attachment-meta-item { + display: flex; + align-items: center; + gap: 4px; + } + + .attachment-actions { + display: flex; + gap: 4px; + flex-shrink: 0; + } + + /* Prior contracts */ + .prior-contracts-list { + display: flex; + flex-direction: column; + gap: 12px; + } + + .prior-contract-item { + display: flex; + align-items: center; + gap: 14px; + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + cursor: pointer; + transition: all 0.15s ease; + } + + .prior-contract-item:hover { + border-color: ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + background: ${cssManager.bdTheme('#f3f4f6', '#18181b')}; + } + + .prior-contract-icon { + width: 48px; + height: 48px; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + font-size: 22px; + background: ${cssManager.bdTheme('#dbeafe', '#1e3a5f')}; + color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + flex-shrink: 0; + } + + .prior-contract-info { + flex: 1; + min-width: 0; + } + + .prior-contract-title { + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + margin-bottom: 4px; + } + + .prior-contract-context { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .prior-contract-actions { + display: flex; + gap: 8px; + flex-shrink: 0; + } + + /* Empty state */ + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + padding: 40px 20px; + text-align: center; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .empty-state dees-icon { + font-size: 48px; + margin-bottom: 16px; + opacity: 0.5; + } + + .empty-state h4 { + margin: 0 0 8px; + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .empty-state p { + margin: 0; + font-size: 14px; + } + + /* Storage summary */ + .storage-summary { + display: flex; + align-items: center; + gap: 16px; + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + margin-bottom: 20px; + } + + .storage-info { + flex: 1; + } + + .storage-label { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + margin-bottom: 6px; + } + + .storage-bar { + height: 6px; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + border-radius: 3px; + overflow: hidden; + } + + .storage-fill { + height: 100%; + background: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + transition: width 0.3s ease; + } + + .storage-text { + font-size: 14px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + white-space: nowrap; + } + + /* Buttons */ + .btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + border-radius: 6px; + border: none; + cursor: pointer; + transition: all 0.15s ease; + } + + .btn-sm { + padding: 6px 10px; + font-size: 12px; + } + + .btn-primary { + background: ${cssManager.bdTheme('#111111', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#09090b')}; + } + + .btn-primary:hover { + background: ${cssManager.bdTheme('#333333', '#e5e5e5')}; + } + + .btn-secondary { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .btn-secondary:hover { + background: ${cssManager.bdTheme('#e5e7eb', '#3f3f46')}; + } + + .btn-ghost { + background: transparent; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + padding: 6px; + } + + .btn-ghost:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .btn-danger { + color: ${cssManager.bdTheme('#dc2626', '#f87171')}; + } + + .btn-danger:hover { + background: ${cssManager.bdTheme('#fef2f2', '#450a0a')}; + } + + /* Type badge */ + .type-badge { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 2px 8px; + border-radius: 4px; + font-size: 11px; + font-weight: 500; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + @property({ type: Boolean }) + public accessor readonly: boolean = false; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor isDragging: boolean = false; + + // Demo attachments data + @state() + private accessor attachments: IAttachment[] = [ + { + id: '1', + name: 'Employment_Terms_v2.pdf', + type: 'pdf', + mimeType: 'application/pdf', + size: 245760, + uploadedAt: Date.now() - 86400000 * 3, + uploadedBy: 'employer', + description: 'Original employment terms document', + }, + { + id: '2', + name: 'ID_Verification.png', + type: 'image', + mimeType: 'image/png', + size: 1024000, + uploadedAt: Date.now() - 86400000, + uploadedBy: 'employee', + }, + { + id: '3', + name: 'Tax_Information.xlsx', + type: 'spreadsheet', + mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + size: 52480, + uploadedAt: Date.now() - 86400000 * 2, + uploadedBy: 'employer', + }, + ]; + + // ============================================================================ + // EVENT HANDLERS + // ============================================================================ + + private handleFieldChange(path: string, value: unknown) { + this.dispatchEvent( + new CustomEvent('field-change', { + detail: { path, value }, + bubbles: true, + composed: true, + }) + ); + } + + private handleDragEnter(e: DragEvent) { + e.preventDefault(); + e.stopPropagation(); + this.isDragging = true; + } + + private handleDragLeave(e: DragEvent) { + e.preventDefault(); + e.stopPropagation(); + this.isDragging = false; + } + + private handleDragOver(e: DragEvent) { + e.preventDefault(); + e.stopPropagation(); + } + + private handleDrop(e: DragEvent) { + e.preventDefault(); + e.stopPropagation(); + this.isDragging = false; + + const files = e.dataTransfer?.files; + if (files && files.length > 0) { + this.handleFiles(files); + } + } + + private handleFileSelect() { + const input = document.createElement('input'); + input.type = 'file'; + input.multiple = true; + input.onchange = () => { + if (input.files && input.files.length > 0) { + this.handleFiles(input.files); + } + }; + input.click(); + } + + private handleFiles(files: FileList) { + // Demo: just add to list + Array.from(files).forEach((file) => { + const newAttachment: IAttachment = { + id: `att-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, + name: file.name, + type: this.getFileType(file.type), + mimeType: file.type, + size: file.size, + uploadedAt: Date.now(), + uploadedBy: 'user', + }; + this.attachments = [...this.attachments, newAttachment]; + }); + } + + private handleDeleteAttachment(attachmentId: string) { + this.attachments = this.attachments.filter((a) => a.id !== attachmentId); + } + + private handleAddPriorContract() { + // TODO: Open prior contract picker modal + } + + private handleRemovePriorContract(index: number) { + if (!this.contract) return; + const updatedPriorContracts = [...this.contract.priorContracts]; + updatedPriorContracts.splice(index, 1); + this.handleFieldChange('priorContracts', updatedPriorContracts); + } + + // ============================================================================ + // HELPERS + // ============================================================================ + + private getFileType(mimeType: string): IAttachment['type'] { + if (mimeType.includes('pdf')) return 'pdf'; + if (mimeType.includes('image')) return 'image'; + if (mimeType.includes('spreadsheet') || mimeType.includes('excel')) return 'spreadsheet'; + if (mimeType.includes('document') || mimeType.includes('word')) return 'document'; + return 'other'; + } + + private getFileTypeConfig(type: IAttachment['type']) { + return FILE_TYPES[type] || FILE_TYPES.other; + } + + private formatFileSize(bytes: number): string { + if (bytes === 0) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]; + } + + private formatDate(timestamp: number): string { + return new Date(timestamp).toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + }); + } + + private getTotalSize(): number { + return this.attachments.reduce((sum, a) => sum + a.size, 0); + } + + private getPartyName(roleId: string): string { + const role = this.contract?.availableRoles.find((r) => r.id === roleId); + return role?.name || roleId; + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + if (!this.contract) { + return html`
No contract loaded
`; + } + + const totalSize = this.getTotalSize(); + const maxSize = 50 * 1024 * 1024; // 50MB demo limit + const usagePercent = Math.min((totalSize / maxSize) * 100, 100); + + return html` +
+ +
+
+
+ + Attachments +
+ ${this.attachments.length} files +
+
+ +
+
+
Storage used
+
+
+
+
+
+ ${this.formatFileSize(totalSize)} / ${this.formatFileSize(maxSize)} +
+
+ + + ${!this.readonly + ? html` +
+
+ +
+
Drop files here or click to upload
+
Add supporting documents, images, or spreadsheets
+
PDF, DOCX, XLSX, PNG, JPG up to 10MB each
+
+ ` + : ''} + + + ${this.attachments.length > 0 + ? html` +
+ ${this.attachments.map((attachment) => this.renderAttachmentItem(attachment))} +
+ ` + : html` +
+ +

No Attachments

+

Upload files to attach them to this contract

+
+ `} +
+
+ + +
+
+
+ + Prior Contracts +
+ ${!this.readonly + ? html` + + ` + : ''} +
+
+ ${this.contract.priorContracts.length > 0 + ? html` +
+ ${this.contract.priorContracts.map((priorContract, index) => + this.renderPriorContractItem(priorContract, index) + )} +
+ ` + : html` +
+ +

No Prior Contracts

+

Link related or predecessor contracts here

+
+ `} +
+
+
+ `; + } + + private renderAttachmentItem(attachment: IAttachment): TemplateResult { + const typeConfig = this.getFileTypeConfig(attachment.type); + + return html` +
+
+ +
+
+
${attachment.name}
+
+ ${typeConfig.label} + + ${this.formatFileSize(attachment.size)} + + + + ${this.formatDate(attachment.uploadedAt)} + + + + ${this.getPartyName(attachment.uploadedBy)} + +
+
+
+ + + ${!this.readonly + ? html` + + ` + : ''} +
+
+ `; + } + + private renderPriorContractItem(priorContract: plugins.sdInterfaces.IPortableContract, index: number): TemplateResult { + return html` +
+
+ +
+
+
${priorContract.title}
+
${priorContract.context || 'No description'}
+
+
+ + ${!this.readonly + ? html` + + ` + : ''} +
+
+ `; + } +} diff --git a/ts_web/elements/sdig-contract-audit/index.ts b/ts_web/elements/sdig-contract-audit/index.ts new file mode 100644 index 0000000..8ff425b --- /dev/null +++ b/ts_web/elements/sdig-contract-audit/index.ts @@ -0,0 +1 @@ +export * from './sdig-contract-audit.js'; diff --git a/ts_web/elements/sdig-contract-audit/sdig-contract-audit.ts b/ts_web/elements/sdig-contract-audit/sdig-contract-audit.ts new file mode 100644 index 0000000..9be9afa --- /dev/null +++ b/ts_web/elements/sdig-contract-audit/sdig-contract-audit.ts @@ -0,0 +1,772 @@ +/** + * @file sdig-contract-audit.ts + * @description Contract audit log and lifecycle history component + */ + +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + state, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contract-audit': SdigContractAudit; + } +} + +// Audit event interface +interface IAuditEvent { + id: string; + timestamp: number; + type: 'created' | 'updated' | 'status_change' | 'signature' | 'comment' | 'attachment' | 'viewed' | 'shared'; + userId: string; + userName: string; + userColor: string; + description: string; + details?: { + field?: string; + oldValue?: string; + newValue?: string; + attachmentName?: string; + signatureStatus?: string; + }; +} + +// Status workflow configuration +const STATUS_WORKFLOW = [ + { id: 'draft', label: 'Draft', icon: 'lucide:file-edit', color: '#f59e0b' }, + { id: 'review', label: 'Review', icon: 'lucide:eye', color: '#3b82f6' }, + { id: 'pending', label: 'Pending Signatures', icon: 'lucide:pen-tool', color: '#8b5cf6' }, + { id: 'signed', label: 'Signed', icon: 'lucide:check-circle', color: '#10b981' }, + { id: 'executed', label: 'Executed', icon: 'lucide:shield-check', color: '#059669' }, +]; + +// Event type configuration +const EVENT_TYPES = { + created: { icon: 'lucide:plus-circle', color: '#10b981', label: 'Created' }, + updated: { icon: 'lucide:pencil', color: '#3b82f6', label: 'Updated' }, + status_change: { icon: 'lucide:arrow-right-circle', color: '#8b5cf6', label: 'Status Changed' }, + signature: { icon: 'lucide:pen-tool', color: '#10b981', label: 'Signature' }, + comment: { icon: 'lucide:message-circle', color: '#f59e0b', label: 'Comment' }, + attachment: { icon: 'lucide:paperclip', color: '#6366f1', label: 'Attachment' }, + viewed: { icon: 'lucide:eye', color: '#6b7280', label: 'Viewed' }, + shared: { icon: 'lucide:share-2', color: '#ec4899', label: 'Shared' }, +}; + +@customElement('sdig-contract-audit') +export class SdigContractAudit extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + } + + .audit-container { + display: flex; + flex-direction: column; + gap: 24px; + } + + /* Lifecycle status */ + .lifecycle-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + padding: 24px; + } + + .lifecycle-title { + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + margin-bottom: 20px; + } + + .status-workflow { + display: flex; + align-items: center; + gap: 8px; + overflow-x: auto; + padding-bottom: 8px; + } + + .status-step { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + min-width: 100px; + } + + .status-icon { + width: 48px; + height: 48px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 22px; + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + transition: all 0.2s ease; + } + + .status-step.completed .status-icon { + background: ${cssManager.bdTheme('#d1fae5', '#064e3b')}; + color: ${cssManager.bdTheme('#059669', '#34d399')}; + } + + .status-step.current .status-icon { + background: ${cssManager.bdTheme('#dbeafe', '#1e3a5f')}; + color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + box-shadow: 0 0 0 4px ${cssManager.bdTheme('rgba(59, 130, 246, 0.2)', 'rgba(96, 165, 250, 0.2)')}; + } + + .status-label { + font-size: 12px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + text-align: center; + } + + .status-step.completed .status-label, + .status-step.current .status-label { + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .status-connector { + flex: 1; + height: 2px; + background: ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + min-width: 40px; + } + + .status-connector.completed { + background: ${cssManager.bdTheme('#10b981', '#34d399')}; + } + + /* Section card */ + .section-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + overflow: hidden; + } + + .section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .section-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .section-title dees-icon { + font-size: 18px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .section-content { + padding: 20px; + } + + /* Filter controls */ + .filter-row { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 20px; + } + + .filter-select { + padding: 8px 12px; + font-size: 13px; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 6px; + outline: none; + cursor: pointer; + } + + .search-input { + flex: 1; + padding: 8px 12px; + font-size: 13px; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 6px; + outline: none; + } + + .search-input:focus { + border-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + } + + /* Timeline */ + .timeline { + position: relative; + padding-left: 32px; + } + + .timeline::before { + content: ''; + position: absolute; + left: 11px; + top: 0; + bottom: 0; + width: 2px; + background: ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .timeline-item { + position: relative; + padding-bottom: 24px; + } + + .timeline-item:last-child { + padding-bottom: 0; + } + + .timeline-dot { + position: absolute; + left: -32px; + top: 0; + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 2px solid; + } + + .timeline-content { + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + } + + .timeline-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 8px; + } + + .timeline-title { + display: flex; + align-items: center; + gap: 8px; + font-size: 14px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .timeline-time { + font-size: 12px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .timeline-user { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 8px; + } + + .timeline-avatar { + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 10px; + font-weight: 600; + color: white; + } + + .timeline-username { + font-size: 13px; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .timeline-description { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .timeline-details { + margin-top: 10px; + padding: 10px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border-radius: 6px; + font-size: 12px; + font-family: 'Roboto Mono', monospace; + } + + .detail-row { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 4px; + } + + .detail-row:last-child { + margin-bottom: 0; + } + + .detail-label { + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .detail-value { + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .detail-old { + text-decoration: line-through; + color: ${cssManager.bdTheme('#ef4444', '#f87171')}; + } + + .detail-new { + color: ${cssManager.bdTheme('#10b981', '#34d399')}; + } + + /* Event type badge */ + .event-badge { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 2px 8px; + border-radius: 4px; + font-size: 11px; + font-weight: 500; + } + + /* Stats row */ + .stats-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 16px; + margin-bottom: 24px; + } + + .stat-card { + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + text-align: center; + } + + .stat-value { + font-size: 28px; + font-weight: 700; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + margin-bottom: 4px; + } + + .stat-label { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + /* Empty state */ + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + padding: 40px 20px; + text-align: center; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .empty-state dees-icon { + font-size: 48px; + margin-bottom: 16px; + opacity: 0.5; + } + + .empty-state h4 { + margin: 0 0 8px; + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .empty-state p { + margin: 0; + font-size: 14px; + } + + /* Buttons */ + .btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + border-radius: 6px; + border: none; + cursor: pointer; + transition: all 0.15s ease; + } + + .btn-secondary { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .btn-secondary:hover { + background: ${cssManager.bdTheme('#e5e7eb', '#3f3f46')}; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor filterType: string = 'all'; + + @state() + private accessor searchQuery: string = ''; + + // Demo audit events + @state() + private accessor auditEvents: IAuditEvent[] = [ + { + id: '1', + timestamp: Date.now() - 3600000, + type: 'signature', + userId: '1', + userName: 'Alice Smith', + userColor: '#3b82f6', + description: 'Signed the contract', + details: { signatureStatus: 'completed' }, + }, + { + id: '2', + timestamp: Date.now() - 7200000, + type: 'status_change', + userId: '2', + userName: 'Bob Johnson', + userColor: '#10b981', + description: 'Changed status from Review to Pending Signatures', + details: { field: 'status', oldValue: 'review', newValue: 'pending' }, + }, + { + id: '3', + timestamp: Date.now() - 86400000, + type: 'updated', + userId: '2', + userName: 'Bob Johnson', + userColor: '#10b981', + description: 'Updated compensation amount', + details: { field: 'paragraphs.2.content', oldValue: '[Salary Amount]', newValue: '€520/month' }, + }, + { + id: '4', + timestamp: Date.now() - 86400000 * 2, + type: 'comment', + userId: '1', + userName: 'Alice Smith', + userColor: '#3b82f6', + description: 'Added a comment on Compensation section', + }, + { + id: '5', + timestamp: Date.now() - 86400000 * 3, + type: 'attachment', + userId: '3', + userName: 'Carol Davis', + userColor: '#f59e0b', + description: 'Uploaded ID verification document', + details: { attachmentName: 'ID_Verification.pdf' }, + }, + { + id: '6', + timestamp: Date.now() - 86400000 * 5, + type: 'created', + userId: '2', + userName: 'Bob Johnson', + userColor: '#10b981', + description: 'Created the contract', + }, + ]; + + // ============================================================================ + // HELPERS + // ============================================================================ + + private getEventConfig(type: IAuditEvent['type']) { + return EVENT_TYPES[type] || EVENT_TYPES.updated; + } + + private getFilteredEvents(): IAuditEvent[] { + let events = this.auditEvents; + + if (this.filterType !== 'all') { + events = events.filter((e) => e.type === this.filterType); + } + + if (this.searchQuery) { + const query = this.searchQuery.toLowerCase(); + events = events.filter( + (e) => + e.description.toLowerCase().includes(query) || + e.userName.toLowerCase().includes(query) + ); + } + + return events; + } + + private formatDate(timestamp: number): string { + return new Date(timestamp).toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + }); + } + + private formatTimeAgo(timestamp: number): string { + const seconds = Math.floor((Date.now() - timestamp) / 1000); + if (seconds < 60) return 'just now'; + const minutes = Math.floor(seconds / 60); + if (minutes < 60) return `${minutes}m ago`; + const hours = Math.floor(minutes / 60); + if (hours < 24) return `${hours}h ago`; + const days = Math.floor(hours / 24); + return `${days}d ago`; + } + + private getCurrentStatusIndex(): number { + // Demo: Return a fixed position + return 2; // Pending Signatures + } + + private getEventStats() { + const total = this.auditEvents.length; + const updates = this.auditEvents.filter((e) => e.type === 'updated').length; + const signatures = this.auditEvents.filter((e) => e.type === 'signature').length; + const comments = this.auditEvents.filter((e) => e.type === 'comment').length; + return { total, updates, signatures, comments }; + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + if (!this.contract) { + return html`
No contract loaded
`; + } + + const currentStatusIndex = this.getCurrentStatusIndex(); + const filteredEvents = this.getFilteredEvents(); + const stats = this.getEventStats(); + + return html` +
+ +
+
Contract Lifecycle
+
+ ${STATUS_WORKFLOW.map((status, index) => html` +
+
+ +
+
${status.label}
+
+ ${index < STATUS_WORKFLOW.length - 1 + ? html`
` + : ''} + `)} +
+
+ + +
+
+
${stats.total}
+
Total Events
+
+
+
${stats.updates}
+
Updates
+
+
+
${stats.signatures}
+
Signatures
+
+
+
${stats.comments}
+
Comments
+
+
+ + +
+
+
+ + Activity Log +
+ +
+
+ +
+ + (this.searchQuery = (e.target as HTMLInputElement).value)} + /> +
+ + + ${filteredEvents.length > 0 + ? html` +
+ ${filteredEvents.map((event) => this.renderTimelineItem(event))} +
+ ` + : html` +
+ +

No Events Found

+

No activity matches your current filters

+
+ `} +
+
+
+ `; + } + + private renderTimelineItem(event: IAuditEvent): TemplateResult { + const config = this.getEventConfig(event.type); + + return html` +
+
+ +
+
+
+
+ + ${config.label} + +
+ + ${this.formatTimeAgo(event.timestamp)} + +
+
+
+ ${event.userName.charAt(0)} +
+ ${event.userName} +
+
${event.description}
+ ${event.details + ? html` +
+ ${event.details.field + ? html` +
+ Field: + ${event.details.field} +
+ ` + : ''} + ${event.details.oldValue && event.details.newValue + ? html` +
+ ${event.details.oldValue} + + ${event.details.newValue} +
+ ` + : ''} + ${event.details.attachmentName + ? html` +
+ File: + ${event.details.attachmentName} +
+ ` + : ''} +
+ ` + : ''} +
+
+ `; + } +} diff --git a/ts_web/elements/sdig-contract-collaboration/index.ts b/ts_web/elements/sdig-contract-collaboration/index.ts new file mode 100644 index 0000000..064c40f --- /dev/null +++ b/ts_web/elements/sdig-contract-collaboration/index.ts @@ -0,0 +1 @@ +export * from './sdig-contract-collaboration.js'; diff --git a/ts_web/elements/sdig-contract-collaboration/sdig-contract-collaboration.ts b/ts_web/elements/sdig-contract-collaboration/sdig-contract-collaboration.ts new file mode 100644 index 0000000..5cd7544 --- /dev/null +++ b/ts_web/elements/sdig-contract-collaboration/sdig-contract-collaboration.ts @@ -0,0 +1,972 @@ +/** + * @file sdig-contract-collaboration.ts + * @description Contract collaboration - comments, suggestions, and presence + */ + +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + state, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contract-collaboration': SdigContractCollaboration; + } +} + +// Comment interface +interface IComment { + id: string; + userId: string; + userName: string; + userColor: string; + content: string; + createdAt: number; + updatedAt?: number; + anchorPath?: string; + anchorText?: string; + resolved: boolean; + replies: IComment[]; +} + +// Suggestion interface +interface ISuggestion { + id: string; + userId: string; + userName: string; + userColor: string; + originalText: string; + suggestedText: string; + path: string; + status: 'pending' | 'accepted' | 'rejected'; + createdAt: number; +} + +// Presence interface +interface IPresence { + userId: string; + userName: string; + userColor: string; + currentSection: string; + cursorPosition?: { path: string; offset: number }; + lastActive: number; +} + +@customElement('sdig-contract-collaboration') +export class SdigContractCollaboration extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + } + + .collaboration-container { + display: flex; + flex-direction: column; + gap: 24px; + } + + /* Presence bar */ + .presence-bar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + } + + .presence-info { + display: flex; + align-items: center; + gap: 12px; + } + + .presence-label { + font-size: 14px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .presence-avatars { + display: flex; + align-items: center; + } + + .presence-avatar { + width: 36px; + height: 36px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 14px; + font-weight: 600; + color: white; + margin-left: -8px; + border: 2px solid ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + cursor: pointer; + position: relative; + } + + .presence-avatar:first-child { + margin-left: 0; + } + + .presence-avatar .status-dot { + position: absolute; + bottom: 0; + right: 0; + width: 10px; + height: 10px; + border-radius: 50%; + background: #10b981; + border: 2px solid ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + } + + .presence-avatar .status-dot.away { + background: #f59e0b; + } + + .presence-count { + display: flex; + align-items: center; + justify-content: center; + min-width: 36px; + height: 36px; + border-radius: 50%; + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + font-size: 13px; + font-weight: 600; + margin-left: -8px; + border: 2px solid ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + } + + .share-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 16px; + background: ${cssManager.bdTheme('#111111', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#09090b')}; + border: none; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.15s ease; + } + + .share-btn:hover { + background: ${cssManager.bdTheme('#333333', '#e5e5e5')}; + } + + /* Section card */ + .section-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + overflow: hidden; + } + + .section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .section-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .section-title dees-icon { + font-size: 18px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .section-badge { + padding: 2px 8px; + border-radius: 9999px; + font-size: 12px; + font-weight: 600; + background: ${cssManager.bdTheme('#dbeafe', '#1e3a5f')}; + color: ${cssManager.bdTheme('#1e40af', '#93c5fd')}; + } + + .section-content { + padding: 20px; + } + + /* Comments list */ + .comments-list { + display: flex; + flex-direction: column; + gap: 16px; + } + + .comment-thread { + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + } + + .comment-thread.resolved { + opacity: 0.6; + } + + .comment-header { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 10px; + } + + .comment-avatar { + width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 13px; + font-weight: 600; + color: white; + flex-shrink: 0; + } + + .comment-meta { + flex: 1; + } + + .comment-author { + font-size: 14px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .comment-time { + font-size: 12px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .comment-anchor { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 4px 8px; + background: ${cssManager.bdTheme('#fef3c7', '#422006')}; + border-radius: 4px; + font-size: 12px; + color: ${cssManager.bdTheme('#92400e', '#fcd34d')}; + margin-bottom: 10px; + cursor: pointer; + } + + .comment-anchor:hover { + background: ${cssManager.bdTheme('#fde68a', '#713f12')}; + } + + .comment-content { + font-size: 14px; + line-height: 1.6; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + margin-bottom: 12px; + } + + .comment-actions { + display: flex; + align-items: center; + gap: 8px; + } + + .comment-replies { + margin-top: 16px; + padding-left: 16px; + border-left: 2px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .reply-item { + padding: 12px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border-radius: 8px; + margin-bottom: 8px; + } + + .reply-item:last-child { + margin-bottom: 0; + } + + /* Suggestions list */ + .suggestions-list { + display: flex; + flex-direction: column; + gap: 12px; + } + + .suggestion-card { + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + } + + .suggestion-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12px; + } + + .suggestion-user { + display: flex; + align-items: center; + gap: 8px; + } + + .suggestion-status { + display: flex; + align-items: center; + gap: 4px; + padding: 4px 10px; + border-radius: 9999px; + font-size: 12px; + font-weight: 500; + } + + .suggestion-status.pending { + background: ${cssManager.bdTheme('#fef3c7', '#422006')}; + color: ${cssManager.bdTheme('#92400e', '#fcd34d')}; + } + + .suggestion-status.accepted { + background: ${cssManager.bdTheme('#d1fae5', '#064e3b')}; + color: ${cssManager.bdTheme('#065f46', '#6ee7b7')}; + } + + .suggestion-status.rejected { + background: ${cssManager.bdTheme('#fee2e2', '#450a0a')}; + color: ${cssManager.bdTheme('#991b1b', '#fca5a5')}; + } + + .suggestion-diff { + padding: 12px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 8px; + font-family: 'Roboto Mono', monospace; + font-size: 13px; + line-height: 1.5; + } + + .diff-removed { + background: ${cssManager.bdTheme('#fee2e2', '#450a0a')}; + color: ${cssManager.bdTheme('#991b1b', '#fca5a5')}; + text-decoration: line-through; + padding: 2px 4px; + border-radius: 2px; + } + + .diff-added { + background: ${cssManager.bdTheme('#d1fae5', '#064e3b')}; + color: ${cssManager.bdTheme('#065f46', '#6ee7b7')}; + padding: 2px 4px; + border-radius: 2px; + } + + .suggestion-actions { + display: flex; + gap: 8px; + margin-top: 12px; + } + + /* New comment input */ + .new-comment { + display: flex; + gap: 12px; + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + } + + .new-comment-input { + flex: 1; + padding: 12px; + font-size: 14px; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 8px; + outline: none; + resize: none; + min-height: 80px; + font-family: inherit; + } + + .new-comment-input:focus { + border-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(59, 130, 246, 0.1)', 'rgba(96, 165, 250, 0.1)')}; + } + + .new-comment-input::placeholder { + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + } + + /* Empty state */ + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + padding: 40px 20px; + text-align: center; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .empty-state dees-icon { + font-size: 48px; + margin-bottom: 16px; + opacity: 0.5; + } + + .empty-state h4 { + margin: 0 0 8px; + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .empty-state p { + margin: 0; + font-size: 14px; + } + + /* Filter tabs */ + .filter-tabs { + display: flex; + gap: 4px; + margin-bottom: 16px; + } + + .filter-tab { + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + background: transparent; + border: none; + border-radius: 6px; + cursor: pointer; + transition: all 0.15s ease; + } + + .filter-tab:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .filter-tab.active { + background: ${cssManager.bdTheme('#111111', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#09090b')}; + } + + /* Buttons */ + .btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + border-radius: 6px; + border: none; + cursor: pointer; + transition: all 0.15s ease; + } + + .btn-sm { + padding: 6px 10px; + font-size: 12px; + } + + .btn-primary { + background: ${cssManager.bdTheme('#111111', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#09090b')}; + } + + .btn-primary:hover { + background: ${cssManager.bdTheme('#333333', '#e5e5e5')}; + } + + .btn-secondary { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .btn-secondary:hover { + background: ${cssManager.bdTheme('#e5e7eb', '#3f3f46')}; + } + + .btn-ghost { + background: transparent; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .btn-ghost:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .btn-success { + background: ${cssManager.bdTheme('#10b981', '#059669')}; + color: white; + } + + .btn-success:hover { + background: ${cssManager.bdTheme('#059669', '#047857')}; + } + + .btn-danger { + background: ${cssManager.bdTheme('#fee2e2', '#450a0a')}; + color: ${cssManager.bdTheme('#dc2626', '#f87171')}; + } + + .btn-danger:hover { + background: ${cssManager.bdTheme('#fecaca', '#7f1d1d')}; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + @property({ type: Boolean }) + public accessor readonly: boolean = false; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor activeTab: 'comments' | 'suggestions' = 'comments'; + + @state() + private accessor commentFilter: 'all' | 'open' | 'resolved' = 'all'; + + @state() + private accessor newCommentText: string = ''; + + // Demo presence data + @state() + private accessor presenceList: IPresence[] = [ + { userId: '1', userName: 'Alice Smith', userColor: '#3b82f6', currentSection: 'content', lastActive: Date.now() }, + { userId: '2', userName: 'Bob Johnson', userColor: '#10b981', currentSection: 'parties', lastActive: Date.now() - 60000 }, + { userId: '3', userName: 'Carol Davis', userColor: '#f59e0b', currentSection: 'terms', lastActive: Date.now() - 300000 }, + ]; + + // Demo comments data + @state() + private accessor comments: IComment[] = [ + { + id: '1', + userId: '1', + userName: 'Alice Smith', + userColor: '#3b82f6', + content: 'Can we clarify the payment terms in paragraph 3? The current wording seems ambiguous.', + createdAt: Date.now() - 3600000, + anchorPath: 'paragraphs.2', + anchorText: 'Compensation', + resolved: false, + replies: [ + { + id: '1-1', + userId: '2', + userName: 'Bob Johnson', + userColor: '#10b981', + content: 'Good point. I\'ll update the wording to be more specific.', + createdAt: Date.now() - 1800000, + resolved: false, + replies: [], + }, + ], + }, + { + id: '2', + userId: '3', + userName: 'Carol Davis', + userColor: '#f59e0b', + content: 'The termination clause needs to comply with the latest regulations.', + createdAt: Date.now() - 86400000, + resolved: true, + replies: [], + }, + ]; + + // Demo suggestions data + @state() + private accessor suggestions: ISuggestion[] = [ + { + id: '1', + userId: '1', + userName: 'Alice Smith', + userColor: '#3b82f6', + originalText: 'monthly salary', + suggestedText: 'monthly gross salary', + path: 'paragraphs.2.content', + status: 'pending', + createdAt: Date.now() - 7200000, + }, + ]; + + // ============================================================================ + // EVENT HANDLERS + // ============================================================================ + + private handleFieldChange(path: string, value: unknown) { + this.dispatchEvent( + new CustomEvent('field-change', { + detail: { path, value }, + bubbles: true, + composed: true, + }) + ); + } + + private handleAddComment() { + if (!this.newCommentText.trim()) return; + + const newComment: IComment = { + id: `comment-${Date.now()}`, + userId: 'current-user', + userName: 'You', + userColor: '#6366f1', + content: this.newCommentText, + createdAt: Date.now(), + resolved: false, + replies: [], + }; + + this.comments = [newComment, ...this.comments]; + this.newCommentText = ''; + } + + private handleResolveComment(commentId: string) { + this.comments = this.comments.map((c) => + c.id === commentId ? { ...c, resolved: !c.resolved } : c + ); + } + + private handleAcceptSuggestion(suggestionId: string) { + this.suggestions = this.suggestions.map((s) => + s.id === suggestionId ? { ...s, status: 'accepted' as const } : s + ); + } + + private handleRejectSuggestion(suggestionId: string) { + this.suggestions = this.suggestions.map((s) => + s.id === suggestionId ? { ...s, status: 'rejected' as const } : s + ); + } + + // ============================================================================ + // HELPERS + // ============================================================================ + + private getFilteredComments(): IComment[] { + if (this.commentFilter === 'all') return this.comments; + if (this.commentFilter === 'open') return this.comments.filter((c) => !c.resolved); + return this.comments.filter((c) => c.resolved); + } + + private formatTimeAgo(timestamp: number): string { + const seconds = Math.floor((Date.now() - timestamp) / 1000); + if (seconds < 60) return 'just now'; + const minutes = Math.floor(seconds / 60); + if (minutes < 60) return `${minutes}m ago`; + const hours = Math.floor(minutes / 60); + if (hours < 24) return `${hours}h ago`; + const days = Math.floor(hours / 24); + return `${days}d ago`; + } + + private getActivePresence(): IPresence[] { + const fiveMinutesAgo = Date.now() - 300000; + return this.presenceList.filter((p) => p.lastActive > fiveMinutesAgo); + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + if (!this.contract) { + return html`
No contract loaded
`; + } + + const activePresence = this.getActivePresence(); + const openComments = this.comments.filter((c) => !c.resolved).length; + const pendingSuggestions = this.suggestions.filter((s) => s.status === 'pending').length; + + return html` +
+ +
+
+ Currently viewing: +
+ ${activePresence.slice(0, 4).map( + (p) => html` +
+ ${p.userName.charAt(0)} + +
+ ` + )} + ${activePresence.length > 4 + ? html`
+${activePresence.length - 4}
` + : ''} +
+
+ +
+ + +
+
+
+ + Comments + ${openComments > 0 ? html`${openComments} open` : ''} +
+
+
+ +
+ + + +
+ + + ${!this.readonly + ? html` +
+ + +
+ ` + : ''} + + + ${this.getFilteredComments().length > 0 + ? html` +
+ ${this.getFilteredComments().map((comment) => this.renderComment(comment))} +
+ ` + : html` +
+ +

No Comments

+

Start a discussion by adding a comment

+
+ `} +
+
+ + +
+
+
+ + Suggestions + ${pendingSuggestions > 0 ? html`${pendingSuggestions} pending` : ''} +
+
+
+ ${this.suggestions.length > 0 + ? html` +
+ ${this.suggestions.map((suggestion) => this.renderSuggestion(suggestion))} +
+ ` + : html` +
+ +

No Suggestions

+

Suggested changes will appear here

+
+ `} +
+
+
+ `; + } + + private renderComment(comment: IComment): TemplateResult { + return html` +
+
+
+ ${comment.userName.charAt(0)} +
+
+
${comment.userName}
+
${this.formatTimeAgo(comment.createdAt)}
+
+ ${!this.readonly + ? html` + + ` + : ''} +
+ + ${comment.anchorText + ? html` +
+ + ${comment.anchorText} +
+ ` + : ''} + +
${comment.content}
+ + ${comment.replies.length > 0 + ? html` +
+ ${comment.replies.map( + (reply) => html` +
+
+
+ ${reply.userName.charAt(0)} +
+
+
${reply.userName}
+
${this.formatTimeAgo(reply.createdAt)}
+
+
+
${reply.content}
+
+ ` + )} +
+ ` + : ''} +
+ `; + } + + private renderSuggestion(suggestion: ISuggestion): TemplateResult { + return html` +
+
+
+
+ ${suggestion.userName.charAt(0)} +
+
+
${suggestion.userName}
+
${this.formatTimeAgo(suggestion.createdAt)}
+
+
+
+ + ${suggestion.status.charAt(0).toUpperCase() + suggestion.status.slice(1)} +
+
+ +
+ ${suggestion.originalText} + + ${suggestion.suggestedText} +
+ + ${suggestion.status === 'pending' && !this.readonly + ? html` +
+ + +
+ ` + : ''} +
+ `; + } +} diff --git a/ts_web/elements/sdig-contract-content/index.ts b/ts_web/elements/sdig-contract-content/index.ts new file mode 100644 index 0000000..39eab13 --- /dev/null +++ b/ts_web/elements/sdig-contract-content/index.ts @@ -0,0 +1 @@ +export * from './sdig-contract-content.js'; diff --git a/ts_web/elements/sdig-contract-content/sdig-contract-content.ts b/ts_web/elements/sdig-contract-content/sdig-contract-content.ts new file mode 100644 index 0000000..9f31308 --- /dev/null +++ b/ts_web/elements/sdig-contract-content/sdig-contract-content.ts @@ -0,0 +1,920 @@ +/** + * @file sdig-contract-content.ts + * @description Contract content/paragraphs editor component + */ + +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + state, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contract-content': SdigContractContent; + } +} + +// Paragraph type configuration +const PARAGRAPH_TYPES = [ + { value: 'section', label: 'Section', icon: 'lucide:heading' }, + { value: 'clause', label: 'Clause', icon: 'lucide:file-text' }, + { value: 'definition', label: 'Definition', icon: 'lucide:book-open' }, + { value: 'obligation', label: 'Obligation', icon: 'lucide:check-square' }, + { value: 'condition', label: 'Condition', icon: 'lucide:git-branch' }, + { value: 'schedule', label: 'Schedule', icon: 'lucide:calendar' }, +]; + +@customElement('sdig-contract-content') +export class SdigContractContent extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + } + + .content-container { + display: flex; + flex-direction: column; + gap: 16px; + } + + /* Toolbar */ + .content-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + } + + .toolbar-left { + display: flex; + align-items: center; + gap: 12px; + } + + .toolbar-right { + display: flex; + align-items: center; + gap: 8px; + } + + .search-box { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background: ${cssManager.bdTheme('#f3f4f6', '#18181b')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 8px; + } + + .search-box input { + border: none; + background: transparent; + font-size: 14px; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + outline: none; + width: 200px; + } + + .search-box input::placeholder { + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + } + + .search-box dees-icon { + font-size: 16px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + /* Section card */ + .section-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + overflow: hidden; + } + + .section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .section-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .section-title dees-icon { + font-size: 18px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .paragraph-count { + font-size: 13px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .section-content { + padding: 0; + } + + /* Paragraph list */ + .paragraphs-list { + display: flex; + flex-direction: column; + } + + .paragraph-item { + display: flex; + align-items: flex-start; + gap: 16px; + padding: 20px; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + cursor: pointer; + transition: background 0.15s ease; + } + + .paragraph-item:last-child { + border-bottom: none; + } + + .paragraph-item:hover { + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + } + + .paragraph-item.selected { + background: ${cssManager.bdTheme('#eff6ff', '#172554')}; + border-color: ${cssManager.bdTheme('#bfdbfe', '#1e40af')}; + } + + .paragraph-item.editing { + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + } + + .paragraph-drag-handle { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + cursor: grab; + flex-shrink: 0; + margin-top: 2px; + } + + .paragraph-drag-handle:hover { + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .paragraph-number { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 8px; + font-size: 14px; + font-weight: 600; + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + flex-shrink: 0; + } + + .paragraph-content { + flex: 1; + min-width: 0; + } + + .paragraph-title-row { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 8px; + } + + .paragraph-title { + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .paragraph-title-input { + flex: 1; + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 6px; + padding: 8px 12px; + outline: none; + } + + .paragraph-title-input:focus { + border-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(59, 130, 246, 0.1)', 'rgba(96, 165, 250, 0.1)')}; + } + + .paragraph-type-badge { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 2px 8px; + border-radius: 4px; + font-size: 11px; + font-weight: 500; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .paragraph-body { + font-size: 14px; + line-height: 1.6; + color: ${cssManager.bdTheme('#4b5563', '#9ca3af')}; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + } + + .paragraph-body.expanded { + -webkit-line-clamp: unset; + overflow: visible; + } + + .paragraph-body-textarea { + width: 100%; + min-height: 150px; + font-size: 14px; + line-height: 1.6; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 6px; + padding: 12px; + outline: none; + resize: vertical; + font-family: inherit; + } + + .paragraph-body-textarea:focus { + border-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(59, 130, 246, 0.1)', 'rgba(96, 165, 250, 0.1)')}; + } + + .paragraph-meta { + display: flex; + align-items: center; + gap: 16px; + margin-top: 12px; + font-size: 12px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .paragraph-meta-item { + display: flex; + align-items: center; + gap: 4px; + } + + .paragraph-actions { + display: flex; + flex-direction: column; + gap: 4px; + flex-shrink: 0; + } + + .paragraph-edit-actions { + display: flex; + gap: 8px; + margin-top: 16px; + } + + /* Variable highlighting */ + .variable { + display: inline; + padding: 2px 6px; + border-radius: 4px; + font-family: 'Roboto Mono', monospace; + font-size: 13px; + background: ${cssManager.bdTheme('#fef3c7', '#422006')}; + color: ${cssManager.bdTheme('#92400e', '#fcd34d')}; + } + + /* Child paragraphs */ + .child-paragraphs { + margin-left: 48px; + border-left: 2px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + padding-left: 16px; + } + + .child-paragraphs .paragraph-item { + padding: 16px; + } + + .child-paragraphs .paragraph-number { + width: 28px; + height: 28px; + font-size: 12px; + } + + /* Add paragraph button */ + .add-paragraph-row { + display: flex; + align-items: center; + justify-content: center; + padding: 16px 20px; + border-top: 1px dashed ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .add-paragraph-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 20px; + background: transparent; + border: 2px dashed ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 8px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.15s ease; + } + + .add-paragraph-btn:hover { + border-color: ${cssManager.bdTheme('#9ca3af', '#52525b')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + background: ${cssManager.bdTheme('#f9fafb', '#18181b')}; + } + + /* Empty state */ + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + padding: 60px 20px; + text-align: center; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .empty-state dees-icon { + font-size: 64px; + margin-bottom: 20px; + opacity: 0.5; + } + + .empty-state h4 { + margin: 0 0 8px; + font-size: 18px; + font-weight: 600; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .empty-state p { + margin: 0 0 24px; + font-size: 14px; + max-width: 400px; + } + + /* Buttons */ + .btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + border-radius: 6px; + border: none; + cursor: pointer; + transition: all 0.15s ease; + } + + .btn-sm { + padding: 6px 10px; + font-size: 12px; + } + + .btn-primary { + background: ${cssManager.bdTheme('#111111', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#09090b')}; + } + + .btn-primary:hover { + background: ${cssManager.bdTheme('#333333', '#e5e5e5')}; + } + + .btn-secondary { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .btn-secondary:hover { + background: ${cssManager.bdTheme('#e5e7eb', '#3f3f46')}; + } + + .btn-ghost { + background: transparent; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + padding: 6px; + } + + .btn-ghost:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .btn-danger { + background: ${cssManager.bdTheme('#fef2f2', '#450a0a')}; + color: ${cssManager.bdTheme('#dc2626', '#fca5a5')}; + } + + .btn-danger:hover { + background: ${cssManager.bdTheme('#fee2e2', '#7f1d1d')}; + } + + /* View mode toggle */ + .view-toggle { + display: flex; + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + border-radius: 6px; + padding: 2px; + } + + .view-toggle-btn { + display: flex; + align-items: center; + justify-content: center; + padding: 6px 10px; + background: transparent; + border: none; + border-radius: 4px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + cursor: pointer; + transition: all 0.15s ease; + } + + .view-toggle-btn.active { + background: ${cssManager.bdTheme('#ffffff', '#3f3f46')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + } + + .view-toggle-btn dees-icon { + font-size: 16px; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + @property({ type: Boolean }) + public accessor readonly: boolean = false; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor selectedParagraphId: string | null = null; + + @state() + private accessor editingParagraphId: string | null = null; + + @state() + private accessor searchQuery: string = ''; + + @state() + private accessor viewMode: 'list' | 'outline' = 'list'; + + @state() + private accessor expandedParagraphs: Set = new Set(); + + // Editing state + @state() + private accessor editTitle: string = ''; + + @state() + private accessor editContent: string = ''; + + // ============================================================================ + // EVENT HANDLERS + // ============================================================================ + + private handleFieldChange(path: string, value: unknown) { + this.dispatchEvent( + new CustomEvent('field-change', { + detail: { path, value }, + bubbles: true, + composed: true, + }) + ); + } + + private handleSelectParagraph(paragraphId: string) { + this.selectedParagraphId = this.selectedParagraphId === paragraphId ? null : paragraphId; + this.dispatchEvent( + new CustomEvent('paragraph-select', { + detail: { paragraphId: this.selectedParagraphId }, + bubbles: true, + composed: true, + }) + ); + } + + private handleEditParagraph(paragraph: plugins.sdInterfaces.IParagraph) { + this.editingParagraphId = paragraph.uniqueId; + this.editTitle = paragraph.title; + this.editContent = paragraph.content; + } + + private handleSaveEdit() { + if (!this.contract || !this.editingParagraphId) return; + + const updatedParagraphs = this.contract.paragraphs.map((p) => { + if (p.uniqueId === this.editingParagraphId) { + return { ...p, title: this.editTitle, content: this.editContent }; + } + return p; + }); + + this.handleFieldChange('paragraphs', updatedParagraphs); + this.editingParagraphId = null; + this.editTitle = ''; + this.editContent = ''; + } + + private handleCancelEdit() { + this.editingParagraphId = null; + this.editTitle = ''; + this.editContent = ''; + } + + private handleAddParagraph(parentId: string | null = null) { + if (!this.contract) return; + + const newParagraph: plugins.sdInterfaces.IParagraph = { + uniqueId: `p-${Date.now()}`, + parent: parentId ? this.contract.paragraphs.find((p) => p.uniqueId === parentId) || null : null, + title: 'New Paragraph', + content: 'Enter paragraph content here...', + }; + + const updatedParagraphs = [...this.contract.paragraphs, newParagraph]; + this.handleFieldChange('paragraphs', updatedParagraphs); + + // Start editing the new paragraph + this.handleEditParagraph(newParagraph); + } + + private handleDeleteParagraph(paragraphId: string) { + if (!this.contract) return; + + // Remove the paragraph and any children + const idsToRemove = new Set([paragraphId]); + + // Find child paragraphs recursively + const findChildren = (parentId: string) => { + this.contract!.paragraphs.forEach((p) => { + if (p.parent?.uniqueId === parentId) { + idsToRemove.add(p.uniqueId); + findChildren(p.uniqueId); + } + }); + }; + findChildren(paragraphId); + + const updatedParagraphs = this.contract.paragraphs.filter((p) => !idsToRemove.has(p.uniqueId)); + this.handleFieldChange('paragraphs', updatedParagraphs); + + if (this.selectedParagraphId === paragraphId) { + this.selectedParagraphId = null; + } + } + + private handleMoveParagraph(paragraphId: string, direction: 'up' | 'down') { + if (!this.contract) return; + + const paragraphs = [...this.contract.paragraphs]; + const index = paragraphs.findIndex((p) => p.uniqueId === paragraphId); + + if (index === -1) return; + if (direction === 'up' && index === 0) return; + if (direction === 'down' && index === paragraphs.length - 1) return; + + const newIndex = direction === 'up' ? index - 1 : index + 1; + [paragraphs[index], paragraphs[newIndex]] = [paragraphs[newIndex], paragraphs[index]]; + + this.handleFieldChange('paragraphs', paragraphs); + } + + private handleSearchChange(e: Event) { + const input = e.target as HTMLInputElement; + this.searchQuery = input.value; + } + + private toggleExpanded(paragraphId: string) { + const expanded = new Set(this.expandedParagraphs); + if (expanded.has(paragraphId)) { + expanded.delete(paragraphId); + } else { + expanded.add(paragraphId); + } + this.expandedParagraphs = expanded; + } + + // ============================================================================ + // HELPERS + // ============================================================================ + + private getRootParagraphs(): plugins.sdInterfaces.IParagraph[] { + if (!this.contract) return []; + return this.contract.paragraphs.filter((p) => !p.parent); + } + + private getChildParagraphs(parentId: string): plugins.sdInterfaces.IParagraph[] { + if (!this.contract) return []; + return this.contract.paragraphs.filter((p) => p.parent?.uniqueId === parentId); + } + + private filterParagraphs(paragraphs: plugins.sdInterfaces.IParagraph[]): plugins.sdInterfaces.IParagraph[] { + if (!this.searchQuery) return paragraphs; + const query = this.searchQuery.toLowerCase(); + return paragraphs.filter( + (p) => + p.title.toLowerCase().includes(query) || + p.content.toLowerCase().includes(query) + ); + } + + private highlightVariables(content: string): TemplateResult { + // Match {{variableName}} patterns + const parts = content.split(/(\{\{[^}]+\}\})/g); + return html`${parts.map((part) => + part.startsWith('{{') && part.endsWith('}}') + ? html`${part}` + : part + )}`; + } + + private getParagraphNumber(paragraph: plugins.sdInterfaces.IParagraph, index: number): string { + // Simple numbering - can be enhanced for hierarchical numbering + return String(index + 1); + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + if (!this.contract) { + return html`
No contract loaded
`; + } + + const rootParagraphs = this.getRootParagraphs(); + const filteredParagraphs = this.filterParagraphs(rootParagraphs); + + return html` +
+ +
+
+ +
+
+
+ + +
+ ${!this.readonly + ? html` + + ` + : ''} +
+
+ + +
+
+
+ + Contract Content +
+ ${this.contract.paragraphs.length} paragraphs +
+ +
+ ${filteredParagraphs.length > 0 + ? html` +
+ ${filteredParagraphs.map((paragraph, index) => + this.renderParagraph(paragraph, index) + )} +
+ ${!this.readonly + ? html` +
+ +
+ ` + : ''} + ` + : html` +
+ +

No Paragraphs Yet

+

Start building your contract by adding paragraphs. Each paragraph can contain clauses, definitions, or obligations.

+ ${!this.readonly + ? html` + + ` + : ''} +
+ `} +
+
+
+ `; + } + + private renderParagraph(paragraph: plugins.sdInterfaces.IParagraph, index: number): TemplateResult { + const isSelected = this.selectedParagraphId === paragraph.uniqueId; + const isEditing = this.editingParagraphId === paragraph.uniqueId; + const isExpanded = this.expandedParagraphs.has(paragraph.uniqueId); + const childParagraphs = this.getChildParagraphs(paragraph.uniqueId); + + return html` +
!isEditing && this.handleSelectParagraph(paragraph.uniqueId)} + > + ${!this.readonly + ? html` +
+ +
+ ` + : ''} + +
${this.getParagraphNumber(paragraph, index)}
+ +
+ ${isEditing + ? html` + (this.editTitle = (e.target as HTMLInputElement).value)} + @click=${(e: Event) => e.stopPropagation()} + placeholder="Paragraph title" + /> + +
+ + +
+ ` + : html` +
+ ${paragraph.title} +
+
${this.highlightVariables(paragraph.content)}
+ ${paragraph.content.length > 200 + ? html` + + ` + : ''} + `} +
+ + ${!this.readonly && !isEditing + ? html` +
+ + + + +
+ ` + : ''} +
+ + ${childParagraphs.length > 0 + ? html` +
+ ${childParagraphs.map((child, childIndex) => this.renderParagraph(child, childIndex))} +
+ ` + : ''} + `; + } +} diff --git a/ts_web/elements/sdig-contract-header/index.ts b/ts_web/elements/sdig-contract-header/index.ts new file mode 100644 index 0000000..70673b2 --- /dev/null +++ b/ts_web/elements/sdig-contract-header/index.ts @@ -0,0 +1 @@ +export * from './sdig-contract-header.js'; diff --git a/ts_web/elements/sdig-contract-header/sdig-contract-header.ts b/ts_web/elements/sdig-contract-header/sdig-contract-header.ts new file mode 100644 index 0000000..8a2e5e7 --- /dev/null +++ b/ts_web/elements/sdig-contract-header/sdig-contract-header.ts @@ -0,0 +1,558 @@ +/** + * @file sdig-contract-header.ts + * @description Contract header component with title, status, and quick actions + */ + +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + state, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contract-header': SdigContractHeader; + } +} + +@customElement('sdig-contract-header') +export class SdigContractHeader extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + } + + .header-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + padding: 24px; + } + + .header-top { + display: flex; + align-items: flex-start; + justify-content: space-between; + margin-bottom: 20px; + } + + .title-section { + flex: 1; + } + + .contract-number { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + margin-bottom: 8px; + } + + .title-input-wrapper { + position: relative; + } + + .title-input { + width: 100%; + font-size: 24px; + font-weight: 700; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + background: transparent; + border: none; + padding: 0; + outline: none; + border-bottom: 2px solid transparent; + transition: border-color 0.15s ease; + } + + .title-input:focus { + border-bottom-color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .title-input::placeholder { + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + } + + .status-section { + display: flex; + align-items: center; + gap: 12px; + } + + /* shadcn-style badge */ + .status-badge { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 2px 10px; + border-radius: 6px; + font-size: 12px; + font-weight: 500; + cursor: pointer; + transition: all 0.15s ease; + border: 1px solid transparent; + line-height: 1.4; + } + + .status-badge:hover:not(:disabled) { + filter: brightness(0.95); + } + + .status-badge:disabled { + cursor: default; + } + + .status-badge.draft { + background: ${cssManager.bdTheme('hsl(48 96% 89%)', 'hsl(48 96% 15%)')}; + color: ${cssManager.bdTheme('hsl(25 95% 30%)', 'hsl(48 96% 70%)')}; + border-color: ${cssManager.bdTheme('hsl(48 96% 76%)', 'hsl(48 96% 25%)')}; + } + + .status-badge.review { + background: ${cssManager.bdTheme('hsl(214 95% 93%)', 'hsl(214 95% 15%)')}; + color: ${cssManager.bdTheme('hsl(214 95% 35%)', 'hsl(214 95% 70%)')}; + border-color: ${cssManager.bdTheme('hsl(214 95% 80%)', 'hsl(214 95% 25%)')}; + } + + .status-badge.pending { + background: ${cssManager.bdTheme('hsl(38 92% 90%)', 'hsl(38 92% 15%)')}; + color: ${cssManager.bdTheme('hsl(25 95% 35%)', 'hsl(38 92% 65%)')}; + border-color: ${cssManager.bdTheme('hsl(38 92% 75%)', 'hsl(38 92% 25%)')}; + } + + .status-badge.signed, + .status-badge.active { + background: ${cssManager.bdTheme('hsl(142 76% 90%)', 'hsl(142 76% 15%)')}; + color: ${cssManager.bdTheme('hsl(142 76% 28%)', 'hsl(142 76% 65%)')}; + border-color: ${cssManager.bdTheme('hsl(142 76% 75%)', 'hsl(142 76% 25%)')}; + } + + .status-badge.terminated { + background: ${cssManager.bdTheme('hsl(0 84% 92%)', 'hsl(0 84% 15%)')}; + color: ${cssManager.bdTheme('hsl(0 84% 35%)', 'hsl(0 84% 65%)')}; + border-color: ${cssManager.bdTheme('hsl(0 84% 80%)', 'hsl(0 84% 25%)')}; + } + + .status-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: currentColor; + opacity: 0.8; + } + + /* Meta info row */ + .meta-row { + display: flex; + flex-wrap: wrap; + gap: 24px; + padding-top: 20px; + border-top: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .meta-item { + display: flex; + flex-direction: column; + gap: 4px; + } + + .meta-label { + font-size: 12px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + text-transform: uppercase; + letter-spacing: 0.05em; + } + + .meta-value { + font-size: 14px; + font-weight: 500; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .meta-value.clickable { + cursor: pointer; + color: ${cssManager.bdTheme('#2563eb', '#60a5fa')}; + } + + .meta-value.clickable:hover { + text-decoration: underline; + } + + /* Tags */ + .tags-container { + display: flex; + flex-wrap: wrap; + gap: 6px; + } + + .tag { + display: inline-flex; + align-items: center; + padding: 4px 10px; + border-radius: 6px; + font-size: 12px; + font-weight: 500; + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + /* Quick actions */ + .quick-actions { + display: flex; + gap: 8px; + } + + .action-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + border-radius: 8px; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + cursor: pointer; + transition: all 0.15s ease; + } + + .action-btn:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#18181b')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + border-color: ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + } + + .action-btn dees-icon { + font-size: 16px; + } + + /* Status dropdown */ + .status-dropdown { + position: absolute; + top: 100%; + right: 0; + margin-top: 8px; + min-width: 200px; + background: ${cssManager.bdTheme('#ffffff', '#18181b')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + z-index: 100; + overflow: hidden; + } + + .status-option { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 14px; + font-size: 14px; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + cursor: pointer; + transition: background 0.1s ease; + } + + .status-option:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + } + + .status-option.selected { + background: ${cssManager.bdTheme('#eff6ff', '#1e3a5f')}; + color: ${cssManager.bdTheme('#1e40af', '#93c5fd')}; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + @property({ type: Boolean }) + public accessor readonly: boolean = false; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor showStatusDropdown: boolean = false; + + @state() + private accessor editingTitle: boolean = false; + + // ============================================================================ + // STATUS CONFIGURATION + // ============================================================================ + + private statusOptions: Array<{ + value: plugins.sdInterfaces.TContractStatus; + label: string; + category: string; + }> = [ + { value: 'draft', label: 'Draft', category: 'draft' }, + { value: 'internal_review', label: 'Internal Review', category: 'review' }, + { value: 'legal_review', label: 'Legal Review', category: 'review' }, + { value: 'negotiation', label: 'Negotiation', category: 'review' }, + { value: 'pending_approval', label: 'Pending Approval', category: 'pending' }, + { value: 'pending_signature', label: 'Pending Signature', category: 'pending' }, + { value: 'partially_signed', label: 'Partially Signed', category: 'pending' }, + { value: 'signed', label: 'Signed', category: 'signed' }, + { value: 'executed', label: 'Executed', category: 'signed' }, + { value: 'active', label: 'Active', category: 'active' }, + { value: 'expired', label: 'Expired', category: 'terminated' }, + { value: 'terminated', label: 'Terminated', category: 'terminated' }, + { value: 'cancelled', label: 'Cancelled', category: 'terminated' }, + { value: 'voided', label: 'Voided', category: 'terminated' }, + ]; + + // ============================================================================ + // EVENT HANDLERS + // ============================================================================ + + private handleTitleChange(e: Event) { + const input = e.target as HTMLInputElement; + this.dispatchEvent( + new CustomEvent('field-change', { + detail: { path: 'title', value: input.value }, + bubbles: true, + composed: true, + }) + ); + } + + private handleStatusChange(status: plugins.sdInterfaces.TContractStatus) { + this.showStatusDropdown = false; + this.dispatchEvent( + new CustomEvent('field-change', { + detail: { path: 'lifecycle.currentStatus', value: status }, + bubbles: true, + composed: true, + }) + ); + } + + private toggleStatusDropdown() { + if (!this.readonly) { + this.showStatusDropdown = !this.showStatusDropdown; + } + } + + private handleExport() { + this.dispatchEvent( + new CustomEvent('action', { + detail: { action: 'export' }, + bubbles: true, + composed: true, + }) + ); + } + + private handleDuplicate() { + this.dispatchEvent( + new CustomEvent('action', { + detail: { action: 'duplicate' }, + bubbles: true, + composed: true, + }) + ); + } + + private handleShare() { + this.dispatchEvent( + new CustomEvent('action', { + detail: { action: 'share' }, + bubbles: true, + composed: true, + }) + ); + } + + // ============================================================================ + // HELPERS + // ============================================================================ + + private getStatusCategory(status: string): string { + const option = this.statusOptions.find((o) => o.value === status); + return option?.category || 'draft'; + } + + private formatStatus(status: string): string { + const option = this.statusOptions.find((o) => o.value === status); + return option?.label || status.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()); + } + + private formatDate(timestamp: number): string { + return new Date(timestamp).toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric', + }); + } + + private formatContractType(type: string): string { + return type.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()); + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + if (!this.contract) { + return html`
No contract loaded
`; + } + + const status = this.contract.lifecycle?.currentStatus || 'draft'; + const statusCategory = this.getStatusCategory(status); + + return html` +
+
+
+ ${this.contract.metadata?.contractNumber + ? html`
#${this.contract.metadata.contractNumber}
` + : ''} +
+ +
+
+ +
+
+ + + ${this.showStatusDropdown + ? html` +
+ ${this.statusOptions.map( + (option) => html` +
this.handleStatusChange(option.value)} + > + + ${option.label} +
+ ` + )} +
+ ` + : ''} +
+ +
+ + + +
+
+
+ + ${this.contract.metadata ? html` +
+
+ Type + ${this.formatContractType(this.contract.metadata.contractType)} +
+ +
+ Category + ${this.formatContractType(this.contract.metadata.category)} +
+ +
+ Language + ${this.contract.metadata.language?.toUpperCase() || 'N/A'} +
+ +
+ Jurisdiction + + ${this.contract.metadata.governingLaw?.country || 'Not specified'} + ${this.contract.metadata.governingLaw?.state + ? `, ${this.contract.metadata.governingLaw.state}` + : ''} + +
+ +
+ Created + ${this.formatDate(this.contract.createdAt)} +
+ +
+ Parties + ${this.contract.involvedParties?.length || 0} parties +
+ + ${this.contract.metadata.tags?.length > 0 + ? html` +
+ Tags +
+ ${this.contract.metadata.tags.map((tag) => html`${tag}`)} +
+
+ ` + : ''} +
+ ` : ''} +
+ `; + } +} diff --git a/ts_web/elements/sdig-contract-metadata/index.ts b/ts_web/elements/sdig-contract-metadata/index.ts new file mode 100644 index 0000000..eec7baf --- /dev/null +++ b/ts_web/elements/sdig-contract-metadata/index.ts @@ -0,0 +1 @@ +export * from './sdig-contract-metadata.js'; diff --git a/ts_web/elements/sdig-contract-metadata/sdig-contract-metadata.ts b/ts_web/elements/sdig-contract-metadata/sdig-contract-metadata.ts new file mode 100644 index 0000000..b8cea34 --- /dev/null +++ b/ts_web/elements/sdig-contract-metadata/sdig-contract-metadata.ts @@ -0,0 +1,820 @@ +/** + * @file sdig-contract-metadata.ts + * @description Contract metadata editor component + */ + +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + state, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contract-metadata': SdigContractMetadata; + } +} + +// Type-safe options arrays +const CONTRACT_CATEGORIES: Array<{ value: plugins.sdInterfaces.TContractCategory; label: string }> = [ + { value: 'employment', label: 'Employment' }, + { value: 'service', label: 'Service Agreement' }, + { value: 'sales', label: 'Sales' }, + { value: 'lease', label: 'Lease / Rental' }, + { value: 'license', label: 'License' }, + { value: 'partnership', label: 'Partnership' }, + { value: 'confidentiality', label: 'Confidentiality / NDA' }, + { value: 'financial', label: 'Financial' }, + { value: 'real_estate', label: 'Real Estate' }, + { value: 'intellectual_property', label: 'Intellectual Property' }, + { value: 'government', label: 'Government' }, + { value: 'construction', label: 'Construction' }, + { value: 'healthcare', label: 'Healthcare' }, + { value: 'insurance', label: 'Insurance' }, + { value: 'other', label: 'Other' }, +]; + +const CONFIDENTIALITY_LEVELS: Array<{ value: plugins.sdInterfaces.TConfidentialityLevel; label: string }> = [ + { value: 'public', label: 'Public' }, + { value: 'internal', label: 'Internal' }, + { value: 'confidential', label: 'Confidential' }, + { value: 'restricted', label: 'Restricted' }, +]; + +const DISPUTE_RESOLUTIONS: Array<{ value: plugins.sdInterfaces.TDisputeResolution; label: string }> = [ + { value: 'litigation', label: 'Litigation' }, + { value: 'arbitration', label: 'Arbitration' }, + { value: 'mediation', label: 'Mediation' }, + { value: 'negotiation', label: 'Negotiation' }, +]; + +const COMMON_LANGUAGES = [ + { value: 'en', label: 'English' }, + { value: 'de', label: 'German' }, + { value: 'fr', label: 'French' }, + { value: 'es', label: 'Spanish' }, + { value: 'it', label: 'Italian' }, + { value: 'pt', label: 'Portuguese' }, + { value: 'nl', label: 'Dutch' }, + { value: 'pl', label: 'Polish' }, + { value: 'sv', label: 'Swedish' }, + { value: 'da', label: 'Danish' }, + { value: 'fi', label: 'Finnish' }, + { value: 'no', label: 'Norwegian' }, + { value: 'zh', label: 'Chinese' }, + { value: 'ja', label: 'Japanese' }, + { value: 'ko', label: 'Korean' }, + { value: 'ar', label: 'Arabic' }, + { value: 'ru', label: 'Russian' }, +]; + +@customElement('sdig-contract-metadata') +export class SdigContractMetadata extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + } + + .metadata-container { + display: flex; + flex-direction: column; + gap: 24px; + } + + /* Section cards */ + .section-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + overflow: hidden; + } + + .section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .section-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .section-title dees-icon { + font-size: 18px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .section-content { + padding: 20px; + } + + /* Form grid */ + .form-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 20px; + } + + .form-group { + display: flex; + flex-direction: column; + gap: 6px; + } + + .form-group.full-width { + grid-column: 1 / -1; + } + + .form-label { + font-size: 13px; + font-weight: 500; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .form-label .required { + color: #ef4444; + margin-left: 2px; + } + + .form-description { + font-size: 12px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + margin-top: 4px; + } + + /* Input styles */ + .form-input, + .form-select, + .form-textarea { + width: 100%; + padding: 10px 12px; + font-size: 14px; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + background: ${cssManager.bdTheme('#ffffff', '#18181b')}; + border: 1px solid ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 8px; + outline: none; + transition: all 0.15s ease; + } + + .form-input:focus, + .form-select:focus, + .form-textarea:focus { + border-color: ${cssManager.bdTheme('#111111', '#fafafa')}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(0,0,0,0.05)', 'rgba(255,255,255,0.05)')}; + } + + .form-input::placeholder, + .form-textarea::placeholder { + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + } + + .form-input:disabled, + .form-select:disabled, + .form-textarea:disabled { + opacity: 0.6; + cursor: not-allowed; + } + + .form-select { + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 10px center; + background-repeat: no-repeat; + background-size: 16px; + padding-right: 36px; + } + + .form-textarea { + min-height: 80px; + resize: vertical; + } + + /* Radio group */ + .radio-group { + display: flex; + flex-wrap: wrap; + gap: 12px; + } + + .radio-option { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + } + + .radio-option input[type="radio"] { + width: 18px; + height: 18px; + accent-color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .radio-option span { + font-size: 14px; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + /* Tags input */ + .tags-input-container { + display: flex; + flex-wrap: wrap; + gap: 8px; + padding: 8px 12px; + min-height: 44px; + background: ${cssManager.bdTheme('#ffffff', '#18181b')}; + border: 1px solid ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 8px; + cursor: text; + } + + .tags-input-container:focus-within { + border-color: ${cssManager.bdTheme('#111111', '#fafafa')}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(0,0,0,0.05)', 'rgba(255,255,255,0.05)')}; + } + + .tag-item { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 4px 10px; + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + border-radius: 6px; + font-size: 13px; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .tag-remove { + display: flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + border-radius: 50%; + background: transparent; + border: none; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + cursor: pointer; + font-size: 14px; + line-height: 1; + } + + .tag-remove:hover { + background: ${cssManager.bdTheme('#e5e7eb', '#3f3f46')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .tags-input { + flex: 1; + min-width: 120px; + border: none; + background: transparent; + padding: 4px 0; + font-size: 14px; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + outline: none; + } + + .tags-input::placeholder { + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + } + + /* Divider */ + .section-divider { + border-top: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + margin: 20px 0; + } + + /* Collapsible sections */ + .collapsible-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 0; + cursor: pointer; + user-select: none; + } + + .collapsible-header:hover .collapse-icon { + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .collapse-icon { + font-size: 16px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + transition: transform 0.2s ease; + } + + .collapse-icon.expanded { + transform: rotate(180deg); + } + + .collapsible-content { + overflow: hidden; + max-height: 0; + opacity: 0; + transition: all 0.3s ease; + } + + .collapsible-content.expanded { + max-height: 1000px; + opacity: 1; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + @property({ type: Boolean }) + public accessor readonly: boolean = false; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor showArbitrationFields: boolean = false; + + @state() + private accessor newTag: string = ''; + + // ============================================================================ + // LIFECYCLE + // ============================================================================ + + public updated(changedProperties: Map) { + if (changedProperties.has('contract') && this.contract?.metadata?.governingLaw) { + this.showArbitrationFields = this.contract.metadata.governingLaw.disputeResolution === 'arbitration'; + } + } + + // ============================================================================ + // EVENT HANDLERS + // ============================================================================ + + private handleFieldChange(path: string, value: unknown) { + this.dispatchEvent( + new CustomEvent('field-change', { + detail: { path, value }, + bubbles: true, + composed: true, + }) + ); + } + + private handleInputChange(path: string, e: Event) { + const input = e.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement; + this.handleFieldChange(path, input.value); + } + + private handleRadioChange(path: string, value: string) { + this.handleFieldChange(path, value); + + // Special handling for dispute resolution + if (path === 'metadata.governingLaw.disputeResolution') { + this.showArbitrationFields = value === 'arbitration'; + } + } + + private handleTagAdd(e: KeyboardEvent) { + if (e.key === 'Enter' && this.newTag.trim()) { + e.preventDefault(); + const currentTags = this.contract?.metadata.tags || []; + if (!currentTags.includes(this.newTag.trim())) { + this.handleFieldChange('metadata.tags', [...currentTags, this.newTag.trim()]); + } + this.newTag = ''; + } + } + + private handleTagRemove(tag: string) { + const currentTags = this.contract?.metadata.tags || []; + this.handleFieldChange( + 'metadata.tags', + currentTags.filter((t) => t !== tag) + ); + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + if (!this.contract) { + return html`
No contract loaded
`; + } + + if (!this.contract.metadata) { + return html``; + } + + const metadata = this.contract.metadata; + + return html` + + `; + } +} diff --git a/ts_web/elements/sdig-contract-parties/index.ts b/ts_web/elements/sdig-contract-parties/index.ts new file mode 100644 index 0000000..8a61c8e --- /dev/null +++ b/ts_web/elements/sdig-contract-parties/index.ts @@ -0,0 +1 @@ +export * from './sdig-contract-parties.js'; diff --git a/ts_web/elements/sdig-contract-parties/sdig-contract-parties.ts b/ts_web/elements/sdig-contract-parties/sdig-contract-parties.ts new file mode 100644 index 0000000..a6241b1 --- /dev/null +++ b/ts_web/elements/sdig-contract-parties/sdig-contract-parties.ts @@ -0,0 +1,736 @@ +/** + * @file sdig-contract-parties.ts + * @description Contract parties and roles management component + */ + +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + state, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contract-parties': SdigContractParties; + } +} + +// Party role display configuration +const PARTY_ROLES: Array<{ value: plugins.sdInterfaces.TPartyRole; label: string; icon: string }> = [ + { value: 'signer', label: 'Signer', icon: 'lucide:pen-tool' }, + { value: 'witness', label: 'Witness', icon: 'lucide:eye' }, + { value: 'notary', label: 'Notary', icon: 'lucide:stamp' }, + { value: 'cc', label: 'CC (Copy)', icon: 'lucide:mail' }, + { value: 'approver', label: 'Approver', icon: 'lucide:check-circle' }, + { value: 'guarantor', label: 'Guarantor', icon: 'lucide:shield' }, + { value: 'beneficiary', label: 'Beneficiary', icon: 'lucide:user-check' }, +]; + +const SIGNING_DEPENDENCIES: Array<{ value: plugins.sdInterfaces.TSigningDependency; label: string }> = [ + { value: 'none', label: 'No dependency' }, + { value: 'sequential', label: 'Sequential (in order)' }, + { value: 'parallel', label: 'Parallel (any order)' }, + { value: 'after_specific', label: 'After specific parties' }, +]; + +@customElement('sdig-contract-parties') +export class SdigContractParties extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + } + + .parties-container { + display: flex; + flex-direction: column; + gap: 24px; + } + + /* Section cards */ + .section-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + overflow: hidden; + } + + .section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .section-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .section-title dees-icon { + font-size: 18px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .section-content { + padding: 20px; + } + + /* Roles list */ + .roles-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 16px; + } + + .role-card { + display: flex; + flex-direction: column; + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + transition: all 0.15s ease; + } + + .role-card:hover { + border-color: ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + } + + .role-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12px; + } + + .role-name { + display: flex; + align-items: center; + gap: 8px; + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .role-name dees-icon { + font-size: 16px; + padding: 6px; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + border-radius: 6px; + } + + .role-badge { + font-size: 11px; + font-weight: 500; + padding: 2px 8px; + border-radius: 4px; + background: ${cssManager.bdTheme('#dbeafe', '#1e3a5f')}; + color: ${cssManager.bdTheme('#1e40af', '#93c5fd')}; + } + + .role-description { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + margin-bottom: 12px; + } + + .role-meta { + display: flex; + flex-wrap: wrap; + gap: 8px; + font-size: 12px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .role-meta-item { + display: flex; + align-items: center; + gap: 4px; + } + + /* Parties list */ + .parties-list { + display: flex; + flex-direction: column; + gap: 16px; + } + + .party-card { + display: flex; + align-items: flex-start; + gap: 16px; + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + transition: all 0.15s ease; + } + + .party-card:hover { + border-color: ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + } + + .party-card.selected { + border-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + background: ${cssManager.bdTheme('#eff6ff', '#172554')}; + } + + .party-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + font-weight: 600; + color: white; + flex-shrink: 0; + } + + .party-info { + flex: 1; + min-width: 0; + } + + .party-name { + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + margin-bottom: 4px; + } + + .party-role-tag { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 2px 8px; + border-radius: 4px; + font-size: 11px; + font-weight: 500; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + margin-bottom: 8px; + } + + .party-details { + display: flex; + flex-wrap: wrap; + gap: 16px; + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .party-detail { + display: flex; + align-items: center; + gap: 6px; + } + + .party-detail dees-icon { + font-size: 14px; + } + + .party-status { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 8px; + } + + .signature-status { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 4px 10px; + border-radius: 9999px; + font-size: 12px; + font-weight: 500; + } + + .signature-status.pending { + background: ${cssManager.bdTheme('#fef3c7', '#422006')}; + color: ${cssManager.bdTheme('#92400e', '#fcd34d')}; + } + + .signature-status.signed { + background: ${cssManager.bdTheme('#d1fae5', '#064e3b')}; + color: ${cssManager.bdTheme('#065f46', '#6ee7b7')}; + } + + .signature-status.declined { + background: ${cssManager.bdTheme('#fee2e2', '#450a0a')}; + color: ${cssManager.bdTheme('#991b1b', '#fca5a5')}; + } + + .signing-order { + display: flex; + align-items: center; + gap: 4px; + font-size: 12px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .order-number { + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: 600; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + /* Add button */ + .add-button { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 12px 20px; + background: transparent; + border: 2px dashed ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 10px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.15s ease; + } + + .add-button:hover { + border-color: ${cssManager.bdTheme('#9ca3af', '#52525b')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + background: ${cssManager.bdTheme('#f9fafb', '#18181b')}; + } + + /* Empty state */ + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + padding: 40px 20px; + text-align: center; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .empty-state dees-icon { + font-size: 48px; + margin-bottom: 16px; + opacity: 0.5; + } + + .empty-state h4 { + margin: 0 0 8px; + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .empty-state p { + margin: 0; + font-size: 14px; + } + + /* Action buttons */ + .action-buttons { + display: flex; + gap: 8px; + } + + .btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + border-radius: 6px; + border: none; + cursor: pointer; + transition: all 0.15s ease; + } + + .btn-sm { + padding: 6px 10px; + font-size: 12px; + } + + .btn-primary { + background: ${cssManager.bdTheme('#111111', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#09090b')}; + } + + .btn-primary:hover { + background: ${cssManager.bdTheme('#333333', '#e5e5e5')}; + } + + .btn-secondary { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .btn-secondary:hover { + background: ${cssManager.bdTheme('#e5e7eb', '#3f3f46')}; + } + + .btn-ghost { + background: transparent; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .btn-ghost:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + @property({ type: Boolean }) + public accessor readonly: boolean = false; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor selectedPartyId: string | null = null; + + @state() + private accessor showRoleEditor: boolean = false; + + @state() + private accessor showPartyEditor: boolean = false; + + // ============================================================================ + // EVENT HANDLERS + // ============================================================================ + + private handleFieldChange(path: string, value: unknown) { + this.dispatchEvent( + new CustomEvent('field-change', { + detail: { path, value }, + bubbles: true, + composed: true, + }) + ); + } + + private handleSelectParty(partyId: string) { + this.selectedPartyId = this.selectedPartyId === partyId ? null : partyId; + this.dispatchEvent( + new CustomEvent('party-select', { + detail: { partyId: this.selectedPartyId }, + bubbles: true, + composed: true, + }) + ); + } + + private handleAddRole() { + this.showRoleEditor = true; + // TODO: Open role editor modal + } + + private handleAddParty() { + this.showPartyEditor = true; + // TODO: Open party editor modal + } + + private handleRemoveParty(partyId: string) { + if (!this.contract) return; + const updatedParties = this.contract.involvedParties.filter((p) => p.partyId !== partyId); + this.handleFieldChange('involvedParties', updatedParties); + } + + // ============================================================================ + // HELPERS + // ============================================================================ + + private getPartyDisplayName(party: plugins.sdInterfaces.IInvolvedParty): string { + if (!party) return 'Unknown Party'; + const contact = party.contact; + if (!contact) return party.deliveryEmail || 'Unknown Party'; + if ('name' in contact && contact.name) { + return contact.name as string; + } + if ('firstName' in contact && 'lastName' in contact) { + return `${contact.firstName || ''} ${contact.lastName || ''}`.trim() || party.deliveryEmail || 'Unknown Party'; + } + return party.deliveryEmail || 'Unknown Party'; + } + + private getPartyInitials(party: plugins.sdInterfaces.IInvolvedParty): string { + const name = this.getPartyDisplayName(party); + if (!name || name.length === 0) return '??'; + const parts = name.split(' '); + if (parts.length >= 2 && parts[0].length > 0 && parts[parts.length - 1].length > 0) { + return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase(); + } + return name.substring(0, Math.min(2, name.length)).toUpperCase(); + } + + private getPartyColor(party: plugins.sdInterfaces.IInvolvedParty): string { + // Generate a consistent color based on party ID + const colors = [ + '#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', + '#ec4899', '#06b6d4', '#84cc16', '#f97316', '#6366f1', + ]; + const idStr = party?.partyId || 'default'; + const hash = idStr.split('').reduce((a, b) => a + b.charCodeAt(0), 0); + return colors[hash % colors.length]; + } + + private getRoleName(roleId: string): string { + if (!roleId) return 'Unknown Role'; + const role = this.contract?.availableRoles.find((r) => r.id === roleId); + return role?.name || roleId.charAt(0).toUpperCase() + roleId.slice(1); + } + + private getSignatureStatusClass(status: string): string { + if (status === 'signed') return 'signed'; + if (status === 'declined') return 'declined'; + return 'pending'; + } + + private formatSignatureStatus(status: string): string { + return status.charAt(0).toUpperCase() + status.slice(1); + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + if (!this.contract) { + return html`
No contract loaded
`; + } + + const roles = this.contract.availableRoles; + const parties = this.contract.involvedParties; + + return html` +
+ +
+
+
+ + Available Roles +
+ ${!this.readonly + ? html` + + ` + : ''} +
+
+ ${roles.length > 0 + ? html` +
+ ${roles.map((role) => this.renderRoleCard(role))} +
+ ` + : html` +
+ +

No Roles Defined

+

Add roles to define the types of parties in this contract

+
+ `} +
+
+ + +
+
+
+ + Involved Parties (${parties.length}) +
+ ${!this.readonly + ? html` + + ` + : ''} +
+
+ ${parties.length > 0 + ? html` +
+ ${parties.map((party) => this.renderPartyCard(party))} +
+ ` + : html` +
+ +

No Parties Added

+

Add parties who will be involved in this contract

+
+ `} +
+
+
+ `; + } + + private renderRoleCard(role: plugins.sdInterfaces.IRole): TemplateResult { + return html` +
+
+
+ + ${role.name} +
+ ${role.category} +
+
${role.description || 'No description'}
+
+ ${role.signatureRequired + ? html` + + + Signature required + + ` + : ''} + ${role.defaultSigningOrder > 0 + ? html` + + + Order: ${role.defaultSigningOrder} + + ` + : ''} + ${role.minParties + ? html` + + + Min: ${role.minParties}${role.maxParties ? `, Max: ${role.maxParties}` : ''} + + ` + : ''} +
+
+ `; + } + + private renderPartyCard(party: plugins.sdInterfaces.IInvolvedParty): TemplateResult { + // Handle both full IInvolvedParty and minimal demo data + const partyId = (party as any).partyId || (party as any).role || 'unknown'; + const roleId = (party as any).roleId || (party as any).role || ''; + const partyRole = (party as any).partyRole || 'signer'; + const signatureStatus = (party as any).signature?.status || 'pending'; + const signingOrder = (party as any).signingOrder || 0; + const deliveryEmail = (party as any).deliveryEmail; + const deliveryPhone = (party as any).deliveryPhone; + const actingAsProxy = (party as any).actingAsProxy; + + const isSelected = this.selectedPartyId === partyId; + + return html` +
this.handleSelectParty(partyId)} + > +
+ ${this.getPartyInitials(party)} +
+ +
+
${this.getPartyDisplayName(party)}
+
+ ${this.getRoleName(roleId)} (${PARTY_ROLES.find((r) => r.value === partyRole)?.label || partyRole}) +
+
+ ${deliveryEmail + ? html` +
+ + ${deliveryEmail} +
+ ` + : ''} + ${deliveryPhone + ? html` +
+ + ${deliveryPhone} +
+ ` + : ''} + ${actingAsProxy + ? html` +
+ + Acting as proxy +
+ ` + : ''} +
+
+ +
+ + ${this.formatSignatureStatus(signatureStatus)} + + ${signingOrder > 0 + ? html` +
+ ${signingOrder} + Signing order +
+ ` + : ''} +
+
+ `; + } +} diff --git a/ts_web/elements/sdig-contract-signatures/index.ts b/ts_web/elements/sdig-contract-signatures/index.ts new file mode 100644 index 0000000..3a50274 --- /dev/null +++ b/ts_web/elements/sdig-contract-signatures/index.ts @@ -0,0 +1 @@ +export * from './sdig-contract-signatures.js'; diff --git a/ts_web/elements/sdig-contract-signatures/sdig-contract-signatures.ts b/ts_web/elements/sdig-contract-signatures/sdig-contract-signatures.ts new file mode 100644 index 0000000..cb2548c --- /dev/null +++ b/ts_web/elements/sdig-contract-signatures/sdig-contract-signatures.ts @@ -0,0 +1,840 @@ +/** + * @file sdig-contract-signatures.ts + * @description Contract signature fields manager component + */ + +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + state, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contract-signatures': SdigContractSignatures; + } +} + +// Signature field interface (for future interface updates) +interface ISignatureField { + id: string; + name: string; + assignedPartyId: string | null; + roleId: string; + type: 'signature' | 'initials' | 'date' | 'text'; + required: boolean; + status: 'pending' | 'ready' | 'signed' | 'declined'; + signedAt?: number; + signatureData?: any; + position: { + paragraphId?: string; + pageNumber?: number; + x: number; + y: number; + }; +} + +// Signature status configuration +const SIGNATURE_STATUSES = [ + { value: 'pending', label: 'Pending', color: '#f59e0b', icon: 'lucide:clock' }, + { value: 'ready', label: 'Ready to Sign', color: '#3b82f6', icon: 'lucide:pen-tool' }, + { value: 'signed', label: 'Signed', color: '#10b981', icon: 'lucide:check-circle' }, + { value: 'declined', label: 'Declined', color: '#ef4444', icon: 'lucide:x-circle' }, +]; + +const FIELD_TYPES = [ + { value: 'signature', label: 'Full Signature', icon: 'lucide:pen-tool' }, + { value: 'initials', label: 'Initials', icon: 'lucide:type' }, + { value: 'date', label: 'Date', icon: 'lucide:calendar' }, + { value: 'text', label: 'Text Field', icon: 'lucide:text-cursor' }, +]; + +@customElement('sdig-contract-signatures') +export class SdigContractSignatures extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + } + + .signatures-container { + display: flex; + flex-direction: column; + gap: 24px; + } + + /* Summary cards */ + .summary-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + gap: 16px; + } + + .summary-card { + display: flex; + flex-direction: column; + gap: 8px; + padding: 20px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + } + + .summary-card-icon { + width: 40px; + height: 40px; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + } + + .summary-card-icon.pending { + background: ${cssManager.bdTheme('#fef3c7', '#422006')}; + color: ${cssManager.bdTheme('#f59e0b', '#fcd34d')}; + } + + .summary-card-icon.ready { + background: ${cssManager.bdTheme('#dbeafe', '#1e3a5f')}; + color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + } + + .summary-card-icon.signed { + background: ${cssManager.bdTheme('#d1fae5', '#064e3b')}; + color: ${cssManager.bdTheme('#10b981', '#34d399')}; + } + + .summary-card-icon.declined { + background: ${cssManager.bdTheme('#fee2e2', '#450a0a')}; + color: ${cssManager.bdTheme('#ef4444', '#f87171')}; + } + + .summary-card-value { + font-size: 28px; + font-weight: 700; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .summary-card-label { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + /* Section card */ + .section-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + overflow: hidden; + } + + .section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .section-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .section-title dees-icon { + font-size: 18px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .section-content { + padding: 20px; + } + + /* Signature fields list */ + .fields-list { + display: flex; + flex-direction: column; + gap: 12px; + } + + .field-card { + display: flex; + align-items: center; + gap: 16px; + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + transition: all 0.15s ease; + } + + .field-card:hover { + border-color: ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + } + + .field-card.selected { + border-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + background: ${cssManager.bdTheme('#eff6ff', '#172554')}; + } + + .field-icon { + width: 44px; + height: 44px; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + flex-shrink: 0; + } + + .field-info { + flex: 1; + min-width: 0; + } + + .field-name { + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + margin-bottom: 4px; + } + + .field-meta { + display: flex; + flex-wrap: wrap; + gap: 12px; + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .field-meta-item { + display: flex; + align-items: center; + gap: 4px; + } + + .field-meta-item dees-icon { + font-size: 14px; + } + + .field-status { + display: flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + border-radius: 9999px; + font-size: 12px; + font-weight: 500; + } + + .field-status.pending { + background: ${cssManager.bdTheme('#fef3c7', '#422006')}; + color: ${cssManager.bdTheme('#92400e', '#fcd34d')}; + } + + .field-status.ready { + background: ${cssManager.bdTheme('#dbeafe', '#1e3a5f')}; + color: ${cssManager.bdTheme('#1e40af', '#93c5fd')}; + } + + .field-status.signed { + background: ${cssManager.bdTheme('#d1fae5', '#064e3b')}; + color: ${cssManager.bdTheme('#065f46', '#6ee7b7')}; + } + + .field-status.declined { + background: ${cssManager.bdTheme('#fee2e2', '#450a0a')}; + color: ${cssManager.bdTheme('#991b1b', '#fca5a5')}; + } + + .field-actions { + display: flex; + gap: 8px; + flex-shrink: 0; + } + + /* Signer progress */ + .signers-section { + margin-top: 24px; + } + + .signers-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 16px; + } + + .signer-card { + display: flex; + align-items: center; + gap: 14px; + padding: 16px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + } + + .signer-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + font-weight: 600; + color: white; + flex-shrink: 0; + } + + .signer-info { + flex: 1; + min-width: 0; + } + + .signer-name { + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + margin-bottom: 4px; + } + + .signer-role { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + margin-bottom: 8px; + } + + .signer-progress { + display: flex; + align-items: center; + gap: 8px; + } + + .progress-bar { + flex: 1; + height: 6px; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + border-radius: 3px; + overflow: hidden; + } + + .progress-fill { + height: 100%; + background: ${cssManager.bdTheme('#10b981', '#34d399')}; + transition: width 0.3s ease; + } + + .progress-text { + font-size: 12px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + min-width: 36px; + text-align: right; + } + + /* Signature preview */ + .signature-preview { + position: relative; + padding: 24px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 10px; + text-align: center; + } + + .signature-preview-label { + font-size: 12px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + margin-bottom: 12px; + } + + .signature-preview-image { + max-width: 200px; + max-height: 80px; + margin: 0 auto; + } + + .signature-preview-placeholder { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + } + + .signature-preview-placeholder dees-icon { + font-size: 32px; + opacity: 0.5; + } + + /* Empty state */ + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + padding: 48px 20px; + text-align: center; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .empty-state dees-icon { + font-size: 48px; + margin-bottom: 16px; + opacity: 0.5; + } + + .empty-state h4 { + margin: 0 0 8px; + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .empty-state p { + margin: 0 0 20px; + font-size: 14px; + } + + /* Buttons */ + .btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + border-radius: 6px; + border: none; + cursor: pointer; + transition: all 0.15s ease; + } + + .btn-sm { + padding: 6px 10px; + font-size: 12px; + } + + .btn-primary { + background: ${cssManager.bdTheme('#111111', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#09090b')}; + } + + .btn-primary:hover { + background: ${cssManager.bdTheme('#333333', '#e5e5e5')}; + } + + .btn-secondary { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .btn-secondary:hover { + background: ${cssManager.bdTheme('#e5e7eb', '#3f3f46')}; + } + + .btn-ghost { + background: transparent; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + padding: 6px; + } + + .btn-ghost:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .btn-success { + background: ${cssManager.bdTheme('#10b981', '#059669')}; + color: white; + } + + .btn-success:hover { + background: ${cssManager.bdTheme('#059669', '#047857')}; + } + + /* Type badge */ + .type-badge { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 2px 8px; + border-radius: 4px; + font-size: 11px; + font-weight: 500; + background: ${cssManager.bdTheme('#e5e7eb', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + /* Signing order */ + .signing-order-badge { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: 50%; + font-size: 12px; + font-weight: 600; + background: ${cssManager.bdTheme('#dbeafe', '#1e3a5f')}; + color: ${cssManager.bdTheme('#1e40af', '#93c5fd')}; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + @property({ type: Boolean }) + public accessor readonly: boolean = false; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor selectedFieldId: string | null = null; + + // Demo signature fields data + @state() + private accessor signatureFields: ISignatureField[] = []; + + // ============================================================================ + // LIFECYCLE + // ============================================================================ + + public async firstUpdated() { + // Generate demo signature fields based on contract parties + if (this.contract && this.contract.involvedParties.length > 0) { + this.signatureFields = this.contract.involvedParties.map((party, index) => ({ + id: `sig-${index + 1}`, + name: `Signature - ${this.getPartyRoleName(party.role)}`, + assignedPartyId: null, + roleId: party.role, + type: 'signature' as const, + required: true, + status: index === 0 ? 'signed' : index === 1 ? 'ready' : 'pending', + signedAt: index === 0 ? Date.now() - 86400000 : undefined, + position: { x: 0, y: 0 }, + })); + } + } + + // ============================================================================ + // EVENT HANDLERS + // ============================================================================ + + private handleFieldChange(path: string, value: unknown) { + this.dispatchEvent( + new CustomEvent('field-change', { + detail: { path, value }, + bubbles: true, + composed: true, + }) + ); + } + + private handleSelectField(fieldId: string) { + this.selectedFieldId = this.selectedFieldId === fieldId ? null : fieldId; + } + + private handleAddField() { + const newField: ISignatureField = { + id: `sig-${Date.now()}`, + name: 'New Signature Field', + assignedPartyId: null, + roleId: '', + type: 'signature', + required: true, + status: 'pending', + position: { x: 0, y: 0 }, + }; + this.signatureFields = [...this.signatureFields, newField]; + } + + private handleDeleteField(fieldId: string) { + this.signatureFields = this.signatureFields.filter((f) => f.id !== fieldId); + if (this.selectedFieldId === fieldId) { + this.selectedFieldId = null; + } + } + + // ============================================================================ + // HELPERS + // ============================================================================ + + private getPartyRoleName(roleId: string): string { + const role = this.contract?.availableRoles.find((r) => r.id === roleId); + return role?.name || roleId; + } + + private getStatusConfig(status: string) { + return SIGNATURE_STATUSES.find((s) => s.value === status) || SIGNATURE_STATUSES[0]; + } + + private getFieldTypeConfig(type: string) { + return FIELD_TYPES.find((t) => t.value === type) || FIELD_TYPES[0]; + } + + private getSignatureStats() { + const total = this.signatureFields.length; + const signed = this.signatureFields.filter((f) => f.status === 'signed').length; + const ready = this.signatureFields.filter((f) => f.status === 'ready').length; + const pending = this.signatureFields.filter((f) => f.status === 'pending').length; + const declined = this.signatureFields.filter((f) => f.status === 'declined').length; + return { total, signed, ready, pending, declined }; + } + + private getPartyColor(index: number): string { + const colors = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899']; + return colors[index % colors.length]; + } + + private formatDate(timestamp: number): string { + return new Date(timestamp).toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + }); + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + if (!this.contract) { + return html`
No contract loaded
`; + } + + const stats = this.getSignatureStats(); + + return html` +
+ +
+
+
+ +
+
${stats.pending}
+
Pending
+
+
+
+ +
+
${stats.ready}
+
Ready to Sign
+
+
+
+ +
+
${stats.signed}
+
Signed
+
+
+
+ +
+
${stats.declined}
+
Declined
+
+
+ + +
+
+
+ + Signature Fields +
+ ${!this.readonly + ? html` + + ` + : ''} +
+
+ ${this.signatureFields.length > 0 + ? html` +
+ ${this.signatureFields.map((field, index) => this.renderSignatureField(field, index))} +
+ ` + : html` +
+ +

No Signature Fields

+

Add signature fields to define where parties should sign the contract

+ ${!this.readonly + ? html` + + ` + : ''} +
+ `} +
+
+ + + ${this.contract.involvedParties.length > 0 + ? html` +
+
+
+ + Signers Progress +
+
+
+
+ ${this.contract.involvedParties.map((party, index) => this.renderSignerCard(party, index))} +
+
+
+ ` + : ''} +
+ `; + } + + private renderSignatureField(field: ISignatureField, index: number): TemplateResult { + const isSelected = this.selectedFieldId === field.id; + const statusConfig = this.getStatusConfig(field.status); + const typeConfig = this.getFieldTypeConfig(field.type); + + return html` +
this.handleSelectField(field.id)} + > +
${index + 1}
+ +
+ +
+ +
+
${field.name}
+
+ + + ${this.getPartyRoleName(field.roleId)} + + + + ${typeConfig.label} + + ${field.required + ? html` + + + Required + + ` + : ''} + ${field.signedAt + ? html` + + + ${this.formatDate(field.signedAt)} + + ` + : ''} +
+
+ +
+ + ${statusConfig.label} +
+ + ${!this.readonly + ? html` +
+ + +
+ ` + : ''} +
+ `; + } + + private renderSignerCard(party: plugins.sdInterfaces.IInvolvedParty, index: number): TemplateResult { + const partyFields = this.signatureFields.filter((f) => f.roleId === party.role); + const signedFields = partyFields.filter((f) => f.status === 'signed').length; + const totalFields = partyFields.length; + const progress = totalFields > 0 ? Math.round((signedFields / totalFields) * 100) : 0; + const roleName = this.getPartyRoleName(party.role); + + return html` +
+
+ ${roleName.charAt(0).toUpperCase()} +
+
+
${roleName}
+
${signedFields} of ${totalFields} signatures
+
+
+
+
+ ${progress}% +
+
+
+ `; + } +} diff --git a/ts_web/elements/sdig-contract-terms/index.ts b/ts_web/elements/sdig-contract-terms/index.ts new file mode 100644 index 0000000..66b6808 --- /dev/null +++ b/ts_web/elements/sdig-contract-terms/index.ts @@ -0,0 +1 @@ +export * from './sdig-contract-terms.js'; diff --git a/ts_web/elements/sdig-contract-terms/sdig-contract-terms.ts b/ts_web/elements/sdig-contract-terms/sdig-contract-terms.ts new file mode 100644 index 0000000..253e0c6 --- /dev/null +++ b/ts_web/elements/sdig-contract-terms/sdig-contract-terms.ts @@ -0,0 +1,873 @@ +/** + * @file sdig-contract-terms.ts + * @description Contract terms editor - tabbed container for financial, time, and obligation terms + */ + +import { + DeesElement, + property, + html, + customElement, + type TemplateResult, + css, + cssManager, + state, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contract-terms': SdigContractTerms; + } +} + +// Term types +type TTermTab = 'financial' | 'time' | 'obligations'; + +interface ITermTabConfig { + id: TTermTab; + label: string; + icon: string; + description: string; +} + +const TERM_TABS: ITermTabConfig[] = [ + { id: 'financial', label: 'Financial Terms', icon: 'lucide:banknote', description: 'Payment schedules, rates, and penalties' }, + { id: 'time', label: 'Time Terms', icon: 'lucide:calendar', description: 'Milestones, deadlines, and renewal' }, + { id: 'obligations', label: 'Obligations', icon: 'lucide:check-square', description: 'Deliverables, SLAs, and warranties' }, +]; + +// Extended contract terms interfaces (for future interface updates) +interface IPaymentScheduleItem { + id: string; + description: string; + amount: number; + currency: string; + dueDate: string; + status: 'pending' | 'paid' | 'overdue'; +} + +interface IMilestone { + id: string; + name: string; + description: string; + dueDate: string; + status: 'pending' | 'in_progress' | 'completed' | 'delayed'; + dependencies: string[]; +} + +interface IObligation { + id: string; + description: string; + responsibleParty: string; + deadline: string; + status: 'pending' | 'completed' | 'waived'; +} + +@customElement('sdig-contract-terms') +export class SdigContractTerms extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + } + + .terms-container { + display: flex; + flex-direction: column; + gap: 16px; + } + + /* Section card */ + .section-card { + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + border-radius: 12px; + overflow: hidden; + } + + /* Tab navigation */ + .tabs-nav { + display: flex; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + } + + .tab-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 16px 24px; + font-size: 14px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + background: transparent; + border: none; + border-bottom: 2px solid transparent; + cursor: pointer; + transition: all 0.15s ease; + } + + .tab-btn:hover { + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + background: ${cssManager.bdTheme('#f3f4f6', '#18181b')}; + } + + .tab-btn.active { + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + border-bottom-color: ${cssManager.bdTheme('#111111', '#fafafa')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + } + + .tab-btn dees-icon { + font-size: 16px; + } + + /* Tab content */ + .tab-content { + padding: 24px; + } + + /* Sub-sections */ + .sub-section { + margin-bottom: 24px; + } + + .sub-section:last-child { + margin-bottom: 0; + } + + .sub-section-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 16px; + } + + .sub-section-title { + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .sub-section-description { + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + margin-top: 4px; + } + + /* Form groups */ + .form-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 16px; + margin-bottom: 16px; + } + + .form-group { + display: flex; + flex-direction: column; + gap: 6px; + } + + .form-label { + font-size: 13px; + font-weight: 500; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .form-input { + padding: 10px 12px; + font-size: 14px; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border: 1px solid ${cssManager.bdTheme('#d1d5db', '#3f3f46')}; + border-radius: 6px; + outline: none; + transition: border-color 0.15s ease, box-shadow 0.15s ease; + } + + .form-input:focus { + border-color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(59, 130, 246, 0.1)', 'rgba(96, 165, 250, 0.1)')}; + } + + .form-input::placeholder { + color: ${cssManager.bdTheme('#9ca3af', '#6b7280')}; + } + + select.form-input { + cursor: pointer; + } + + /* Data table */ + .data-table { + width: 100%; + border-collapse: collapse; + font-size: 14px; + } + + .data-table th { + text-align: left; + padding: 12px 16px; + font-weight: 500; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.05em; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .data-table td { + padding: 12px 16px; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .data-table tr:last-child td { + border-bottom: none; + } + + .data-table tr:hover td { + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + } + + /* Status badges */ + .status-badge { + display: inline-flex; + align-items: center; + padding: 4px 10px; + border-radius: 9999px; + font-size: 12px; + font-weight: 500; + } + + .status-badge.pending { + background: ${cssManager.bdTheme('#fef3c7', '#422006')}; + color: ${cssManager.bdTheme('#92400e', '#fcd34d')}; + } + + .status-badge.paid, + .status-badge.completed { + background: ${cssManager.bdTheme('#d1fae5', '#064e3b')}; + color: ${cssManager.bdTheme('#065f46', '#6ee7b7')}; + } + + .status-badge.overdue, + .status-badge.delayed { + background: ${cssManager.bdTheme('#fee2e2', '#450a0a')}; + color: ${cssManager.bdTheme('#991b1b', '#fca5a5')}; + } + + .status-badge.in_progress { + background: ${cssManager.bdTheme('#dbeafe', '#1e3a5f')}; + color: ${cssManager.bdTheme('#1e40af', '#93c5fd')}; + } + + /* Amount display */ + .amount { + font-weight: 600; + font-family: 'Roboto Mono', monospace; + } + + .amount.positive { + color: ${cssManager.bdTheme('#059669', '#34d399')}; + } + + .amount.negative { + color: ${cssManager.bdTheme('#dc2626', '#f87171')}; + } + + /* Summary card */ + .summary-card { + display: flex; + gap: 32px; + padding: 20px; + background: ${cssManager.bdTheme('#f9fafb', '#111111')}; + border-radius: 8px; + margin-bottom: 24px; + } + + .summary-item { + display: flex; + flex-direction: column; + gap: 4px; + } + + .summary-label { + font-size: 12px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + text-transform: uppercase; + letter-spacing: 0.05em; + } + + .summary-value { + font-size: 24px; + font-weight: 700; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .summary-value.currency { + font-family: 'Roboto Mono', monospace; + } + + /* Empty state */ + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + padding: 48px 20px; + text-align: center; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .empty-state dees-icon { + font-size: 48px; + margin-bottom: 16px; + opacity: 0.5; + } + + .empty-state h4 { + margin: 0 0 8px; + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .empty-state p { + margin: 0 0 20px; + font-size: 14px; + } + + /* Buttons */ + .btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + border-radius: 6px; + border: none; + cursor: pointer; + transition: all 0.15s ease; + } + + .btn-sm { + padding: 6px 10px; + font-size: 12px; + } + + .btn-primary { + background: ${cssManager.bdTheme('#111111', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#09090b')}; + } + + .btn-primary:hover { + background: ${cssManager.bdTheme('#333333', '#e5e5e5')}; + } + + .btn-secondary { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .btn-secondary:hover { + background: ${cssManager.bdTheme('#e5e7eb', '#3f3f46')}; + } + + .btn-ghost { + background: transparent; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .btn-ghost:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + /* Add row button */ + .add-row { + display: flex; + justify-content: center; + padding: 16px; + border-top: 1px dashed ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + /* Info banner */ + .info-banner { + display: flex; + align-items: flex-start; + gap: 12px; + padding: 16px; + background: ${cssManager.bdTheme('#eff6ff', '#172554')}; + border: 1px solid ${cssManager.bdTheme('#bfdbfe', '#1e40af')}; + border-radius: 8px; + margin-bottom: 24px; + } + + .info-banner dees-icon { + font-size: 20px; + color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + flex-shrink: 0; + } + + .info-banner-content { + flex: 1; + } + + .info-banner-title { + font-size: 14px; + font-weight: 600; + color: ${cssManager.bdTheme('#1e40af', '#93c5fd')}; + margin-bottom: 4px; + } + + .info-banner-text { + font-size: 13px; + color: ${cssManager.bdTheme('#3b82f6', '#60a5fa')}; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + @property({ type: Boolean }) + public accessor readonly: boolean = false; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor activeTab: TTermTab = 'financial'; + + // Demo data for terms (will be replaced with actual contract data when interface is extended) + @state() + private accessor paymentSchedule: IPaymentScheduleItem[] = [ + { id: '1', description: 'Initial deposit', amount: 5000, currency: 'EUR', dueDate: '2024-02-01', status: 'paid' }, + { id: '2', description: 'Monthly payment - March', amount: 1000, currency: 'EUR', dueDate: '2024-03-01', status: 'paid' }, + { id: '3', description: 'Monthly payment - April', amount: 1000, currency: 'EUR', dueDate: '2024-04-01', status: 'pending' }, + ]; + + @state() + private accessor milestones: IMilestone[] = [ + { id: '1', name: 'Project Kickoff', description: 'Initial planning and setup', dueDate: '2024-02-15', status: 'completed', dependencies: [] }, + { id: '2', name: 'Phase 1 Delivery', description: 'First deliverable milestone', dueDate: '2024-03-15', status: 'in_progress', dependencies: ['1'] }, + { id: '3', name: 'Final Delivery', description: 'Complete project delivery', dueDate: '2024-05-01', status: 'pending', dependencies: ['2'] }, + ]; + + @state() + private accessor obligations: IObligation[] = [ + { id: '1', description: 'Provide access credentials', responsibleParty: 'employer', deadline: '2024-02-01', status: 'completed' }, + { id: '2', description: 'Submit monthly reports', responsibleParty: 'employee', deadline: '2024-03-01', status: 'pending' }, + { id: '3', description: 'Conduct quarterly review', responsibleParty: 'employer', deadline: '2024-04-01', status: 'pending' }, + ]; + + // ============================================================================ + // EVENT HANDLERS + // ============================================================================ + + private handleFieldChange(path: string, value: unknown) { + this.dispatchEvent( + new CustomEvent('field-change', { + detail: { path, value }, + bubbles: true, + composed: true, + }) + ); + } + + private handleTabChange(tab: TTermTab) { + this.activeTab = tab; + } + + private handleAddPayment() { + const newPayment: IPaymentScheduleItem = { + id: `pay-${Date.now()}`, + description: 'New payment', + amount: 0, + currency: 'EUR', + dueDate: new Date().toISOString().split('T')[0], + status: 'pending', + }; + this.paymentSchedule = [...this.paymentSchedule, newPayment]; + } + + private handleAddMilestone() { + const newMilestone: IMilestone = { + id: `ms-${Date.now()}`, + name: 'New Milestone', + description: '', + dueDate: new Date().toISOString().split('T')[0], + status: 'pending', + dependencies: [], + }; + this.milestones = [...this.milestones, newMilestone]; + } + + private handleAddObligation() { + const newObligation: IObligation = { + id: `obl-${Date.now()}`, + description: 'New obligation', + responsibleParty: '', + deadline: new Date().toISOString().split('T')[0], + status: 'pending', + }; + this.obligations = [...this.obligations, newObligation]; + } + + // ============================================================================ + // HELPERS + // ============================================================================ + + private formatCurrency(amount: number, currency: string): string { + return new Intl.NumberFormat('en-US', { + style: 'currency', + currency: currency, + }).format(amount); + } + + private formatDate(dateStr: string): string { + return new Date(dateStr).toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric', + }); + } + + private getTotalAmount(): number { + return this.paymentSchedule.reduce((sum, p) => sum + p.amount, 0); + } + + private getPaidAmount(): number { + return this.paymentSchedule.filter((p) => p.status === 'paid').reduce((sum, p) => sum + p.amount, 0); + } + + private getPartyName(roleId: string): string { + const role = this.contract?.availableRoles.find((r) => r.id === roleId); + return role?.name || roleId; + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + if (!this.contract) { + return html`
No contract loaded
`; + } + + return html` +
+
+ + + + +
+ ${this.activeTab === 'financial' + ? this.renderFinancialTerms() + : this.activeTab === 'time' + ? this.renderTimeTerms() + : this.renderObligations()} +
+
+
+ `; + } + + private renderFinancialTerms(): TemplateResult { + const totalAmount = this.getTotalAmount(); + const paidAmount = this.getPaidAmount(); + const pendingAmount = totalAmount - paidAmount; + + return html` + +
+
+ Total Value + ${this.formatCurrency(totalAmount, 'EUR')} +
+
+ Paid + ${this.formatCurrency(paidAmount, 'EUR')} +
+
+ Pending + ${this.formatCurrency(pendingAmount, 'EUR')} +
+
+ + +
+
+
+
Payment Schedule
+
Scheduled payments and their status
+
+ ${!this.readonly + ? html` + + ` + : ''} +
+ + ${this.paymentSchedule.length > 0 + ? html` + + + + + + + + ${!this.readonly ? html`` : ''} + + + + ${this.paymentSchedule.map( + (payment) => html` + + + + + + ${!this.readonly + ? html` + + ` + : ''} + + ` + )} + +
DescriptionAmountDue DateStatus
${payment.description}${this.formatCurrency(payment.amount, payment.currency)}${this.formatDate(payment.dueDate)}${payment.status} + +
+ ` + : html` +
+ +

No Payment Schedule

+

Add payment terms to track financial obligations

+
+ `} +
+ `; + } + + private renderTimeTerms(): TemplateResult { + const completedCount = this.milestones.filter((m) => m.status === 'completed').length; + const totalCount = this.milestones.length; + + return html` + +
+
+ Total Milestones + ${totalCount} +
+
+ Completed + ${completedCount} +
+
+ Progress + ${totalCount > 0 ? Math.round((completedCount / totalCount) * 100) : 0}% +
+
+ + +
+
+
+
Milestones
+
Key project milestones and deadlines
+
+ ${!this.readonly + ? html` + + ` + : ''} +
+ + ${this.milestones.length > 0 + ? html` + + + + + + + + ${!this.readonly ? html`` : ''} + + + + ${this.milestones.map( + (milestone) => html` + + + + + + ${!this.readonly + ? html` + + ` + : ''} + + ` + )} + +
MilestoneDescriptionDue DateStatus
${milestone.name}${milestone.description || '—'}${this.formatDate(milestone.dueDate)}${milestone.status.replace('_', ' ')} + +
+ ` + : html` +
+ +

No Milestones

+

Add milestones to track project progress

+
+ `} +
+ `; + } + + private renderObligations(): TemplateResult { + const completedCount = this.obligations.filter((o) => o.status === 'completed').length; + + return html` + +
+
+ Total Obligations + ${this.obligations.length} +
+
+ Completed + ${completedCount} +
+
+ Pending + ${this.obligations.length - completedCount} +
+
+ + +
+ +
+
Contractual Obligations
+
+ Track responsibilities assigned to each party. Mark obligations as completed when fulfilled. +
+
+
+ + +
+
+
+
Party Obligations
+
Responsibilities and deliverables by party
+
+ ${!this.readonly + ? html` + + ` + : ''} +
+ + ${this.obligations.length > 0 + ? html` + + + + + + + + ${!this.readonly ? html`` : ''} + + + + ${this.obligations.map( + (obligation) => html` + + + + + + ${!this.readonly + ? html` + + ` + : ''} + + ` + )} + +
ObligationResponsible PartyDeadlineStatus
${obligation.description}${this.getPartyName(obligation.responsibleParty)}${this.formatDate(obligation.deadline)}${obligation.status} + +
+ ` + : html` +
+ +

No Obligations

+

Add obligations to track party responsibilities

+
+ `} +
+ `; + } +} diff --git a/ts_web/elements/sdig-contracteditor.ts b/ts_web/elements/sdig-contracteditor.ts deleted file mode 100644 index ebec94d..0000000 --- a/ts_web/elements/sdig-contracteditor.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - DeesElement, - property, - html, - customElement, - type TemplateResult, - css, - cssManager, - domtools, -} from '@design.estate/dees-element'; - -import * as plugins from '../plugins.js'; - -declare global { - interface HTMLElementTagNameMap { - 'sdig-contracteditor': ContractEditor; - } -} - -@customElement('sdig-contracteditor') -export class ContractEditor extends DeesElement { - public static demo = () => html` `; - - // INSTANCE - public localStateInstance = new domtools.plugins.smartstate.Smartstate(); - public contractState = - this.localStateInstance.getStatePart('contract'); - - @property({ type: Object }) - public contract: plugins.sdInterfaces.IPortableContract; - - public async firstUpdated(_changedProperties: Map) { - super.firstUpdated(_changedProperties); - - } - - public render(): TemplateResult { - return html`
`; - } -} diff --git a/ts_web/elements/sdig-contracteditor/index.ts b/ts_web/elements/sdig-contracteditor/index.ts new file mode 100644 index 0000000..0859570 --- /dev/null +++ b/ts_web/elements/sdig-contracteditor/index.ts @@ -0,0 +1,8 @@ +/** + * @file index.ts + * @description Export barrel for sdig-contracteditor module + */ + +export * from './sdig-contracteditor.js'; +export * from './types.js'; +export * from './state.js'; diff --git a/ts_web/elements/sdig-contracteditor/sdig-contracteditor.ts b/ts_web/elements/sdig-contracteditor/sdig-contracteditor.ts new file mode 100644 index 0000000..3901158 --- /dev/null +++ b/ts_web/elements/sdig-contracteditor/sdig-contracteditor.ts @@ -0,0 +1,839 @@ +/** + * @file sdig-contracteditor.ts + * @description Main contract editor orchestrator component + */ + +import { + DeesElement, + property, + state, + html, + customElement, + type TemplateResult, + css, + cssManager, +} from '@design.estate/dees-element'; + +import * as plugins from '../../plugins.js'; +import { createEditorStore, type TEditorStore } from './state.js'; +import { + type TEditorSection, + type IEditorState, + EDITOR_SECTIONS, + type IContractChangeEventDetail, + type ISectionChangeEventDetail, +} from './types.js'; + +// Import sub-components +import '../sdig-contract-header/sdig-contract-header.js'; +import '../sdig-contract-metadata/sdig-contract-metadata.js'; +import '../sdig-contract-parties/sdig-contract-parties.js'; +import '../sdig-contract-content/sdig-contract-content.js'; +import '../sdig-contract-terms/sdig-contract-terms.js'; +import '../sdig-contract-signatures/sdig-contract-signatures.js'; +import '../sdig-contract-attachments/sdig-contract-attachments.js'; +import '../sdig-contract-collaboration/sdig-contract-collaboration.js'; +import '../sdig-contract-audit/sdig-contract-audit.js'; + +declare global { + interface HTMLElementTagNameMap { + 'sdig-contracteditor': SdigContracteditor; + } +} + +@customElement('sdig-contracteditor') +export class SdigContracteditor extends DeesElement { + // ============================================================================ + // STATIC + // ============================================================================ + + public static demo = () => html` + + `; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + width: 100%; + height: 100%; + min-height: 600px; + } + + .editor-container { + display: flex; + flex-direction: column; + height: 100%; + background: ${cssManager.bdTheme('#f8f9fa', '#09090b')}; + border-radius: 8px; + overflow: hidden; + border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + /* Header */ + .editor-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 24px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .header-left { + display: flex; + align-items: center; + gap: 16px; + } + + .contract-title { + font-size: 18px; + font-weight: 600; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + margin: 0; + } + + /* shadcn-style badge */ + .contract-status { + display: inline-flex; + align-items: center; + padding: 2px 10px; + border-radius: 6px; + font-size: 12px; + font-weight: 500; + line-height: 1.4; + border: 1px solid transparent; + background: ${cssManager.bdTheme('hsl(214 95% 93%)', 'hsl(214 95% 15%)')}; + color: ${cssManager.bdTheme('hsl(214 95% 35%)', 'hsl(214 95% 70%)')}; + border-color: ${cssManager.bdTheme('hsl(214 95% 80%)', 'hsl(214 95% 25%)')}; + } + + .contract-status.draft { + background: ${cssManager.bdTheme('hsl(48 96% 89%)', 'hsl(48 96% 15%)')}; + color: ${cssManager.bdTheme('hsl(25 95% 30%)', 'hsl(48 96% 70%)')}; + border-color: ${cssManager.bdTheme('hsl(48 96% 76%)', 'hsl(48 96% 25%)')}; + } + + .contract-status.executed { + background: ${cssManager.bdTheme('hsl(142 76% 90%)', 'hsl(142 76% 15%)')}; + color: ${cssManager.bdTheme('hsl(142 76% 28%)', 'hsl(142 76% 65%)')}; + border-color: ${cssManager.bdTheme('hsl(142 76% 75%)', 'hsl(142 76% 25%)')}; + } + + .header-right { + display: flex; + align-items: center; + gap: 12px; + } + + .dirty-indicator { + display: flex; + align-items: center; + gap: 6px; + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .dirty-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: #f59e0b; + } + + .collaborators { + display: flex; + align-items: center; + gap: -8px; + } + + .collaborator-avatar { + width: 32px; + height: 32px; + border-radius: 50%; + border: 2px solid ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: 600; + color: white; + margin-left: -8px; + } + + .collaborator-avatar:first-child { + margin-left: 0; + } + + /* Navigation Tabs */ + .editor-nav { + display: flex; + align-items: center; + gap: 4px; + padding: 0 24px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border-bottom: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + overflow-x: auto; + } + + .nav-tab { + display: flex; + align-items: center; + gap: 8px; + padding: 12px 16px; + font-size: 14px; + font-weight: 500; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + background: transparent; + border: none; + border-bottom: 2px solid transparent; + cursor: pointer; + transition: all 0.15s ease; + white-space: nowrap; + } + + .nav-tab:hover { + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + background: ${cssManager.bdTheme('#f3f4f6', '#18181b')}; + } + + .nav-tab.active { + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + border-bottom-color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .nav-tab dees-icon { + font-size: 16px; + } + + .nav-badge { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 20px; + height: 20px; + padding: 0 6px; + border-radius: 10px; + font-size: 11px; + font-weight: 600; + background: ${cssManager.bdTheme('#ef4444', '#dc2626')}; + color: white; + } + + /* Main Content Area */ + .editor-main { + display: flex; + flex: 1; + overflow: hidden; + } + + .editor-content { + flex: 1; + overflow-y: auto; + padding: 24px; + } + + .editor-sidebar { + width: 320px; + border-left: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + overflow-y: auto; + } + + /* Section placeholder */ + .section-placeholder { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 400px; + text-align: center; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .section-placeholder dees-icon { + font-size: 48px; + margin-bottom: 16px; + opacity: 0.5; + } + + .section-placeholder h3 { + margin: 0 0 8px; + font-size: 18px; + font-weight: 600; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .section-placeholder p { + margin: 0; + font-size: 14px; + } + + /* Footer */ + .editor-footer { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 24px; + background: ${cssManager.bdTheme('#ffffff', '#0a0a0a')}; + border-top: 1px solid ${cssManager.bdTheme('#e5e5e5', '#27272a')}; + } + + .footer-left { + display: flex; + align-items: center; + gap: 16px; + font-size: 13px; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .footer-right { + display: flex; + align-items: center; + gap: 12px; + } + + /* Buttons */ + .btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 8px 16px; + font-size: 14px; + font-weight: 500; + border-radius: 6px; + border: none; + cursor: pointer; + transition: all 0.15s ease; + } + + .btn-primary { + background: ${cssManager.bdTheme('#111111', '#fafafa')}; + color: ${cssManager.bdTheme('#ffffff', '#09090b')}; + } + + .btn-primary:hover { + background: ${cssManager.bdTheme('#333333', '#e5e5e5')}; + } + + .btn-secondary { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#374151', '#d1d5db')}; + } + + .btn-secondary:hover { + background: ${cssManager.bdTheme('#e5e7eb', '#3f3f46')}; + } + + .btn-ghost { + background: transparent; + color: ${cssManager.bdTheme('#6b7280', '#9ca3af')}; + } + + .btn-ghost:hover { + background: ${cssManager.bdTheme('#f3f4f6', '#27272a')}; + color: ${cssManager.bdTheme('#111111', '#fafafa')}; + } + + .btn:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + /* Loading state */ + .loading-overlay { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + background: ${cssManager.bdTheme('rgba(255,255,255,0.8)', 'rgba(0,0,0,0.8)')}; + z-index: 100; + } + + /* Overview section layout */ + .overview-section { + display: flex; + flex-direction: column; + gap: 24px; + } + `, + ]; + + // ============================================================================ + // PROPERTIES + // ============================================================================ + + @property({ type: Object }) + public accessor contract: plugins.sdInterfaces.IPortableContract | null = null; + + @property({ type: Boolean }) + public accessor showSidebar: boolean = true; + + @property({ type: String }) + public accessor initialSection: TEditorSection = 'overview'; + + // ============================================================================ + // STATE + // ============================================================================ + + @state() + private accessor editorState: IEditorState | null = null; + + // ============================================================================ + // INSTANCE + // ============================================================================ + + private store: TEditorStore | null = null; + private unsubscribe: (() => void) | null = null; + private storeReady: Promise; + private resolveStoreReady!: () => void; + + constructor() { + super(); + this.storeReady = new Promise((resolve) => { + this.resolveStoreReady = resolve; + }); + } + + // ============================================================================ + // LIFECYCLE + // ============================================================================ + + public connectedCallback() { + super.connectedCallback(); + this.initStore(); + } + + private async initStore() { + this.store = await createEditorStore(); + this.unsubscribe = this.store.subscribe((state) => { + this.editorState = state; + }); + + // Set initial section + this.store.setActiveSection(this.initialSection); + this.resolveStoreReady(); + + // If contract was already set, apply it now + if (this.contract) { + this.store.setContract(this.contract); + } + } + + public disconnectedCallback() { + super.disconnectedCallback(); + if (this.unsubscribe) { + this.unsubscribe(); + } + } + + public async updated(changedProperties: Map) { + if (changedProperties.has('contract') && this.contract) { + await this.storeReady; + this.store?.setContract(this.contract); + } + } + + // ============================================================================ + // EVENT HANDLERS + // ============================================================================ + + private handleSectionChange(section: TEditorSection) { + const previousSection = this.editorState?.activeSection || 'overview'; + this.store?.setActiveSection(section); + + this.dispatchEvent( + new CustomEvent('section-change', { + detail: { section, previousSection }, + bubbles: true, + composed: true, + }) + ); + } + + private handleSave() { + if (!this.editorState?.contract) return; + + this.store?.setSaving(true); + + this.dispatchEvent( + new CustomEvent('contract-save', { + detail: { + contract: this.editorState.contract, + isDraft: this.editorState.contract.lifecycle.currentStatus === 'draft', + }, + bubbles: true, + composed: true, + }) + ); + } + + private handleDiscard() { + this.store?.discardChanges(); + this.dispatchEvent( + new CustomEvent('contract-discard', { + bubbles: true, + composed: true, + }) + ); + } + + private handleUndo() { + this.store?.undo(); + } + + private handleRedo() { + this.store?.redo(); + } + + // ============================================================================ + // PUBLIC API + // ============================================================================ + + /** + * Update a field in the contract + */ + public updateField(path: string, value: unknown, description?: string) { + this.store?.updateContract(path, value, description); + + this.dispatchEvent( + new CustomEvent('contract-change', { + detail: { path, value, source: 'user' }, + bubbles: true, + composed: true, + }) + ); + } + + /** + * Get current contract state + */ + public getContract(): plugins.sdInterfaces.IPortableContract | null { + return this.editorState?.contract || null; + } + + /** + * Mark contract as saved externally + */ + public markSaved() { + this.store?.markSaved(); + } + + // ============================================================================ + // RENDER HELPERS + // ============================================================================ + + private getStatusClass(status: string): string { + if (status === 'draft' || status === 'internal_review') return 'draft'; + if (status === 'executed' || status === 'active') return 'executed'; + return ''; + } + + private formatStatus(status: string): string { + return status.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()); + } + + private handleFieldChange(e: CustomEvent<{ path: string; value: unknown }>) { + const { path, value } = e.detail; + this.updateField(path, value); + } + + private renderSectionContent(): TemplateResult { + const section = this.editorState?.activeSection || 'overview'; + const contract = this.editorState?.contract; + const sectionConfig = EDITOR_SECTIONS.find((s) => s.id === section); + + // Render section based on active tab + switch (section) { + case 'overview': + return this.renderOverviewSection(); + case 'parties': + return this.renderPartiesSection(); + case 'content': + return this.renderContentSection(); + case 'terms': + return this.renderTermsSection(); + case 'signatures': + return this.renderSignaturesSection(); + case 'attachments': + return this.renderAttachmentsSection(); + case 'collaboration': + return this.renderCollaborationSection(); + case 'audit': + return this.renderAuditSection(); + default: + return this.renderPlaceholder(sectionConfig, 'This section is being implemented...'); + } + } + + private renderOverviewSection(): TemplateResult { + const contract = this.editorState?.contract; + if (!contract) { + return html`
No contract loaded
`; + } + + return html` +
+ + + +
+ `; + } + + private renderPartiesSection(): TemplateResult { + const contract = this.editorState?.contract; + if (!contract) { + return html`
No contract loaded
`; + } + + return html` + + `; + } + + private renderContentSection(): TemplateResult { + const contract = this.editorState?.contract; + if (!contract) { + return html`
No contract loaded
`; + } + + return html` + + `; + } + + private renderTermsSection(): TemplateResult { + const contract = this.editorState?.contract; + if (!contract) { + return html`
No contract loaded
`; + } + + return html` + + `; + } + + private renderSignaturesSection(): TemplateResult { + const contract = this.editorState?.contract; + if (!contract) { + return html`
No contract loaded
`; + } + + return html` + + `; + } + + private renderAttachmentsSection(): TemplateResult { + const contract = this.editorState?.contract; + if (!contract) { + return html`
No contract loaded
`; + } + + return html` + + `; + } + + private renderCollaborationSection(): TemplateResult { + const contract = this.editorState?.contract; + if (!contract) { + return html`
No contract loaded
`; + } + + return html` + + `; + } + + private renderAuditSection(): TemplateResult { + const contract = this.editorState?.contract; + if (!contract) { + return html`
No contract loaded
`; + } + + return html` + + `; + } + + private renderPlaceholder(sectionConfig: typeof EDITOR_SECTIONS[0] | undefined, message: string): TemplateResult { + return html` +
+ +

${sectionConfig?.label || 'Section'}

+

${message}

+
+ `; + } + + // ============================================================================ + // RENDER + // ============================================================================ + + public render(): TemplateResult { + const contract = this.editorState?.contract; + const activeSection = this.editorState?.activeSection || 'overview'; + const isDirty = this.editorState?.isDirty || false; + const isSaving = this.editorState?.isSaving || false; + const collaborators = this.editorState?.activeCollaborators || []; + + return html` +
+ +
+
+

${contract?.title || 'Untitled Contract'}

+ ${contract?.lifecycle?.currentStatus + ? html` + + ${this.formatStatus(contract.lifecycle.currentStatus)} + + ` + : ''} +
+
+ ${isDirty + ? html` +
+ + Unsaved changes +
+ ` + : ''} + ${collaborators.length > 0 + ? html` +
+ ${collaborators.slice(0, 3).map( + (c) => html` +
+ ${c.displayName.charAt(0).toUpperCase()} +
+ ` + )} + ${collaborators.length > 3 + ? html` +
+ +${collaborators.length - 3} +
+ ` + : ''} +
+ ` + : ''} + + +
+
+ + + + + +
+
+ ${this.renderSectionContent()} +
+ ${this.showSidebar + ? html` + + ` + : ''} +
+ + + + + ${this.editorState?.isLoading + ? html` +
+ +
+ ` + : ''} +
+ `; + } +} diff --git a/ts_web/elements/sdig-contracteditor/state.ts b/ts_web/elements/sdig-contracteditor/state.ts new file mode 100644 index 0000000..fe8af9f --- /dev/null +++ b/ts_web/elements/sdig-contracteditor/state.ts @@ -0,0 +1,407 @@ +/** + * @file state.ts + * @description Smartstate store for contract editor + */ + +import { domtools } from '@design.estate/dees-element'; +import type * as sdInterfaces from '@signature.digital/tools/interfaces'; +import { + type IEditorState, + type TEditorSection, + type TEditorMode, + type IContractChange, + type IValidationError, + type IEditorUser, + createInitialEditorState, +} from './types.js'; + +// ============================================================================ +// STATE STORE +// ============================================================================ + +/** + * Create a new editor state store instance + */ +export async function createEditorStore() { + const smartstate = new domtools.plugins.smartstate.Smartstate<{ editor: IEditorState }>(); + + // Initialize with default state (getStatePart is now async) + const statePart = await smartstate.getStatePart('editor', createInitialEditorState(), 'soft'); + + // Create actions for state modifications + const setContractAction = statePart.createAction<{ contract: sdInterfaces.IPortableContract }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + contract: structuredClone(payload.contract), + originalContract: structuredClone(payload.contract), + isDirty: false, + undoStack: [], + redoStack: [], + }) + ); + + const updateContractAction = statePart.createAction<{ path: string; value: unknown; description?: string; userId?: string }>( + async (statePartArg, payload) => { + const state = statePartArg.getState(); + if (!state.contract) return state; + + const previousValue = getNestedValue(state.contract, payload.path); + + const change: IContractChange = { + id: crypto.randomUUID(), + timestamp: Date.now(), + path: payload.path, + previousValue, + newValue: payload.value, + description: payload.description || `Updated ${payload.path}`, + userId: payload.userId, + }; + + const updatedContract = setNestedValue( + structuredClone(state.contract), + payload.path, + payload.value + ); + + return { + ...state, + contract: updatedContract, + isDirty: true, + undoStack: [...state.undoStack, change], + redoStack: [], + }; + } + ); + + const setActiveSectionAction = statePart.createAction<{ section: TEditorSection }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + activeSection: payload.section, + }) + ); + + const setEditorModeAction = statePart.createAction<{ mode: TEditorMode }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + editorMode: payload.mode, + }) + ); + + const selectParagraphAction = statePart.createAction<{ paragraphId: string | null }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + selectedParagraphId: payload.paragraphId, + }) + ); + + const selectPartyAction = statePart.createAction<{ partyId: string | null }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + selectedPartyId: payload.partyId, + }) + ); + + const selectSignatureFieldAction = statePart.createAction<{ fieldId: string | null }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + selectedSignatureFieldId: payload.fieldId, + }) + ); + + const undoAction = statePart.createAction( + async (statePartArg) => { + const state = statePartArg.getState(); + if (state.undoStack.length === 0 || !state.contract) return state; + + const change = state.undoStack[state.undoStack.length - 1]; + const updatedContract = setNestedValue( + structuredClone(state.contract), + change.path, + change.previousValue + ); + + return { + ...state, + contract: updatedContract, + undoStack: state.undoStack.slice(0, -1), + redoStack: [...state.redoStack, change], + isDirty: state.undoStack.length > 1, + }; + } + ); + + const redoAction = statePart.createAction( + async (statePartArg) => { + const state = statePartArg.getState(); + if (state.redoStack.length === 0 || !state.contract) return state; + + const change = state.redoStack[state.redoStack.length - 1]; + const updatedContract = setNestedValue( + structuredClone(state.contract), + change.path, + change.newValue + ); + + return { + ...state, + contract: updatedContract, + undoStack: [...state.undoStack, change], + redoStack: state.redoStack.slice(0, -1), + isDirty: true, + }; + } + ); + + const setLoadingAction = statePart.createAction<{ isLoading: boolean }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + isLoading: payload.isLoading, + }) + ); + + const setSavingAction = statePart.createAction<{ isSaving: boolean }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + isSaving: payload.isSaving, + }) + ); + + const markSavedAction = statePart.createAction( + async (statePartArg) => { + const state = statePartArg.getState(); + return { + ...state, + originalContract: state.contract ? structuredClone(state.contract) : null, + isDirty: false, + isSaving: false, + }; + } + ); + + const discardChangesAction = statePart.createAction( + async (statePartArg) => { + const state = statePartArg.getState(); + return { + ...state, + contract: state.originalContract ? structuredClone(state.originalContract) : null, + isDirty: false, + undoStack: [], + redoStack: [], + }; + } + ); + + const setValidationErrorsAction = statePart.createAction<{ errors: IValidationError[] }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + validationErrors: payload.errors, + }) + ); + + const clearValidationErrorsAction = statePart.createAction( + async (statePartArg) => ({ + ...statePartArg.getState(), + validationErrors: [], + }) + ); + + const setCurrentUserAction = statePart.createAction<{ user: IEditorUser }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + currentUser: payload.user, + }) + ); + + const setActiveCollaboratorsAction = statePart.createAction<{ collaborators: sdInterfaces.IUserPresence[] }>( + async (statePartArg, payload) => ({ + ...statePartArg.getState(), + activeCollaborators: payload.collaborators, + }) + ); + + const addCollaboratorAction = statePart.createAction<{ collaborator: sdInterfaces.IUserPresence }>( + async (statePartArg, payload) => { + const state = statePartArg.getState(); + if (state.activeCollaborators.find(c => c.userId === payload.collaborator.userId)) { + return state; + } + return { + ...state, + activeCollaborators: [...state.activeCollaborators, payload.collaborator], + }; + } + ); + + const removeCollaboratorAction = statePart.createAction<{ userId: string }>( + async (statePartArg, payload) => { + const state = statePartArg.getState(); + return { + ...state, + activeCollaborators: state.activeCollaborators.filter(c => c.userId !== payload.userId), + }; + } + ); + + const updateCollaboratorAction = statePart.createAction<{ userId: string; updates: Partial }>( + async (statePartArg, payload) => { + const state = statePartArg.getState(); + return { + ...state, + activeCollaborators: state.activeCollaborators.map(c => + c.userId === payload.userId ? { ...c, ...payload.updates } : c + ), + }; + } + ); + + return { + smartstate, + statePart, + + // Getters + getContract: () => statePart.getState().contract, + getActiveSection: () => statePart.getState().activeSection, + isDirty: () => statePart.getState().isDirty, + isLoading: () => statePart.getState().isLoading, + isSaving: () => statePart.getState().isSaving, + + // Contract operations + setContract: (contract: sdInterfaces.IPortableContract) => setContractAction.trigger({ contract }), + + updateContract: (path: string, value: unknown, description?: string) => { + const state = statePart.getState(); + return updateContractAction.trigger({ path, value, description, userId: state.currentUser?.userId }); + }, + + // Navigation + setActiveSection: (section: TEditorSection) => setActiveSectionAction.trigger({ section }), + setEditorMode: (mode: TEditorMode) => setEditorModeAction.trigger({ mode }), + + // Selection + selectParagraph: (paragraphId: string | null) => selectParagraphAction.trigger({ paragraphId }), + selectParty: (partyId: string | null) => selectPartyAction.trigger({ partyId }), + selectSignatureField: (fieldId: string | null) => selectSignatureFieldAction.trigger({ fieldId }), + + // Undo/Redo + undo: () => undoAction.trigger(), + redo: () => redoAction.trigger(), + canUndo: () => statePart.getState().undoStack.length > 0, + canRedo: () => statePart.getState().redoStack.length > 0, + + // Loading/Saving state + setLoading: (isLoading: boolean) => setLoadingAction.trigger({ isLoading }), + setSaving: (isSaving: boolean) => setSavingAction.trigger({ isSaving }), + markSaved: () => markSavedAction.trigger(), + + // Discard changes + discardChanges: () => discardChangesAction.trigger(), + + // Validation + setValidationErrors: (errors: IValidationError[]) => setValidationErrorsAction.trigger({ errors }), + clearValidationErrors: () => clearValidationErrorsAction.trigger(), + + // User/Collaboration + setCurrentUser: (user: IEditorUser) => setCurrentUserAction.trigger({ user }), + setActiveCollaborators: (collaborators: sdInterfaces.IUserPresence[]) => setActiveCollaboratorsAction.trigger({ collaborators }), + addCollaborator: (collaborator: sdInterfaces.IUserPresence) => addCollaboratorAction.trigger({ collaborator }), + removeCollaborator: (userId: string) => removeCollaboratorAction.trigger({ userId }), + updateCollaborator: (userId: string, updates: Partial) => updateCollaboratorAction.trigger({ userId, updates }), + + // Subscribe to state changes (using new API) + subscribe: (callback: (state: IEditorState) => void) => { + const subscription = statePart.select().subscribe(callback); + return () => subscription.unsubscribe(); + }, + }; +} + +// ============================================================================ +// UTILITY FUNCTIONS +// ============================================================================ + +/** + * Get nested value from object by path + */ +function getNestedValue(obj: Record, path: string): unknown { + const keys = path.split('.'); + let current: unknown = obj; + + for (const key of keys) { + if (current === null || current === undefined) return undefined; + if (typeof current !== 'object') return undefined; + + // Handle array index + const arrayMatch = key.match(/^(\w+)\[(\d+)\]$/); + if (arrayMatch) { + const [, arrayKey, index] = arrayMatch; + current = (current as Record)[arrayKey]; + if (Array.isArray(current)) { + current = current[parseInt(index, 10)]; + } else { + return undefined; + } + } else { + current = (current as Record)[key]; + } + } + + return current; +} + +/** + * Set nested value in object by path (immutably) + */ +function setNestedValue>( + obj: T, + path: string, + value: unknown +): T { + const keys = path.split('.'); + const result = { ...obj } as Record; + let current = result; + + for (let i = 0; i < keys.length - 1; i++) { + const key = keys[i]; + + // Handle array index + const arrayMatch = key.match(/^(\w+)\[(\d+)\]$/); + if (arrayMatch) { + const [, arrayKey, index] = arrayMatch; + const arr = [...((current[arrayKey] as unknown[]) || [])]; + if (i === keys.length - 2) { + arr[parseInt(index, 10)] = value; + current[arrayKey] = arr; + return result as T; + } else { + arr[parseInt(index, 10)] = { ...(arr[parseInt(index, 10)] as Record || {}) }; + current[arrayKey] = arr; + current = arr[parseInt(index, 10)] as Record; + } + } else { + if (typeof current[key] !== 'object' || current[key] === null) { + current[key] = {}; + } else { + current[key] = { ...(current[key] as Record) }; + } + current = current[key] as Record; + } + } + + const lastKey = keys[keys.length - 1]; + const arrayMatch = lastKey.match(/^(\w+)\[(\d+)\]$/); + if (arrayMatch) { + const [, arrayKey, index] = arrayMatch; + const arr = [...((current[arrayKey] as unknown[]) || [])]; + arr[parseInt(index, 10)] = value; + current[arrayKey] = arr; + } else { + current[lastKey] = value; + } + + return result as T; +} + +/** + * Type for editor store + */ +export type TEditorStore = Awaited>; diff --git a/ts_web/elements/sdig-contracteditor/types.ts b/ts_web/elements/sdig-contracteditor/types.ts new file mode 100644 index 0000000..f56aa38 --- /dev/null +++ b/ts_web/elements/sdig-contracteditor/types.ts @@ -0,0 +1,228 @@ +/** + * @file types.ts + * @description Editor-specific types and event interfaces + */ + +import type * as sdInterfaces from '@signature.digital/tools/interfaces'; + +// ============================================================================ +// EDITOR NAVIGATION +// ============================================================================ + +/** + * Available editor sections/tabs + */ +export type TEditorSection = + | 'overview' + | 'parties' + | 'content' + | 'terms' + | 'signatures' + | 'attachments' + | 'collaboration' + | 'audit'; + +/** + * Section configuration + */ +export interface IEditorSectionConfig { + id: TEditorSection; + label: string; + icon: string; + badge?: number | string; + disabled?: boolean; +} + +/** + * Default section configurations + */ +export const EDITOR_SECTIONS: IEditorSectionConfig[] = [ + { id: 'overview', label: 'Overview', icon: 'lucide:file-text' }, + { id: 'parties', label: 'Parties & Roles', icon: 'lucide:users' }, + { id: 'content', label: 'Content', icon: 'lucide:file-edit' }, + { id: 'terms', label: 'Terms', icon: 'lucide:calculator' }, + { id: 'signatures', label: 'Signatures', icon: 'lucide:pen-tool' }, + { id: 'attachments', label: 'Attachments', icon: 'lucide:paperclip' }, + { id: 'collaboration', label: 'Collaboration', icon: 'lucide:message-circle' }, + { id: 'audit', label: 'Audit & History', icon: 'lucide:history' }, +]; + +// ============================================================================ +// EDITOR STATE +// ============================================================================ + +/** + * Current user in the editor + */ +export interface IEditorUser { + userId: string; + displayName: string; + email: string; + avatarUrl?: string; + color: string; +} + +/** + * Editor mode + */ +export type TEditorMode = 'edit' | 'view' | 'review' | 'sign'; + +/** + * Editor state interface + */ +export interface IEditorState { + // Contract data + contract: sdInterfaces.IPortableContract | null; + originalContract: sdInterfaces.IPortableContract | null; + + // UI state + activeSection: TEditorSection; + editorMode: TEditorMode; + isDirty: boolean; + isSaving: boolean; + isLoading: boolean; + + // Selection state + selectedParagraphId: string | null; + selectedPartyId: string | null; + selectedSignatureFieldId: string | null; + + // Collaboration + currentUser: IEditorUser | null; + activeCollaborators: sdInterfaces.IUserPresence[]; + + // Validation + validationErrors: IValidationError[]; + + // History + undoStack: IContractChange[]; + redoStack: IContractChange[]; +} + +/** + * Initial editor state factory + */ +export function createInitialEditorState(): IEditorState { + return { + contract: null, + originalContract: null, + activeSection: 'overview', + editorMode: 'edit', + isDirty: false, + isSaving: false, + isLoading: false, + selectedParagraphId: null, + selectedPartyId: null, + selectedSignatureFieldId: null, + currentUser: null, + activeCollaborators: [], + validationErrors: [], + undoStack: [], + redoStack: [], + }; +} + +// ============================================================================ +// CHANGE TRACKING +// ============================================================================ + +/** + * Contract change for undo/redo + */ +export interface IContractChange { + id: string; + timestamp: number; + path: string; + previousValue: unknown; + newValue: unknown; + description: string; + userId?: string; +} + +/** + * Validation error + */ +export interface IValidationError { + path: string; + message: string; + severity: 'error' | 'warning' | 'info'; + fieldLabel?: string; +} + +// ============================================================================ +// EVENTS +// ============================================================================ + +/** + * Contract change event detail + */ +export interface IContractChangeEventDetail { + path: string; + value: unknown; + previousValue?: unknown; + source?: 'user' | 'collaboration' | 'system'; +} + +/** + * Section change event detail + */ +export interface ISectionChangeEventDetail { + section: TEditorSection; + previousSection: TEditorSection; +} + +/** + * Save event detail + */ +export interface ISaveEventDetail { + contract: sdInterfaces.IPortableContract; + isDraft: boolean; +} + +/** + * Custom event types + */ +export interface IEditorEvents { + 'contract-change': CustomEvent; + 'section-change': CustomEvent; + 'contract-save': CustomEvent; + 'contract-discard': CustomEvent; + 'validation-error': CustomEvent; +} + +// ============================================================================ +// UTILITY TYPES +// ============================================================================ + +/** + * Deep path type for nested object access + */ +export type TDeepPath = K extends string + ? T[K] extends Record + ? `${K}` | `${K}.${TDeepPath}` + : `${K}` + : never; + +/** + * Contract field path + */ +export type TContractPath = string; // Simplified for runtime use + +/** + * Field metadata for UI rendering + */ +export interface IFieldMetadata { + path: TContractPath; + label: string; + description?: string; + required: boolean; + type: 'text' | 'textarea' | 'number' | 'date' | 'select' | 'multiselect' | 'checkbox' | 'custom'; + options?: Array<{ value: string; label: string }>; + validation?: { + min?: number; + max?: number; + minLength?: number; + maxLength?: number; + pattern?: string; + }; +} diff --git a/ts_web/elements/sdig-signbox/index.ts b/ts_web/elements/sdig-signbox/index.ts new file mode 100644 index 0000000..80e1e7c --- /dev/null +++ b/ts_web/elements/sdig-signbox/index.ts @@ -0,0 +1 @@ +export * from './sdig-signbox.js'; diff --git a/ts_web/elements/sdig-signbox.ts b/ts_web/elements/sdig-signbox/sdig-signbox.ts similarity index 98% rename from ts_web/elements/sdig-signbox.ts rename to ts_web/elements/sdig-signbox/sdig-signbox.ts index 09abf41..2489db0 100644 --- a/ts_web/elements/sdig-signbox.ts +++ b/ts_web/elements/sdig-signbox/sdig-signbox.ts @@ -1,5 +1,5 @@ import { DeesElement, property, html, customElement, type TemplateResult, css, cssManager } from '@design.estate/dees-element'; -import * as plugins from '../plugins.js'; +import * as plugins from '../../plugins.js'; declare global { interface HTMLElementTagNameMap { diff --git a/ts_web/elements/sdig-signpad/index.ts b/ts_web/elements/sdig-signpad/index.ts new file mode 100644 index 0000000..d9abb20 --- /dev/null +++ b/ts_web/elements/sdig-signpad/index.ts @@ -0,0 +1 @@ +export * from './sdig-signpad.js'; diff --git a/ts_web/elements/sdig-signpad.ts b/ts_web/elements/sdig-signpad/sdig-signpad.ts similarity index 98% rename from ts_web/elements/sdig-signpad.ts rename to ts_web/elements/sdig-signpad/sdig-signpad.ts index 96dc8d1..5c61f74 100644 --- a/ts_web/elements/sdig-signpad.ts +++ b/ts_web/elements/sdig-signpad/sdig-signpad.ts @@ -1,5 +1,5 @@ import { DeesElement, property, html, customElement, type TemplateResult, css, cssManager } from '@design.estate/dees-element'; -import * as plugins from '../plugins.js'; +import * as plugins from '../../plugins.js'; declare global { interface HTMLElementTagNameMap { diff --git a/tsconfig.json b/tsconfig.json index dfe5a55..3327c2e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,6 @@ { "compilerOptions": { - "experimentalDecorators": true, - "useDefineForClassFields": false, + "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext",