diff --git a/package-lock.json b/package-lock.json index 05489e1..45d290f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,6 +69,19 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, "node_modules/@astrojs/compiler": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.12.2.tgz", @@ -1078,6 +1091,116 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", + "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@ctrl/tinycolor": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", @@ -4740,11 +4863,12 @@ } }, "node_modules/canvascreator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/canvascreator/-/canvascreator-1.1.1.tgz", - "integrity": "sha512-nFXK8n19+0+a5DoNJzYjEChLfMjhTjK9+cXwvUyg6Jc0mEQQFmSBqAVaBJEyvl+ssryZEZPJ9jlW2wk3gluCuA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/canvascreator/-/canvascreator-1.1.3.tgz", + "integrity": "sha512-4SJEl3uW3/zxDzxCJX6Ncxo8lpRl5l/Zi7CnS6AOB91sPsEy+yUuc2FtIMDLznIMBpIhYkxB9OnP15dn8knEIg==", "license": "Apache-2.0", "dependencies": { + "jsdom": "^26.1.0", "pdfkit": "^0.17.1", "svg-to-pdfkit": "^0.1.8" }, @@ -5185,6 +5309,66 @@ "node": ">=4" } }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -5202,6 +5386,12 @@ } } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/decode-named-character-reference": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", @@ -6571,6 +6761,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/html-entities": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", @@ -6960,6 +7162,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -7035,6 +7243,92 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/json-autotranslate": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/json-autotranslate/-/json-autotranslate-1.16.1.tgz", @@ -9302,6 +9596,12 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nwsapi": { + "version": "2.2.21", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", + "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==", + "license": "MIT" + }, "node_modules/object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", @@ -9747,6 +10047,15 @@ "node": ">=12.0.0" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/quansync": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", @@ -10242,6 +10551,12 @@ "fsevents": "~2.3.2" } }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "license": "MIT" + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -10301,6 +10616,18 @@ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "license": "ISC" }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -10693,6 +11020,12 @@ "pdfkit": ">=0.8.1" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, "node_modules/tailwindcss": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", @@ -10800,6 +11133,24 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "license": "MIT" + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -10812,6 +11163,18 @@ "node": ">=0.6.0" } }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -11428,6 +11791,18 @@ } } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/web-namespaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", @@ -11450,6 +11825,39 @@ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "license": "MIT" }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -12122,7 +12530,6 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -12140,6 +12547,21 @@ } } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, "node_modules/xxhash-wasm": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", diff --git a/public/canvascreator/canvascreator.esm.min.js b/public/canvascreator/canvascreator.esm.min.js new file mode 100644 index 0000000..b2a7279 --- /dev/null +++ b/public/canvascreator/canvascreator.esm.min.js @@ -0,0 +1 @@ +function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t,i,s,n,o={exports:{}};function a(){if(i)return t;i=1;return t={width:1e3,height:712,headerHeight:80,footerHeight:30,fontSize:12,fontFamily:"Arial, sans-serif",backgroundColor:"#f5f5ff",borderColor:"#1a3987",fontColor:"#1a3987",contentFontColor:"#333",highlightColor:"#d7e3fe",sectionColor:"#ffffff",padding:10,cornerRadius:10,circleRadius:14,lineSize:1,shadowColor:"rgba(0, 0, 0, 0.2)",stickyNoteSize:80,stickyNoteSpacing:10,stickyNoteCornerRadius:3,maxLineWidth:70,stickyNoteColor:"#fff399",stickyNoteBorderColor:"#000",defaultLocale:"en-US"}}function r(){if(n)return s;n=1;const e=a();return s={sanitizeInput:function(e){let t=e.replace(/)<[^<]*)*<\/script>/gi,"");return t=t.replace(/\s+on[a-z]+=("[^"]*"|'[^']*'|[^\s>]+)/gi,""),t},validateInput:function(e){return e.length>200?e.substring(0,200):e},distributeMissingPositions:function(t,i,s=e){const n=Math.floor((s.width-i.layout.columns*s.padding)/i.layout.columns),o=Math.floor((s.height-s.headerHeight-s.footerHeight-4*s.padding)/i.layout.rows);t.sections.forEach(e=>{const t=i.sections.find(t=>t.id===e.sectionId);if(!t)return;const a=e.stickyNotes.filter(e=>!e.position||void 0===e.position.x||void 0===e.position.y);if(0===a.length)return;const r=t.gridPosition.column*n+2*s.padding,c=t.gridPosition.row*o+s.headerHeight,d=t.gridPosition.colSpan*n,l=t.gridPosition.rowSpan*o,u=s.stickyNoteSize,p=Math.max(1,Math.floor(d/(u+s.stickyNoteSpacing))),m=Math.min(a.length,p),h=Math.ceil(a.length/m),g=Math.max(0,(d-m*u)/(m+1)),v=Math.max(0,(l-h*u)/(h+1));a.forEach((e,t)=>{const i=t%m,s=Math.floor(t/m);e.position={x:r+g+i*(u+g),y:c+v+s*(u+v)}})})}},s}var c,d,l,u={apiBusinessModelCanvas:{id:"apiBusinessModelCanvas",layout:{columns:5,rows:3},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Alexander Osterwalder","Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"keyPartners",gridPosition:{column:0,row:0,colSpan:1,rowSpan:2},fillOrder:7},{id:"keyActivities",gridPosition:{column:1,row:0,colSpan:1,rowSpan:1},fillOrder:6},{id:"keyResources",gridPosition:{column:1,row:1,colSpan:1,rowSpan:1},fillOrder:5},{id:"apiValueProposition",gridPosition:{column:2,row:0,colSpan:1,rowSpan:2},fillOrder:1,highlight:!0},{id:"developerRelations",gridPosition:{column:3,row:0,colSpan:1,rowSpan:1},fillOrder:3},{id:"channels",gridPosition:{column:3,row:1,colSpan:1,rowSpan:1},fillOrder:4},{id:"apiConsumerSegments",gridPosition:{column:4,row:0,colSpan:1,rowSpan:2},fillOrder:2},{id:"costs",gridPosition:{column:0,row:2,colSpan:2.5,rowSpan:1},fillOrder:9},{id:"benefits",gridPosition:{column:2.5,row:2,colSpan:2.5,rowSpan:1},fillOrder:8}]},apiValuePropositionCanvas:{id:"apiValuePropositionCanvas",layout:{columns:4,rows:3},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Alexander Osterwalder","Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"tasks",gridPosition:{column:0,row:0,colSpan:4,rowSpan:1},fillOrder:1,highlight:!0,journeySteps:!0},{id:"gainEnablingFeatures",gridPosition:{column:0,row:1,colSpan:2,rowSpan:1},fillOrder:2},{id:"painRelievingFeatures",gridPosition:{column:2,row:1,colSpan:2,rowSpan:1},fillOrder:3},{id:"apiProducts",gridPosition:{column:0,row:2,colSpan:4,rowSpan:1},fillOrder:4}]},businessImpactCanvas:{id:"businessImpactCanvas",layout:{columns:3,rows:2},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"availabilityRisks",gridPosition:{column:0,row:0,colSpan:1,rowSpan:1},fillOrder:1,highlight:!0},{id:"securityRisks",gridPosition:{column:1,row:0,colSpan:1,rowSpan:1},fillOrder:3,highlight:!0},{id:"dataRisks",gridPosition:{column:2,row:0,colSpan:1,rowSpan:1},fillOrder:5,highlight:!0},{id:"mitigateAvailabilityRisks",gridPosition:{column:0,row:1,colSpan:1,rowSpan:1},fillOrder:2},{id:"mitigateSecurityRisks",gridPosition:{column:1,row:1,colSpan:1,rowSpan:1},fillOrder:4},{id:"mitigateDataRisks",gridPosition:{column:2,row:1,colSpan:1,rowSpan:1},fillOrder:6}]},capacityCanvas:{id:"capacityCanvas",layout:{columns:3,rows:3},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"currentBusinessVolumes",gridPosition:{column:0,row:0,colSpan:1,rowSpan:1},fillOrder:1,highlight:!0},{id:"futureConsumptionTrends",gridPosition:{column:1,row:0,colSpan:2,rowSpan:1},fillOrder:2},{id:"peakLoadAndAvailabilityRequirements",gridPosition:{column:0,row:1,colSpan:3,rowSpan:1},fillOrder:3},{id:"cachingStrategies",gridPosition:{column:0,row:2,colSpan:1,rowSpan:1},fillOrder:4},{id:"rateLimitingStrategies",gridPosition:{column:1,row:2,colSpan:1,rowSpan:1},fillOrder:5},{id:"scalingStrategies",gridPosition:{column:2,row:2,colSpan:1,rowSpan:1},fillOrder:6}]},customerJourneyCanvas:{id:"customerJourneyCanvas",layout:{columns:5,rows:4},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"customerDiscoversNeed",gridPosition:{column:0,row:0,colSpan:1,rowSpan:1},fillOrder:2},{id:"persona",gridPosition:{column:1,row:0,colSpan:3,rowSpan:1},fillOrder:1,highlight:!0},{id:"pains",gridPosition:{column:0,row:1,colSpan:1,rowSpan:2},fillOrder:5},{id:"journeySteps",gridPosition:{column:1,row:1,colSpan:3,rowSpan:2},fillOrder:4,journeySteps:!0},{id:"customerNeedIsResolved",gridPosition:{column:4,row:0,colSpan:1,rowSpan:1},fillOrder:3},{id:"gains",gridPosition:{column:4,row:1,colSpan:1,rowSpan:2},fillOrder:6},{id:"inputsOutputs",gridPosition:{column:.5,row:3,colSpan:2,rowSpan:1},fillOrder:7},{id:"interactionProcessingRules",gridPosition:{column:2.5,row:3,colSpan:2,rowSpan:1},fillOrder:8}]},domainCanvas:{id:"domainCanvas",layout:{columns:2,rows:4},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"selectedCustomerJourneySteps",gridPosition:{column:0,row:0,colSpan:2,rowSpan:1},fillOrder:1,highlight:!0,journeySteps:!0},{id:"coreEntitiesAndBusinessMeaning",gridPosition:{column:0,row:1,colSpan:1,rowSpan:1},fillOrder:2},{id:"attributesAndBusinessImportance",gridPosition:{column:1,row:1,colSpan:1,rowSpan:2},fillOrder:3},{id:"relationshipsBetweenEntities",gridPosition:{column:0,row:2,colSpan:1,rowSpan:1},fillOrder:4},{id:"businessComplianceAndIntegrityRules",gridPosition:{column:0,row:3,colSpan:1,rowSpan:1},fillOrder:5},{id:"securityAndPrivacyConsiderations",gridPosition:{column:1,row:3,colSpan:1,rowSpan:1},fillOrder:6}]},eventCanvas:{id:"eventCanvas",layout:{columns:4,rows:3},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"userTaskTrigger",gridPosition:{column:0,row:0,colSpan:1,rowSpan:1},fillOrder:1,highlight:!0},{id:"inputEventPayload",gridPosition:{column:0,row:1,colSpan:1,rowSpan:2},fillOrder:2},{id:"processingLogic",gridPosition:{column:1,row:1,colSpan:2,rowSpan:2},fillOrder:3},{id:"outputEventResult",gridPosition:{column:3,row:1,colSpan:1,rowSpan:2},fillOrder:4}]},interactionCanvas:{id:"interactionCanvas",layout:{columns:4,rows:3},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"crudInteractions",gridPosition:{column:0,row:0,colSpan:1,rowSpan:1},fillOrder:1,highlight:!0},{id:"crudInputOutputModels",gridPosition:{column:0,row:1,colSpan:1,rowSpan:1},fillOrder:2},{id:"crudProcessingValidation",gridPosition:{column:0,row:2,colSpan:1,rowSpan:1},fillOrder:3},{id:"queryDrivenInteractions",gridPosition:{column:1,row:0,colSpan:1,rowSpan:1},fillOrder:4,highlight:!0},{id:"queryDrivenInputOutputModels",gridPosition:{column:1,row:1,colSpan:1,rowSpan:1},fillOrder:5},{id:"queryDrivenProcessingValidation",gridPosition:{column:1,row:2,colSpan:1,rowSpan:1},fillOrder:6},{id:"commandDrivenInteractions",gridPosition:{column:2,row:0,colSpan:1,rowSpan:1},fillOrder:7,highlight:!0},{id:"commandDrivenInputOutputModels",gridPosition:{column:2,row:1,colSpan:1,rowSpan:1},fillOrder:8},{id:"commandDrivenProcessingValidation",gridPosition:{column:2,row:2,colSpan:1,rowSpan:1},fillOrder:9},{id:"eventDrivenInteractions",gridPosition:{column:3,row:0,colSpan:1,rowSpan:1},fillOrder:10,highlight:!0},{id:"eventDrivenInputOutputModels",gridPosition:{column:3,row:1,colSpan:1,rowSpan:1},fillOrder:11},{id:"eventDrivenProcessingValidation",gridPosition:{column:3,row:2,colSpan:1,rowSpan:1},fillOrder:12}]},locationsCanvas:{id:"locationsCanvas",layout:{columns:4,rows:2},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"locationGroups",gridPosition:{column:0,row:0,colSpan:1,rowSpan:1},fillOrder:1,highlight:!0},{id:"locationGroupCharacteristics",gridPosition:{column:0,row:1,colSpan:1,rowSpan:1},fillOrder:2},{id:"locations",gridPosition:{column:1,row:0,colSpan:1,rowSpan:1},fillOrder:3,highlight:!0},{id:"locationCharacteristics",gridPosition:{column:1,row:1,colSpan:1,rowSpan:1},fillOrder:4},{id:"locationDistances",gridPosition:{column:2,row:0,colSpan:1,rowSpan:1},fillOrder:5},{id:"locationDistanceCharacteristics",gridPosition:{column:2,row:1,colSpan:1,rowSpan:1},fillOrder:6},{id:"locationEndpoints",gridPosition:{column:3,row:0,colSpan:1,rowSpan:1},fillOrder:7},{id:"locationEndpointCharacteristics",gridPosition:{column:3,row:1,colSpan:1,rowSpan:1},fillOrder:8}]},restCanvas:{id:"restCanvas",layout:{columns:4,rows:3},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"apiResources",gridPosition:{column:0,row:0,colSpan:1,rowSpan:1},fillOrder:1,highlight:!0},{id:"apiResourceModel",gridPosition:{column:0,row:1,colSpan:1,rowSpan:2},fillOrder:2},{id:"apiVerbs",gridPosition:{column:1,row:0,colSpan:1,rowSpan:1},fillOrder:3,highlight:!0},{id:"apiVerbExample",gridPosition:{column:1,row:1,colSpan:3,rowSpan:2},fillOrder:4}]},graphqlCanvas:{id:"graphqlCanvas",layout:{columns:4,rows:3},metadata:{source:"APIOps Cycles",license:"CC-BY-SA 4.0",authors:["Osaango Ltd"],website:"www.apiopscycles.com"},sections:[{id:"apiName",gridPosition:{column:0,row:0,colSpan:2,rowSpan:1},fillOrder:1},{id:"consumerGoals",gridPosition:{column:2,row:0,colSpan:2,rowSpan:1},fillOrder:2},{id:"keyTypes",gridPosition:{column:0,row:1,colSpan:1,rowSpan:1},fillOrder:3},{id:"relationships",gridPosition:{column:1,row:1,colSpan:1,rowSpan:1},fillOrder:4},{id:"queries",gridPosition:{column:2,row:1,colSpan:1,rowSpan:1},fillOrder:5},{id:"mutations",gridPosition:{column:3,row:1,colSpan:1,rowSpan:1},fillOrder:6},{id:"subscriptions",gridPosition:{column:0,row:2,colSpan:1,rowSpan:1},fillOrder:7},{id:"authorizationRules",gridPosition:{column:1,row:2,colSpan:1,rowSpan:1},fillOrder:8},{id:"consumerConstraints",gridPosition:{column:2,row:2,colSpan:1,rowSpan:1},fillOrder:9},{id:"openQuestions",gridPosition:{column:3,row:2,colSpan:1,rowSpan:1},fillOrder:10}]}},p={"de-DE":{apiBusinessModelCanvas:{title:"API Business Model Canvas",purpose:"Wie praktikabel und wiederverwendbar wird diese API sein? Haben wir einen Business Case aus Kosten-Nutzen-Sicht?",howToUse:"Fassen Sie das Wertversprechen einer API aus dem API Value Proposition Canvas zusammen und folgen Sie dann der nummerierten Reihenfolge.",sections:{keyPartners:{section:"Schlüsselpartner",description:"Wer sind die wichtigsten beteiligten Stakeholder?"},keyActivities:{section:"Schlüsselaktivitäten",description:"Was sind die wichtigsten Maßnahmen, die der API-Anbieter ergreifen muss, um erfolgreich zu arbeiten?"},keyResources:{section:"Schlüsselressourcen",description:"Welche einzigartigen strategischen Vermögenswerte muss der API-Anbieter erwerben oder aufbauen?"},apiValueProposition:{section:"Wertversprechen der API",description:"Welchen Wert bietet die API den API-Konsumenten?"},developerRelations:{section:"Entwicklerbeziehungen",description:"Wie erreicht und unterstützt der API-Anbieter API-Konsumenten?"},channels:{section:"Kanäle",description:"Über welche Mechanismen interagieren API-Konsumenten mit der API?"},apiConsumerSegments:{section:"Konsumenten der API",description:"Wer sind die Zielgruppen für die API?"},costs:{section:"Kosten",description:"Was sind die wesentlichen Kosten für die Erstellung, Bereitstellung und den Betrieb der API?"},benefits:{section:"Vorteile",description:"Was sind die wesentlichen Vorteile oder Einnahmequellen, die durch die API generiert werden?"}}},apiValuePropositionCanvas:{title:"API Value Proposition Canvas",purpose:"Berücksichtigt diese API die Aufgaben, Probleme (Pains) und Bedürfnisse (Gains) der API-Konsumenten?",howToUse:"Beschreiben Sie die Sichtweise des API-Konsumenten, beginnend mit seinen Aufgaben, dann seine Pains und Gains, und schließlich die API-Produkte und -Features.",sections:{tasks:{section:"Aufgaben",description:"Was wollen die API-Konsumenten erreichen?"},gainEnablingFeatures:{section:"Nutzenstiftende Features",description:"Welche Features ermöglichen es API-Konsumenten ihre Bedürfnisse zu bedienen?"},painRelievingFeatures:{section:"Problemlösende Features",description:"Welche Features ermöglichen es API-Konsumenten ihre Probleme zu überwinden?"},apiProducts:{section:"API-Produkte",description:"Welche API-Produkte und -Features eigenen sich für diese Aufgaben, Probleme und Bedürfnisse?"}}},businessImpactCanvas:{title:"Business Impact Canvas",purpose:"Was sind die potenziellen geschäftlichen Auswirkungen eines Ausfalls einer API?",howToUse:"Berücksichtigen Sie die potenziellen Auswirkungen auf Verfügbarkeit, Sicherheit und Daten für jede API.",sections:{availabilityRisks:{section:"Risiken der Verfügbarkeit",description:"Was sind die potenziellen Risiken für die API-Verfügbarkeit?"},securityRisks:{section:"Sicherheitsrisiken",description:"Welche potenziellen Sicherheitsrisiken sind mit der API assoziiert?"},dataRisks:{section:"Datenrisiken",description:"Welche potenziellen Risiken bestehen für die Datenintegrität oder -Vertraulichkeit?"},mitigateAvailabilityRisks:{section:"Reduzierung von Risiken der Verfügbarkeit",description:"Wie kann der API-Anbieter die Risiken der Verfügbarkeit reduzieren?"},mitigateSecurityRisks:{section:"Reduktion der Sicherheitsrisiken",description:"Wie kann der API-Anbieter die Sicherheitsrisiken reduzieren?"},mitigateDataRisks:{section:"Reduktion der Datenrisiken",description:"Wie kann der API-Anbieter die Datenrisiken reduzieren?"}}},capacityCanvas:{title:"Capacity Canvas",purpose:"Welche Anforderungen ergeben sich, um den Konsum der API zu gewährleisten?",howToUse:"Analysieren Sie die aktuellen und zukünftigen Kapazitätsanforderungen für jede API.",sections:{currentBusinessVolumes:{section:"Aktuelles Geschäftsvolumen",description:"Wie hoch sind das aktuelle Geschäftsvolumen und die Transaktionsraten?"},futureConsumptionTrends:{section:"Zukünftige Konsumtrends",description:"Was sind die erwarteten künftigen Konsumtrends?"},peakLoadAndAvailabilityRequirements:{section:"Spitzenlast- und Verfügbarkeitsanforderungen",description:"Was sind die Spitzenlast- und Verfügbarkeitsanforderungen?"},cachingStrategies:{section:"Caching-Strategien",description:"Welche Caching-Strategien können zur Performanceoptimierung eingesetzt werden?"},rateLimitingStrategies:{section:"Rate-Limiting-Strategien",description:"Welche Rate-Limiting-Strategien können zur Konsumsteuerung eingesetzt werden?"},scalingStrategies:{section:"Strategien zur Skalierung",description:"Welche Strategien zur Skalierung können eingesetzt werden, um das Wachstum zu unterstützen?"}}},customerJourneyCanvas:{title:"Customer Journey Canvas",purpose:"Welche Reise eines Kunden oder Partners soll mit der API unterstützt werden?",howToUse:"Beschreiben Sie eine reale Reise eines Kunden oder Nutzers – nicht die API-Nutzung selbst. Diese Reise macht Probleme, Ziele und Kontexte sichtbar, um spätere API-Anforderungen und Nutzen zu definieren.",sections:{customerDiscoversNeed:{section:"Kunde erkennt Bedarf",description:"Wie erkennt der Kunde oder Nutzer ein Bedürfnis oder Problem?"},persona:{section:"Persona",description:"Wer ist der typische Kunde oder Nutzer, der diese Reise erlebt?"},pains:{section:"Probleme",description:"Was sind die Probleme oder Herausforderungen des Kunden?"},journeySteps:{section:"Customer Journey Schritte",description:"Welche Schritte durchläuft der Kunde bei der Nutzung der API?"},customerNeedIsResolved:{section:"Kundenbedürfnis wird gelöst",description:"Wie wird das Bedürfnis des Kunden letztendlich gelöst?"},gains:{section:"Nutzen",description:"Welchen Gewinn oder Nutzen hat der Kunde?"},inputsOutputs:{section:"Inputs & Outputs",description:"Was sind die Inputs und Outputs bei jedem Schritt?"},interactionProcessingRules:{section:"Interaktions- und Verarbeitungsregeln",description:"Wie lauten die Interaktions- und Verarbeitungsregeln bei jedem Schritt?"}}},domainCanvas:{title:"Domain Canvas",purpose:"Was sind die wesentlichen Entitäten und Geschäftsregeln im Zusammenhang mit der API?",howToUse:"Definieren Sie das Domänenmodell für jede API, einschließlich Entitäten, Attribute und Beziehungen.",sections:{selectedCustomerJourneySteps:{section:"Ausgewählte Customer Journey Schritte",description:"Welche Customer Journey Schritte sind für diese Domäne relevant?"},coreEntitiesAndBusinessMeaning:{section:"Grundlegende Entitäten & geschäftliche Bedeutung",description:"Welches sind die wesentlichen Entitäten und ihre Bedeutung für das Geschäft?"},attributesAndBusinessImportance:{section:"Attribute & geschäftliche Wichtigkeit",description:"Welches sind die Schlüsselattribute der einzelnen Entitäten und ihre geschäftliche Wichtigkeit?"},relationshipsBetweenEntities:{section:"Beziehungen zwischen Entitäten",description:"Welche Beziehungen bestehen zwischen den Entitäten?"},businessComplianceAndIntegrityRules:{section:"Geschäfts-, Compliance- und Integritätsregeln",description:"Welche Geschäfts-, Compliance- und Integritätsregeln gelten für die Entitäten?"},securityAndPrivacyConsiderations:{section:"Überlegungen zu Sicherheit und Datenschutz",description:"Welche Überlegungen zur Sicherheit und zum Datenschutz gibt es im Zusammenhang mit den Entitäten?"}}},eventCanvas:{title:"Event Canvas",purpose:"Welche Events sind für die API relevant, und wie werden sie verarbeitet?",howToUse:"Definieren Sie die Events, ihre Trigger und die Verarbeitungslogik für jede API.",sections:{userTaskTrigger:{section:"Nutzeraufgabe / Trigger",description:"Welche Nutzeraktion oder welches System-Event löst diese Eventoperation aus?"},inputEventPayload:{section:"Input / Event-Payload",description:"Welche Daten sind in der eingehenden Event-Payload enthalten? Geben Sie die Schlüsselattribute an."},processingLogic:{section:"Verarbeitung / Logik",description:"Beschreiben Sie die Backend-Verarbeitungslogik, inklusive Validierungen, Transformationen, oder Routing-Entscheidungen."},outputEventResult:{section:"Output / Event-Ergebnis",description:"Welches Event oder welche Bestätigungsmeldung wird erzeugt? Geben Sie die Attribute des Output-Payloads an."}}},interactionCanvas:{title:"Interaction Canvas",purpose:"Welche verschiedenen Interaktionsarten werden von der API unterstützt?",howToUse:"Definieren Sie die CRUD-, abfrage-, befehlsgesteuerten und eventgesteuerten Interaktionen für jede API.",sections:{crudInteractions:{section:"CRUD Interaktionen",description:"Welche CRUD-Interaktionen (Create, Read, Update, Delete) werden von der API unterstützt?"},crudInputOutputModels:{section:"CRUD Input- & Output-Modelle",description:"Was sind die Input- und Output-Modelle für die CRUD-Interaktionen?"},crudProcessingValidation:{section:"CRUD Verarbeitung & Validierung",description:"Wie sehen die Verarbeitungs- und Validierungsregeln für die CRUD-Interaktionen aus?"},queryDrivenInteractions:{section:"Abfragegesteuerte Interaktionen",description:"Welche abfragegesteuerten Interaktionen werden von der API unterstützt?"},queryDrivenInputOutputModels:{section:"Abfragegesteuerte Input- & Output-Modelle",description:"Was sind die Input- und Output-Modelle für die abfragegesteuerten Interaktionen"},queryDrivenProcessingValidation:{section:"Abfragegesteuerte Verarbeitung & Validierung",description:"Wie sehen die Verarbeitungs- und Validierungsregeln für die abfragegesteuerten Interaktionen aus?"},commandDrivenInteractions:{section:"Befehlsgesteuerte Interaktionen",description:"Welche befehlsgesteuerten Interaktionen werden von der API unterstützt?"},commandDrivenInputOutputModels:{section:"Befehlsgesteuerte Input- & Output-Modelle",description:"Was sind die Input- und Output-Modelle für die befehlsgesteuerten Interaktionen?"},commandDrivenProcessingValidation:{section:"Befehlsgesteuerte Verarbeitung & Validierung",description:"Wie sehen die Verarbeitungs- und Validierungsregeln für die befehlsgesteuerten Interaktionen aus?"},eventDrivenInteractions:{section:"Eventgesteuerte Interaktionen",description:"Welche eventgesteuerten Interaktionen werden von der API unterstützt?"},eventDrivenInputOutputModels:{section:"Eventgesteuerte Input- & Output-Modelle",description:"Was sind die Input- und Output-Modelle für die eventgesteuerten Interaktionen?"},eventDrivenProcessingValidation:{section:"Eventgesteuerte Verarbeitung & Validierung",description:"Wie sehen die Verarbeitungs- und Validierungsregeln für die eventgesteuerten Interaktionen aus?"}}},locationsCanvas:{title:"Location Canvas",purpose:"Was sind die relevanten Standorte und ihre Merkmale?",howToUse:"Definieren Sie die Standorte, ihre Entfernungen und ihre Endpunkte für jede API.",sections:{locationGroups:{section:"Standortgruppen",description:"Welches sind die relevanten Standortgruppen?"},locationGroupCharacteristics:{section:"Standortgruppenmerkmale",description:"Was sind die Merkmale der Standortgruppen?"},locations:{section:"Standorte",description:"Welches sind die relevanten Standorte innerhalb jeder Gruppe?"},locationCharacteristics:{section:"Standortmerkmale",description:"Was sind die Merkmale der Standorte?"},locationDistances:{section:"Standortentfernungen",description:"Wie groß sind die Entfernungen zwischen den Standorten?"},locationDistanceCharacteristics:{section:"Standort-Entfernungsmerkmale",description:"Was sind die Merkmale der Standortentfernungen?"},locationEndpoints:{section:"Standort-Endpunkte",description:"Welche Endpunkte sind mit den Standorten assoziiert?"},locationEndpointCharacteristics:{section:"Standort-Endpunktemerkmale",description:"Was sind die Merkmale der Standort-Endpunkte?"}}},restCanvas:{title:"REST Canvas",purpose:"Wie kann die API nach RESTful-Prinzipien gestaltet werden?",howToUse:"Definieren Sie die API-Ressourcen, HTTP-Methoden und Beispielanfragen und -antworten.",sections:{apiResources:{section:"API-Ressourcen",description:"Was sind die Schlüsselressourcen, die von der API bereitgestellt werden?"},apiResourceModel:{section:"API-Ressourcenmodell",description:"Wie sieht die Struktur des API-Ressourcenmodells aus?"},apiVerbs:{section:"HTTP-Methoden der API",description:"Welche HTTP-Methoden werden für die Interaktion mit den API-Ressourcen verwendet?"},apiVerbExample:{section:"HTTP-Methoden-Beispiel",description:"Geben Sie für jede HTTP-Methode ein Beispiel für eine API-Anfrage und -Antwort an."}}},graphqlCanvas:{title:"GraphQL Canvas",purpose:"Wie kann die API unter Verwendung von GraphQL-Prinzipien gestaltet werden?",howToUse:"Definieren Sie die Schlüsseltypen, Abfragen, Mutationen und Einschränkungen für Ihre GraphQL-API.",sections:{apiName:{section:"API-Name",description:"Wie lautet der Name der GraphQL-API oder des Endpunkts?"},consumerGoals:{section:"Ziele der Konsumenten",description:"Welche Probleme versuchen API-Konsumenten zu lösen? Welche Daten benötigen sie?"},keyTypes:{section:"Schlüsseltypen",description:"Welche Kern-Typen werden bereitgestellt (z.B. Benutzer, Bestellung, Produkt)?"},relationships:{section:"Beziehungen",description:"Wie stehen die Typen in verschachtelten Abfragen zueinander?"},queries:{section:"Abfragen",description:"Welche typischen Abfragen sollten unterstützt werden?"},mutations:{section:"Mutationen",description:"Welche Operationen verändern Daten (z.B. erstellen, aktualisieren, löschen)?"},subscriptions:{section:"Subscriptions",description:"Gibt es Echtzeit-Updates oder Ereignisse, die Konsumenten abonnieren können?"},authorizationRules:{section:"Autorisierungsregeln",description:"Wer darf auf welche Felder oder Typen zugreifen?"},consumerConstraints:{section:"Einschränkungen für Konsumenten",description:"Gibt es Paginierungs-, Filter- oder Ratenbegrenzungen?"},openQuestions:{section:"Notizen / Offene Fragen",description:"Gibt es noch offene Entscheidungen oder Integrationsüberlegungen?"}}}},"en-US":{apiBusinessModelCanvas:{title:"API Business Model Canvas",purpose:"How feasible and reusable will this API be? Do we have a business case from a cost - benefit point of view?",howToUse:"Summarize the value proposition of one API from the API Value Proposition Canvas, then follow the numbered sequence.",sections:{keyPartners:{section:"Key Partners",description:"Who are the key stakeholders involved?"},keyActivities:{section:"Key Activities",description:"What are the most important actions the API provider must take to operate successfully?"},keyResources:{section:"Key Resources",description:"What unique strategic assets must the API provider acquire or build?"},apiValueProposition:{section:"API Value Proposition",description:"What value does the API offer to API consumers?"},developerRelations:{section:"Developer Relations",description:"How does the API provider reach and support API consumers?"},channels:{section:"Channels",description:"Through which mechanisms do API consumers interact with the API?"},apiConsumerSegments:{section:"API Consumer Segments",description:"Who are the target audiences for the API?"},costs:{section:"Costs",description:"What are the significant costs involved in building, deploying, and operating the API?"},benefits:{section:"Benefits",description:"What are the significant benefits or revenue streams generated by the API?"}}},apiValuePropositionCanvas:{title:"API Value Proposition Canvas",purpose:"Does this API address the jobs, pains, and gains of API consumers?",howToUse:"Describe the API consumer's perspective, starting with their tasks, then their pains and gains, and finally the API's products and features.",sections:{tasks:{section:"Tasks",description:"What are the API consumers trying to achieve?"},gainEnablingFeatures:{section:"Gain Enabling Features",description:"What features enable API consumers to achieve gains?"},painRelievingFeatures:{section:"Pain Relieving Features",description:"What features help API consumers overcome pains?"},apiProducts:{section:"API Products",description:"What API products and features address the tasks, pains, and gains?"}}},businessImpactCanvas:{title:"Business Impact Canvas",purpose:"What are the potential business impacts of API failure?",howToUse:"Consider the potential impact on availability, security, and data for each API.",sections:{availabilityRisks:{section:"Availability Risks",description:"What are the potential risks to API availability?"},securityRisks:{section:"Security Risks",description:"What are the potential security risks associated with the API?"},dataRisks:{section:"Data Risks",description:"What are the potential risks to data integrity or confidentiality?"},mitigateAvailabilityRisks:{section:"Mitigate Availability Risks",description:"How can the API provider mitigate the availability risks?"},mitigateSecurityRisks:{section:"Mitigate Security Risks",description:"How can the API provider mitigate the security risks?"},mitigateDataRisks:{section:"Mitigate Data Risks",description:"How can the API provider mitigate the data risks?"}}},capacityCanvas:{title:"Capacity Canvas",purpose:"How much capacity is needed to support API consumption?",howToUse:"Analyze the current and future capacity requirements for each API.",sections:{currentBusinessVolumes:{section:"Current Business Volumes",description:"What are the current business volumes and transaction rates?"},futureConsumptionTrends:{section:"Future Consumption Trends",description:"What are the anticipated future consumption trends?"},peakLoadAndAvailabilityRequirements:{section:"Peak Load and Availability Requirements",description:"What are the peak load and availability requirements?"},cachingStrategies:{section:"Caching Strategies",description:"What caching strategies can be used to optimize performance?"},rateLimitingStrategies:{section:"Rate Limiting Strategies",description:"What rate limiting strategies can be used to manage consumption?"},scalingStrategies:{section:"Scaling Strategies",description:"What scaling strategies can be used to accommodate growth?"}}},customerJourneyCanvas:{title:"Customer Journey Canvas",purpose:"What is the customer or partner journey that the API is intended to support?",howToUse:"Describe a real-life customer or user journey — not the API usage — to reveal pain points, goals, and context. This insight helps define what kind of API support is truly needed later.",sections:{customerDiscoversNeed:{section:"Customer Discovers Need",description:"How does the customer recognize their need or problem?"},persona:{section:"Persona",description:"Who is the typical customer experiencing this journey?"},pains:{section:"Pains",description:"What are the customer's pain points or challenges?"},journeySteps:{section:"Journey Steps",description:"What are the steps the customer takes in their journey?"},customerNeedIsResolved:{section:"Customer Need Is Resolved",description:"How is the customer's need ultimately resolved?"},gains:{section:"Gains",description:"What are the customer's gains or benefits?"},inputsOutputs:{section:"Inputs & Outputs",description:"What are the inputs and outputs at each step?"},interactionProcessingRules:{section:"Interaction & Processing Rules",description:"What are the interaction and processing rules at each step?"}}},domainCanvas:{title:"Domain Canvas",purpose:"What are the core entities and business rules related to the API?",howToUse:"Define the domain model for each API, including entities, attributes, and relationships.",sections:{selectedCustomerJourneySteps:{section:"Selected Customer Journey Steps",description:"Which customer journey steps are relevant to this domain?"},coreEntitiesAndBusinessMeaning:{section:"Core Entities & Business Meaning",description:"What are the core entities and their business meaning?"},attributesAndBusinessImportance:{section:"Attributes & Business Importance",description:"What are the key attributes of each entity and their business importance?"},relationshipsBetweenEntities:{section:"Relationships Between Entities",description:"What are the relationships between the entities?"},businessComplianceAndIntegrityRules:{section:"Business, Compliance & Integrity Rules",description:"What are the business, compliance, and integrity rules related to the entities?"},securityAndPrivacyConsiderations:{section:"Security & Privacy Considerations",description:"What are the security and privacy considerations related to the entities?"}}},eventCanvas:{title:"Event Canvas",purpose:"What events are relevant to the API, and how are they processed?",howToUse:"Define the events, their triggers, and the processing logic for each API.",sections:{userTaskTrigger:{section:"User Task / Trigger",description:"What user action or system event triggers this event operation?"},inputEventPayload:{section:"Input / Event Payload",description:"What data is included in the incoming event payload? Specify key attributes."},processingLogic:{section:"Processing / Logic",description:"Describe the backend processing logic, including validations, transformations, or routing decisions."},outputEventResult:{section:"Output / Event Result",description:"What resulting event or acknowledgment is produced? Include attributes of the output payload."}}},interactionCanvas:{title:"Interaction Canvas",purpose:"What are the different types of interactions supported by the API?",howToUse:"Define the CRUD, query-driven, command-driven, and event-driven interactions for each API.",sections:{crudInteractions:{section:"CRUD Interactions",description:"What are the CRUD (Create, Read, Update, Delete) interactions supported by the API?"},crudInputOutputModels:{section:"CRUD Input & Output Models",description:"What are the input and output models for the CRUD interactions?"},crudProcessingValidation:{section:"CRUD Processing & Validation",description:"What are the processing and validation rules for the CRUD interactions?"},queryDrivenInteractions:{section:"Query-Driven Interactions",description:"What are the query-driven interactions supported by the API?"},queryDrivenInputOutputModels:{section:"Query-Driven Input & Output Models",description:"What are the input and output models for the query-driven interactions?"},queryDrivenProcessingValidation:{section:"Query-Driven Processing & Validation",description:"What are the processing and validation rules for the query-driven interactions?"},commandDrivenInteractions:{section:"Command-Driven Interactions",description:"What are the command-driven interactions supported by the API?"},commandDrivenInputOutputModels:{section:"Command-Driven Input & Output Models",description:"What are the input and output models for the command-driven interactions?"},commandDrivenProcessingValidation:{section:"Command-Driven Processing & Validation",description:"What are the processing and validation rules for the command-driven interactions?"},eventDrivenInteractions:{section:"Event-Driven Interactions",description:"What are the event-driven interactions supported by the API?"},eventDrivenInputOutputModels:{section:"Event-Driven Input & Output Models",description:"What are the input and output models for the event-driven interactions?"},eventDrivenProcessingValidation:{section:"Event-Driven Processing & Validation",description:"What are the processing and validation rules for the event-driven interactions?"}}},locationsCanvas:{title:"Locations Canvas",purpose:"What are the relevant locations and their characteristics?",howToUse:"Define the locations, their distances, and their endpoints for each API.",sections:{locationGroups:{section:"Location Groups",description:"What are the relevant location groups?"},locationGroupCharacteristics:{section:"Location Group Characteristics",description:"What are the characteristics of the location groups?"},locations:{section:"Locations",description:"What are the relevant locations within each group?"},locationCharacteristics:{section:"Location Characteristics",description:"What are the characteristics of the locations?"},locationDistances:{section:"Location Distances",description:"What are the distances between the locations?"},locationDistanceCharacteristics:{section:"Location Distance Characteristics",description:"What are the characteristics of the location distances?"},locationEndpoints:{section:"Location Endpoints",description:"What are the endpoints associated with the locations?"},locationEndpointCharacteristics:{section:"Location Endpoint Characteristics",description:"What are the characteristics of the location endpoints?"}}},restCanvas:{title:"REST Canvas",purpose:"How can the API be designed using RESTful principles?",howToUse:"Define the API resources, verbs, and example requests and responses.",sections:{apiResources:{section:"API Resources",description:"What are the key resources exposed by the API?"},apiResourceModel:{section:"API Resource Model",description:"What is the structure of the API resource model?"},apiVerbs:{section:"API Verbs",description:"What HTTP verbs are used to interact with the API resources?"},apiVerbExample:{section:"API Verb Example",description:"Provide an example of an API request and response for each verb."}}},graphqlCanvas:{title:"GraphQL Canvas",purpose:"How can the API be designed using GraphQL principles?",howToUse:"Define the key types, queries, mutations, and constraints for your GraphQL API.",sections:{apiName:{section:"API Name",description:"What is the name of the GraphQL API or endpoint?"},consumerGoals:{section:"Consumer Goals",description:"What problems are API consumers trying to solve? What data do they need?"},keyTypes:{section:"Key Types",description:"What are the core types exposed (e.g., User, Order, Product)?"},relationships:{section:"Relationships",description:"How do types relate to each other in nested queries?"},queries:{section:"Queries",description:"What common queries should be supported?"},mutations:{section:"Mutations",description:"What operations will modify data (e.g., create, update, delete)?"},subscriptions:{section:"Subscriptions",description:"Are there any real-time updates or events consumers can subscribe to?"},authorizationRules:{section:"Authorization Rules",description:"Who can access which fields or types?"},consumerConstraints:{section:"Consumer Constraints",description:"Are there pagination, filtering, or rate-limiting constraints?"},openQuestions:{section:"Notes / Open Questions",description:"Any pending decisions or integration considerations?"}}}},"fi-FI":{apiBusinessModelCanvas:{title:"API Business Model Canvas",purpose:"Kuinka toteuttamiskelpoinen ja uudelleenkäytettävä API on? Onko meillä liiketoimintaperuste kustannus-hyötynäkökulmasta?",howToUse:"Yhteenveto APIn arvolupauksesta API Value Proposition Canvasin pohjalta, ja etene sitten numeroidussa järjestyksessä.",sections:{keyPartners:{section:"Keskeiset kumppanit",description:"Ketkä ovat tärkeimmät sidosryhmät?"},keyActivities:{section:"Keskeiset toiminnot",description:"Mitkä ovat tärkeimmät toimet, jotka API-tarjoajan on toteutettava menestyäkseen?"},keyResources:{section:"Keskeiset resurssit",description:"Mitä ainutlaatuisia strategisia resursseja API-tarjoajan on hankittava tai kehitettävä?"},apiValueProposition:{section:"APIn arvolupaus",description:"Mitä arvoa API tarjoaa sen käyttäjille?"},developerRelations:{section:"Suhde kehittäjiin",description:"Miten API-tarjoaja tavoittaa ja tukee APIn käyttäjiä?"},channels:{section:"Kanavat",description:"Minkä kanavien kautta APIn käyttäjät ovat vuorovaikutuksessa APIn kanssa?"},apiConsumerSegments:{section:"APIn kohderyhmät",description:"Keitä ovat APIn kohdeyleisöt?"},costs:{section:"Kustannukset",description:"Mitkä ovat merkittävimmät kustannukset APIn rakentamisessa, julkaisemisessa ja ylläpidossa?"},benefits:{section:"Hyödyt",description:"Mitkä ovat APIn tuottamat merkittävät hyödyt tai tulovirrat?"}}},apiValuePropositionCanvas:{title:"API Value Proposition Canvas",purpose:"Vastaako tämä API API-käyttäjien tehtäviin, kipupisteisiin ja hyötyihin?",howToUse:"Kuvaile API-käyttäjän näkökulma: aloita tehtävistä, siirry kipupisteisiin ja hyötyihin ja lopuksi esittele API-tuotteet ja -ominaisuudet.",sections:{tasks:{section:"Tehtävät",description:"Mitä API-käyttäjät yrittävät saavuttaa?"},gainEnablingFeatures:{section:"Hyötyä mahdollistavat ominaisuudet",description:"Mitkä ominaisuudet mahdollistavat API-käyttäjien hyötyjen saavuttamisen?"},painRelievingFeatures:{section:"Kipua lievittävät ominaisuudet",description:"Mitkä ominaisuudet auttavat API-käyttäjiä poistamaan kipupisteet?"},apiProducts:{section:"APIn tuotteet",description:"Mitkä API-tuotteet ja -ominaisuudet vastaavat tehtäviin, kipupisteisiin ja hyötyihin?"}}},businessImpactCanvas:{title:"Business Impact Canvas",purpose:"Mitkä ovat mahdolliset liiketoiminnalliset vaikutukset APIn virhetilanteissa?",howToUse:"Ota huomioon mahdolliset vaikutukset saatavuuteen, tietoturvaan ja dataan kullekin APIlle.",sections:{availabilityRisks:{section:"Saatavuuteen liittyvät riskit",description:"Mitkä ovat APIn saatavuuteen liittyvät mahdolliset riskit?"},securityRisks:{section:"Tietoturvariskit",description:"Mitkä ovat APIin liittyvät mahdolliset tietoturvariskit?"},dataRisks:{section:"Tietoriskit",description:"Mitkä ovat mahdolliset riskit tiedon eheydelle tai luottamuksellisuudelle?"},mitigateAvailabilityRisks:{section:"Saatavuusriskien vähentäminen",description:"Miten API-tarjoaja voi vähentää saatavuuteen liittyviä riskejä?"},mitigateSecurityRisks:{section:"Tietoturvariskien vähentäminen",description:"Miten API-tarjoaja voi vähentää tietoturvariskejä?"},mitigateDataRisks:{section:"Tietoriskien vähentäminen",description:"Miten API-tarjoaja voi vähentää tietoriskejä?"}}},capacityCanvas:{title:"Capacity Canvas",purpose:"Kuinka paljon kapasiteettia tarvitaan APIn käytön tukemiseksi?",howToUse:"Analysoi kunkin APIn nykyiset ja tulevat kapasiteettitarpeet.",sections:{currentBusinessVolumes:{section:"Nykyinen liiketoimintavolyymi",description:"Mitkä ovat nykyiset liiketoimintavolyymit ja transaktiomäärät?"},futureConsumptionTrends:{section:"Tulevat kulutustrendit",description:"Mitkä ovat ennakoidut tulevat kulutustrendit?"},peakLoadAndAvailabilityRequirements:{section:"Huipputehon ja saatavuuden vaatimukset",description:"Mitkä ovat huippukuormituksen ja saatavuuden vaatimukset?"},cachingStrategies:{section:"Välimuististrategiat",description:"Mitä välimuististrategioita voidaan käyttää suorituskyvyn optimoimiseksi?"},rateLimitingStrategies:{section:"Kutsunopeuden rajoitusstrategiat",description:"Mitä kutsunopeuden rajoitusstrategioita voidaan käyttää kulutuksen hallintaan?"},scalingStrategies:{section:"Skaalausstrategiat",description:"Mitä skaalausstrategioita voidaan käyttää kasvun tukemiseen?"}}},customerJourneyCanvas:{title:"Customer Journey Canvas",purpose:"Mikä on se asiakkaan tai kumppanin asiakaspolku, jota API:n tulisi tukea?",howToUse:"Kuvaa oikea asiakkaan tai käyttäjän polku, ei API:n käyttöpolkua. Tunnista kipupisteet, tavoitteet ja konteksti. Tämä toimii pohjana API-tarpeiden ja arvolupausten muotoilulle.",sections:{customerDiscoversNeed:{section:"Asiakas havaitsee tarpeen",description:"Miten asiakas huomaa tarpeensa?"},persona:{section:"Persona",description:"Kuka on tämän asiakaspolun kokija?"},pains:{section:"Kipupisteet",description:"Mitkä haasteet tai ongelmat ilmenevät polun aikana?"},journeySteps:{section:"Asiakaspolun vaiheet",description:"Mitä vaiheita asiakas käy läpi?"},customerNeedIsResolved:{section:"Tarve täyttyy",description:"Miten tarve lopulta täyttyy — mahdollisesti ilman APIa?"},gains:{section:"Hyödyt",description:"Mitä hyötyä tai arvoa asiakas saa lopputuloksena?"},inputsOutputs:{section:"Syötteet ja tulosteet",description:"Mitkä asiat käynnistävät ja seuraavat eri vaiheita?"},interactionProcessingRules:{section:"Vuorovaikutus- ja käsittelysäännöt",description:"Mitkä roolit, järjestelmät tai säännöt vaikuttavat kulkuun?"}}},domainCanvas:{title:"Domain Canvas",purpose:"Mitkä ovat APIn keskeiset entiteetit ja liiketoimintasäännöt?",howToUse:"Määrittele kunkin APIn toimialuemalli, mukaan lukien entiteetit, attribuutit ja suhteet.",sections:{selectedCustomerJourneySteps:{section:"Valitut asiakaspolun vaiheet",description:"Mitkä asiakaspolun vaiheet ovat olennaisia tälle toimialueelle?"},coreEntitiesAndBusinessMeaning:{section:"Ydinkohteet ja liiketoiminnallinen merkitys",description:"Mitkä ovat keskeiset entiteetit ja niiden liiketoiminnallinen merkitys?"},attributesAndBusinessImportance:{section:"Attribuutit ja liiketoiminnallinen merkitys",description:"Mitkä ovat kunkin entiteetin keskeiset attribuutit ja niiden liiketoiminnallinen merkitys?"},relationshipsBetweenEntities:{section:"Entiteettien väliset suhteet",description:"Mitkä ovat entiteettien väliset suhteet?"},businessComplianceAndIntegrityRules:{section:"Liiketoiminta-, sääntely- ja eheysvaatimukset",description:"Mitkä ovat entiteetteihin liittyvät liiketoiminta-, sääntely- ja eheysvaatimukset?"},securityAndPrivacyConsiderations:{section:"Tietoturva- ja yksityisyysnäkökohdat",description:"Mitä tietoturvaan ja yksityisyyteen liittyviä näkökulmia entiteetteihin liittyy?"}}},eventCanvas:{title:"Event Canvas",purpose:"Mitkä tapahtumat liittyvät APIin ja miten ne käsitellään?",howToUse:"Määrittele tapahtumat, niiden laukaisijat ja käsittelylogiikka kullekin APIlle.",sections:{userTaskTrigger:{section:"Käyttäjän tehtävä / Laukaisija",description:"Mikä käyttäjän toiminto tai järjestelmätapahtuma laukaisee tämän tapahtuman?"},inputEventPayload:{section:"Syöte / Tapahtumakuorma",description:"Mitä tietoja saapuva tapahtumakuorma sisältää? Määrittele keskeiset attribuutit."},processingLogic:{section:"Käsittely / Logiikka",description:"Kuvaile taustajärjestelmän käsittelylogiikka mukaan lukien validoinnit, muunnokset ja reitityspäätökset."},outputEventResult:{section:"Tulos / Tapahtuman lopputulos",description:"Mikä tapahtuma tai kuittaus syntyy? Sisällytä vastauksen attribuutit."}}},interactionCanvas:{title:"Interaction Canvas",purpose:"Mitä erilaisia vuorovaikutustyyppejä API tukee?",howToUse:"Määrittele CRUD-, kysely-, käsky- ja tapahtumapohjaiset vuorovaikutukset jokaiselle APIlle.",sections:{crudInteractions:{section:"CRUD-vuorovaikutukset",description:"Mitä CRUD (luo, lue, päivitä, poista) -toimintoja API tukee?"},crudInputOutputModels:{section:"CRUD-syöte- ja tulostemallit",description:"Mitkä ovat syöte- ja tulostemallit CRUD-toiminnoille?"},crudProcessingValidation:{section:"CRUD-käsittely ja validointi",description:"Mitkä ovat CRUD-toimintojen käsittely- ja validointisäännöt?"},queryDrivenInteractions:{section:"Kyselypohjaiset vuorovaikutukset",description:"Mitä kyselypohjaisia vuorovaikutuksia API tukee?"},queryDrivenInputOutputModels:{section:"Kyselypohjaiset syöte- ja tulostemallit",description:"Mitkä ovat syöte- ja tulostemallit kyselypohjaisille vuorovaikutuksille?"},queryDrivenProcessingValidation:{section:"Kyselypohjainen käsittely ja validointi",description:"Mitkä ovat kyselypohjaisten vuorovaikutusten käsittely- ja validointisäännöt?"},commandDrivenInteractions:{section:"Käskyohjatut vuorovaikutukset",description:"Mitkä käskyohjatut vuorovaikutukset API tukee?"},commandDrivenInputOutputModels:{section:"Käskyohjatut syöte- ja tulostemallit",description:"Mitkä ovat käskyohjattujen vuorovaikutusten syöte- ja tulostemallit?"},commandDrivenProcessingValidation:{section:"Käskyohjattu käsittely ja validointi",description:"Mitkä ovat käskyohjattujen vuorovaikutusten käsittely- ja validointisäännöt?"},eventDrivenInteractions:{section:"Tapahtumapohjaiset vuorovaikutukset",description:"Mitkä tapahtumapohjaiset vuorovaikutukset API tukee?"},eventDrivenInputOutputModels:{section:"Tapahtumapohjaiset syöte- ja tulostemallit",description:"Mitkä ovat tapahtumapohjaisten vuorovaikutusten syöte- ja tulostemallit?"},eventDrivenProcessingValidation:{section:"Tapahtumapohjainen käsittely ja validointi",description:"Mitkä ovat tapahtumapohjaisten vuorovaikutusten käsittely- ja validointisäännöt?"}}},locationsCanvas:{title:"Locations Canvas",purpose:"Mitkä ovat olennaiset sijainnit ja niiden ominaisuudet?",howToUse:"Määrittele sijainnit, välimatkat ja päätepisteet kullekin APIlle.",sections:{locationGroups:{section:"Sijaintiryhmät",description:"Mitkä ovat olennaiset sijaintiryhmät?"},locationGroupCharacteristics:{section:"Sijaintiryhmien ominaisuudet",description:"Mitkä ovat sijaintiryhmien ominaisuudet?"},locations:{section:"Sijainnit",description:"Mitkä ovat olennaiset sijainnit kussakin ryhmässä?"},locationCharacteristics:{section:"Sijaintien ominaisuudet",description:"Mitkä ovat sijaintien ominaisuudet?"},locationDistances:{section:"Sijaintien väliset etäisyydet",description:"Mitkä ovat etäisyydet sijaintien välillä?"},locationDistanceCharacteristics:{section:"Sijaintien välimatkojen ominaisuudet",description:"Mitkä ovat sijaintien välimatkojen ominaisuudet?"},locationEndpoints:{section:"Sijainnin päätepisteet",description:"Mitkä päätepisteet liittyvät sijainteihin?"},locationEndpointCharacteristics:{section:"Sijaintipisteiden ominaisuudet",description:"Mitkä ovat sijaintiin liittyvien päätepisteiden ominaisuudet?"}}},restCanvas:{title:"REST Canvas",purpose:"Miten API voidaan suunnitella REST-periaatteiden mukaisesti?",howToUse:"Määrittele APIn resurssit, verbit sekä esimerkkipyynnöt ja -vastaukset.",sections:{apiResources:{section:"APIn resurssit",description:"Mitkä ovat keskeiset resurssit, joita API paljastaa?"},apiResourceModel:{section:"APIn resurssimalli",description:"Millainen on APIn resurssimallin rakenne?"},apiVerbs:{section:"APIn verbit",description:"Mitä HTTP-verbejä käytetään APIn resurssien kanssa vuorovaikutuksessa?"},apiVerbExample:{section:"API-verbin esimerkki",description:"Anna esimerkki API-pyynnöstä ja -vastauksesta kullekin verbille."}}},graphqlCanvas:{title:"GraphQL Canvas",purpose:"Kuinka API voidaan suunnitella GraphQL-periaatteiden mukaisesti?",howToUse:"Määrittele keskeiset tyypit, kyselyt, mutaatiot ja rajoitukset GraphQL-API:a varten.",sections:{apiName:{section:"APIn nimi",description:"Mikä on GraphQL-API:n tai päätepisteen nimi?"},consumerGoals:{section:"Käyttäjien tavoitteet",description:"Mitä ongelmia API:n käyttäjät yrittävät ratkaista? Mitä dataa he tarvitsevat?"},keyTypes:{section:"Keskeiset tyypit",description:"Mitkä ovat keskeiset tyypit (esim. User, Order, Product)?"},relationships:{section:"Suhteet",description:"Miten tyypit liittyvät toisiinsa sisäkkäisissä kyselyissä?"},queries:{section:"Kyselyt",description:"Mitä yleisiä kyselyitä pitäisi tukea?"},mutations:{section:"Mutaatiot",description:"Mitkä toiminnot muuttavat dataa (esim. luonti, päivitys, poisto)?"},subscriptions:{section:"Tilaukset",description:"Onko reaaliaikaisia päivityksiä tai tapahtumia, joita voi tilata?"},authorizationRules:{section:"Valtuutussäännöt",description:"Kuka voi käyttää mitäkin kenttiä tai tyyppejä?"},consumerConstraints:{section:"Käyttäjärajoitukset",description:"Onko sivutukseen, suodatukseen tai nopeusrajoihin liittyviä rajoitteita?"},openQuestions:{section:"Huomiot / Avoimet kysymykset",description:"Onko keskeneräisiä päätöksiä tai integraatioon liittyviä huomioita?"}}}},"fr-FR":{apiBusinessModelCanvas:{title:"API Business Model Canvas",purpose:"Dans quelle mesure cette API sera-t-elle viable et réutilisable ? Avons-nous un cas commercial du point de vue coût-bénéfice ?",howToUse:"Résumez la proposition de valeur d'une API à partir du Canvas de proposition de valeur API, puis suivez la séquence numérotée.",sections:{keyPartners:{section:"Partenaires clés",description:"Qui sont les principales parties prenantes impliquées?"},keyActivities:{section:"Activités clés",description:"Quelles sont les actions les plus importantes que le fournisseur d'API doit entreprendre pour réussir?"},keyResources:{section:"Ressources clés",description:"Quels actifs stratégiques uniques le fournisseur d'API doit-il acquérir ou développer?"},apiValueProposition:{section:"Proposition de valeur de l'API",description:"Quelle valeur l'API offre-t-elle aux consommateurs d'API?"},developerRelations:{section:"Relations développeurs",description:"Comment le fournisseur d'API atteint-il et soutient-il les consommateurs d'API?"},channels:{section:"Canaux",description:"Par quels mécanismes les consommateurs d'API interagissent-ils avec l'API?"},apiConsumerSegments:{section:"Segments de consommateurs de l'API",description:"Quelles sont les audiences cibles pour l'API?"},costs:{section:"Coûts",description:"Quels sont les coûts importants liés à la création, au déploiement et à l'exploitation de l'API?"},benefits:{section:"Avantages",description:"Quels sont les avantages significatifs ou les sources de revenus générés par l'API?"}}},apiValuePropositionCanvas:{title:"API Value Proposition Canvas",purpose:"Cette API répond-elle aux tâches, peines et gains des consommateurs d'API?",howToUse:"Décrivez le point de vue du consommateur d'API, en commençant par ses tâches, puis ses peines et gains, et enfin les produits et fonctionnalités de l'API.",sections:{tasks:{section:"Tâches",description:"Qu'essaient d'accomplir les consommateurs d'API?"},gainEnablingFeatures:{section:"Fonctionnalités génératrices de gains",description:"Quelles fonctionnalités permettent aux consommateurs d'API d'obtenir des gains?"},painRelievingFeatures:{section:"Fonctionnalités soulageant les peines",description:"Quelles fonctionnalités aident les consommateurs d'API à surmonter leurs difficultés?"},apiProducts:{section:"Produits API",description:"Quels produits et fonctionnalités API répondent aux tâches, peines et gains?"}}},businessImpactCanvas:{title:"Business Impact Canvas",purpose:"Quels sont les impacts commerciaux potentiels d'une défaillance de l'API?",howToUse:"Considérez l'impact potentiel sur la disponibilité, la sécurité et les données pour chaque API.",sections:{availabilityRisks:{section:"Risques de disponibilité",description:"Quels sont les risques potentiels pour la disponibilité de l'API?"},securityRisks:{section:"Risques de sécurité",description:"Quels sont les risques de sécurité potentiels associés à l'API?"},dataRisks:{section:"Risques liés aux données",description:"Quels sont les risques potententiels pour l'intégrité ou la confidentialité des données?"},mitigateAvailabilityRisks:{section:"Atténuer les risques de disponibilité",description:"Comment le fournisseur d'API peut-il atténuer les risques de disponibilité?"},mitigateSecurityRisks:{section:"Atténuer les risques de sécurité",description:"Comment le fournisseur d'API peut-il atténuer les risques de sécurité?"},mitigateDataRisks:{section:"Atténuer les risques liés aux données",description:"Comment le fournisseur d'API peut-il atténuer les risques liés aux données?"}}},capacityCanvas:{title:"Capacity Canvas",purpose:"Quelle capacité est nécessaire pour soutenir la consommation de l'API?",howToUse:"Analysez les besoins de capacité actuels et futurs pour chaque API.",sections:{currentBusinessVolumes:{section:"Volumes d'activité actuels",description:"Quels sont les volumes d'affaires et taux de transaction actuels?"},futureConsumptionTrends:{section:"Tendances de consommation futures",description:"Quelles sont les tendances de consommation anticipées?"},peakLoadAndAvailabilityRequirements:{section:"Exigences de charge maximale et de disponibilité",description:"Quelles sont les exigences de charge maximale et de disponibilité?"},cachingStrategies:{section:"Stratégies de mise en cache",description:"Quelles stratégies de mise en cache peuvent être utilisées pour optimiser les performances?"},rateLimitingStrategies:{section:"Stratégies de limitation de débit",description:"Quelles stratégies de limitation de débit peuvent être utilisées pour gérer la consommation?"},scalingStrategies:{section:"Stratégies de montée en charge",description:"Quelles stratégies d'évolutivité peuvent être utilisées pour accompagner la croissance?"}}},customerJourneyCanvas:{title:"Customer Journey Canvas",purpose:"Quel est le parcours client ou partenaire que l'API est censée soutenir?",howToUse:"Décrivez un parcours client ou utilisateur réel — pas l'utilisation de l'API — afin de révéler les points de douleur, les objectifs et le contexte. Ces informations aident à définir le type de support API réellement nécessaire plus tard.",sections:{customerDiscoversNeed:{section:"Le client découvre le besoin",description:"Comment le client reconnaît-il son besoin ou son problème?"},persona:{section:"Persona",description:"Qui est le client type qui vit ce parcours?"},pains:{section:"Douleurs",description:"Quels sont les points de douleur ou défis du client?"},journeySteps:{section:"Étapes du parcours",description:"Quelles sont les étapes suivies par le client dans son parcours?"},customerNeedIsResolved:{section:"Le besoin du client est résolu",description:"Comment le besoin du client est-il finalement résolu?"},gains:{section:"Gains",description:"Quels sont les gains ou bénéfices pour le client?"},inputsOutputs:{section:"Entrées et sorties",description:"Quelles sont les entrées et les sorties à chaque étape?"},interactionProcessingRules:{section:"Règles d'interaction et de traitement",description:"Quelles sont les règles d'interaction et de traitement à chaque étape?"}}},domainCanvas:{title:"Domain Canvas",purpose:"Quelles sont les entités principales et les règles métier liées à l'API?",howToUse:"Définissez le modèle de domaine pour chaque API, incluant entités, attributs et relations.",sections:{selectedCustomerJourneySteps:{section:"Étapes du parcours client sélectionnées",description:"Quelles étapes du parcours client sont pertinentes pour ce domaine?"},coreEntitiesAndBusinessMeaning:{section:"Entités principales et signification métier",description:"Quelles sont les entités principales et leur signification métier?"},attributesAndBusinessImportance:{section:"Attributs et importance métier",description:"Quels sont les attributs clés de chaque entité et leur importance métier?"},relationshipsBetweenEntities:{section:"Relations entre les entités",description:"Quelles sont les relations entre les entités?"},businessComplianceAndIntegrityRules:{section:"Règles métier, conformité et intégrité",description:"Quelles sont les règles métier, de conformité et d'intégrité liées aux entités?"},securityAndPrivacyConsiderations:{section:"Considérations de sécurité et de confidentialité",description:"Quelles sont les considérations de sécurité et de confidentialité liées aux entités?"}}},eventCanvas:{title:"Event Canvas",purpose:"Quels événements sont pertinents pour l'API et comment sont-ils traités?",howToUse:"Définissez les événements, leurs déclencheurs et la logique de traitement pour chaque API.",sections:{userTaskTrigger:{section:"Tâche utilisateur / Déclencheur",description:"Quelle action utilisateur ou événement système déclenche cette opération d'événement?"},inputEventPayload:{section:"Entrée / Charge utile de l'événement",description:"Quelles données sont incluses dans la charge utile de l'événement entrant? Spécifiez les attributs clés."},processingLogic:{section:"Traitement / Logique",description:"Décrivez la logique de traitement backend, y compris les validations, transformations ou décisions de routage."},outputEventResult:{section:"Sortie / Résultat de l'événement",description:"Quel événement ou accusé de réception est produit? Incluez les attributs de la charge utile de sortie."}}},interactionCanvas:{title:"Interaction Canvas",purpose:"Quels sont les différents types d'interactions pris en charge par l'API?",howToUse:"Définissez les interactions CRUD, orientées requête, orientées commande et orientées événements pour chaque API.",sections:{crudInteractions:{section:"Interactions CRUD",description:"Quelles interactions CRUD (Create, Read, Update, Delete) sont prises en charge par l'API?"},crudInputOutputModels:{section:"Modèles d'entrée et de sortie CRUD",description:"Quels sont les modèles d'entrée et de sortie pour les interactions CRUD?"},crudProcessingValidation:{section:"Traitement et validation CRUD",description:"Quelles sont les règles de traitement et de validation pour les interactions CRUD?"},queryDrivenInteractions:{section:"Interactions orientées requête",description:"Quelles interactions orientées requête sont prises en charge par l'API?"},queryDrivenInputOutputModels:{section:"Modèles d'entrée et de sortie orientés requête",description:"Quels sont les modèles d'entrée et de sortie pour les interactions orientées requête?"},queryDrivenProcessingValidation:{section:"Traitement et validation orientées requête",description:"Quelles sont les règles de traitement et de validation pour les interactions orientées requête?"},commandDrivenInteractions:{section:"Interactions orientées commande",description:"Quelles interactions orientées commande sont prises en charge par l'API?"},commandDrivenInputOutputModels:{section:"Modèles d'entrée et de sortie orientées commande",description:"Quels sont les modèles d'entrée et de sortie pour les interactions orientées commande?"},commandDrivenProcessingValidation:{section:"Traitement et validation orientées commande",description:"Quelles sont les règles de traitement et de validation pour les interactions orientées commande?"},eventDrivenInteractions:{section:"Interactions orientées événement",description:"Quelles interactions orientées événement sont prises en charge par l'API?"},eventDrivenInputOutputModels:{section:"Modèles d'entrée et de sortie orientées événement",description:"Quels sont les modèles d'entrée et de sortie pour les interactions orientées événement?"},eventDrivenProcessingValidation:{section:"Traitement et validation orientées événement",description:"Quelles sont les règles de traitement et de validation pour les interactions orientées événement?"}}},locationsCanvas:{title:"Locations Canvas",purpose:"Quels sont les emplacements pertinents et leurs caractéristiques?",howToUse:"Définissez les emplacements, leurs distances et leurs points de terminaison pour chaque API.",sections:{locationGroups:{section:"Groupes d'emplacements",description:"Quels sont les groupes d'emplacements pertinents?"},locationGroupCharacteristics:{section:"Caractéristiques des groupes d'emplacements",description:"Quelles sont les caractéristiques des groupes d'emplacements?"},locations:{section:"Emplacements",description:"Quels sont les emplacements pertinents dans chaque groupe?"},locationCharacteristics:{section:"Caractéristiques des emplacements",description:"Quelles sont les caractéristiques des emplacements?"},locationDistances:{section:"Distances entre emplacements",description:"Quelles sont les distances entre les emplacements?"},locationDistanceCharacteristics:{section:"Caractéristiques des distances",description:"Quelles sont les caractéristiques des distances entre emplacements?"},locationEndpoints:{section:"Points de terminaison",description:"Quels sont les points de terminaison associés aux emplacements?"},locationEndpointCharacteristics:{section:"Caractéristiques des points de terminaison",description:"Quelles sont les caractéristiques des points de terminaison?"}}},restCanvas:{title:"REST Canvas",purpose:"Comment l'API peut-elle être conçue selon les principes REST?",howToUse:"Définissez les ressources de l'API, les verbes et les exemples de requêtes et réponses.",sections:{apiResources:{section:"Ressources API",description:"Quelles sont les ressources clés exposées par l'API?"},apiResourceModel:{section:"Modèle de ressource API",description:"Quelle est la structure du modèle de ressources de l'API?"},apiVerbs:{section:"Verbes API",description:"Quels verbes HTTP sont utilisés pour interagir avec les ressources de l'API?"},apiVerbExample:{section:"Exemple de verbe API",description:"Fournissez un exemple de requête et de réponse API pour chaque verbe."}}},graphqlCanvas:{title:"GraphQL Canvas",purpose:"Comment l'API peut-elle être conçue selon les principes GraphQL ?",howToUse:"Définissez les principaux types, requêtes, mutations et contraintes pour votre API GraphQL.",sections:{apiName:{section:"Nom de l'API",description:"Quel est le nom de l'API GraphQL ou du point de terminaison ?"},consumerGoals:{section:"Objectifs des consommateurs",description:"Quels problèmes les consommateurs de l'API cherchent-ils à résoudre ? Quelles données leur sont nécessaires ?"},keyTypes:{section:"Types clés",description:"Quels sont les types principaux exposés (ex. Utilisateur, Commande, Produit) ?"},relationships:{section:"Relations",description:"Comment les types sont-ils liés dans les requêtes imbriquées ?"},queries:{section:"Requêtes",description:"Quelles requêtes courantes doivent être prises en charge ?"},mutations:{section:"Mutations",description:"Quelles opérations vont modifier les données (ex. créer, mettre à jour, supprimer) ?"},subscriptions:{section:"Abonnements",description:"Existe-t-il des mises à jour en temps réel ou des événements auxquels les consommateurs peuvent s'abonner ?"},authorizationRules:{section:"Règles d'autorisation",description:"Qui peut accéder à quels champs ou types ?"},consumerConstraints:{section:"Contraintes des consommateurs",description:"Y a-t-il des contraintes de pagination, de filtrage ou de limitation du débit ?"},openQuestions:{section:"Notes / Questions ouvertes",description:"Y a-t-il des décisions en attente ou des considérations d'intégration ?"}}}},"pt-BR":{apiBusinessModelCanvas:{title:"API Business Model Canvas",purpose:"Qual será a viabilidade e a reutilização desta API? Temos um caso de negócios do ponto de vista de custo-benefício?",howToUse:"Resuma a proposta de valor de uma API a partir do API Value Proposition Canvas e siga a sequência numerada.",sections:{keyPartners:{section:"Parceiros-chave",description:"Quem são as principais partes interessadas envolvidas?"},keyActivities:{section:"Atividades-chave",description:"Quais são as ações mais importantes que o provedor da API deve realizar para operar com sucesso?"},keyResources:{section:"Recursos-chave",description:"Que ativos estratégicos exclusivos o provedor da API deve adquirir ou construir?"},apiValueProposition:{section:"Proposta de valor da API",description:"Que valor a API oferece aos consumidores da API?"},developerRelations:{section:"Relações com desenvolvedores",description:"Como o provedor da API alcança e oferece suporte aos consumidores da API?"},channels:{section:"Canais",description:"Por meio de quais mecanismos os consumidores da API interagem com a API?"},apiConsumerSegments:{section:"Segmentos de consumidores da API",description:"Quem é o público-alvo da API?"},costs:{section:"Custos",description:"Quais são os custos significativos envolvidos na construção, implantação e operação da API?"},benefits:{section:"Benefícios",description:"Quais são os benefícios significativos ou fluxos de receita gerados pela API?"}}},apiValuePropositionCanvas:{title:"API Value Proposition Canvas",purpose:"Esta API aborda as tarefas, dificuldades e ganhos dos consumidores da API?",howToUse:"Descreva a perspectiva do consumidor da API, começando pelas suas tarefas, depois pelos seus problemas e ganhos e, finalmente, pelos produtos e funcionalidades da API.",sections:{tasks:{section:"Tarefas",description:"O que os consumidores da API pretendem alcançar?"},gainEnablingFeatures:{section:"Recursos que possibilitam ganhos",description:"Quais recursos permitem que os consumidores da API obtenham ganhos?"},painRelievingFeatures:{section:"Recursos que aliviam dificuldades",description:"Quais recursos ajudam os consumidores da API a superar dificuldades?"},apiProducts:{section:"Produtos API",description:"Quais produtos e recursos API atendem às tarefas, dificuldades e ganhos?"}}},businessImpactCanvas:{title:"Business Impact Canvas",purpose:"Quais são os possíveis impactos nos negócios da falha da API?",howToUse:"Considere o impacto potencial na disponibilidade, segurança e dados para cada API.",sections:{availabilityRisks:{section:"Riscos de disponibilidade",description:"Quais são os riscos potenciais para a disponibilidade da API?"},securityRisks:{section:"Riscos de segurança",description:"Quais são os riscos potenciais de segurança associados à API?"},dataRisks:{section:"Riscos de dados",description:"Quais são os riscos potenciais para a integridade ou confidencialidade dos dados?"},mitigateAvailabilityRisks:{section:"Mitigar riscos de disponibilidade",description:"Como o provedor da API pode mitigar os riscos de disponibilidade?"},mitigateSecurityRisks:{section:"Mitigar riscos de segurança",description:"Como o provedor da API pode mitigar os riscos de segurança?"},mitigateDataRisks:{section:"Mitigar riscos de dados",description:"Como o provedor da API pode mitigar os riscos de dados?"}}},capacityCanvas:{title:"Capacity Canvas",purpose:"Quanta capacidade é necessária para suportar o consumo da API?",howToUse:"Analise os requisitos de capacidade atuais e futuros para cada API.",sections:{currentBusinessVolumes:{section:"Volumes comerciais atuais",description:"Quais são os volumes comerciais e as taxas de transação atuais?"},futureConsumptionTrends:{section:"Tendências de consumo futuro",description:"Quais são as tendências de consumo futuro previstas?"},peakLoadAndAvailabilityRequirements:{section:"Requisitos de pico de carga e disponibilidade",description:"Quais são os requisitos de pico de carga e disponibilidade?"},cachingStrategies:{section:"Estratégias de cache",description:"Quais estratégias de cache podem ser usadas para otimizar o desempenho?"},rateLimitingStrategies:{section:"Estratégias de limitação de taxa",description:"Que estratégias de limitação de taxa podem ser usadas para gerenciar o consumo?"},scalingStrategies:{section:"Estratégias de dimensionamento",description:"Que estratégias de dimensionamento podem ser usadas para acomodar o crescimento?"}}},customerJourneyCanvas:{title:"Customer Journey Canvas",purpose:"Qual é a jornada do cliente ou parceiro que a API pretende apoiar?",howToUse:"Descreva uma jornada real de um cliente ou usuário — não o uso da API — para revelar pontos fracos, objetivos e contexto. Essa informação ajuda a definir que tipo de suporte de API será realmente necessário mais tarde.",sections:{customerDiscoversNeed:{section:"O cliente descobre a necessidade",description:"Como o cliente reconhece sua necessidade ou problema?"},persona:{section:"Persona",description:"Quem é o cliente típico que passa por essa jornada?"},pains:{section:"Dores",description:"Quais são os pontos fracos ou desafios do cliente?"},journeySteps:{section:"Etapas da jornada",description:"Quais são as etapas que o cliente percorre em sua jornada?"},customerNeedIsResolved:{section:"Necessidade do cliente resolvida",description:"Como a necessidade do cliente é resolvida no final?"},gains:{section:"Ganhos",description:"Quais são os ganhos ou benefícios do cliente?"},inputsOutputs:{section:"Entradas e saídas",description:"Quais são as entradas e saídas em cada etapa?"},interactionProcessingRules:{section:"Regras de interação e processamento",description:"Quais são as regras de interação e processamento em cada etapa?"}}},domainCanvas:{title:"Domain Canvas",purpose:"Quais são as entidades principais e as regras de negócios relacionadas à API?",howToUse:"Defina o modelo de domínio para cada API, incluindo entidades, atributos e relações.",sections:{selectedCustomerJourneySteps:{section:"Etapas selecionadas da jornada do cliente",description:"Quais etapas da jornada do cliente são relevantes para este domínio?"},coreEntitiesAndBusinessMeaning:{section:"Entidades principais e significado comercial",description:"Quais são as entidades principais e seu significado comercial?"},attributesAndBusinessImportance:{section:"Atributos e importância comercial",description:"Quais são os principais atributos de cada entidade e sua importância comercial?"},relationshipsBetweenEntities:{section:"Relações entre entidades",description:"Quais são as relações entre as entidades?"},businessComplianceAndIntegrityRules:{section:"Regras de negócios, conformidade e integridade",description:"Quais são as regras de negócios, conformidade e integridade relacionadas às entidades?"},securityAndPrivacyConsiderations:{section:"Considerações sobre segurança e privacidade",description:"Quais são as considerações sobre segurança e privacidade relacionadas às entidades?"}}},eventCanvas:{title:"Event Canvas",purpose:"Quais eventos são relevantes para a API e como são processados?",howToUse:"Defina os eventos, seus gatilhos e a lógica de processamento para cada API.",sections:{userTaskTrigger:{section:"Tarefa do usuário/gatilho",description:"Que ação do usuário ou evento do sistema aciona essa operação de evento?"},inputEventPayload:{section:"Entrada / Carga útil do evento",description:"Que dados estão incluídos na carga útil do evento recebido? Especifique os atributos principais."},processingLogic:{section:"Processamento/Lógica",description:"Descreva a lógica de processamento de back-end, incluindo validações, transformações ou decisões de roteamento."},outputEventResult:{section:"Saída/Resultado do evento",description:"Que evento ou confirmação resultante é produzido? Inclua atributos da carga útil de saída."}}},interactionCanvas:{title:"Interaction Canvas",purpose:"Quais são os diferentes tipos de interações suportados pela API?",howToUse:"Defina as interações CRUD, orientadas por consulta, orientadas por comando e orientadas por evento para cada API.",sections:{crudInteractions:{section:"Interações CRUD",description:"Quais são as interações CRUD (Criar, Ler, Atualizar, Excluir) suportadas pela API?"},crudInputOutputModels:{section:"Modelos de entrada e saída CRUD",description:"Quais são os modelos de entrada e saída para as interações CRUD?"},crudProcessingValidation:{section:"Processamento e validação CRUD",description:"Quais são as regras de processamento e validação para as interações CRUD?"},queryDrivenInteractions:{section:"Interações orientadas por consulta",description:"Quais são as interações orientadas por consulta suportadas pela API?"},queryDrivenInputOutputModels:{section:"Modelos de entrada e saída orientados por consulta",description:"Quais são os modelos de entrada e saída para as interações orientadas por consulta?"},queryDrivenProcessingValidation:{section:"Processamento e validação orientados por consulta",description:"Quais são as regras de processamento e validação para as interações orientadas por consulta?"},commandDrivenInteractions:{section:"Interações orientadas por comando",description:"Quais são as interações orientadas por comando suportadas pela API?"},commandDrivenInputOutputModels:{section:"Modelos de entrada e saída orientados por comando",description:"Quais são os modelos de entrada e saída para as interações orientadas por comando?"},commandDrivenProcessingValidation:{section:"Processamento e validação orientados por comando",description:"Quais são as regras de processamento e validação para as interações orientadas por comando?"},eventDrivenInteractions:{section:"Interações orientadas por eventos",description:"Quais são as interações orientadas por eventos suportadas pela API?"},eventDrivenInputOutputModels:{section:"Modelos de entrada e saída orientados por eventos",description:"Quais são os modelos de entrada e saída para as interações orientadas por eventos?"},eventDrivenProcessingValidation:{section:"Processamento e validação orientados por eventos",description:"Quais são as regras de processamento e validação para as interações orientadas por eventos?"}}},locationsCanvas:{title:"Location Canvas",purpose:"Quais são os locais relevantes e suas características?",howToUse:"Defina os locais, suas distâncias e seus pontos finais para cada API.",sections:{locationGroups:{section:"Grupos de Locais",description:"Quais são os grupos de locais relevantes?"},locationGroupCharacteristics:{section:"Características do grupo de locais",description:"Quais são as características dos grupos de locais?"},locations:{section:"Locais",description:"Quais são os locais relevantes dentro de cada grupo?"},locationCharacteristics:{section:"Características dos locais",description:"Quais são as características dos locais?"},locationDistances:{section:"Distâncias de localização",description:"Quais são as distâncias entre as localizações?"},locationDistanceCharacteristics:{section:"Características das distâncias de localização",description:"Quais são as características das distâncias de localização?"},locationEndpoints:{section:"Pontos finais de localização",description:"Quais são os pontos finais associados às localizações?"},locationEndpointCharacteristics:{section:"Características dos pontos finais de localização",description:"Quais são as características dos pontos finais de localização?"}}},restCanvas:{title:"REST Canvas",purpose:"Como a API pode ser projetada usando os princípios RESTful?",howToUse:"Defina os recursos, verbos e exemplos de solicitações e respostas da API.",sections:{apiResources:{section:"Recursos da API",description:"Quais são os principais recursos expostos pela API?"},apiResourceModel:{section:"Modelo de recurso da API",description:"Qual é a estrutura do modelo de recurso da API?"},apiVerbs:{section:"Verbos da API",description:"Quais verbos HTTP são usados para interagir com os recursos da API?"},apiVerbExample:{section:"Exemplo de verbo da API",description:"Forneça um exemplo de solicitação e resposta da API para cada verbo."}}},graphqlCanvas:{title:"GraphQL Canvas",purpose:"Como a API pode ser projetada usando os princípios do GraphQL?",howToUse:"Defina os tipos de chave, consultas, mutações e restrições para sua API GraphQL.",sections:{apiName:{section:"Nome da API",description:"Qual é o nome da API GraphQL ou do endpoint?"},consumerGoals:{section:"Objetivos do consumidor",description:"Quais problemas os consumidores da API estão tentando resolver? De quais dados eles precisam?"},keyTypes:{section:"Tipos de chave",description:"Quais são os tipos principais expostos (por exemplo, Usuário, Pedido, Produto)?"},relationships:{section:"Relações",description:"Como os tipos se relacionam entre si em consultas aninhadas?"},queries:{section:"Consultas",description:"Quais consultas comuns devem ser suportadas?"},mutations:{section:"Mutações",description:"Quais operações modificarão os dados (por exemplo, criar, atualizar, excluir)?"},subscriptions:{section:"Assinaturas",description:"Existem atualizações em tempo real ou eventos que os consumidores podem assinar?"},authorizationRules:{section:"Regras de autorização",description:"Quem pode acessar quais campos ou tipos?"},consumerConstraints:{section:"Restrições do consumidor",description:"Existem restrições de paginação, filtragem ou limitação de taxa?"},openQuestions:{section:"Notas/Questões em aberto",description:"Alguma decisão pendente ou considerações sobre integração?"}}}}};function m(){if(d)return c;d=1;const{sanitizeInput:e,validateInput:t,distributeMissingPositions:i}=r(),s=a(),n=u,o=p;let l=s.stickyNoteColor,m=null;function h(e){const t=document.getElementById("canvas");t.innerHTML="";Object.keys(o[e]).forEach(i=>{const s=document.createElement("option");s.value=i,s.text=o[e][i].title,t.add(s)})}document.getElementById("locale").addEventListener("change",e=>{const t=e.target.value;document.getElementById("canvasSelector").style.display="block",h(t);document.getElementById("canvas").value&&(document.getElementById("canvasCreator").style.display="flex")},{once:!0}),document.querySelectorAll(".canvas-tools").forEach(e=>{e.addEventListener("touchstart",function(e){e.preventDefault(),this.click()},{passive:!1})}),document.getElementById("canvas").addEventListener("change",e=>{k(document.getElementById("locale").value,e.target.value)},{once:!0});const g=document.createElement("input");g.type="file",g.accept="application/json",g.addEventListener("change",function(){const e=g.files[0];if(!e)return;const t=new FileReader;t.onload=function(e){try{const t=JSON.parse(e.target.result);if(!t.templateId||!t.metadata||!t.sections)return void alert("Invalid JSON file format.");if(canvasId=t.templateId,y=t,v=n[canvasId],v&&i(y,v),!v)return void alert("Canvas data not found for canvasId: "+canvasId);const s=document.getElementById("canvas"),o=s.onchange;s.onchange=null,s.value=canvasId,setTimeout(()=>{s.onchange=o},0);const a=t.locale||"en-US";document.getElementById("locale").value=a,h(a),document.getElementById("canvasSelector").style.display="block",document.getElementById("canvasCreator").style.display="flex",k(a,canvasId,!0),unsavedChanges=!0,alert("Canvas imported successfully.")}catch(e){alert("Failed to parse JSON: "+e.message),console.error(e)}},t.readAsText(e),g.value=""});let v=null,y={};function k(i,a,r=!1){if(v=n[a],!v)return void console.error(`Canvas data not found for canvasId: ${a}`);r||(y={templateId:a,locale:i,metadata:{source:"",license:"",authors:[],website:""},sections:v.sections?v.sections.map(e=>({sectionId:e.id,stickyNotes:[]})):[]});let c=d3.select("svg");const d=i=>{c.selectAll(".sticky-note").remove(),i&&i.sections&&(i.sections.forEach(o=>{const a=i.templateId,r=n[a].sections.find(e=>e.id===o.sectionId);if(o.stickyNotes&&o.stickyNotes.length>0){const n=c.selectAll(`.sticky-note-${o.sectionId}`).data(o.stickyNotes).enter().append("g").attr("class",`sticky-note sticky-note-${o.sectionId}`).attr("id",(e,t)=>`sticky-note-${o.sectionId}-${t}`).attr("transform",e=>{const t=(e.position.y||0)+0*(r.gridPosition.row+1);return`translate(${e.position.x||0},${t})`});n.on("click touchstart",function(e,t){e.stopPropagation(),e.preventDefault(),m=t}),n.append("rect").attr("x",0).attr("y",0).attr("width",s.stickyNoteSize).attr("height",s.stickyNoteSize).attr("fill",e=>e.color||s.stickyNoteColor).attr("stroke",s.stickyNoteBorderColor).attr("rx",3).attr("ry",3),n.append("text").attr("x",5).attr("y",15).attr("font-family",s.fontFamily).attr("font-size",s.fontSize+"px").attr("fill",s.contentFontColor).each(function(e){e.content=u(c,e.content);const t=e.content.split("\n");for(let e=0;e{r.node().focus()},0),r.on("focus",function(){this.value=o.content.replace(/\n{2,}/g,"\n")}).on("blur",function(s,n){let o=this.value;o=e(o),o=t(o),n.content=u(c,o),a.select("text").selectAll("tspan").remove(),d3.select(this.parentNode).remove(),d(i)})})}}),c.selectAll(".sticky-note").call(d3.drag().on("start",function(e,t){d3.select(this).attr("originalPosition",{x:t.position.x,y:t.position.y})}).on("drag",function(e,t){t.position.x=e.x,t.position.y=e.y,d3.select(this).attr("transform",`translate(${t.position.x},${t.position.y})`)}).on("end",function(e,t){})),c.on("contextmenu",function(e){e.preventDefault();const t=e.offsetX,n=e.offsetY;let o=null;for(let e=0;e=i.position.x&&t<=i.position.x+s.stickyNoteSize&&n>=i.position.y&&n<=i.position.y+s.stickyNoteSize){o=i;break}}if(o)break}if(o&&confirm("Are you sure you want to delete this sticky note?")){const e=i.sections.find(e=>e.stickyNotes.includes(o));e.stickyNotes=e.stickyNotes.filter(e=>e!==o),d(i)}}))};function u(e,t){const i=t.replace(/\n{2,}/g,"\n").split(" ");let n="";const o=[];return i.forEach(t=>{const i=n+t+" ",a=e.append("text").attr("font-family",s.fontFamily).attr("font-size",s.fontSize+"px").text(i),r=a.node().getComputedTextLength();a.remove(),r>s.maxLineWidth?(o.push(n),n=t+" "):n=i}),o.push(n),o.join("\n")}((t,i,n)=>{d3.select("svg").remove();const o=Math.floor((s.width-t.layout.columns*s.padding)/t.layout.columns),a=Math.floor((s.height-s.headerHeight-s.footerHeight-4*s.padding)/t.layout.rows),r=i.locale||s.defaultLocale,u=i.templateId,p=n[r][u];0===Object.keys(i).length&&(i.templateId=t.id,i.locale=r,i.metadata={source:"",license:"",authors:[],website:""},i.sections=t.sections.map(e=>({sectionId:e.id,stickyNotes:[]}))),c=d3.select("#canvasCreator").append("svg").attr("width",s.width+2*s.padding).attr("height",s.height).style("background-color",s.backgroundColor);(async(e,t,i=0,n=0,o=s.headerHeight+2*s.padding,a=s.headerHeight+2*s.padding)=>{try{const s=await fetch(e);if(!s.ok)throw new Error("Failed to fetch the logo SVG");const r=await s.text();t.append("g").attr("transform",`translate(${i}, ${n}) scale(${o/100}, ${a/100})`).html(r)}catch(e){}})("/img/apiops-cycles-logo2025-blue.svg",c,s.padding,s.padding/2,s.padding,s.padding),c.append("text").attr("x",s.headerHeight+2*s.padding).attr("y",2*s.padding).attr("text-anchor","start").attr("font-family",s.fontFamily).attr("font-size",s.fontSize+4+"px").attr("font-weight","bold").attr("fill",s.fontColor).text(p.title),c.append("text").attr("x",s.headerHeight+2*s.padding).attr("y",s.headerHeight-3*s.padding).attr("text-anchor","start").attr("font-family",s.fontFamily).attr("font-size",s.fontSize+2+"px").attr("fill",s.fontColor).text(p.purpose),c.append("text").attr("x",s.headerHeight+2*s.padding).attr("y",s.headerHeight-s.padding).attr("text-anchor","start").attr("font-family",s.fontFamily).attr("font-size",s.fontSize+2+"px").attr("fill",s.fontColor).text(p.howToUse),c.append("text").attr("x",s.width/2).attr("y",s.height-s.footerHeight).attr("text-anchor","middle").attr("font-family",s.fontFamily).attr("font-size",s.fontSize).attr("fill",s.fontColor).html(`Template by: ${t.metadata.source} | ${t.metadata.license} | ${t.metadata.authors} | ${t.metadata.website}`),t.sections.forEach((e,t)=>{const i=e.id,n=p.sections[i],r=e.gridPosition.column*o+2*s.padding,d=e.gridPosition.row*a+s.headerHeight,l=e.gridPosition.colSpan*o,u=e.gridPosition.rowSpan*a,m={...s,...e.style};if(c.append("rect").attr("x",r).attr("y",d).attr("width",l).attr("height",u).attr("fill",m.sectionColor).attr("stroke",m.borderColor).attr("rx",m.cornerRadius).attr("ry",m.cornerRadius).attr("stroke-width",m.lineSize),e.highlight&&c.append("rect").attr("x",r).attr("y",d).attr("width",l).attr("height",u).attr("fill",m.highlightColor).attr("stroke",m.borderColor).attr("rx",m.cornerRadius).attr("ry",m.cornerRadius).attr("stroke-width",2*m.lineSize),e.journeySteps){const e=["","","","",""],t=e.length,i=Math.max(l/t-2*m.padding,m.stickyNoteSize),s=m.stickyNoteSize,n=0;c.append("defs").append("marker").attr("id","arrowhead").attr("markerWidth",4).attr("markerHeight",7).attr("refX",5).attr("refY",3.5).attr("orient","auto").append("polygon").attr("points","0 0, 5 3.5, 0 7").attr("fill",m.borderColor),e.forEach((t,o)=>{const a=r+o*(i+2*m.stickyNoteSpacing),l=a+i/2,u=d+m.stickyNoteSize;if(c.append("rect").attr("x",a).attr("y",d+m.stickyNoteSize/2+2*m.stickyNoteSpacing).attr("width",i).attr("height",s).attr("fill","#fff").attr("stroke",m.borderColor).attr("stroke-width",m.lineSize).attr("stroke-dasharray",3*m.lineSize).attr("rx",m.cornerRadius/2).attr("ry",m.cornerRadius/2),o{const t=g+e+" ",i=f.append("text").attr("font-family",m.fontFamily).attr("font-size",m.fontSize+"px").attr("fill",m.fontColor).attr("x",r+m.padding).attr("y",d+m.padding+m.circleRadius+2*m.padding+v*y).text(t);i.node().getComputedTextLength()>k?(i.remove(),c.append("text").attr("x",r+m.padding).attr("y",d+m.padding+m.circleRadius+2*m.padding+v*y).attr("font-family",s.fontFamily).attr("font-size",m.fontSize+"px").attr("fill",m.fontColor).text(g),g=e+" ",v++):(i.remove(),g=t)}),c.append("text").attr("x",r+m.padding).attr("y",d+m.padding+m.circleRadius+2*m.padding+v*y).attr("font-family",m.fontFamily).attr("font-size",m.fontSize+"px").attr("fill",m.fontColor).text(g)});c.append("defs").append("filter").attr("id","shadow").append("feDropShadow").attr("dx",3).attr("dy",3).attr("stdDeviation",2).attr("flood-color",s.shadowColor);document.getElementById("exportButton").onclick=()=>{const e={templateId:i.templateId,locale:i.locale,metadata:{...i.metadata,date:(new Date).toISOString()},sections:i.sections.map(e=>({sectionId:e.sectionId,stickyNotes:e.stickyNotes.map(e=>({content:e.content.replace(/\n/g,""),position:e.position,size:e.size,color:e.color}))}))},t=JSON.stringify(e,null,2),s=document.createElement("a");s.href="data:application/json;charset=utf-8,"+encodeURIComponent(t);const n=`${i.metadata.source||"Canvas"}_${i.templateId}_${i.locale}.json`;s.download=n,document.body.appendChild(s),s.click(),document.body.removeChild(s)},importButton.dataset.listenerAttached||(importButton.addEventListener("click",()=>{g.click()}),importButton.dataset.listenerAttached="true");document.getElementById("exportSVGButton").onclick=()=>{const e=c.node(),t=(new XMLSerializer).serializeToString(e),s=new Blob([t],{type:"image/svg+xml;charset=utf-8"}),n=document.createElement("a");n.href=URL.createObjectURL(s);const o=`${i.metadata.source||"Canvas"}_${i.templateId}_${i.locale}.svg`;n.download=o,document.body.appendChild(n),n.click(),document.body.removeChild(n)};document.querySelectorAll(".colorSwatch").forEach(e=>{e.addEventListener("click",()=>{l=e.dataset.color,m&&(m.color=l,d(i),m=null)})}),document.getElementById("metadataButton").addEventListener("click",()=>{document.getElementById("metadataForm").style.display="block"}),document.getElementById("saveMetadata").addEventListener("click",()=>{i.metadata={source:document.getElementById("source").value,license:document.getElementById("license").value,authors:document.getElementById("authors").value.split(","),website:document.getElementById("website").value},document.getElementById("metadataForm").style.display="none",c.selectAll("text.footer").remove(),c.append("text").attr("class","footer").attr("x",s.width/2).attr("y",s.height-s.footerHeight-2*s.padding).attr("text-anchor","middle").attr("font-family",s.fontFamily).attr("font-size",s.fontSize).attr("fill",s.fontColor).html(`Content by: ${i?.metadata?.source} | ${i?.metadata?.license} | ${i?.metadata?.authors} | ${i?.metadata?.website}`)});let h=0,v=0;function y(n,r){let u,p;if("mouse"===r)u=n.offsetX-s.stickyNoteSize/2,p=n.offsetY-s.stickyNoteSize/2;else if("touch"===r){const e=n.changedTouches[0],t=c.node().getBoundingClientRect();u=e.clientX-t.left-s.stickyNoteSize/2,p=e.clientY-t.top-s.stickyNoteSize/2}const m=t.sections.find(e=>{const t={x:e.gridPosition.column*o+2*s.padding,y:e.gridPosition.row*a+s.headerHeight,width:e.gridPosition.colSpan*o,height:e.gridPosition.rowSpan*a};return function(e,t,i){return e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height}(u+s.stickyNoteSize/2,p+s.stickyNoteSize/2,t)});if(m){i.sections.find(e=>e.sectionId===m.id).stickyNotes.push({content:e("Double-click on text to edit. Click and select color "),position:{x:u,y:p},size:s.stickyNoteSize,color:l}),d(i)}}c.on("click touchend",function(e){e.preventDefault(),function(e){let t,i;const s=c.node().getBoundingClientRect();if(e.type.startsWith("touch")){const n=e.changedTouches[0];t=n.clientX-s.left,i=n.clientY-s.top}else t=e.clientX-s.left,i=e.clientY-s.top}(e);const t=(new Date).getTime();"touchend"===e.type?(t-h<300&&y(e,"touch"),h=t):(t-v<300&&y(e,"mouse"),v=t)}),d(i)})(v,y,o)}let f=!1;window.addEventListener("beforeunload",function(e){if(y&&y.sections&&(f=y.sections.some(e=>e.stickyNotes.length>0),f)){const t="You have unsaved changes. Are you sure you want to leave this page?";return e.preventDefault(),e.returnValue=t,t}}),document.getElementById("locale").addEventListener("change",e=>{const t=e.target.value;document.getElementById("canvasSelector").style.display="block",h(t);const i=document.getElementById("canvas").value;i&&k(t,i)}),document.getElementById("canvas").addEventListener("change",e=>{k(document.getElementById("locale").value,e.target.value)}),function(){const e=document.getElementById("locale"),t=Object.keys(o),i=document.createElement("option");i.value="",i.text="Select Locale",e.add(i),t.forEach(t=>{const i=document.createElement("option");i.value=t,i.text=t,e.add(i)})}();const P=document.getElementById("locale"),I=document.getElementById("canvas");function A(e){if(y&&y.sections&&(f=y.sections.some(e=>e.stickyNotes.length>0),f)){if(confirm("Are you sure you want to remove sticky notes and change canvas?")){y.sections.forEach(e=>{e.stickyNotes=[]});return k(P.value,I.value),!1}e.target.blur()}}return P.addEventListener("focus",A),I.addEventListener("focus",A),c={loadCanvas:k}}var h=(l||(l=1,function(e,t){const i=r(),s=m(),n=a();t.createCanvas=s.loadCanvas,t.loadCanvas=s.loadCanvas,t.sanitizeInput=i.sanitizeInput,t.validateInput=i.validateInput,t.distributeMissingPositions=i.distributeMissingPositions,t.defaultStyles=n,e.exports={createCanvas:t.createCanvas,loadCanvas:t.loadCanvas,sanitizeInput:t.sanitizeInput,validateInput:t.validateInput,distributeMissingPositions:t.distributeMissingPositions,defaultStyles:t.defaultStyles}}(o,o.exports)),o.exports),g=e(h);export{g as default}; diff --git a/public/canvascreator/canvascreator.min.css b/public/canvascreator/canvascreator.min.css new file mode 100644 index 0000000..2632fe1 --- /dev/null +++ b/public/canvascreator/canvascreator.min.css @@ -0,0 +1 @@ +body{font-family:Arial,sans-serif;background-color:#f4f7fc;color:#333;margin:0;padding:20px}h1{color:#1a3987;font-size:2rem;margin-bottom:10px}p,ul{font-size:1rem;max-width:800px;margin:0 auto 10px auto;text-align:left}ul{list-style-type:disc;padding-left:20px}.help-icon{position:fixed;bottom:20px;right:20px;background:#0073e6;color:#fff;width:40px;height:40px;border-radius:50%;text-align:center;font-size:1.5rem;font-weight:700;cursor:pointer;line-height:40px;box-shadow:0 4px 6px rgba(0,0,0,.2);transition:.3s;user-select:none}.help-icon:hover{background:#005bb5}.help-tooltip{display:none;position:fixed;bottom:70px;right:20px;width:250px;background:#fff;color:#333;padding:12px;border-radius:8px;box-shadow:0 4px 8px rgba(0,0,0,.2);text-align:left;font-size:.9rem;line-height:1.4}.help-tooltip ul{padding-left:15px}.help-container:hover .help-tooltip{display:block}.sidenav{height:100%;width:0;position:fixed;z-index:1;top:0;left:0;background-color:#0073e6;overflow-x:hidden;transition:.5s;padding-top:60px}.sidenav a{padding:8px 8px 8px 32px;text-decoration:none;font-size:25px;color:#fff;display:block;transition:.3s}.sidenav a:hover{color:#f1f1f1}.sidenav .closebtn{position:absolute;top:0;right:25px;font-size:36px;margin-left:50px}@media screen and (max-height:450px){.sidenav{padding-top:15px}.sidenav a{font-size:18px}}#toolContainer{padding:20px;max-width:1000px;margin:auto;text-align:center}svg{touch-action:manipulation}#canvasCreator{background:#fff;padding:20px;border-radius:10px;box-shadow:0 4px 8px rgba(0,0,0,.2);width:1000px;height:750px;margin:auto}#canvasSelector,#localeSelector{display:flex;justify-content:center;margin:15px 0}select{padding:8px;border:1px solid #ccc;border-radius:5px;font-size:1rem}.canvas-tools{background:#0073e6;color:#fff;border:none;padding:12px 20px;margin:10px;border-radius:5px;cursor:pointer;font-size:1rem;transition:.3s}.canvas-tools:hover{background:#005bb5}#metadataForm{display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;padding:20px;border-radius:10px;box-shadow:0 4px 8px rgba(0,0,0,.2);z-index:10;width:300px}#metadataForm input{width:100%;padding:8px;margin:5px 0;border:1px solid #ccc;border-radius:5px}#metadataForm button{width:100%;padding:10px;background:#0073e6;color:#fff;border:none;border-radius:5px;cursor:pointer}#metadataForm button:hover{background:#005bb5}#colorPalette{display:flex;justify-content:center;margin-top:20px}.colorSwatch{width:40px;height:40px;margin:5px;border-radius:50%;border:2px solid #ccc;cursor:pointer;transition:transform .2s}.colorSwatch:hover{transform:scale(1.1)} \ No newline at end of file diff --git a/public/img/apiops-cycles-logo-2025-32.png b/public/img/apiops-cycles-logo-2025-32.png new file mode 100644 index 0000000..2b31245 Binary files /dev/null and b/public/img/apiops-cycles-logo-2025-32.png differ diff --git a/public/img/apiops-cycles-logo2025-blue.svg b/public/img/apiops-cycles-logo2025-blue.svg new file mode 100644 index 0000000..db84e57 --- /dev/null +++ b/public/img/apiops-cycles-logo2025-blue.svg @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/CanvasCreator.astro b/src/components/CanvasCreator.astro index 9495726..5c903cc 100644 --- a/src/components/CanvasCreator.astro +++ b/src/components/CanvasCreator.astro @@ -1,13 +1,87 @@ --- -interface Props { - canvasId: string; -} -const { canvasId } = Astro.props as Props; --- + + + +
+

APIOps Cycles Canvas Creator

+
+ + +
-
- +
+ + +
+
+ + + + + +
+ + + + + +
+
+
+
+ +
+ +
+
?
+
+ Canvas Help +
    +
  • Open: Select locale & canvas.
  • +
  • Create/Edit: Import JSON or double-click.
  • +
  • Change Color: Click note, pick color.
  • +
  • Remove: Right-click & confirm.
  • +
  • Save: Export as JSON (local only).
  • +
  • Export: Save as SVG for slides/web.
  • +
+
+
+ + \ No newline at end of file