From 256cf74a4551578709fb0fc84c3d916955cf38be Mon Sep 17 00:00:00 2001 From: Dominik Schwank Date: Mon, 24 Mar 2025 08:55:27 +0000 Subject: [PATCH] feat: enhance translation and invoice layout --- package.json | 4 +- pnpm-lock.yaml | 881 ++++++++++++++++++++++++++++-- ts_shared/demoletter.ts | 198 ++++--- ts_shared/index.ts | 17 +- ts_shared/interfaces/document.ts | 20 +- ts_shared/translation.ts | 361 ++++++++---- ts_web/elements/contentinvoice.ts | 516 ++++++++--------- ts_web/elements/document.demo.ts | 11 +- ts_web/elements/document.ts | 133 ++--- ts_web/elements/index.ts | 19 +- ts_web/elements/letterheader.ts | 143 +++-- ts_web/elements/page.ts | 151 +++-- ts_web/elements/pagecontainer.ts | 24 +- ts_web/elements/pagecontent.ts | 81 ++- ts_web/elements/pagefooter.ts | 151 +++-- ts_web/elements/pageheader.ts | 30 +- ts_web/elements/paymentcode.ts | 95 ++++ ts_web/elements/viewer.demo.ts | 11 +- ts_web/elements/viewer.ts | 34 +- ts_web/style.ts | 38 +- 20 files changed, 2138 insertions(+), 780 deletions(-) create mode 100644 ts_web/elements/paymentcode.ts diff --git a/package.json b/package.json index 8d38d70..2d1da00 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "author": "Lossless GmbH", "license": "MIT", "dependencies": { + "@design.estate/dees-catalog": "^1.4.1", "@design.estate/dees-domtools": "^2.0.65", "@design.estate/dees-element": "^2.0.39", "@design.estate/dees-wcctools": "^1.0.90", @@ -30,9 +31,10 @@ "@push.rocks/smartpath": "^5.0.18", "@push.rocks/smartpdf": "^3.1.8", "@push.rocks/smarttime": "^4.0.8", - "@tsclass/tsclass": "^4.1.2", + "@tsclass/tsclass": "^4.4.3", "@types/node": "^22.10.1", "@types/qrcode": "^1.5.5", + "puppeteer": "^24.3.0", "qrcode": "^1.5.4" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aebd9af..c7887dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@design.estate/dees-catalog': + specifier: ^1.4.1 + version: 1.4.1 '@design.estate/dees-domtools': specifier: ^2.0.65 version: 2.0.65 @@ -36,14 +39,17 @@ importers: specifier: ^4.0.8 version: 4.0.8 '@tsclass/tsclass': - specifier: ^4.1.2 - version: 4.1.2 + specifier: ^4.4.3 + version: 4.4.3 '@types/node': specifier: ^22.10.1 version: 22.10.1 '@types/qrcode': specifier: ^1.5.5 version: 1.5.5 + puppeteer: + specifier: ^24.3.0 + version: 24.3.0(typescript@5.6.3) qrcode: specifier: ^1.5.4 version: 1.5.4 @@ -284,12 +290,18 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@design.estate/dees-catalog@1.4.1': + resolution: {integrity: sha512-oi2JCySccaFezCH7nP+rQgqLCQMjjWWypTNoNKmu3EkL/k1EIWdwypa6a2yHcMAwxtYUTSDESvddXTHulticDg==} + '@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-domtools@2.3.2': + resolution: {integrity: sha512-RfXR2t67M9kaCoF6CBkKJtVdsdp6p1O7S1OaWjrs8V0S3277ch4bSYfO+8f+QYweXKkI6Tr2PKaq3PIlwFSC1g==} + '@design.estate/dees-element@2.0.39': resolution: {integrity: sha512-AQdGU/+GmWmU5M5pDf+GWT7GU8UN073WZvtIkfqQZemxd35HYU1vpi629m8/PjKd5dIHAU7QN2mKb6IQ8anPgw==} @@ -587,6 +599,26 @@ packages: '@esm-bundle/chai@4.3.4-fix.0': resolution: {integrity: sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw==} + '@fortawesome/fontawesome-common-types@6.7.2': + resolution: {integrity: sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==} + engines: {node: '>=6'} + + '@fortawesome/fontawesome-svg-core@6.7.2': + resolution: {integrity: sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==} + engines: {node: '>=6'} + + '@fortawesome/free-brands-svg-icons@6.7.2': + resolution: {integrity: sha512-zu0evbcRTgjKfrr77/2XX+bU+kuGfjm0LbajJHVIgBWNIDzrhpRxiCPNT8DW5AdmSsq7Mcf9D1bH0aSeSUSM+Q==} + engines: {node: '>=6'} + + '@fortawesome/free-regular-svg-icons@6.7.2': + resolution: {integrity: sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g==} + engines: {node: '>=6'} + + '@fortawesome/free-solid-svg-icons@6.7.2': + resolution: {integrity: sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==} + engines: {node: '>=6'} + '@git.zone/tsbuild@2.2.0': resolution: {integrity: sha512-lsF1VvqzTjrcOPW7mvsK0E6jlQJ9UHF37s6Z0JhVS/COXWtPdRT4Dm7/hhbwqH62yu44B+mRz1gJhc7NgBoA5Q==} hasBin: true @@ -653,6 +685,70 @@ packages: '@mongodb-js/saslprep@1.1.9': resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} + '@napi-rs/canvas-android-arm64@0.1.67': + resolution: {integrity: sha512-W+3DFG5h0WU8Vqqb3W5fNmm5/TPH5ECZRinQDK4CAKFSUkc4iZcDwrmyFG9sB4KdHazf1mFVHCpEeVMO6Mk6Zg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.67': + resolution: {integrity: sha512-xzrv7QboI47yhIHR5P5u/9KGswokuOKLiKSukr1Ku03RRJxP6lGuVtrAZAgdRg7F9FsuF2REf2yK53YVb6pMlA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.67': + resolution: {integrity: sha512-SNk9lYBr84N0gW8MZ2IrjygFtbFBILr3SEqMdHzHHuph20SQmssFvJGPZwSSCMEyKAvyqhogbmlew0te5Z4w9Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.67': + resolution: {integrity: sha512-qmBlSvUpl567bzH8tNXi82u5FrL4d0qINqd6K9O7GWGGGFmKMJdrgi2/SW3wwCTxqHBasIDdVWc4KSJfwyaoDQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.67': + resolution: {integrity: sha512-k3nAPQefkMeFuJ65Rqdnx92KX1JXQhEKjjWeKsCJB+7sIBgQUWtHo9c3etfVLv5pkWJJDFi/Zc2soNkH3E8dRA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-arm64-musl@0.1.67': + resolution: {integrity: sha512-lZwHWR1cCP408l86n3Qbs3X1oFeAYMjJIQvQl1VMZh6wo5PfI+jaZSKBUOd8x44TnVllX9yhLY9unNRztk/sUQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.67': + resolution: {integrity: sha512-PdBC9p6bLHA1W3OdA0vTHj701SB/kioGQ1uCFBRMs5KBCaMLb/H4aNi8uaIUIEvBWnxeAjoNcLU7//q0FxEosw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/canvas-linux-x64-gnu@0.1.67': + resolution: {integrity: sha512-kJJX6eWzjipL/LdKOWCJctc88e5yzuXri8+s0V/lN06OwuLGW62TWS3lvi8qlUrGMOfRGabSWWlB4omhASSB8w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-linux-x64-musl@0.1.67': + resolution: {integrity: sha512-jLKiPWGeN6ZzhnaLG7ex7eexsiHJ1mdtPK1qKvETIcu45dApMXyUIHvdL6XWB5gFFtj5ScHzLUxv1vkfPZsoxA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-win32-x64-msvc@0.1.67': + resolution: {integrity: sha512-K/JmkOFbc4iRZYUqJhj0jwqfHA/wNQEmTiGNsgZ6d59yF/IBNp5T0D5eg3B8ghjI8GxDYCiSJ6DNX8mC3Oh2EQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.67': + resolution: {integrity: sha512-VA4Khm/5Kg2bQGx3jXotTC4MloOG8b1Ung80exafUK0k5u6yJmIz3Q2iXeeWZs5weV+LQOEB+CPKsYwEYaGAjw==} + engines: {node: '>= 10'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -702,6 +798,11 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} + '@puppeteer/browsers@2.7.1': + resolution: {integrity: sha512-MK7rtm8JjaxPN7Mf1JdZIZKPD2Z+W7osvrC1vjpvfOX1K0awDIHYbNi89f7eotp7eMUn2shWnt03HwVbriXtKQ==} + engines: {node: '>=18'} + hasBin: true + '@push.rocks/consolecolor@2.0.2': resolution: {integrity: sha512-IBwxCLX+YF3f5wB2N4LfuvFqm9WPlBMiEeSAfjN8YQCyYec6u1hlrR3EIj8vT300pppjeGrybJHK+GyjdGXZJw==} @@ -787,6 +888,9 @@ packages: '@push.rocks/smarthash@3.0.4': resolution: {integrity: sha512-HJ/fSx41jm0CvSaqMLa6b2nuNK5rHAqAeAq3dAB7Sq9BCPm2M0J5ZVDTzEAH8pS91XYniUiwuE0jwPERNn9hmw==} + '@push.rocks/smarti18n@1.0.4': + resolution: {integrity: sha512-bHIi9Iuzp2cbux9q79ZK5jOQYPsYJ9zDDS4p/xEPQH31gr0mcFRosLSQb1kvDQDVmUhI0ADlQMqr2ui9zEXQHA==} + '@push.rocks/smartjson@5.0.20': resolution: {integrity: sha512-ogGBLyOTluphZVwBYNyjhm5sziPGuiAwWihW07OSRxD4HQUyqj9Ek6r1pqH07JUG5EbtRYivM1Yt1cCwnu3JVQ==} @@ -844,6 +948,9 @@ packages: '@push.rocks/smartpromise@4.0.4': resolution: {integrity: sha512-Mbh+DnX4+rVPEZgYU7LtTJI/AYoNn7+h27AycEFpPJW41DCfjTiXiI0+ecNdyO1AfbcL0Q02RQjoEauEWx5FQg==} + '@push.rocks/smartpromise@4.2.2': + resolution: {integrity: sha512-3EGXSo0L4e5V/aPSznH3XssjFccGN72GECGqtDCu9xC8AmB5AtCl5h0Xy3dNHCr67XIXqhmuUAnMDV1/v+PiJg==} + '@push.rocks/smartpuppeteer@2.0.2': resolution: {integrity: sha512-EcYCT0PX++WjfHp7W5UYX3t8x5gSNpJMMUvhA7SHz8b2t76ItslNWxprRcF0CUQyN1fozbf5StZf7dwdGc/dIA==} @@ -1239,6 +1346,31 @@ packages: '@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.8': + resolution: {integrity: sha512-YshF2YDaeRA2StyzAs5nUPrev7npQ38oWD0eTRwnsciSL2KrRPMoUw8BzjIXItb3+dccKGTX3IQOd2NFzmHkog==} + engines: {node: '>= 0.8.0'} + + '@svgdotjs/svg.js@3.2.4': + resolution: {integrity: sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==} + + '@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.2': + resolution: {integrity: sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g==} + engines: {node: '>= 14.18'} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -1252,11 +1384,14 @@ packages: '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@tsclass/tsclass@3.0.48': resolution: {integrity: sha512-hC65UvDlp9qvsl6OcIZXz0JNiWZ0gyzsTzbXpg215sGxopgbkOLCr6E0s4qCTnweYm95gt2AdY95uP7M7kExaQ==} - '@tsclass/tsclass@4.1.2': - resolution: {integrity: sha512-uMg1IcTU1cP0McXYGwGffoU3asNQHle7bTN0tn6kVXzfNzSwQf4o8v+YQ4VRnUzo4ov6VKcPXqg5OLb2vz977g==} + '@tsclass/tsclass@4.4.3': + resolution: {integrity: sha512-Vhp+B1UsYlwXLhIeds++CXEeCwFgRzpput4YNM7Qyhr+UQgIMFRFAs2HSI3jEE5r9c1hR9G6MkSxi2U/CLyiaA==} '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} @@ -1540,6 +1675,12 @@ packages: resolution: {integrity: sha512-84E1025aUSjvZU1j17eCTwV7m5Zg3cZHErV3+CaJM9JPCesZwLraIa0ONIQ9w4KLgcDgJFw9UnJ0LbFf42h6tg==} engines: {node: '>=18.0.0'} + '@webcontainer/api@1.2.0': + resolution: {integrity: sha512-tzoKBd4lLdhHy5GHFpUkl+ndoSba8JqmB7x0ZQFnWfjbcbQOvKQfxA8MEMUYhgqjWHnbrWdAfnBEHz5f5lYG5A==} + + '@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'} @@ -1548,6 +1689,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} @@ -1588,6 +1733,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + apexcharts@4.4.0: + resolution: {integrity: sha512-JGsHeQEKDlQh1rob8aBai9/HKvXIpbZ83TnobKZAcdOELf+oQZaxZyAnbbldr6PPBdCgG2zzzLaP1dtEsJxzWw==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1607,6 +1755,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -1636,6 +1788,28 @@ packages: bare-events@2.5.0: resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + bare-fs@4.0.1: + resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} + engines: {bare: '>=1.7.0'} + + bare-os@3.4.0: + resolution: {integrity: sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==} + engines: {bare: '>=1.6.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1643,6 +1817,10 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -1678,7 +1856,7 @@ packages: engines: {node: '>=16.20.1'} buffer-crc32@0.2.13: - resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1765,6 +1943,11 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chromium-bidi@2.0.0: + resolution: {integrity: sha512-8VmyVj0ewSY4pstZV0Y3rCUUwpomam8uWgHZf1XavRxJEP4vU9/dcpNuoyB+u4AQxPo96CASXz5CHPvdH+dSeQ==} + peerDependencies: + devtools-protocol: '*' + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1788,6 +1971,10 @@ packages: cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clone@2.1.2: resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=} engines: {node: '>=0.8'} @@ -1808,7 +1995,7 @@ packages: engines: {node: '>=7.0.0'} color-name@1.1.3: - resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1878,6 +2065,15 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + croner@4.4.1: resolution: {integrity: sha512-aqVeeIPCf5/NZFlz4mN4MLEOs9xf4ODCmHQDs+577JFj8mK3RkKJz77h7+Rn94AijUqKdFNOUHM+v88d8p02UQ==} @@ -1903,6 +2099,10 @@ packages: resolution: {integrity: sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==} engines: {node: '>=14.16'} + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} @@ -1943,6 +2143,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} engines: {node: '>=0.10.0'} @@ -1981,6 +2190,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delayed-stream@1.0.0: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} @@ -2014,6 +2227,9 @@ packages: devtools-protocol@0.0.1019158: resolution: {integrity: sha512-wvq+KscQ7/6spEV7czhnZc9RM/woz1AY+/Vpd8/h2HFMwJSdTliu7f/yr1A6vDdJfKICZsShqsYpEQbdhg8AFQ==} + devtools-protocol@0.0.1402036: + resolution: {integrity: sha512-JwAYQgEvm3yD45CHB+RmF5kMbWtXBaOGwuxa87sZogHcLCv8c/IqnThaoQ1y60d7pXWjSKWQphPEc+1rAScVdg==} + dicer@0.3.0: resolution: {integrity: sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==} engines: {node: '>=4.5.0'} @@ -2084,6 +2300,13 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + errorstacks@2.4.1: resolution: {integrity: sha512-jE4i0SMYevwu/xxAuzhly/KTwtj0xDhbzB6m1xPImxTkw8wcCbgarOQPfCVMi5JKVyW7in29pNJCCJrry3Ynnw==} @@ -2108,6 +2331,10 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-html@1.0.3: resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} @@ -2127,6 +2354,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} @@ -2136,6 +2368,14 @@ packages: engines: {node: '>=4'} hasBin: true + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + etag@1.8.1: resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} engines: {node: '>= 0.6'} @@ -2207,7 +2447,7 @@ packages: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} fd-slicer@1.1.0: - resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -2340,6 +2580,10 @@ packages: get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} + engines: {node: '>= 14'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2421,6 +2665,10 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2451,6 +2699,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -2459,6 +2711,10 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -2469,6 +2725,9 @@ packages: humanize-number@0.0.2: resolution: {integrity: sha1-EcCvakcWQ2M1iFiASPF5lUFInBg=} + 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'} @@ -2480,6 +2739,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + indent-string@5.0.0: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} @@ -2520,6 +2783,9 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} @@ -2666,11 +2932,14 @@ packages: hasBin: true jsbn@1.1.0: - resolution: {integrity: sha1-sBMHyym2GKHtJux56RH4A8TaAEA=} + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + jsonfile@4.0.0: resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} @@ -2717,6 +2986,20 @@ packages: kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + lenis@1.1.20: + resolution: {integrity: sha512-UE64mlJEN4W8DWP2tfHzPzygk94Q2BhjzeG/YHWoyeMJ2Fd6XziBCNN+IvHwmB4GkmKIYxgr0+TvRYTSAMTMFA==} + peerDependencies: + react: '>=17.0.0' + vue: '>=3.0.0' + peerDependenciesMeta: + react: + optional: true + vue: + optional: true + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lit-element@4.1.1: resolution: {integrity: sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==} @@ -2793,6 +3076,10 @@ packages: lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + lru-cache@8.0.5: resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} engines: {node: '>=16.14'} @@ -3041,6 +3328,9 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -3049,6 +3339,9 @@ packages: engines: {node: '>=10'} hasBin: true + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + mongodb-connection-string-url@2.6.0: resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} @@ -3095,7 +3388,7 @@ packages: optional: true ms@2.0.0: - resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -3120,6 +3413,10 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + new-find-package-json@2.0.0: resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} engines: {node: '>=12.22.0'} @@ -3176,7 +3473,7 @@ packages: engines: {node: '>= 0.8'} once@1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} one-time@1.0.0: resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} @@ -3224,6 +3521,14 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -3240,6 +3545,14 @@ packages: param-case@2.1.1: resolution: {integrity: sha1-35T9jPZTHs915r75oIWPvHK+Ikc=} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parse-ms@2.1.0: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} @@ -3302,6 +3615,10 @@ packages: resolution: {integrity: sha512-KbW4Qb7iHw2fBRWtA9FTc4pZg9cokiFIzc6cE7dzelTrhXWolfQuG1fYVC0E2BRmK/w7xfBjQ+OEsPZPO3QEew==} engines: {node: '>=14'} + 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'} @@ -3310,7 +3627,7 @@ packages: resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} pend@1.2.0: - resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3360,6 +3677,10 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -3386,9 +3707,19 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + puppeteer-core@24.3.0: + resolution: {integrity: sha512-x8kQRP/xxtiFav6wWuLzrctO0HWRpSQy+JjaHbqIl+d5U2lmRh2pY9vh5AzDFN0EtOXW2pzngi9RrryY1vZGig==} + engines: {node: '>=18'} + puppeteer@15.5.0: resolution: {integrity: sha512-+vZPU8iBSdCx1Kn5hHas80fyo0TiVyMeqLGv/1dygX2HKhAZjO9YThadbRTCoTYq0yWw+w/CysldPsEekDtjDQ==} engines: {node: '>=14.1.0'} + deprecated: < 22.8.2 is no longer supported + + puppeteer@24.3.0: + resolution: {integrity: sha512-wYEx+NnEM1T6ncHB+IsTovUgx+JlZ0pv0sRGTb8IzoTeOILvyUcdU2h34bYEQ1iG5maz1VQA5eI4kzIyAVh90A==} + engines: {node: '>=18'} + hasBin: true qrcode@1.5.4: resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} @@ -3478,7 +3809,7 @@ packages: engines: {node: '>=4'} require-directory@2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} require-main-filename@2.0.0: @@ -3487,6 +3818,10 @@ packages: resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-path@1.4.0: resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} engines: {node: '>= 0.8'} @@ -3549,6 +3884,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -3619,6 +3959,10 @@ packages: resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} engines: {node: '>=10.2.0'} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + socks@2.8.3: resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} @@ -3642,7 +3986,7 @@ packages: engines: {node: '>=8'} sprintf-js@1.0.3: - resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} @@ -3672,6 +4016,9 @@ packages: streamx@2.20.2: resolution: {integrity: sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==} + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3742,6 +4089,9 @@ packages: tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -3840,14 +4190,17 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.29.0: - resolution: {integrity: sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ==} + type-fest@4.37.0: + resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==} engines: {node: '>=16'} type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} @@ -3989,7 +4342,7 @@ packages: engines: {node: '>=12'} wrappy@1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} @@ -4039,6 +4392,18 @@ packages: utf-8-validate: optional: true + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + 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.8.0: resolution: {integrity: sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==} engines: {node: '>=10.0.0'} @@ -4071,9 +4436,23 @@ packages: 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==} + deprecated: This package is now deprecated. Move to @xterm/addon-fit instead. + peerDependencies: + xterm: ^5.0.0 + + xterm@5.3.0: + resolution: {integrity: sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==} + deprecated: This package is now deprecated. Move to @xterm/xterm instead. + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@2.1.2: resolution: {integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=} @@ -4092,13 +4471,20 @@ packages: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yauzl@2.10.0: - resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} ylru@1.4.0: resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} engines: {node: '>= 4.0.0'} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -4152,7 +4538,7 @@ snapshots: '@push.rocks/taskbuffer': 3.1.7 '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstore': 2.0.20 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 '@types/express': 4.17.21 body-parser: 1.20.3 cors: 2.8.5 @@ -4794,6 +5180,32 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 + '@design.estate/dees-catalog@1.4.1': + dependencies: + '@design.estate/dees-domtools': 2.3.2 + '@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 + '@push.rocks/smarti18n': 1.0.4 + '@push.rocks/smartpromise': 4.2.2 + '@push.rocks/smartstring': 4.0.15 + '@tsclass/tsclass': 4.4.3 + '@webcontainer/api': 1.2.0 + apexcharts: 4.4.0 + highlight.js: 11.11.1 + ibantools: 4.5.1 + monaco-editor: 0.52.2 + pdfjs-dist: 4.10.38 + xterm: 5.3.0 + xterm-addon-fit: 0.8.0(xterm@5.3.0) + transitivePeerDependencies: + - react + - supports-color + - vue + '@design.estate/dees-comms@1.0.27': dependencies: '@api.global/typedrequest': 3.1.10 @@ -4823,6 +5235,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@design.estate/dees-domtools@2.3.2': + dependencies: + '@api.global/typedrequest': 3.1.10 + '@design.estate/dees-comms': 1.0.27 + '@push.rocks/lik': 6.1.0 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartmarkdown': 3.0.3 + '@push.rocks/smartpromise': 4.2.2 + '@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/smarturl': 3.1.0 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/websetup': 3.0.19 + '@push.rocks/webstore': 2.0.20 + lenis: 1.1.20 + lit: 3.2.1 + sweet-scroll: 4.0.0 + transitivePeerDependencies: + - react + - supports-color + - vue + '@design.estate/dees-element@2.0.39': dependencies: '@design.estate/dees-domtools': 2.0.65 @@ -4989,6 +5426,24 @@ snapshots: dependencies: '@types/chai': 4.3.20 + '@fortawesome/fontawesome-common-types@6.7.2': {} + + '@fortawesome/fontawesome-svg-core@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + + '@fortawesome/free-brands-svg-icons@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + + '@fortawesome/free-regular-svg-icons@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + + '@fortawesome/free-solid-svg-icons@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + '@git.zone/tsbuild@2.2.0': dependencies: '@git.zone/tspublish': 1.7.7 @@ -5086,9 +5541,7 @@ snapshots: '@push.rocks/smartshell': 3.0.6 '@push.rocks/taskbuffer': 3.1.7 transitivePeerDependencies: - - bufferutil - supports-color - - utf-8-validate '@hapi/bourne@3.0.0': {} @@ -5146,6 +5599,50 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 + '@napi-rs/canvas-android-arm64@0.1.67': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.67': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.67': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.67': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.67': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.67': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.67': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.67': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.67': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.67': + optional: true + + '@napi-rs/canvas@0.1.67': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.67 + '@napi-rs/canvas-darwin-arm64': 0.1.67 + '@napi-rs/canvas-darwin-x64': 0.1.67 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.67 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.67 + '@napi-rs/canvas-linux-arm64-musl': 0.1.67 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.67 + '@napi-rs/canvas-linux-x64-gnu': 0.1.67 + '@napi-rs/canvas-linux-x64-musl': 0.1.67 + '@napi-rs/canvas-win32-x64-msvc': 0.1.67 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5216,6 +5713,19 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@puppeteer/browsers@2.7.1': + dependencies: + debug: 4.4.0 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.7.1 + tar-fs: 3.0.8 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-buffer + - supports-color + '@push.rocks/consolecolor@2.0.2': dependencies: ansi-256-colors: 1.1.0 @@ -5246,7 +5756,7 @@ snapshots: '@push.rocks/smartstring': 4.0.15 '@push.rocks/smartunique': 3.0.9 '@push.rocks/taskbuffer': 3.1.7 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 transitivePeerDependencies: - aws-crt @@ -5268,7 +5778,7 @@ snapshots: '@pushrocks/smartjson': 4.0.6 '@pushrocks/smartpath': 5.0.5 '@pushrocks/smartpromise': 3.1.7 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 mongodb: 4.17.2(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0)) transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -5326,7 +5836,7 @@ snapshots: '@push.rocks/smartstream': 3.2.5 '@push.rocks/smartstring': 4.0.15 '@push.rocks/smartunique': 3.0.9 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 transitivePeerDependencies: - aws-crt @@ -5376,7 +5886,7 @@ snapshots: '@push.rocks/smarttime': 4.0.8 '@push.rocks/smartunique': 3.0.9 '@push.rocks/taskbuffer': 3.1.7 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 mongodb: 6.11.0(@aws-sdk/credential-providers@3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0)))(socks@2.8.3) transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -5469,6 +5979,8 @@ snapshots: '@types/through2': 2.0.41 through2: 4.0.2 + '@push.rocks/smarti18n@1.0.4': {} + '@push.rocks/smartjson@5.0.20': dependencies: '@push.rocks/smartenv': 5.0.12 @@ -5489,7 +6001,7 @@ snapshots: '@push.rocks/smartlog-interfaces@3.0.2': dependencies: '@api.global/typedrequest-interfaces': 2.0.2 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 '@push.rocks/smartlog@3.0.7': dependencies: @@ -5602,7 +6114,7 @@ snapshots: '@push.rocks/smartpromise': 4.0.4 '@push.rocks/smartpuppeteer': 2.0.2 '@push.rocks/smartunique': 3.0.9 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 '@types/express': 5.0.0 express: 4.21.1 pdf-lib: 1.17.1 @@ -5616,6 +6128,8 @@ snapshots: '@push.rocks/smartpromise@4.0.4': {} + '@push.rocks/smartpromise@4.2.2': {} + '@push.rocks/smartpuppeteer@2.0.2': dependencies: '@pushrocks/smartdelay': 2.0.13 @@ -5651,7 +6165,7 @@ snapshots: '@push.rocks/smartbucket': 3.3.5 '@push.rocks/smartfile': 11.0.21 '@push.rocks/smartpath': 5.0.18 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 '@types/s3rver': 3.7.4 s3rver: 3.7.1 transitivePeerDependencies: @@ -5674,7 +6188,7 @@ snapshots: '@push.rocks/smartxml': 1.0.8 '@push.rocks/smartyaml': 2.0.5 '@push.rocks/webrequest': 3.0.37 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 '@push.rocks/smartsocket@2.0.27': dependencies: @@ -5830,7 +6344,7 @@ snapshots: dependencies: '@pushrocks/smartdelay': 3.0.1 '@pushrocks/smartpromise': 4.0.2 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.3 '@push.rocks/webstore@2.0.20': dependencies: @@ -6378,6 +6892,25 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@svgdotjs/svg.draggable.js@3.0.6(@svgdotjs/svg.js@3.2.4)': + dependencies: + '@svgdotjs/svg.js': 3.2.4 + + '@svgdotjs/svg.filter.js@3.0.8': + dependencies: + '@svgdotjs/svg.js': 3.2.4 + + '@svgdotjs/svg.js@3.2.4': {} + + '@svgdotjs/svg.resize.js@2.0.5(@svgdotjs/svg.js@3.2.4)(@svgdotjs/svg.select.js@4.0.2(@svgdotjs/svg.js@3.2.4))': + dependencies: + '@svgdotjs/svg.js': 3.2.4 + '@svgdotjs/svg.select.js': 4.0.2(@svgdotjs/svg.js@3.2.4) + + '@svgdotjs/svg.select.js@4.0.2(@svgdotjs/svg.js@3.2.4)': + dependencies: + '@svgdotjs/svg.js': 3.2.4 + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 @@ -6390,13 +6923,15 @@ snapshots: '@tokenizer/token@0.3.0': {} + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@tsclass/tsclass@3.0.48': dependencies: type-fest: 2.19.0 - '@tsclass/tsclass@4.1.2': + '@tsclass/tsclass@4.4.3': dependencies: - type-fest: 4.29.0 + type-fest: 4.37.0 '@types/accepts@1.3.7': dependencies: @@ -6776,6 +7311,10 @@ snapshots: - supports-color - utf-8-validate + '@webcontainer/api@1.2.0': {} + + '@yr/monotone-cubic-spline@1.0.3': {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -6783,10 +7322,12 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4 + debug: 4.3.7 transitivePeerDependencies: - supports-color + agent-base@7.1.3: {} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 @@ -6818,6 +7359,15 @@ snapshots: ansi-styles@6.2.1: {} + apexcharts@4.4.0: + dependencies: + '@svgdotjs/svg.draggable.js': 3.0.6(@svgdotjs/svg.js@3.2.4) + '@svgdotjs/svg.filter.js': 3.0.8 + '@svgdotjs/svg.js': 3.2.4 + '@svgdotjs/svg.resize.js': 2.0.5(@svgdotjs/svg.js@3.2.4)(@svgdotjs/svg.select.js@4.0.2(@svgdotjs/svg.js@3.2.4)) + '@svgdotjs/svg.select.js': 4.0.2(@svgdotjs/svg.js@3.2.4) + '@yr/monotone-cubic-spline': 1.0.3 + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -6832,6 +7382,10 @@ snapshots: array-union@2.1.0: {} + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + astral-regex@2.0.0: {} async-mutex@0.3.2: @@ -6853,10 +7407,36 @@ snapshots: bare-events@2.5.0: optional: true + bare-fs@4.0.1: + dependencies: + bare-events: 2.5.0 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.0) + transitivePeerDependencies: + - bare-buffer + optional: true + + bare-os@3.4.0: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.4.0 + optional: true + + bare-stream@2.6.5(bare-events@2.5.0): + dependencies: + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.0 + optional: true + base64-js@1.5.1: {} base64id@2.0.0: {} + basic-ftp@5.0.5: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -7001,6 +7581,12 @@ snapshots: chownr@2.0.0: {} + chromium-bidi@2.0.0(devtools-protocol@0.0.1402036): + dependencies: + devtools-protocol: 0.0.1402036 + mitt: 3.0.1 + zod: 3.24.2 + ci-info@3.9.0: {} clean-css@4.2.4: @@ -7023,6 +7609,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clone@2.1.2: {} co-body@6.2.0: @@ -7107,6 +7699,15 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cosmiconfig@9.0.0(typescript@5.6.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.6.3 + croner@4.4.1: {} croner@5.7.0: {} @@ -7134,6 +7735,8 @@ snapshots: dependencies: type-fest: 2.19.0 + data-uri-to-buffer@6.0.2: {} + dayjs@1.11.13: {} debounce@1.2.1: {} @@ -7154,6 +7757,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.0: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} decode-named-character-reference@1.0.2: @@ -7188,6 +7795,12 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + delayed-stream@1.0.0: {} delegates@1.0.0: {} @@ -7208,6 +7821,8 @@ snapshots: devtools-protocol@0.0.1019158: {} + devtools-protocol@0.0.1402036: {} + dicer@0.3.0: dependencies: streamsearch: 0.1.2 @@ -7288,6 +7903,12 @@ snapshots: entities@4.5.0: {} + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + errorstacks@2.4.1: {} es-define-property@1.0.0: @@ -7352,6 +7973,8 @@ snapshots: '@esbuild/win32-ia32': 0.24.0 '@esbuild/win32-x64': 0.24.0 + escalade@3.2.0: {} + escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} @@ -7362,10 +7985,22 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + esm@3.2.25: {} esprima@4.0.1: {} + estraverse@5.3.0: {} + + esutils@2.0.3: {} + etag@1.8.1: {} eventemitter3@4.0.7: {} @@ -7434,7 +8069,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.4 + debug: 4.4.0 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -7621,6 +8256,14 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-uri@6.0.4: + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -7744,6 +8387,8 @@ snapshots: he@1.2.0: {} + highlight.js@11.11.1: {} + html-escaper@2.0.2: {} html-minifier@4.0.0: @@ -7788,6 +8433,13 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -7796,7 +8448,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -7808,6 +8467,8 @@ snapshots: humanize-number@0.0.2: {} + ibantools@4.5.1: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -7816,6 +8477,11 @@ snapshots: ignore@5.3.2: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + indent-string@5.0.0: {} inflation@2.1.0: {} @@ -7849,6 +8515,8 @@ snapshots: ipaddr.js@1.9.1: {} + is-arrayish@0.2.1: {} + is-arrayish@0.3.2: {} is-deflate@1.0.0: {} @@ -7985,6 +8653,8 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -8068,6 +8738,10 @@ snapshots: kuler@2.0.0: {} + lenis@1.1.20: {} + + lines-and-columns@1.2.4: {} + lit-element@4.1.1: dependencies: '@lit-labs/ssr-dom-shim': 1.2.1 @@ -8158,6 +8832,8 @@ snapshots: pseudomap: 1.0.2 yallist: 2.1.2 + lru-cache@7.18.3: {} + lru-cache@8.0.5: {} make-dir@3.1.0: @@ -8569,10 +9245,14 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + mitt@3.0.1: {} + mkdirp-classic@0.5.3: {} mkdirp@1.0.4: {} + monaco-editor@0.52.2: {} + mongodb-connection-string-url@2.6.0: dependencies: '@types/whatwg-url': 8.2.2 @@ -8649,6 +9329,8 @@ snapshots: negotiator@0.6.3: {} + netmask@2.0.2: {} + new-find-package-json@2.0.0: dependencies: debug: 4.3.7 @@ -8736,6 +9418,24 @@ snapshots: p-try@2.2.0: {} + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.3 + debug: 4.4.0 + get-uri: 6.0.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + package-json-from-dist@1.0.1: {} package-json@8.1.1: @@ -8753,6 +9453,17 @@ snapshots: dependencies: no-case: 2.3.2 + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parse-ms@2.1.0: {} parse-ms@3.0.0: {} @@ -8797,6 +9508,10 @@ snapshots: transitivePeerDependencies: - supports-color + pdfjs-dist@4.10.38: + optionalDependencies: + '@napi-rs/canvas': 0.1.67 + peek-readable@5.3.1: {} peek-stream@1.1.3: @@ -8846,6 +9561,19 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + proxy-from-env@1.1.0: {} pseudomap@1.0.2: {} @@ -8877,6 +9605,20 @@ snapshots: punycode@2.3.1: {} + puppeteer-core@24.3.0: + dependencies: + '@puppeteer/browsers': 2.7.1 + chromium-bidi: 2.0.0(devtools-protocol@0.0.1402036) + debug: 4.4.0 + devtools-protocol: 0.0.1402036 + typed-query-selector: 2.12.0 + ws: 8.18.1 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - utf-8-validate + puppeteer@15.5.0: dependencies: cross-fetch: 3.1.5 @@ -8897,6 +9639,21 @@ snapshots: - supports-color - utf-8-validate + puppeteer@24.3.0(typescript@5.6.3): + dependencies: + '@puppeteer/browsers': 2.7.1 + chromium-bidi: 2.0.0(devtools-protocol@0.0.1402036) + cosmiconfig: 9.0.0(typescript@5.6.3) + devtools-protocol: 0.0.1402036 + puppeteer-core: 24.3.0 + typed-query-selector: 2.12.0 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - typescript + - utf-8-validate + qrcode@1.5.4: dependencies: dijkstrajs: 1.0.3 @@ -9022,6 +9779,8 @@ snapshots: resolve-alpn@1.2.1: {} + resolve-from@4.0.0: {} + resolve-path@1.4.0: dependencies: http-errors: 1.6.3 @@ -9087,6 +9846,8 @@ snapshots: semver@7.6.3: {} + semver@7.7.1: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -9201,6 +9962,14 @@ snapshots: - supports-color - utf-8-validate + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + socks@2.8.3: dependencies: ip-address: 9.0.5 @@ -9251,6 +10020,14 @@ snapshots: optionalDependencies: bare-events: 2.5.0 + streamx@2.22.0: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.1 + optionalDependencies: + bare-events: 2.5.0 + optional: true + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -9322,6 +10099,16 @@ snapshots: pump: 3.0.2 tar-stream: 2.2.0 + tar-fs@3.0.8: + dependencies: + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.0.1 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -9427,13 +10214,15 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.29.0: {} + type-fest@4.37.0: {} type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 + typed-query-selector@2.12.0: {} + typescript@5.6.3: {} uglify-js@3.19.3: {} @@ -9596,6 +10385,8 @@ snapshots: ws@8.18.0: {} + ws@8.18.1: {} + ws@8.8.0: {} xml-js@1.6.11: @@ -9613,8 +10404,16 @@ snapshots: xtend@4.0.2: {} + xterm-addon-fit@0.8.0(xterm@5.3.0): + dependencies: + xterm: 5.3.0 + + xterm@5.3.0: {} + y18n@4.0.3: {} + y18n@5.0.8: {} + yallist@2.1.2: {} yallist@4.0.0: {} @@ -9640,6 +10439,16 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 @@ -9647,4 +10456,6 @@ snapshots: ylru@1.4.0: {} + zod@3.24.2: {} + zwitch@2.0.4: {} diff --git a/ts_shared/demoletter.ts b/ts_shared/demoletter.ts index 3f5b701..0e76a87 100644 --- a/ts_shared/demoletter.ts +++ b/ts_shared/demoletter.ts @@ -1,47 +1,46 @@ -import * as plugins from './plugins.js'; -import * as interfaces from './interfaces/index.js'; +import * as plugins from "./plugins.js"; +import * as interfaces from "./interfaces/index.js"; const fromContact: plugins.tsclass.business.IContact = { - name: 'Awesome From Company', - type: 'company', - description: 'a company that does stuff', + name: "Awesome From Company", + type: "company", + description: "a company that does stuff", address: { - streetName: 'Awesome Street', - houseNumber: '5', - city: 'Bremen', - country: 'Germany', - postalCode: '28359', + streetName: "Awesome Street", + houseNumber: "5", + city: "Bremen", + country: "Germany", + postalCode: "28359", }, - vatId: 'DE12345678', + vatId: "DE12345678", sepaConnection: { - bic: 'BPOTBEB1', - iban: 'BE01234567891616' + bic: "BPOTBEB1", + iban: "BE01234567891616", }, - email: 'hello@awesome.company', - phone: '+49 421 1234567', - fax: '+49 421 1234568', - + email: "hello@awesome.company", + phone: "+49 421 1234567", + fax: "+49 421 1234568", }; const toContact: plugins.tsclass.business.IContact = { - name: 'Awesome To GmbH', - type: 'company', - customerNumber: 'LL-CLIENT-123', - description: 'a company that does stuff', + name: "Awesome To GmbH", + type: "company", + customerNumber: "LL-CLIENT-123", + description: "a company that does stuff", address: { - streetName: 'Awesome Street', - houseNumber: '5', - city: 'Bremen', - country: 'Germany', - postalCode: '28359' + streetName: "Awesome Street", + houseNumber: "5", + city: "Bremen", + country: "Germany", + postalCode: "28359", }, - vatId: 'BE12345678', -} + vatId: "BE12345678", +}; export const demoLetter: plugins.tsclass.business.ILetter = { versionInfo: { - type: 'draft', - version: '1.0.0', + type: "draft", + version: "1.0.0", }, accentColor: null, content: { @@ -49,155 +48,192 @@ export const demoLetter: plugins.tsclass.business.ILetter = { timesheetData: null, contractData: { contractDate: Date.now(), - id: 'someid' + id: "someid", }, + letterData: {} as plugins.tsclass.business.ILetter, invoiceData: { - id: 'LL-INV-48765', + id: "LL-INV-48765", reverseCharge: true, dueInDays: 30, billedBy: fromContact, billedTo: toContact, status: null, deliveryDate: new Date().getTime(), - periodOfPerformance: null, + periodOfPerformance: { + from: +new Date().setDate(new Date().getDate() - 7), + to: +new Date(), + }, printResult: null, - currency: 'EUR', + currency: "EUR", notes: [], - type: 'debitnote', + type: "debitnote", items: [ { - name: 'Item with 19% VAT', + name: "Item with 19% VAT", unitQuantity: 2, unitNetPrice: 100, - unitType: 'hours', + unitType: "hours", vatPercentage: 19, position: 0, }, { - name: 'Item with 7% VAT', + name: "Item with 7% VAT", unitQuantity: 4, unitNetPrice: 100, - unitType: 'hours', + unitType: "hours", vatPercentage: 7, position: 1, }, { - name: 'Item with 7% VAT', + name: "Item with 7% VAT", unitQuantity: 3, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 7, position: 2, }, { - name: 'Item with 21% VAT', + name: "Item with 21% VAT", unitQuantity: 1, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 21, position: 3, }, { - name: 'Item with 0% VAT', + name: "Item with 0% VAT", unitQuantity: 6, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 0, position: 4, - },{ - name: 'Item with 19% VAT', + }, + { + name: "Item with 19% VAT", unitQuantity: 8, unitNetPrice: 100, - unitType: 'hours', + unitType: "hours", vatPercentage: 19, position: 5, }, { - name: 'Item with 7% VAT', + name: "Item with 7% VAT", unitQuantity: 9, unitNetPrice: 100, - unitType: 'hours', + unitType: "hours", vatPercentage: 7, position: 6, }, { - name: 'Item with 7% VAT', + name: "Item with 7% VAT", unitQuantity: 4, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 7, position: 8, }, { - name: 'Item with 21% VAT', + name: "Item with 21% VAT", unitQuantity: 3, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 21, position: 9, }, { - name: 'Item with 0% VAT', + name: "Item with 0% VAT", unitQuantity: 1, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 0, position: 10, }, { - name: 'Item with 0% VAT', + name: "Item with 0% VAT", unitQuantity: 1, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 0, - position: 10, + position: 11, }, { - name: 'Item with 0% VAT', + name: "Item with 0% VAT", unitQuantity: 1, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 0, - position: 10, + position: 12, }, { - name: 'Item with 0% VAT', + name: "Item with 0% VAT", unitQuantity: 1, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 0, - position: 10, + position: 13, }, { - name: 'Item with 0% VAT', + name: "Item with 0% VAT", unitQuantity: 1, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 0, - position: 10, + position: 14, }, { - name: 'Item with 0% VAT', + name: "Item with 0% VAT", unitQuantity: 1, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 0, - position: 10, + position: 15, }, { - name: 'Item with 0% VAT', + name: "Item with 0% VAT", unitQuantity: 1, unitNetPrice: 230, - unitType: 'hours', + unitType: "hours", vatPercentage: 0, - position: 10, + position: 16, + }, + { + name: "Item with 0% VAT", + unitQuantity: 1, + unitNetPrice: 230, + unitType: "hours", + vatPercentage: 0, + position: 17, + }, + { + name: "Item with 0% VAT", + unitQuantity: 1, + unitNetPrice: 230, + unitType: "hours", + vatPercentage: 0, + position: 18, + }, + { + name: "Item with 0% VAT", + unitQuantity: 1, + unitNetPrice: 230, + unitType: "hours", + vatPercentage: 0, + position: 19, + }, + { + name: "Item with 0% VAT", + unitQuantity: 1, + unitNetPrice: 230, + unitType: "hours", + vatPercentage: 0, + position: 20, }, ], - } + }, }, - + date: Date.now(), - type: 'invoice', + type: "invoice", needsCoverSheet: false, objectActions: [], pdf: null, @@ -208,12 +244,12 @@ export const demoLetter: plugins.tsclass.business.ILetter = { legalContact: null, logoUrl: null, pdfAttachments: null, - subject: 'Invoice: LL-INV-48765', -} + subject: "Invoice: LL-INV-48765", +}; export const demoDocumentSettings: interfaces.IDocumentSettings = { enableTopDraftText: true, enableDefaultHeader: true, enableDefaultFooter: true, - languageCode: 'DE', -}; \ No newline at end of file + languageCode: "DE", +}; diff --git a/ts_shared/index.ts b/ts_shared/index.ts index b7d1fec..8217f8f 100644 --- a/ts_shared/index.ts +++ b/ts_shared/index.ts @@ -1,12 +1,15 @@ -export const a4Height = 1122; -export const a4Width = 794; -export const rightMargin = 70; -export const leftMargin = 90; +const DPI = 96 / 2.54; // / +export const A4_HEIGHT = cmToPx(29.7); // DPI * 29.7cm +export const A4_WIDTH = cmToPx(21); // DPI * 21cm -import * as interfaces from './interfaces/index.js'; +export function cmToPx(value: number): number { + return DPI * value; +} + +import * as interfaces from "./interfaces/index.js"; export { interfaces }; -import * as translation from './translation.js'; +import * as translation from "./translation.js"; export { translation }; -export * from './demoletter.js'; +export * from "./demoletter.js"; diff --git a/ts_shared/interfaces/document.ts b/ts_shared/interfaces/document.ts index 9a86868..70a575b 100644 --- a/ts_shared/interfaces/document.ts +++ b/ts_shared/interfaces/document.ts @@ -1,9 +1,23 @@ -import * as translation from '../translation.js'; +import * as translation from "../translation.js"; + +export interface IDocumentTheme { + colorPrimaryForeground?: string; + colorPrimaryBackground?: string; + colorAccentForeground?: string; + colorAccentBackground?: string; + fontFamily?: string; + pageBackground?: string; + coverPageBackground?: string; +} export interface IDocumentSettings { enableTopDraftText?: boolean; enableDefaultHeader?: boolean; enableDefaultFooter?: boolean; - languageCode?: translation.TLanguageCode; + enableFoldMarks?: boolean; + enableInvoiceContractRefSection?: boolean; + languageCode?: translation.LanguageCode; + dateStyle?: Intl.DateTimeFormatOptions["dateStyle"]; vatGroupPositions?: boolean; -} \ No newline at end of file + theme?: IDocumentTheme; +} diff --git a/ts_shared/translation.ts b/ts_shared/translation.ts index 6155439..e898417 100644 --- a/ts_shared/translation.ts +++ b/ts_shared/translation.ts @@ -1,143 +1,272 @@ -import * as interfaces from './interfaces/index.js'; - // Define English translations without enforcing TTranslationImplementation yet export const EN_translations = { - address: 'Address', - bankConnection: 'Bank Connection', - contactInfo: 'Contact Info', - description: 'Description', - invoice: 'Invoice', - itemPos: 'Item Pos.', - quantity: 'Quantity', - registrationInfo: 'Registration Info', - reverseVatNote: 'VAT arises on a reverse charge basis and is payable by the customer.', - totalNetPrice: 'Total Net Price', - unitNetPrice: 'Unit Net Price', - unitType: 'Unit Type', - yourCustomerId: 'Your Customer ID:', - yourVatId: 'Your vat id on file:', - continuesOnPage: 'Continues on page', - finalPageStatement: 'This is the final page of this document.', - page: 'Page', - vatShort: 'VAT', -} as const; + address: "Address", + "bank.accountHolder": "beneficiary", + "bank.bic": "bic", + "bank.iban": "iban", + "bank.institution": "institution", + "bankConnection@@title": "Bank Connection", + "contact@@title": "Contact Info", + "customer.number": "Your Customer ID", + description: "Description", + "empty.logo": "no logo provided", + "empty.number.customer": "not registered", + empty: "not provided", + fax: "Fax", + introStatement: "We hereby invoice the following products and services", + "invoice.number": "Invoice number", + invoice: "Invoice", + "item.position": "Pos.", + mail: "Mail", + "overlay@@draft": "Draft", + "page.continueNext": "Continues on page", + "page.final": "This is the final page of this document.", + page: "Page", + pageOf: "of", + "payment.qr": "Pay via QR code", + "payment.qr.description": "Scan the QR code with you banking app", + "payment.terms": "Payment Terms", + "payment.terms.direct": "Without deduction until", + "periodOfPerformance.day": "Delivery Date", + "periodOfPerformance.range": "Delivery Period", + phone: "Phone", + "price.total.net": "Total Net Price", + "price.unit.net": "Unit Net Price", + price: "Price", + quantity: "Quantity", + referencedContract: "Referenced contract", + "referencedContract.text": + "This invoice is adhering to agreements made by contract between the parties on", + "registration.label": "Registration Info", + subject: "Subject", + sum: "Sum", + totalGross: "Total gross", + "unit.type": "Unit Type", + "vat.position": "on item positions", + "vat.reverseCharge.note": + "VAT arises on a reverse charge basis and is payable by the customer.", + "vat.short": "VAT", + "vat.yourId": "Your vat id on file", + vat: "Valued Added Tax", +}; // Infer keys of EN_translations -export type TTranslationKey = keyof typeof EN_translations; + +/** + * For example: + * - price + */ +type RawTranslationKeys = keyof typeof EN_translations; + +/** + * For example: + * - price.item + * - price.sum + * - price.unit + * - vat.yourId + */ +type NestedTranslationKeys = + | RawTranslationKeys + | `${RawTranslationKeys}.${string}` + | `${RawTranslationKeys}.${string}.${string}` + | `${RawTranslationKeys}.${string}.${string}.${string}` + | `${RawTranslationKeys}.${string}.${string}.${string}.${string}`; + +/** + * For example: + * - contact@@mail + * - vat = 'VAT' + * - vat.yourId = 'your vat id' + * - footer@@vat.yourId = 'your vat id' + * - header@@vat.yourId = 'THIS IS YOUR VAT' + */ +type LocationBasedTranslationKeys = `${string}@@${NestedTranslationKeys}`; + +/** + * Mix of everything + */ +export type TranslationKey = + | NestedTranslationKeys + | LocationBasedTranslationKeys; // Define the type for all translations based on EN_translations keys -export type TTranslationImplementation = { - [key in TTranslationKey]: string; +export type Dictionary = { + [key in TranslationKey]: string; }; // Define German translations -export const DE_translations: TTranslationImplementation = { - address: 'Adresse', - bankConnection: 'Bankverbindung', - contactInfo: 'Kontaktinformationen', - description: 'Beschreibung', - invoice: 'Rechnung', - itemPos: 'Pos.', - quantity: 'Anzahl', - registrationInfo: 'HRA/HRB Info', - reverseVatNote: - 'Umkehr der Umsatzsteuerpflicht: Der Rechnungsempfänger ist für die korrekte Abrechnung der Umsatzsteuer zuständig.', - totalNetPrice: 'Summe netto', - unitNetPrice: 'Einheit netto', - unitType: 'Einheit', - yourCustomerId: 'Ihre Kundennummer:', - yourVatId: 'Ihre Umsatzsteuer-ID:', - continuesOnPage: 'Fortsetzung auf Seite', - finalPageStatement: 'Dies ist die letzte Seite dieses Dokuments.', - page: 'Seite', - vatShort: 'USt', +export const DE_translations: Dictionary = { + address: "Adresse", + "bank.accountHolder": "Kontoinhaber", + "bank.bic": "BIC", + "bank.iban": "IBAN", + "bank.institution": "Bankinstitut", + "bankConnection@@title": "Bankverbindung", + "contact@@title": "Kontaktinformationen", + "customer.number": "Ihre Kundennummer", + description: "Beschreibung", + "empty.logo": "Kein Logo gesetzt", + "empty.number.customer": "nicht registriert", + empty: "nicht angegeben", + fax: "Fax", + introStatement: + "Wir stellen Ihnen hiermit folgende Produkte und Dienstleistungen in Rechnung", + "invoice.number": "Rechnungsnr.", + invoice: "Rechnung", + "item.position": "Pos.", + mail: "E-Mail", + "overlay@@draft": "Entwurf", + "page.continueNext": "Fortsetzung auf Seite", + "page.final": "Dies ist die letzte Seite dieses Dokuments.", + page: "Seite", + pageOf: "von", + "payment.qr": "Überweisen per QR-Code", + "payment.qr.description": + "Den QR-Code einfach mit der Banking-App einscannen", + "payment.terms": "Zahlungsbedingungen", + "payment.terms.direct": "Ohne Abzug bis zum", + "periodOfPerformance.day": "Lieferdatum", + "periodOfPerformance.range": "Lieferzeitraum", + phone: "Telefon", + "price.total.net": "Gesamtpreis", + "price.unit.net": "Stückpreis", + price: "Preis", + quantity: "Menge", + referencedContract: "Referenzierter Vertrag", + "referencedContract.text": + "Diese Rechnung bezieht sich auf die getroffenen Vertragsvereinbarungen vom", + "registration.label": "Registrierungsinfo", + subject: "Betreff", + sum: "Summe", + totalGross: "Gesamtbetrag brutto", + "unit.type": "Einheit", + "vat.position": "auf Positionen", + "vat.reverseCharge.note": + "Die Umsatzsteuer entsteht im Reverse-Charge-Verfahren und ist vom Kunden zu zahlen.", + "vat.short": "MwSt.", + "vat.yourId": "Ihre hinterlegte USt-Id", + vat: "Umsatzsteuer", }; // Define Spanish translations -export const ES_translations: TTranslationImplementation = { - address: 'Dirección', - bankConnection: 'Conexión bancaria', - contactInfo: 'Información de contacto', - description: 'Descripción', - invoice: 'Factura', - itemPos: 'Pos.', - quantity: 'Cantidad', - registrationInfo: 'Información de registro', - reverseVatNote: 'El IVA se aplica por inversión del sujeto pasivo y debe ser pagado por el cliente.', - totalNetPrice: 'Precio total neto', - unitNetPrice: 'Precio unitario neto', - unitType: 'Tipo de unidad', - yourCustomerId: 'Su número de cliente:', - yourVatId: 'Su ID de IVA:', - continuesOnPage: 'Continúa en la página', - finalPageStatement: 'Esta es la última página de este documento.', - page: 'Página', - vatShort: 'IVA', -}; +// export const ES_translations: TTranslationImplementation = { +// address: "Dirección", +// bankConnection: "Conexión bancaria", +// contactInfo: "Información de contacto", +// description: "Descripción", +// invoice: "Factura", +// itemPos: "Pos.", +// quantity: "Cantidad", +// registrationInfo: "Información de registro", +// reverseVatNote: +// "El IVA se aplica por inversión del sujeto pasivo y debe ser pagado por el cliente.", +// totalNetPrice: "Precio total neto", +// unitNetPrice: "Precio unitario neto", +// unitType: "Tipo de unidad", +// yourCustomerId: "Su número de cliente:", +// yourVatId: "Su ID de IVA:", +// continuesOnPage: "Continúa en la página", +// finalPageStatement: "Esta es la última página de este documento.", +// page: "Página", +// vatShort: "IVA", +// }; // Define French translations -export const FR_translations: TTranslationImplementation = { - address: 'Adresse', - bankConnection: 'Coordonnées bancaires', - contactInfo: 'Informations de contact', - description: 'Description', - invoice: 'Facture', - itemPos: 'Position', - quantity: 'Quantité', - registrationInfo: "Informations d'enregistrement", - reverseVatNote: - "La TVA s'applique selon le mécanisme d'autoliquidation et est à payer par le client.", - totalNetPrice: 'Prix net total', - unitNetPrice: 'Prix unitaire net', - unitType: "Type d'unité", - yourCustomerId: 'Votre numéro de client :', - yourVatId: 'Votre numéro de TVA :', - continuesOnPage: 'Continue sur la page', - finalPageStatement: 'Ceci est la dernière page de ce document.', - page: 'Page', - vatShort: 'TVA', -}; +// export const FR_translations: TTranslationImplementation = { +// address: "Adresse", +// bankConnection: "Coordonnées bancaires", +// contactInfo: "Informations de contact", +// description: "Description", +// invoice: "Facture", +// itemPos: "Position", +// quantity: "Quantité", +// registrationInfo: "Informations d'enregistrement", +// reverseVatNote: +// "La TVA s'applique selon le mécanisme d'autoliquidation et est à payer par le client.", +// totalNetPrice: "Prix net total", +// unitNetPrice: "Prix unitaire net", +// unitType: "Type d'unité", +// yourCustomerId: "Votre numéro de client :", +// yourVatId: "Votre numéro de TVA :", +// continuesOnPage: "Continue sur la page", +// finalPageStatement: "Ceci est la dernière page de ce document.", +// page: "Page", +// vatShort: "TVA", +// }; // Define Italian translations -export const IT_translations: TTranslationImplementation = { - address: 'Indirizzo', - bankConnection: 'Coordinate bancarie', - contactInfo: 'Informazioni di contatto', - description: 'Descrizione', - invoice: 'Fattura', - itemPos: 'Pos.', - quantity: 'Quantità', - registrationInfo: 'Informazioni di registrazione', - reverseVatNote: "L'IVA è applicata con inversione contabile ed è a carico del cliente.", - totalNetPrice: 'Prezzo netto totale', - unitNetPrice: 'Prezzo netto unitario', - unitType: 'Tipo di unità', - yourCustomerId: 'Il tuo numero cliente:', - yourVatId: 'Il tuo numero di partita IVA:', - continuesOnPage: 'Continua alla pagina', - finalPageStatement: 'Questa è l\'ultima pagina di questo documento.', - page: 'Pagina', - vatShort: 'IVA', -}; +// export const IT_translations: TTranslationImplementation = { +// address: "Indirizzo", +// bankConnection: "Coordinate bancarie", +// contactInfo: "Informazioni di contatto", +// description: "Descrizione", +// invoice: "Fattura", +// itemPos: "Pos.", +// quantity: "Quantità", +// registrationInfo: "Informazioni di registrazione", +// reverseVatNote: +// "L'IVA è applicata con inversione contabile ed è a carico del cliente.", +// totalNetPrice: "Prezzo netto totale", +// unitNetPrice: "Prezzo netto unitario", +// unitType: "Tipo di unità", +// yourCustomerId: "Il tuo numero cliente:", +// yourVatId: "Il tuo numero di partita IVA:", +// continuesOnPage: "Continua alla pagina", +// finalPageStatement: "Questa è l'ultima pagina di questo documento.", +// page: "Pagina", +// vatShort: "IVA", +// }; // Language Code Map -export const languageCodeMap: Record = { +export const languageCodeMap: Record = { EN: EN_translations, DE: DE_translations, - ES: ES_translations, - FR: FR_translations, - IT: IT_translations, + // ES: ES_translations, + // FR: FR_translations, + // IT: IT_translations, }; // Language Code Type -export type TLanguageCode = keyof typeof languageCodeMap; +export type LanguageCode = keyof typeof languageCodeMap; + +function* getTranslationKeyHierarchy( + key: TranslationKey +): Generator { + yield key; + + const areaSplit = key.split("@@") as [TranslationKey, TranslationKey]; + let rest = areaSplit[1]; + + if (rest) { + yield rest; + } else { + rest = areaSplit[0]; + } + + if (!rest.includes(".")) return; + + const parts = rest.split("."); + for (let i = parts.length - 1; i > 0; i--) { + yield parts.slice(0, i).join(".") as TranslationKey; + } +} // Translate Function export const translate = ( - languageCode: TLanguageCode, - key: TTranslationKey, - defaultValue: string + languageCode: LanguageCode, + key: TranslationKey ): string => { - const translations = languageCodeMap[languageCode] || EN_translations; - return translations[key] || defaultValue; -}; \ No newline at end of file + const dictionary = languageCodeMap[languageCode] || EN_translations; + const lookupHierarchy = getTranslationKeyHierarchy(key); + + let found: string; + + for (let keyOption of lookupHierarchy) { + found = dictionary[keyOption] || EN_translations[keyOption]; + + if (found) { + break; + } + } + return found; +}; diff --git a/ts_web/elements/contentinvoice.ts b/ts_web/elements/contentinvoice.ts index 2ea8732..89e519f 100644 --- a/ts_web/elements/contentinvoice.ts +++ b/ts_web/elements/contentinvoice.ts @@ -9,22 +9,21 @@ import { customElement, type TemplateResult, css, - cssManager, - unsafeCSS, render, domtools, -} from '@design.estate/dees-element'; -import * as plugins from '../plugins.js'; +} from "@design.estate/dees-element"; +import * as plugins from "../plugins.js"; -import { dedocumentSharedStyle } from '../style.js'; +import { dedocumentSharedStyle } from "../style.js"; +import type { TranslationKey } from "ts_shared/translation.js"; declare global { interface HTMLElementTagNameMap { - 'dedocument-contentinvoice': DeContentInvoice; + "dedocument-contentinvoice": DeContentInvoice; } } -@customElement('dedocument-contentinvoice') +@customElement("dedocument-contentinvoice") export class DeContentInvoice extends DeesElement { public static demo = () => html` -
We hereby invoice products and services provided to you by Lossless GmbH:
+
${this.translateKey("invoice@@introStatement")}
- ${plugins.shared.translation.translate( - this.documentSettings.languageCode, - 'itemPos', - 'Item Pos.' - )} + ${this.translateKey("invoice@@item.position")}
- ${plugins.shared.translation.translate( - this.documentSettings.languageCode, - 'description', - 'Description' - )} + ${this.translateKey("invoice@@description")}
- ${plugins.shared.translation.translate( - this.documentSettings.languageCode, - 'quantity', - 'Quantity' - )} + ${this.translateKey("invoice@@quantity")}
-
- ${plugins.shared.translation.translate( - this.documentSettings.languageCode, - 'unitType', - 'Unit Type' - )} +
${this.translateKey("invoice@@unit.type")}
+
+ ${this.translateKey("invoice@@price.unit.net")}
- ${plugins.shared.translation.translate( - this.documentSettings.languageCode, - 'unitNetPrice', - 'Unit Net Price' - )} + ${this.translateKey("invoice@@vat.short")}
- ${plugins.shared.translation.translate( - this.documentSettings.languageCode, - 'totalNetPrice', - 'Total Net Price' - )} -
-
- ${plugins.shared.translation.translate( - this.documentSettings.languageCode, - 'vatShort', - 'VAT' - )} + ${this.translateKey("invoice@@price.total.net")}
- ${(() => { - let counter = 1; - return this.letterData?.content.invoiceData?.items?.map((invoiceItem) => { - const isHighlighted = false; // TODO: implement rest of highlight logic - return html` -
-
${counter++}
-
${invoiceItem.name}
-
${invoiceItem.unitQuantity}
-
${invoiceItem.unitType}
-
- ${invoiceItem.unitNetPrice} ${this.letterData?.content.invoiceData.currency} -
-
- ${invoiceItem.unitQuantity * invoiceItem.unitNetPrice} - ${this.letterData?.content.invoiceData.currency} -
-
${invoiceItem.vatPercentage}%
+ ${this.letterData?.content.invoiceData?.items?.map( + (invoiceItem, index) => html` +
+
${index + 1}
+
${invoiceItem.name}
+
${invoiceItem.unitQuantity}
+
${invoiceItem.unitType}
+
+ ${this.formatPrice(invoiceItem.unitNetPrice)}
- `; - }); - })()} +
+ ${invoiceItem.vatPercentage}% +
+
+ ${this.formatPrice( + invoiceItem.unitQuantity * invoiceItem.unitNetPrice + )} +
+
+ ` + )}
-
Total net
-
${this.getTotalNet()} EUR
+
+ ${this.translateKey("invoice@@sum.total.net")} +
+
+ ${this.formatPrice(this.getTotalNet())} +
${this.getVatGroups().map((vatGroupArg) => { - let itemNumbers = ''; - let first = true; - for (const item of vatGroupArg.items) { - const itemIndex = this.letterData.content.invoiceData.items.indexOf(item); - itemNumbers += `${first ? '' : ', '}${itemIndex + 1}`; - first = false; - } + let itemNumbers = vatGroupArg.items + .map( + (item) => + this.letterData.content.invoiceData.items.indexOf(item) + 1 + ) + .join(", "); return html`
- Vat ${vatGroupArg.vatPercentage}% + ${this.translateKey("vat.short")} + ${vatGroupArg.vatPercentage}% ${this.documentSettings.vatGroupPositions ? html`
(on item positions: ${itemNumbers})(${this.translateKey("invoice@@vat.position")}: + ${itemNumbers}) ` : html``}
-
${vatGroupArg.vatAmountSum} EUR
+
+ ${this.formatPrice(vatGroupArg.vatAmountSum)} +
`; })}
-
Total gross
-
${this.getTotalGross()} EUR
+
${this.translateKey("invoice@@totalGross")}
+
+ ${this.formatPrice(this.getTotalGross())} +
+ ${this.letterData?.content.invoiceData.reverseCharge - ? html` -
- ${plugins.shared.translation.translate( - this.documentSettings.languageCode, - 'reverseVatNote', - 'VAT arises on a reverse charge basis and is payable by the customer.' - )} -
- ` + ? html`
+ ${this.translateKey("invoice@@vat.reverseCharge.note")} +
` : ``} -
-
Payment Terms:
- Payment is due within 30 days starting from the reception of this invoice. Please use the - following SEPA details: -

- Beneficiary: ${this.letterData?.from.name}
- IBAN: ${this.letterData?.from?.sepaConnection?.iban}
- BIC: ${this.letterData?.from?.sepaConnection?.bic}
- Description: ${this.letterData?.content.invoiceData?.id}
- Amount: ${this.getTotalGross()} ${this.letterData?.content.invoiceData.currency} -
- ${this.letterData?.content?.contractData?.contractDate - ? html` -
-
Referenced contract:
- This invoice is adhering to agreements made by contract between the parties on - ${plugins.smarttime.ExtendedDate.fromMillis( - this.letterData?.content.contractData.contractDate - ).format('MMMM D, YYYY')}. -
- ` - : html``} -
-
Sepa Payment Code:
-
+ + + ${this.renderReferencedContract()} + + + ${this.renderPaymentTerms()} + + + ${this.renderPaymentInfo()} `, contentNodes.currentContent ); - const canvas = document.createElement('canvas'); - plugins.qrcode.toCanvas( - canvas, - `BCD -001 -1 -SCT -${this.letterData.content.invoiceData.billedBy.sepaConnection.bic} -${this.letterData.content.invoiceData.billedBy.name} -${this.letterData.content.invoiceData.billedBy.sepaConnection.iban} -EUR${this.getTotalGross()} -CHAR -${this.letterData.content.invoiceData.id} -${this.letterData.content.invoiceData.id} -EPC QR Code`, - (error) => { - if (error) console.error(error); - } - ); - contentNodes.currentContent.querySelector('.paymentCode').append(canvas); } } diff --git a/ts_web/elements/document.demo.ts b/ts_web/elements/document.demo.ts index 1f6651c..beaf3af 100644 --- a/ts_web/elements/document.demo.ts +++ b/ts_web/elements/document.demo.ts @@ -1,7 +1,10 @@ -import * as plugins from '../plugins.js'; +import * as plugins from "../plugins.js"; -import { html } from '@design.estate/dees-element'; +import { html } from "@design.estate/dees-element"; export const demoFunc = () => html` - -`; \ No newline at end of file + +`; diff --git a/ts_web/elements/document.ts b/ts_web/elements/document.ts index a01748c..650b2fa 100644 --- a/ts_web/elements/document.ts +++ b/ts_web/elements/document.ts @@ -5,34 +5,35 @@ import { customElement, type TemplateResult, css, - state, - cssManager, - unsafeCSS, domtools, -} from '@design.estate/dees-element'; -import * as plugins from '../plugins.js'; +} from "@design.estate/dees-element"; +import * as plugins from "../plugins.js"; -export const defaultDocumentSettings: plugins.shared.interfaces.IDocumentSettings = { - enableTopDraftText: true, - enableDefaultHeader: true, - enableDefaultFooter: true, - languageCode: 'EN', - vatGroupPositions: true, -}; +export const defaultDocumentSettings: plugins.shared.interfaces.IDocumentSettings = + { + enableTopDraftText: true, + enableDefaultHeader: true, + enableDefaultFooter: true, + enableFoldMarks: true, + enableInvoiceContractRefSection: true, + languageCode: "EN", + vatGroupPositions: true, + dateStyle: "short", + }; +import { DePage } from "./page.js"; +import { DeContentInvoice } from "./contentinvoice.js"; -import { DePage } from './page.js'; -import { DeContentInvoice } from './contentinvoice.js'; - -import { demoFunc } from './document.demo.js'; +import { demoFunc } from "./document.demo.js"; +import { dedocumentSharedStyle } from "../style.js"; declare global { interface HTMLElementTagNameMap { - 'dedocument-dedocument': DeDocument; + "dedocument-dedocument": DeDocument; } } -@customElement('dedocument-dedocument') +@customElement("dedocument-dedocument") export class DeDocument extends DeesElement { public static demo = demoFunc; @@ -40,7 +41,7 @@ export class DeDocument extends DeesElement { type: String, reflect: true, }) - public format: 'a4' = 'a4'; + public format: "a4" = "a4"; @property({ type: Number, @@ -64,8 +65,8 @@ export class DeDocument extends DeesElement { type: Object, reflect: true, converter: (valueArg) => { - if (typeof valueArg === 'string') { - return plugins.smartjson.parseBase64(valueArg) + if (typeof valueArg === "string") { + return plugins.smartjson.parseBase64(valueArg); } else { return valueArg; } @@ -77,14 +78,15 @@ export class DeDocument extends DeesElement { type: Object, reflect: true, converter: (valueArg) => { - if (typeof valueArg === 'string') { - return plugins.smartjson.parseBase64(valueArg) + if (typeof valueArg === "string") { + return plugins.smartjson.parseBase64(valueArg); } else { return valueArg; } }, }) - public documentSettings: plugins.shared.interfaces.IDocumentSettings = defaultDocumentSettings; + public documentSettings: plugins.shared.interfaces.IDocumentSettings = + defaultDocumentSettings; constructor() { super(); @@ -93,13 +95,10 @@ export class DeDocument extends DeesElement { public static styles = [ domtools.elementBasic.staticStyles, + dedocumentSharedStyle, css` :host { display: block; - color: #333; - padding: 0px; - position: relative; - font-family: 'Dees Sans', sans-serif; } .betweenPagesSpacer { @@ -109,41 +108,17 @@ export class DeDocument extends DeesElement { ]; public render(): TemplateResult { - return html` -
- `; + return html`
`; } - public async firstUpdated(_changedProperties: Map) { + public async firstUpdated( + _changedProperties: Map + ) { domtools.plugins.smartdelay.delayFor(0).then(async () => { this.documentSettings = { ...defaultDocumentSettings, ...this.documentSettings, - } - - while (false) { - await domtools.plugins.smartdelay.delayFor(1000); - this.letterData = { - ...this.letterData, - content: { - ...this.letterData.content, - invoiceData: { - ...this.letterData.content.invoiceData, - items: [ - ...this.letterData.content.invoiceData.items, - { - name: 'Test Item', - unitQuantity: 1, - unitNetPrice: 100, - unitType: 'hours', - vatPercentage: 19, - position: 1, - }, - ], - }, - } - } - } + }; }); const resizeObserver = new ResizeObserver((entries) => { for (const entry of entries) { @@ -156,16 +131,15 @@ export class DeDocument extends DeesElement { resizeObserver.observe(this); this.registerGarbageFunction(() => { resizeObserver.disconnect(); - }) + }); } - public latestDocumentSettings: plugins.shared.interfaces.IDocumentSettings = null; + public latestDocumentSettings: plugins.shared.interfaces.IDocumentSettings = + null; public latestRenderedLetterData: plugins.tsclass.business.ILetter = null; public cleanupStore: any[] = []; - public async renderDocument() { - this.latestDocumentSettings = this.documentSettings; this.latestRenderedLetterData = this.letterData; @@ -173,7 +147,7 @@ export class DeDocument extends DeesElement { const cleanUpStoreNextRender = []; const domtools = await this.domtoolsPromise; - const documentBuildContainer = document.createElement('div'); + const documentBuildContainer = document.createElement("div"); cleanUpStoreCurrentRender.push(documentBuildContainer); document.body.appendChild(documentBuildContainer); @@ -208,7 +182,7 @@ export class DeDocument extends DeesElement { // store current page cleanUpStoreNextRender.push(newPage); documentBuildContainer.append(newPage); - + await currentContent.elementDomReady; await currentContent.trimStartToOffset(overallContentOffset); let newPageOverflows = await newPage.checkOverflow(); @@ -224,17 +198,18 @@ export class DeDocument extends DeesElement { complete = true; } } - + for (const cleanUp of this.cleanupStore) { cleanUp.remove(); } - this.cleanupStore = cleanUpStoreNextRender + this.cleanupStore = cleanUpStoreNextRender; cleanUpStoreCurrentRender.forEach((cleanUp) => { cleanUp.remove(); }); - const documentContainer = this.shadowRoot.querySelector('.documentContainer'); + const documentContainer = + this.shadowRoot.querySelector(".documentContainer"); if (documentContainer) { const children = Array.from(documentContainer.children); children.forEach((child) => { @@ -247,24 +222,36 @@ export class DeDocument extends DeesElement { documentContainer.append(page); // betweenPagesSpacer if (!this.printMode) { - const betweenPagesSpacerDiv = document.createElement('div'); - betweenPagesSpacerDiv.classList.add('betweenPagesSpacer'); + const betweenPagesSpacerDiv = document.createElement("div"); + betweenPagesSpacerDiv.classList.add("betweenPagesSpacer"); documentContainer.appendChild(betweenPagesSpacerDiv); } } this.adjustDePageScaling(); } - async updated(changedProperties: Map): Promise { + async updated( + changedProperties: Map + ): Promise { super.updated(changedProperties); const domtools = await this.domtoolsPromise; - let renderedDocIsUpToDate = domtools.convenience.smartjson.deepEqualObjects(this.letterData, this.latestRenderedLetterData) - && domtools.convenience.smartjson.deepEqualObjects(this.documentSettings, this.latestDocumentSettings); + let renderedDocIsUpToDate = + domtools.convenience.smartjson.deepEqualObjects( + this.letterData, + this.latestRenderedLetterData + ) && + domtools.convenience.smartjson.deepEqualObjects( + this.documentSettings, + this.latestDocumentSettings + ); if (!renderedDocIsUpToDate) { this.renderDocument(); } - if (changedProperties.has('viewHeight') || changedProperties.has('viewWidth')) { + if ( + changedProperties.has("viewHeight") || + changedProperties.has("viewWidth") + ) { this.adjustDePageScaling(); } } @@ -275,7 +262,7 @@ export class DeDocument extends DeesElement { } this.viewWidth = this.clientWidth; // Find all DePage instances within this DeDocument - const pages = this.shadowRoot.querySelectorAll('dedocument-page'); + const pages = this.shadowRoot.querySelectorAll("dedocument-page"); // Update each DePage instance's viewHeight and viewWidth pages.forEach((page: DePage) => { diff --git a/ts_web/elements/index.ts b/ts_web/elements/index.ts index 3ffe9a7..129b051 100644 --- a/ts_web/elements/index.ts +++ b/ts_web/elements/index.ts @@ -1,9 +1,10 @@ -export * from './contentinvoice.js'; -export * from './document.js'; -export * from './letterheader.js'; -export * from './page.js'; -export * from './pagecontainer.js'; -export * from './pagecontent.js'; -export * from './pagefooter.js'; -export * from './pageheader.js'; -export * from './viewer.js'; +export * from "./contentinvoice.js"; +export * from "./document.js"; +export * from "./letterheader.js"; +export * from "./page.js"; +export * from "./pagecontainer.js"; +export * from "./pagecontent.js"; +export * from "./pagefooter.js"; +export * from "./pageheader.js"; +export * from "./viewer.js"; +export * from "./paymentcode.js"; diff --git a/ts_web/elements/letterheader.ts b/ts_web/elements/letterheader.ts index f301a1c..de8d77d 100644 --- a/ts_web/elements/letterheader.ts +++ b/ts_web/elements/letterheader.ts @@ -5,29 +5,31 @@ import { customElement, type TemplateResult, css, - cssManager, unsafeCSS, domtools, -} from '@design.estate/dees-element'; +} from "@design.estate/dees-element"; -import * as plugins from '../plugins.js'; -import { dedocumentSharedStyle } from '../style.js'; +import * as plugins from "../plugins.js"; +import { dedocumentSharedStyle } from "../style.js"; declare global { interface HTMLElementTagNameMap { - 'dedocument-letterheader': DeLetterHeader; + "dedocument-letterheader": DeLetterHeader; } } -@customElement('dedocument-letterheader') +@customElement("dedocument-letterheader") export class DeLetterHeader extends DeesElement { public static demo = () => html` - + `; @property({ type: Object, - reflect: true + reflect: true, }) public letterData: plugins.tsclass.business.ILetter; @@ -43,6 +45,12 @@ export class DeLetterHeader extends DeesElement { }) public pageTotalNumber: number = 1; + @property({ + type: Object, + reflect: true, + }) + public documentSettings: plugins.shared.interfaces.IDocumentSettings; + constructor() { super(); domtools.DomTools.setupDomTools(); @@ -52,19 +60,29 @@ export class DeLetterHeader extends DeesElement { domtools.elementBasic.staticStyles, dedocumentSharedStyle, css` - :host { - color: #333; + .address { + position: absolute; + top: calc(var(--DPI-FACTOR) * 4.5); + left: var(--LEFT-MARGIN); + } + + .date { + position: absolute; + top: calc(var(--DPI-FACTOR) * 4.5); + right: var(--RIGHT-MARGIN); + text-align: right; } .recepientInfo { position: absolute; display: block; overflow: hidden; - top: 200px; - right: ${unsafeCSS(plugins.shared.rightMargin + 'px')}; + top: calc(var(--DPI-FACTOR) * 5.5); + right: var(--RIGHT-MARGIN); width: 200px; text-align: right; } + .recepientInfo .label { margin-top: 10px; margin-bottom: 3px; @@ -72,19 +90,6 @@ export class DeLetterHeader extends DeesElement { font-weight: bold; } - .date { - position: absolute; - top: 180px; - right: ${unsafeCSS(plugins.shared.rightMargin + 'px')}; - text-align: right; - } - - .address { - position: absolute; - top: 180px; - left: ${unsafeCSS(plugins.shared.leftMargin + 'px')}; - } - .address .from { font-size: 10px; } @@ -95,31 +100,97 @@ export class DeLetterHeader extends DeesElement { `, ]; + private renderDeliveryDate(from: Date, to: Date): TemplateResult { + if (this.letterData.type !== "invoice") return null; + const dateFormat = new Intl.DateTimeFormat( + this.documentSettings.languageCode, + { dateStyle: this.documentSettings.dateStyle } + ); + + let formattedFrom = from ? dateFormat.format(from) : null; + let formattedTo = to ? dateFormat.format(to) : null; + + const isSameDay = formattedFrom === formattedTo; + + if (isSameDay) { + return html`
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "letterhead@@periodOfPerformance.day" + )} +
+ ${formattedFrom} `; + } else { + return html`
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "letterhead@@periodOfPerformance.range" + )} +
+ ${formattedFrom} - ${formattedTo}`; + } + } + public render(): TemplateResult { return html`
- ${new Date(this.letterData.date).getDate()}. ${new Date(this.letterData.date).toLocaleString('default', { month: 'long' })} - ${new Date(this.letterData.date).getFullYear()} + ${new Intl.DateTimeFormat(this.documentSettings.languageCode, { + dateStyle: "long", + }).format(new Date(this.letterData.date))}
- ${this.letterData.from.name}, ${this.letterData.from.address.streetName} - ${this.letterData.from.address.houseNumber}, ${this.letterData.from.address.postalCode} - ${this.letterData.from.address.city}, ${this.letterData.from.address.country} + ${this.letterData.from.name}, + ${this.letterData.from.address.streetName} + ${this.letterData.from.address.houseNumber}, + ${this.letterData.from.address.postalCode} + ${this.letterData.from.address.city}, + ${this.letterData.from.address.country}
${this.letterData.to.name}
- ${this.letterData.to.address.streetName} ${this.letterData.to.address.houseNumber}
- ${this.letterData.to.address.postalCode} ${this.letterData.to.address.city}
+ ${this.letterData.to.address.streetName} + ${this.letterData.to.address.houseNumber}
+ ${this.letterData.to.address.postalCode} + ${this.letterData.to.address.city}
${this.letterData.from.address.country}
-
your customer id:
- ${this.letterData.to.customerNumber || 'not registered'} +
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "letterhead@@customer.number" + )} +
+ ${this.letterData.to.customerNumber || "not registered"} -
your vat id on file:
- ${this.letterData.to.vatId || 'not provided'} +
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "letterhead@@vat.yourId" + )} +
+ ${this.letterData.to.vatId || "not provided"} + + + ${this.letterData.type === "invoice" + ? html`
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "letterhead@@invoice.number" + )} +
+ ${this.letterData.content.invoiceData.id || "not registered"}` + : null} + ${this.renderDeliveryDate( + new Date( + this.letterData.content?.invoiceData?.periodOfPerformance?.from + ), + new Date( + this.letterData.content?.invoiceData?.periodOfPerformance?.to + ) + )}
`; } diff --git a/ts_web/elements/page.ts b/ts_web/elements/page.ts index c5d59b3..3d58a6e 100644 --- a/ts_web/elements/page.ts +++ b/ts_web/elements/page.ts @@ -1,4 +1,4 @@ -import * as tsclass from '@tsclass/tsclass'; +import * as tsclass from "@tsclass/tsclass"; import { DeesElement, property, @@ -6,24 +6,24 @@ import { customElement, type TemplateResult, css, - cssManager, - unsafeCSS, domtools, -} from '@design.estate/dees-element'; +} from "@design.estate/dees-element"; -import * as plugins from '../plugins.js'; +import * as plugins from "../plugins.js"; -import { defaultDocumentSettings } from './document.js'; +import { defaultDocumentSettings } from "./document.js"; +import { dedocumentSharedStyle } from "../style.js"; declare global { interface HTMLElementTagNameMap { - 'dedocument-page': DePage; + "dedocument-page": DePage; } } -@customElement('dedocument-page') +@customElement("dedocument-page") export class DePage extends DeesElement { - public static demo = () => html` `; + public static demo = () => + html` `; @property({ type: Number, @@ -38,7 +38,7 @@ export class DePage extends DeesElement { @property({ type: String, }) - public format: 'a4' = 'a4'; + public format: "a4" = "a4"; @property({ type: Number, @@ -65,7 +65,8 @@ export class DePage extends DeesElement { type: Object, reflect: true, }) - public documentSettings: plugins.shared.interfaces.IDocumentSettings = defaultDocumentSettings; + public documentSettings: plugins.shared.interfaces.IDocumentSettings = + defaultDocumentSettings; constructor() { super(); @@ -74,6 +75,7 @@ export class DePage extends DeesElement { public static styles = [ domtools.elementBasic.staticStyles, + dedocumentSharedStyle, css` :host { display: block; @@ -100,26 +102,75 @@ export class DePage extends DeesElement { align-items: center; } - .topInfo { - position: absolute; - top: 60px; - left: 40px; - color: red; - transform: rotate(-5deg); - } - .bigDraftText { transform: rotate(-45deg); font-size: 200px; opacity: 0.05; } + + .foldMark__wrapper { + z-index: 0; + } + + .foldMark { + position: absolute; + border-top: 1px solid #d3d3d3; + width: 10px; + left: 15px; + } + + .foldMark--start { + top: calc(var(--DPI-FACTOR) * 8.7); + } + + .foldMark--center { + top: calc(var(--DPI-FACTOR) * 14.85); + } + + .foldMark--end { + top: calc(var(--DPI-FACTOR) * 19.2); + } `, ]; public render(): TemplateResult { return html` +
+
${this.letterData ? html` ${this.documentSettings.enableDefaultHeader @@ -131,7 +182,18 @@ export class DePage extends DeesElement { .pageTotalNumber="${this.pageTotalNumber}" > ` - : ``} + : null} + + + ${this.documentSettings.enableFoldMarks === true + ? html`
+ + + +
` + : null} + + ${this.pageNumber === 1 ? html` ` - : html``} + : null} + + - ${this.documentSettings.enableDefaultFooter + + + ${this.documentSettings.enableDefaultFooter === true ? html` ` - : ``} + : null} +
- ${this.letterData.versionInfo.type === 'draft' + ${this.letterData.versionInfo.type === "draft" ? html` - ${this.documentSettings.enableTopDraftText - ? html` -
- Please note: THIS IS A DRAFT ONLY. NO RIGHTS CAN BE DERIVED FROM - THIS.
- -> Revision/Document version: ${this.letterData.versionInfo.version} -
- ` - : ``} -
DRAFT
+
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "overlay@@draft" + )} +
` - : html``} + : null}
` : html` `} @@ -184,33 +247,37 @@ export class DePage extends DeesElement { public async checkOverflow() { await this.elementDomReady; - const pageContent = this.shadowRoot.querySelector('dedocument-pagecontent'); + const pageContent = this.shadowRoot.querySelector("dedocument-pagecontent"); return pageContent.checkOverflow(); } updated(changedProperties: Map): void { super.updated(changedProperties); - if (changedProperties.has('viewHeight') || changedProperties.has('viewWidth')) { + if ( + changedProperties.has("viewHeight") || + changedProperties.has("viewWidth") + ) { this.adjustScaling(); } } private adjustScaling() { - const scaleWrapper: HTMLDivElement = this.shadowRoot.querySelector('#scaleWrapper'); + const scaleWrapper: HTMLDivElement = + this.shadowRoot.querySelector("#scaleWrapper"); if (!scaleWrapper) return; let scale = 1; if (this.viewHeight) { - scale = this.viewHeight / plugins.shared.a4Height; + scale = this.viewHeight / plugins.shared.A4_HEIGHT; } else if (this.viewWidth) { - scale = this.viewWidth / plugins.shared.a4Width; + scale = this.viewWidth / plugins.shared.A4_WIDTH; } scaleWrapper.style.transform = `scale(${scale})`; // Adjust the outer dimensions so they match the scaled content - this.style.width = `${plugins.shared.a4Width * scale}px`; - this.style.height = `${plugins.shared.a4Height * scale}px`; + this.style.width = `${plugins.shared.A4_WIDTH * scale}px`; + this.style.height = `${plugins.shared.A4_HEIGHT * scale}px`; } } diff --git a/ts_web/elements/pagecontainer.ts b/ts_web/elements/pagecontainer.ts index c49cc08..ce232c7 100644 --- a/ts_web/elements/pagecontainer.ts +++ b/ts_web/elements/pagecontainer.ts @@ -7,27 +7,27 @@ import { css, cssManager, unsafeCSS, -} from '@design.estate/dees-element'; -import * as domtools from '@design.estate/dees-domtools'; +} from "@design.estate/dees-element"; +import * as domtools from "@design.estate/dees-domtools"; -import * as plugins from '../plugins.js'; +import * as plugins from "../plugins.js"; declare global { interface HTMLElementTagNameMap { - 'dedocument-pagecontainer': DePageContainer; + "dedocument-pagecontainer": DePageContainer; } } -@customElement('dedocument-pagecontainer') +@customElement("dedocument-pagecontainer") export class DePageContainer extends DeesElement { public static demo = () => html` - + `; @property({ type: String, }) - public format: 'a4' = 'a4'; + public format: "a4" = "a4"; @property({ type: Boolean, @@ -44,11 +44,9 @@ export class DePageContainer extends DeesElement { css` :host { display: block; - background: white; - color: #333; padding: 0px; - width: ${unsafeCSS(plugins.shared.a4Width + 'px')}; - height: ${unsafeCSS(plugins.shared.a4Height + 'px')}; + width: ${unsafeCSS(plugins.shared.A4_WIDTH + "px")}; + height: ${unsafeCSS(plugins.shared.A4_HEIGHT + "px")}; position: relative; border-radius: 3px; overflow: hidden; @@ -60,7 +58,9 @@ export class DePageContainer extends DeesElement { return html` diff --git a/ts_web/elements/pagecontent.ts b/ts_web/elements/pagecontent.ts index 13f5de5..c9b9238 100644 --- a/ts_web/elements/pagecontent.ts +++ b/ts_web/elements/pagecontent.ts @@ -8,21 +8,21 @@ import { cssManager, unsafeCSS, domtools, -} from '@design.estate/dees-element'; +} from "@design.estate/dees-element"; -import * as plugins from '../plugins.js'; -import { dedocumentSharedStyle } from '../style.js'; +import * as plugins from "../plugins.js"; +import { dedocumentSharedStyle } from "../style.js"; declare global { interface HTMLElementTagNameMap { - 'dedocument-pagecontent': DePageContent; + "dedocument-pagecontent": DePageContent; } } -@customElement('dedocument-pagecontent') +@customElement("dedocument-pagecontent") export class DePageContent extends DeesElement { public static demo = () => html` - + `; @property({ @@ -40,6 +40,12 @@ export class DePageContent extends DeesElement { }) public pageTotalNumber: number = 1; + @property({ + type: Object, + reflect: true, + }) + public documentSettings: plugins.shared.interfaces.IDocumentSettings; + constructor() { super(); domtools.DomTools.setupDomTools(); @@ -49,19 +55,23 @@ export class DePageContent extends DeesElement { domtools.elementBasic.staticStyles, dedocumentSharedStyle, css` - :host { - color: #333; - } - .content { position: absolute; - left: ${unsafeCSS(plugins.shared.leftMargin + 'px')}; - right: ${unsafeCSS(plugins.shared.rightMargin + 'px')}; - bottom: 170px; + left: var(--LEFT-MARGIN); + right: var(--RIGHT-MARGIN); + bottom: calc(var(--DPI-FACTOR) * 4); overflow: visible; } + .content.page--first { + top: calc(var(--DPI-FACTOR) * 9.85); + } + + .content.page--notFirst { + top: calc(var(--DPI-FACTOR) * 4.5); + } + .content .subject { font-size: 18px; font-weight: bold; @@ -83,60 +93,31 @@ export class DePageContent extends DeesElement { margin-bottom: 10px; font-size: 10px; } - - .continuesOnNextPage { - display: inline-block; - background: #eeeeee; - color: #999; - border-radius: 50px; - padding: 5px 10px; - margin-top: 8px; - font-size: 10px; - } - - .finalPage { - display: inline-block; - background: #29b000; - color: #fff; - border-radius: 50px; - padding: 5px 10px; - margin-top: 8px; - font-size: 10px; - } `, ]; public render(): TemplateResult { + const firstPage = this.pageNumber === 1; return html` - -
- ${this.pageNumber === 1 +
+ ${firstPage ? html`
${this.letterData.subject}
` - : html` -
- ${this.letterData.subject} (Page ${this.pageNumber}) -
- `} + : null} - ${this.pageTotalNumber !== this.pageNumber - ? html`
Continues on page ${this.pageNumber + 1}
` - : html`
This is the final page of this document.
`}
`; } - public firstUpdated(_changedProperties: Map): void { + public firstUpdated( + _changedProperties: Map + ): void { super.firstUpdated(_changedProperties); this.checkOverflow(); } public async checkOverflow() { await this.elementDomReady; - const contentContainer = this.shadowRoot.querySelector('.content'); + const contentContainer = this.shadowRoot.querySelector(".content"); if (contentContainer.scrollHeight > contentContainer.clientHeight) { return true; } else { diff --git a/ts_web/elements/pagefooter.ts b/ts_web/elements/pagefooter.ts index a306b01..d6fe3ef 100644 --- a/ts_web/elements/pagefooter.ts +++ b/ts_web/elements/pagefooter.ts @@ -5,24 +5,23 @@ import { customElement, type TemplateResult, css, - cssManager, unsafeCSS, domtools, -} from '@design.estate/dees-element'; +} from "@design.estate/dees-element"; -import * as plugins from '../plugins.js'; -import { dedocumentSharedStyle } from '../style.js'; +import * as plugins from "../plugins.js"; +import { dedocumentSharedStyle } from "../style.js"; declare global { interface HTMLElementTagNameMap { - 'dedocument-pagefooter': DePageFooter; + "dedocument-pagefooter": DePageFooter; } } -@customElement('dedocument-pagefooter') +@customElement("dedocument-pagefooter") export class DePageFooter extends DeesElement { public static demo = () => html` - + `; @property({ @@ -37,12 +36,12 @@ export class DePageFooter extends DeesElement { documentSettings: plugins.shared.interfaces.IDocumentSettings; @property({ - type: Number + type: Number, }) public pageNumber: number = 1; @property({ - type: Number + type: Number, }) public pageTotalNumber: number = 1; @@ -67,32 +66,36 @@ export class DePageFooter extends DeesElement { left: 0px; right: 0px; height: 130px; - content: ''; - padding: 30px ${unsafeCSS(plugins.shared.rightMargin + 'px')} 10px ${unsafeCSS(plugins.shared.leftMargin + 'px')}; - grid-template-columns: calc(100% / 4) calc(100% / 4) calc(100% / 4) calc(100% / 4); + content: ""; + padding: 30px var(--RIGHT-MARGIN) 10px var(--LEFT-MARGIN); + grid-template-columns: calc(100% / 4) calc(100% / 4) calc(100% / 4) calc( + 100% / 4 + ); grid-gap: 5px; - border-top: 2px solid #e4002b; + border-top: 2px solid var(--footer-separator-bg-color, #e4002b); } .bottomstripe .pageNumber { position: absolute; top: 0px; - right: ${unsafeCSS(plugins.shared.rightMargin + 'px')}; - background: #e4002b; + right: var(--RIGHT-MARGIN); + color: var(--footer-separator-fg-color, #ffffff); + background: var(--footer-separator-bg-color, #e4002b); padding: 3px; font-size: 9px; color: #fff; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; } + .bottomstripe .documentTitle { position: absolute; - top: -18px; - right: ${unsafeCSS(plugins.shared.rightMargin + 'px')}; - background: #dddddd; + top: -19px; + right: var(--RIGHT-MARGIN); + color: var(--label-fg); + background: var(--label-bg); padding: 3px; font-size: 9px; - color: #333; border-top-left-radius: 3px; border-top-right-radius: 3px; } @@ -103,36 +106,110 @@ export class DePageFooter extends DeesElement { return html`
- ${plugins.shared.translation.translate(this.documentSettings.languageCode, 'address', 'Address')}:
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "footer@@address" + )}:
${this.letterData.from.name}
- ${this.letterData.from.address.streetName} ${this.letterData.from.address.houseNumber}
- ${this.letterData.from.address.postalCode} ${this.letterData.from.address.city}
+ ${this.letterData.from.address.streetName} + ${this.letterData.from.address.houseNumber}
+ ${this.letterData.from.address.postalCode} + ${this.letterData.from.address.city}
${this.letterData.from.address.country}
- ${plugins.shared.translation.translate(this.documentSettings.languageCode, 'registrationInfo', 'Registration Info')}:
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "footer@@registration.label" + )}:
Amtsgericht Bremen
reg-#: HRB 35230 HB
vat-id: ${this.letterData.from.vatId}
- ${plugins.shared.translation.translate(this.documentSettings.languageCode, 'contactInfo', 'Contact Info')}:
- email: ${this.letterData.from.email}
- phone: ${this.letterData.from.phone}
- fax: ${this.letterData.from.fax} + ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "contact@@title" + )}:
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "contact@@mail" + )}: + ${this.letterData.from.email}
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "contact@@phone" + )}: + ${this.letterData.from.phone}
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "contact@@fax" + )}: + ${this.letterData.from.fax}
- ${plugins.shared.translation.translate(this.documentSettings.languageCode, 'bankConnection', 'Bank Connection')}:
- beneficiary: ${this.letterData?.from?.name}
- institution: ${this.letterData?.from?.sepaConnection?.institution}
- iban: ${this.letterData?.from?.sepaConnection?.iban}
- bic: ${this.letterData?.from?.sepaConnection?.bic}
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "bankConnection@@title" + )}:
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "bankConnection@@bank.accountHolder" + )}: + ${this.letterData?.from?.name}
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "bankConnection@@bank.institution" + )}: + ${this.letterData?.from?.sepaConnection?.institution}
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "bankConnection@@bank.iban" + )}: + ${this.letterData?.from?.sepaConnection?.iban}
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "bankConnection@@bank.bic" + )}: + ${this.letterData?.from?.sepaConnection?.bic}
+
+
+ ${this.letterData?.subject} +
+
+ ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "footer@@page" + )} + ${this.pageNumber} + ${plugins.shared.translation.translate( + this.documentSettings.languageCode, + "footer@@pageOf" + )} + ${this.pageTotalNumber}
-
Subject: ${this.letterData?.subject}${(() => { - const uidString = html`/ Document-UID: ${html`https://uid.signature.digital/`}`; - return ``; - })()}
-
page ${this.pageNumber} of ${this.pageTotalNumber}
`; } diff --git a/ts_web/elements/pageheader.ts b/ts_web/elements/pageheader.ts index e637b55..9c20d0d 100644 --- a/ts_web/elements/pageheader.ts +++ b/ts_web/elements/pageheader.ts @@ -7,22 +7,22 @@ import { css, cssManager, unsafeCSS, - domtools -} from '@design.estate/dees-element'; + domtools, +} from "@design.estate/dees-element"; -import * as plugins from '../plugins.js'; -import { dedocumentSharedStyle } from '../style.js'; +import * as plugins from "../plugins.js"; +import { dedocumentSharedStyle } from "../style.js"; declare global { interface HTMLElementTagNameMap { - 'dedocument-pageheader': DePageHeader; + "dedocument-pageheader": DePageHeader; } } -@customElement('dedocument-pageheader') +@customElement("dedocument-pageheader") export class DePageHeader extends DeesElement { public static demo = () => html` - + `; @property({ @@ -75,7 +75,7 @@ export class DePageHeader extends DeesElement { overflow: hidden; top: 130px; left: auto; - right: ${unsafeCSS(plugins.shared.rightMargin + 'px')}; + right: var(--RIGHT-MARGIN); height: 20px; line-height: 20px; color: #333; @@ -86,8 +86,8 @@ export class DePageHeader extends DeesElement { bottom: 10px; height: 25px; left: auto; - right: ${unsafeCSS(plugins.shared.rightMargin + 'px')}; - font-family: 'Courier New', Courier, monospace; + right: var(--RIGHT-MARGIN); + font-family: "Courier New", Courier, monospace; } .topstripe .logo img { position: relative; @@ -100,10 +100,16 @@ export class DePageHeader extends DeesElement { return html`
-
${this.letterData?.from?.description || '[no letterData.from.description set]'}
+
+ ${this.letterData?.from?.description || + "[no letterData.from.description set]"} +
`; } } diff --git a/ts_web/elements/paymentcode.ts b/ts_web/elements/paymentcode.ts new file mode 100644 index 0000000..7858cb1 --- /dev/null +++ b/ts_web/elements/paymentcode.ts @@ -0,0 +1,95 @@ +import { + css, + customElement, + DeesElement, + html, + property, + query, + type TemplateResult, +} from "@design.estate/dees-element"; +import * as plugins from "../plugins.js"; + +declare global { + interface HTMLElementTagNameMap { + "dedocument-paymentcode": DedocumentPaymentCode; + } +} + +@customElement("dedocument-paymentcode") +export class DedocumentPaymentCode extends DeesElement { + public static styles = [ + css` + :host { + text-align: center; + width: 100px; + height: 100px; + } + + canvas { + width: inherit !important; + height: inherit !important; + } + `, + ]; + + @query("canvas") + private canvasEl!: HTMLCanvasElement; + + @property() + public bic: string; + + @property() + public name: string; + + @property() + public iban: string; + + @property() + public currency: string; + + @property({ type: Number }) + public totalGross: number; + + @property() + public reference: string; + + private updateQRCode(): void { + if (!this.canvasEl) return; + + plugins.qrcode.toCanvas( + this.canvasEl, + `BCD +001 +1 +SCT +${this.bic} +${this.name} +${this.iban} +${this.currency}${this.totalGross?.toFixed?.(2)} + +${this.reference}`, + (error) => { + if (error) console.error(error); + } + ); + } + + public override update( + changedProperties: Parameters[0] + ): void { + super.update(changedProperties); + this.updateQRCode(); + } + + public render(): TemplateResult { + const allDataAvailable = + typeof this.bic === "string" && + typeof this.name === "string" && + typeof this.iban === "string" && + typeof this.currency === "string" && + typeof this.totalGross === "number" && + typeof this.reference === "string"; + + return allDataAvailable ? html`` : null; + } +} diff --git a/ts_web/elements/viewer.demo.ts b/ts_web/elements/viewer.demo.ts index 3876310..42bfeeb 100644 --- a/ts_web/elements/viewer.demo.ts +++ b/ts_web/elements/viewer.demo.ts @@ -1,6 +1,9 @@ -import { html } from '@design.estate/dees-element'; -import * as plugins from '../plugins.js'; +import { html } from "@design.estate/dees-element"; +import * as plugins from "../plugins.js"; export const demoFunc = () => html` - -`; \ No newline at end of file + +`; diff --git a/ts_web/elements/viewer.ts b/ts_web/elements/viewer.ts index a93317f..34c8d02 100644 --- a/ts_web/elements/viewer.ts +++ b/ts_web/elements/viewer.ts @@ -1,15 +1,22 @@ -import * as plugins from '../plugins.js'; +import * as plugins from "../plugins.js"; -import { DeesElement, css, cssManager, customElement, html, property } from '@design.estate/dees-element'; -import { demoFunc } from './viewer.demo.js'; +import { + DeesElement, + css, + cssManager, + customElement, + html, + property, +} from "@design.estate/dees-element"; +import { demoFunc } from "./viewer.demo.js"; declare global { interface HTMLElementTagNameMap { - 'dedocument-viewer': DeDocumentViewer; + "dedocument-viewer": DeDocumentViewer; } } -@customElement('dedocument-viewer') +@customElement("dedocument-viewer") export class DeDocumentViewer extends DeesElement { // DEMO public static demo = demoFunc; @@ -34,7 +41,7 @@ export class DeDocumentViewer extends DeesElement { position: relative; height: 100%; width: 100%; - background: ${cssManager.bdTheme('#eeeeeb', '#111')}; + background: ${cssManager.bdTheme("#eeeeeb", "#111")}; } .controls { top: 0px; @@ -43,7 +50,7 @@ export class DeDocumentViewer extends DeesElement { position: absolute; height: 32px; width: 100%; - background: ${cssManager.bdTheme('#eeeeeb', '#111111ee')}; + background: ${cssManager.bdTheme("#eeeeeb", "#111111ee")}; box-shadow: 0px 2px 8px 0px #000000; } .controlsShadow { @@ -77,7 +84,12 @@ export class DeDocumentViewer extends DeesElement {
${this.letterData - ? html` ` + ? html` + + ` : html``}
@@ -85,9 +97,11 @@ export class DeDocumentViewer extends DeesElement { `; }; - public updated = (changedProperties: Map) => { + public updated = ( + changedProperties: Map + ) => { super.updated(changedProperties); - if (changedProperties.has('letterData')) { + if (changedProperties.has("letterData")) { } }; } diff --git a/ts_web/style.ts b/ts_web/style.ts index b2eba4a..ba22f58 100644 --- a/ts_web/style.ts +++ b/ts_web/style.ts @@ -1,7 +1,39 @@ -import { css } from '@design.estate/dees-element'; +import { css } from "@design.estate/dees-element"; +import * as plugins from "./plugins.js"; export const dedocumentSharedStyle = css` :host { - font-family: 'Exo 2'; + /* Primitive colors */ + --color-light: #ffffff; + --color-dark: #333333; + --color-grey: #dddddd; + --color-grey-100: #dddddd; + --color-red: #e4002b; + + /* Semantic colors */ + --color-primary-fg: var(--theme-color-primary-fg, var(--color-dark)); + --color-primary-bg: var(--theme-color-primary-bg, var(--color-light)); + --color-accent-fg: var(--theme-color-accent-fg, var(--color-light)); + --color-accent-bg: var(--theme-color-accent-bg, var(--color-red)); + + /* Functional colors */ + --text-fg-color: var(--color-primary-fg); + --text-bg-color: var(--color-primary-bg); + --label-fg: var(--color-dark); + --label-bg: var(--color-grey); + --footer-separator-bg-color: var(--color-accent); + --footer-separator-fg-color: var(--color-light); + + /* Functional variables */ + --DPI-FACTOR: ${plugins.shared.cmToPx(1)}px; + --RIGHT-MARGIN: ${plugins.shared.cmToPx(2)}px; + --LEFT-MARGIN: ${plugins.shared.cmToPx(2)}px; + --text-font-family: var(--theme-text-font-family, "Exo 2"); + --text-font-size: var(--theme-text-font-size, 12px); + + color: var(--text-fg-color); + background: var(--text-bg-color); + font-family: var(--text-font-family); + font-size: var(--text-font-size); } -`; \ No newline at end of file +`;