diff --git a/ui/package.json b/ui/package.json index 329331e064..b0b7dd2bfb 100644 --- a/ui/package.json +++ b/ui/package.json @@ -89,6 +89,7 @@ "@rjsf/shadcn": "6.5.1", "@rjsf/utils": "6.5.1", "@rjsf/validator-ajv8": "6.5.1", + "@scalar/api-reference-react": "0.6.31", "@tanstack/react-table": "8.21.3", "@types/node": "24.1.0", "@xterm/addon-fit": "0.11.0", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index 80be38dd53..47a374445a 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: '@rjsf/validator-ajv8': specifier: 6.5.1 version: 6.5.1(@rjsf/utils@6.5.1(react@19.1.6)) + '@scalar/api-reference-react': + specifier: 0.6.31 + version: 0.6.31(axios@1.14.0)(change-case@5.4.4)(react@19.1.6)(tailwindcss@4.1.18)(typescript@5.8.3) '@tanstack/react-table': specifier: 8.21.3 version: 8.21.3(react-dom@19.1.6(react@19.1.6))(react@19.1.6) @@ -435,6 +438,45 @@ packages: '@chevrotain/types@11.1.2': resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} + '@codemirror/autocomplete@6.20.0': + resolution: {integrity: sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==} + + '@codemirror/commands@6.10.2': + resolution: {integrity: sha512-vvX1fsih9HledO1c9zdotZYUZnE4xV0m6i3m25s5DIfXofuprk6cRcLUZvSk3CASUbwjQX21tOGbkY2BH8TpnQ==} + + '@codemirror/lang-css@6.3.1': + resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + + '@codemirror/lang-html@6.4.11': + resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} + + '@codemirror/lang-javascript@6.2.4': + resolution: {integrity: sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==} + + '@codemirror/lang-json@6.0.2': + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + + '@codemirror/lang-xml@6.1.0': + resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} + + '@codemirror/lang-yaml@6.1.2': + resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} + + '@codemirror/language@6.12.2': + resolution: {integrity: sha512-jEPmz2nGGDxhRTg3lTpzmIyGKxz3Gp3SJES4b0nAuE5SWQoKdT5GoQ69cwMmFd+wvFUhYirtDTr0/DRHpQAyWg==} + + '@codemirror/lint@6.9.4': + resolution: {integrity: sha512-ABc9vJ8DEmvOWuH26P3i8FpMWPQkduD9Rvba5iwb6O3hxASgclm3T3krGo8NASXkHCidz6b++LWlzWIUfEPSWw==} + + '@codemirror/search@6.6.0': + resolution: {integrity: sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==} + + '@codemirror/state@6.5.4': + resolution: {integrity: sha512-8y7xqG/hpB53l25CIoit9/ngxdfoG+fx+V3SHBrinnhOtLvKHRyAJJuHzkWrR4YXXLX8eXBsejgAAxHUOdW1yw==} + + '@codemirror/view@6.39.15': + resolution: {integrity: sha512-aCWjgweIIXLBHh7bY6cACvXuyrZ0xGafjQ2VInjp4RM4gMfscK5uESiNdrH0pE+e1lZr2B4ONGsjchl2KsKZzg==} + '@csstools/color-helpers@6.0.2': resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} @@ -879,6 +921,21 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/vue@1.1.11': + resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} + + '@headlessui/tailwindcss@0.2.2': + resolution: {integrity: sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==} + engines: {node: '>=10'} + peerDependencies: + tailwindcss: ^3.0 || ^4.0 + + '@headlessui/vue@1.7.23': + resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} + engines: {node: '>=10'} + peerDependencies: + vue: ^3.2.0 + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -899,12 +956,39 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@hyperjump/browser@1.3.1': + resolution: {integrity: sha512-Le5XZUjnVqVjkgLYv6yyWgALat/0HpB1XaCPuCZ+GCFki9NvXloSZITIJ0H+wRW7mb9At1SxvohKBbNQbrr/cw==} + engines: {node: '>=18.0.0'} + + '@hyperjump/json-pointer@1.1.2': + resolution: {integrity: sha512-zPNgu1zdhtjQHFNLGzvEsLDsLOEvhRj6u6ktIQmlz7YPESv5uF8SnAe3Dq0oL6gZ6OGWSLq2n7pphRNF6Hpg6w==} + + '@hyperjump/json-schema-formats@1.0.1': + resolution: {integrity: sha512-qvcIxysnMfcPxyPSFFzzo28o2BN1CNT5b0tQXNUP0kaFpvptQNDg8SCLvlnMg2sYxuiuqna8+azGBaBthiskAw==} + + '@hyperjump/json-schema@1.17.5': + resolution: {integrity: sha512-f/yM4hQsBQYNEDu8zxmAZNfa/GxquWoC1FzUY0ADbSjsN8B3ICagdCPg4F2rrRET+/MJp/qKecgIF7GtdjX0sg==} + peerDependencies: + '@hyperjump/browser': ^1.1.0 + + '@hyperjump/pact@1.4.0': + resolution: {integrity: sha512-01Q7VY6BcAkp9W31Fv+ciiZycxZHGlR2N6ba9BifgyclHYHdbaZgITo0U6QMhYRlem4k8pf8J31/tApxvqAz8A==} + + '@hyperjump/uri@1.3.3': + resolution: {integrity: sha512-rUqeUdL2aW7lzvSnCL6yUetXYzqxhsBEw9Z7Y1bEhgiRzcfO3kjY0UdD6c4H/bzxe0fXIjYuocjWQzinio8JTQ==} + '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} '@iconify/utils@3.1.3': resolution: {integrity: sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==} + '@internationalized/date@3.12.0': + resolution: {integrity: sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ==} + + '@internationalized/number@3.6.5': + resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1047,6 +1131,36 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@lezer/common@1.5.1': + resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} + + '@lezer/css@1.3.1': + resolution: {integrity: sha512-PYAKeUVBo3HFThruRyp/iK91SwiZJnzXh8QzkQlwijB5y+N5iB28+iLk78o2zmKqqV0uolNhCwFqB8LA7b0Svg==} + + '@lezer/highlight@1.2.3': + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} + + '@lezer/html@1.3.13': + resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==} + + '@lezer/javascript@1.5.4': + resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} + + '@lezer/json@1.0.3': + resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} + + '@lezer/lr@1.4.8': + resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} + + '@lezer/xml@1.0.6': + resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} + + '@lezer/yaml@1.0.4': + resolution: {integrity: sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==} + + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + '@mermaid-js/parser@1.1.1': resolution: {integrity: sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==} @@ -1113,6 +1227,9 @@ packages: resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} engines: {node: '>=20.0.0'} + '@phosphor-icons/core@2.1.1': + resolution: {integrity: sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==} + '@playwright/test@1.59.1': resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==} engines: {node: '>=18'} @@ -1121,6 +1238,9 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -1608,6 +1728,13 @@ packages: react-redux: optional: true + '@replit/codemirror-css-color-picker@6.3.0': + resolution: {integrity: sha512-19biDANghUm7Fz7L1SNMIhK48tagaWuCOHj4oPPxc7hxPGkTVY2lU/jVZ8tsbTKQPVG7BO2CBDzs7CBwb20t4A==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@rjsf/core@6.5.1': resolution: {integrity: sha512-H5GY9OU6wpLXGHaVzd8/1qGZ+zylCA86maD32tMdeOiUIJTmH6+VeheRx4Wr6OnprxbD/ybkEH48vIqS68wwxg==} engines: {node: '>=20'} @@ -1760,12 +1887,98 @@ packages: cpu: [x64] os: [win32] + '@scalar/api-client@2.3.34': + resolution: {integrity: sha512-TwhtLNr/1AlbsOe52imeriggpYcLQX12rVR953LAN5GX4B1cwvnOuA/2kX6EhpxWYM6tbgQaojmIZAB3mMaxXA==} + engines: {node: '>=18'} + + '@scalar/api-reference-react@0.6.31': + resolution: {integrity: sha512-fjCfSdCgTG3XYvRdCViwmcWqfcv1sYhjCNu9zZwq0Fw/hjRcFnJCjxFhwfN6kJT1lRl2jRgC72zKeDaUqmO3oA==} + engines: {node: '>=18'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + '@scalar/api-reference@1.28.34': + resolution: {integrity: sha512-PRCnjbnZl0ToYbLsPzk7r/yrBZTPBda/zG2Pgws0BG+JllqX1/1qoUWuNyW18ZlLCP8mOl8Tq6nn3me7w6buzQ==} + engines: {node: '>=18'} + + '@scalar/code-highlight@0.0.29': + resolution: {integrity: sha512-GKOd8oQZNMVDGgq92u4ICqaJlQ+ClGzKjVonGVjO8bhCIN0zUneStWN7kfA8ik+8Ry6h3Keqs3+Z0I1DEoJGqg==} + engines: {node: '>=18'} + + '@scalar/components@0.13.59': + resolution: {integrity: sha512-Um2cYyNZoA+wCs196d4vnbf3s+xMt9JtH8l7z1fqogxQ8vE4FiZNN1SYpNLjJ8d8V29qsYWm60dDpCA6t+GsBQ==} + engines: {node: '>=18'} + + '@scalar/draggable@0.1.11': + resolution: {integrity: sha512-EQW9N1+mDORhsbjdtCI3XDvmUKsuKw1uf6r3kT1Mm2zQKT+rWwA0ChsAkEN6OG62C0YumMuXpH71h1seAWptxw==} + engines: {node: '>=18'} + + '@scalar/icons@0.3.7': + resolution: {integrity: sha512-S0e8EQyc4MYW5MUGVMehUPgDrgDX8nGUQ/KTv9WVxZDbDOxXID0NVtkPMa+jQ2ep0obzJmjRqh8NTlnGIEGYiA==} + engines: {node: '>=18'} + + '@scalar/import@0.3.27': + resolution: {integrity: sha512-E8WLCwo0oLUfC22HEK9HPpJqtOb1cotsghIDZ08jG+ZzirogLSeIU9wl4cfIiHShxFZGQqql1bp1hi0FBrCA8w==} + engines: {node: '>=18'} + + '@scalar/oas-utils@0.2.144': + resolution: {integrity: sha512-7U2cHC2zuSwRPecluD5aO3j2FL60aF1DjKXBuFjsVL690QQo2oFxImYBjNm4qvWrVrWV9HpZZNUmZ8AdB0MdNw==} + engines: {node: '>=18'} + + '@scalar/object-utils@1.1.14': + resolution: {integrity: sha512-nOc1sd6TXN1kMacduYUUpavEomQi1OD91NQRlqLYQSYxyqgpQ2+ZyA1QyfdIVgikO9plkx69H9bQ7nCyKj8/1w==} + engines: {node: '>=18'} + + '@scalar/openapi-parser@0.10.17': + resolution: {integrity: sha512-SO+vw+kv8xEROJ527KpiT5ccAVQZuE6n8G4qTN6b72QVT0URHoLwr8uHQQnEGlyA0QhAx7En+lKD1Hy39xZ9oQ==} + engines: {node: '>=18'} + + '@scalar/openapi-types@0.2.3': + resolution: {integrity: sha512-O1GwqLpcRc3GKXTbeBZ5E12fXR2ltpqGWk4RfhoN4ebKZsPVknV5at5425G97E1SwMy12BporRvn90k1Z+MruQ==} + engines: {node: '>=18'} + + '@scalar/postman-to-openapi@0.2.17': + resolution: {integrity: sha512-Pjlsle4I6A7UjgY40teLHDef51mv4xQbCj6sHCmiox1/+1bmPfh8ieG2GpeDBzsBbKGiu3gnTseC+r2/UYRtrg==} + engines: {node: '>=18'} + + '@scalar/snippetz@0.2.20': + resolution: {integrity: sha512-MX55ePxHuS8xiunYmmgCRPsAjwWXkP0+2Y1y07Nzx8K3iRvMAfDD7YhpGsaqKp4Tlz0DKYGYuGtOj8+g63FObA==} + engines: {node: '>=18'} + + '@scalar/themes@0.11.3': + resolution: {integrity: sha512-47+eQ/X4SSfxEoxSYicmRA2KAJpxY5s4eAV8m6hnhSNc9k8MuYUuI68jI5H8JOf0O6axQUdgyNfMTMsG7m6sEg==} + engines: {node: '>=18'} + + '@scalar/types@0.1.16': + resolution: {integrity: sha512-v1L96F8Inn27NUw5Xcl0iifw3SOX0R9WBV6GeswR23s8i1SJz7UiLEi8rLOqOB5DiLtC8hDK0kNl4TKn7MNJWQ==} + engines: {node: '>=18'} + + '@scalar/use-codemirror@0.11.104': + resolution: {integrity: sha512-BDIi9+IidKcjmcO0DW5Cz44g3+1Bw3FnqdClsSmlxEf/9ClDKixe1yjgBf1u970YsOcvfMBGhRdF3Up//QpzgA==} + engines: {node: '>=18'} + + '@scalar/use-hooks@0.1.50': + resolution: {integrity: sha512-/9FDyuU62Gg/a2Qsa7cRYNhdkON0FzRWRD9f4W0t+9Tm9/HNvGdm6yKaSh43S0kR0ia2AAgZEVg646H+Fqam4Q==} + engines: {node: '>=18'} + + '@scalar/use-toasts@0.7.10': + resolution: {integrity: sha512-kp1DdHlV+YlHqta9mblrZuhHZmQnnkmJ6ZO0KUiGgEqwyJ5V53IseelEo9vhK+ulcKRlPbWFneI69+wt2yuPNA==} + engines: {node: '>=18'} + + '@scalar/use-tooltip@1.0.7': + resolution: {integrity: sha512-hXkLLOhyR/FMSNd2g+WWKETheyv4xQeRVJeiLxwkmixid/qdKSvpCz98+K6WN6QV3qIRtOnkeCYDunts6JX/JA==} + engines: {node: '>=18'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + '@swc/helpers@0.5.20': + resolution: {integrity: sha512-2egEBHUMasdypIzrprsu8g+OEVd7Vp2MM3a2eVlM/cyFYto0nGz5BX5BTgh/ShZZI9ed+ozEq+Ngt+rgmUs8tw==} + '@tailwindcss/node@4.1.18': resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} @@ -1865,6 +2078,14 @@ packages: resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} engines: {node: '>=12'} + '@tanstack/virtual-core@3.13.23': + resolution: {integrity: sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==} + + '@tanstack/vue-virtual@3.13.23': + resolution: {integrity: sha512-b5jPluAR6U3eOq6GWAYSpj3ugnAIZgGR0e6aGAgyRse0Yu6MVQQ0ZWm9SArSXWtageogn6bkVD8D//c4IjW3xQ==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -2065,6 +2286,9 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} + '@types/node@24.1.0': resolution: {integrity: sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==} @@ -2121,6 +2345,9 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -2187,6 +2414,20 @@ packages: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher + '@unhead/dom@1.11.20': + resolution: {integrity: sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==} + + '@unhead/schema@1.11.20': + resolution: {integrity: sha512-0zWykKAaJdm+/Y7yi/Yds20PrUK7XabLe9c3IRcjnwYmSWY6z0Cr19VIs3ozCj8P+GhR+/TI2mwtGlueCEYouA==} + + '@unhead/shared@1.11.20': + resolution: {integrity: sha512-1MOrBkGgkUXS+sOKz/DBh4U20DNoITlJwpmvSInxEUNhghSNb56S0RnaHRq0iHkhrO/cDgz2zvfdlRpoPLGI3w==} + + '@unhead/vue@1.11.20': + resolution: {integrity: sha512-sqQaLbwqY9TvLEGeq8Fd7+F2TIuV3nZ5ihVISHjWpAM3y7DwNWRU7NmT9+yYT+2/jw1Vjwdkv5/HvDnvCLrgmg==} + peerDependencies: + vue: '>=2.7 || >=3' + '@upsetjs/venn.js@2.0.0': resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} @@ -2219,6 +2460,97 @@ packages: '@vitest/utils@4.1.0': resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} + '@vue/compiler-core@3.5.29': + resolution: {integrity: sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==} + + '@vue/compiler-dom@3.5.29': + resolution: {integrity: sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==} + + '@vue/compiler-sfc@3.5.29': + resolution: {integrity: sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==} + + '@vue/compiler-ssr@3.5.29': + resolution: {integrity: sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/reactivity@3.5.29': + resolution: {integrity: sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==} + + '@vue/runtime-core@3.5.29': + resolution: {integrity: sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==} + + '@vue/runtime-dom@3.5.29': + resolution: {integrity: sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==} + + '@vue/server-renderer@3.5.29': + resolution: {integrity: sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==} + peerDependencies: + vue: 3.5.29 + + '@vue/shared@3.5.29': + resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==} + + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + + '@vueuse/core@11.3.0': + resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} + + '@vueuse/integrations@11.3.0': + resolution: {integrity: sha512-5fzRl0apQWrDezmobchoiGTkGw238VWESxZHazfhP3RM7pDSiyXy18QbfYkILoYNTd23HPAfQTJpkUc5QbkwTw==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + + '@vueuse/metadata@11.3.0': + resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} + + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + + '@vueuse/shared@11.3.0': + resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -2335,6 +2667,14 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -2343,6 +2683,14 @@ packages: ajv: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -2409,6 +2757,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + autoprefixer@10.4.27: resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} engines: {node: ^10 || ^12 || >=14} @@ -2416,6 +2767,9 @@ packages: peerDependencies: postcss: ^8.1.0 + axios@1.14.0: + resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==} + babel-loader@10.0.0: resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} @@ -2523,6 +2877,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -2570,6 +2928,9 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc + codemirror@6.0.2: + resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2583,6 +2944,10 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -2676,6 +3041,9 @@ packages: typescript: optional: true + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + cron-parser@5.3.1: resolution: {integrity: sha512-Mu5Jk1b4cUfY8u34+thI9TZxvQiuhaMBS2Ag84rOSoHlU33xtIPkXwr6lWuw3XPmxSxq317B+hl0o4J+LdhwNg==} engines: {node: '>=18'} @@ -2725,6 +3093,14 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cva@1.0.0-beta.2: + resolution: {integrity: sha512-dqcOFe247I5pKxfuzqfq3seLL5iMYsTgo40Uw7+pKZAntPgFtR7Tmy59P5IVIq/XgB0NQWoIvYDt9TwHkuK8Cg==} + peerDependencies: + typescript: '>= 4.5.5 < 6' + peerDependenciesMeta: + typescript: + optional: true + cytoscape-cose-bilkent@4.1.0: resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: @@ -2932,9 +3308,16 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delaunator@5.1.0: resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -3036,6 +3419,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -3063,6 +3450,10 @@ packages: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es-toolkit@1.45.1: resolution: {integrity: sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==} @@ -3148,6 +3539,9 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -3250,6 +3644,9 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + focus-trap@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -3259,6 +3656,10 @@ packages: debug: optional: true + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -3297,6 +3698,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + fuse.js@7.1.0: + resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} + engines: {node: '>=10'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -3309,6 +3714,10 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -3316,6 +3725,9 @@ packages: get-tsconfig@4.10.0: resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3365,6 +3777,10 @@ packages: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -3373,19 +3789,80 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + highlightjs-curl@1.3.0: + resolution: {integrity: sha512-50UEfZq1KR0Lfk2Tr6xb/MUIZH3h10oNC0OTy9g7WELcs5Fgy/mKN1vEhuKTkKbdo8vr5F9GXstu2eLhApfQ3A==} + + highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -3415,6 +3892,9 @@ packages: html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + html-webpack-plugin@5.6.7: resolution: {integrity: sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==} engines: {node: '>=10.13.0'} @@ -3427,6 +3907,9 @@ packages: webpack: optional: true + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -3483,6 +3966,9 @@ packages: peerDependencies: postcss: ^8.1.0 + idn-hostname@15.1.8: + resolution: {integrity: sha512-MmLwddtSVyMtzYxx+xs2IFEbfyg/facubL/mEaAoJX/XIfjt1ly5QhPByihf4yrxZYbkQfRZVEnBgISv/e2ZWw==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -3546,6 +4032,10 @@ packages: resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} engines: {node: '>= 10'} + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -3595,6 +4085,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -3610,6 +4104,10 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -3676,6 +4174,10 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-deterministic@1.0.12: + resolution: {integrity: sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==} + engines: {node: '>= 4'} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -3688,6 +4190,12 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} + just-clone@6.2.0: + resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} + + just-curry-it@5.3.0: + resolution: {integrity: sha512-silMIRiFjUWlfaDhkgSzpuAyQ6EX/o09Eu8ZBfmFwQMbax7+LQzeIU2CBrICT6Ne4l86ITCGvUCBpCubWYy0Yw==} + katex@0.16.45: resolution: {integrity: sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==} hasBin: true @@ -3714,6 +4222,10 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + leven@4.1.0: + resolution: {integrity: sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3826,6 +4338,9 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lowlight@3.3.0: + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} + lru-cache@11.2.6: resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} @@ -3955,6 +4470,9 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + microdiff@1.5.0: + resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -4138,6 +4656,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.11: + resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} + engines: {node: ^18 || >=20} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -4244,6 +4767,9 @@ packages: package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + packrup@0.1.2: + resolution: {integrity: sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==} + param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -4262,6 +4788,10 @@ packages: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} @@ -4398,6 +4928,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} @@ -4405,6 +4939,10 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + prism-react-renderer@2.4.1: resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} peerDependencies: @@ -4428,6 +4966,10 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -4446,6 +4988,11 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + radix-vue@1.9.17: + resolution: {integrity: sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==} + peerDependencies: + vue: '>= 3.2.0' + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -4590,6 +5137,24 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + + rehype-format@5.0.1: + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -4855,6 +5420,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -4873,6 +5442,9 @@ packages: peerDependencies: webpack: ^5.27.0 + style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -4921,10 +5493,16 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} + tailwind-merge@2.6.1: + resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==} + tailwind-merge@3.3.1: resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} @@ -5000,6 +5578,9 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + tldts-core@7.0.23: resolution: {integrity: sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==} @@ -5049,6 +5630,10 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + ts-deepmerge@7.0.3: + resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} + engines: {node: '>=14.13.1'} + ts-loader@9.5.7: resolution: {integrity: sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==} engines: {node: '>=12.0.0'} @@ -5090,6 +5675,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} @@ -5097,9 +5685,15 @@ packages: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} + unhead@1.11.20: + resolution: {integrity: sha512-3AsNQC0pjwlLqEYHLjtichGWankK8yqmocReITecmpB1H0aOabeESueyy+8X1gyJx4ftZVwo9hqQ4O3fPWffCA==} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -5192,10 +5786,18 @@ packages: deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + vfile-message@4.0.3: resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} @@ -5322,18 +5924,51 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true - watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} - engines: {node: '>=10.13.0'} + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 - wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + vue-sonner@1.3.2: + resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==} - webidl-conversions@8.0.1: + vue@3.5.29: + resolution: {integrity: sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + watchpack@2.5.1: + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -5407,6 +6042,10 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} @@ -5495,6 +6134,12 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zhead@2.2.4: + resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} + + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -5702,6 +6347,106 @@ snapshots: '@chevrotain/types@11.1.2': {} + '@codemirror/autocomplete@6.20.0': + dependencies: + '@codemirror/language': 6.12.2 + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + '@lezer/common': 1.5.1 + + '@codemirror/commands@6.10.2': + dependencies: + '@codemirror/language': 6.12.2 + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + '@lezer/common': 1.5.1 + + '@codemirror/lang-css@6.3.1': + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.2 + '@codemirror/state': 6.5.4 + '@lezer/common': 1.5.1 + '@lezer/css': 1.3.1 + + '@codemirror/lang-html@6.4.11': + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.12.2 + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + '@lezer/common': 1.5.1 + '@lezer/css': 1.3.1 + '@lezer/html': 1.3.13 + + '@codemirror/lang-javascript@6.2.4': + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.2 + '@codemirror/lint': 6.9.4 + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + '@lezer/common': 1.5.1 + '@lezer/javascript': 1.5.4 + + '@codemirror/lang-json@6.0.2': + dependencies: + '@codemirror/language': 6.12.2 + '@lezer/json': 1.0.3 + + '@codemirror/lang-xml@6.1.0': + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.2 + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + '@lezer/common': 1.5.1 + '@lezer/xml': 1.0.6 + + '@codemirror/lang-yaml@6.1.2': + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.2 + '@codemirror/state': 6.5.4 + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + '@lezer/yaml': 1.0.4 + + '@codemirror/language@6.12.2': + dependencies: + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + style-mod: 4.1.3 + + '@codemirror/lint@6.9.4': + dependencies: + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + crelt: 1.0.6 + + '@codemirror/search@6.6.0': + dependencies: + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + crelt: 1.0.6 + + '@codemirror/state@6.5.4': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/view@6.39.15': + dependencies: + '@codemirror/state': 6.5.4 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + '@csstools/color-helpers@6.0.2': {} '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': @@ -6007,6 +6752,24 @@ snapshots: '@floating-ui/utils@0.2.11': {} + '@floating-ui/vue@1.1.11(vue@3.5.29(typescript@5.8.3))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + vue-demi: 0.14.10(vue@3.5.29(typescript@5.8.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@headlessui/tailwindcss@0.2.2(tailwindcss@4.1.18)': + dependencies: + tailwindcss: 4.1.18 + + '@headlessui/vue@1.7.23(vue@3.5.29(typescript@5.8.3))': + dependencies: + '@tanstack/vue-virtual': 3.13.23(vue@3.5.29(typescript@5.8.3)) + vue: 3.5.29(typescript@5.8.3) + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -6020,6 +6783,36 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@hyperjump/browser@1.3.1': + dependencies: + '@hyperjump/json-pointer': 1.1.2 + '@hyperjump/uri': 1.3.3 + content-type: 1.0.5 + just-curry-it: 5.3.0 + + '@hyperjump/json-pointer@1.1.2': {} + + '@hyperjump/json-schema-formats@1.0.1': + dependencies: + '@hyperjump/uri': 1.3.3 + idn-hostname: 15.1.8 + + '@hyperjump/json-schema@1.17.5(@hyperjump/browser@1.3.1)': + dependencies: + '@hyperjump/browser': 1.3.1 + '@hyperjump/json-pointer': 1.1.2 + '@hyperjump/json-schema-formats': 1.0.1 + '@hyperjump/pact': 1.4.0 + '@hyperjump/uri': 1.3.3 + content-type: 1.0.5 + json-stringify-deterministic: 1.0.12 + just-curry-it: 5.3.0 + uuid: 9.0.1 + + '@hyperjump/pact@1.4.0': {} + + '@hyperjump/uri@1.3.3': {} + '@iconify/types@2.0.0': {} '@iconify/utils@3.1.3': @@ -6028,6 +6821,14 @@ snapshots: '@iconify/types': 2.0.0 import-meta-resolve: 4.2.0 + '@internationalized/date@3.12.0': + dependencies: + '@swc/helpers': 0.5.20 + + '@internationalized/number@3.6.5': + dependencies: + '@swc/helpers': 0.5.20 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6181,6 +6982,54 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} + '@lezer/common@1.5.1': {} + + '@lezer/css@1.3.1': + dependencies: + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + + '@lezer/highlight@1.2.3': + dependencies: + '@lezer/common': 1.5.1 + + '@lezer/html@1.3.13': + dependencies: + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + + '@lezer/javascript@1.5.4': + dependencies: + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + + '@lezer/json@1.0.3': + dependencies: + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + + '@lezer/lr@1.4.8': + dependencies: + '@lezer/common': 1.5.1 + + '@lezer/xml@1.0.6': + dependencies: + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + + '@lezer/yaml@1.0.4': + dependencies: + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + + '@marijn/find-cluster-break@1.0.2': {} + '@mermaid-js/parser@1.1.1': dependencies: '@chevrotain/types': 11.1.2 @@ -6304,12 +7153,16 @@ snapshots: tslib: 2.8.1 tsyringe: 4.10.0 + '@phosphor-icons/core@2.1.1': {} + '@playwright/test@1.59.1': dependencies: playwright: 1.59.1 '@polka/url@1.0.0-next.29': {} + '@popperjs/core@2.11.8': {} + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -6822,6 +7675,12 @@ snapshots: react: 19.1.6 react-redux: 9.2.0(@types/react@19.1.8)(react@19.1.6)(redux@5.0.1) + '@replit/codemirror-css-color-picker@6.3.0(@codemirror/language@6.12.2)(@codemirror/state@6.5.4)(@codemirror/view@6.39.15)': + dependencies: + '@codemirror/language': 6.12.2 + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + '@rjsf/core@6.5.1(@rjsf/utils@6.5.1(react@19.1.6))(react@19.1.6)': dependencies: '@rjsf/utils': 6.5.1(react@19.1.6) @@ -6955,10 +7814,302 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.0': optional: true + '@scalar/api-client@2.3.34(axios@1.14.0)(change-case@5.4.4)(tailwindcss@4.1.18)(typescript@5.8.3)': + dependencies: + '@headlessui/tailwindcss': 0.2.2(tailwindcss@4.1.18) + '@headlessui/vue': 1.7.23(vue@3.5.29(typescript@5.8.3)) + '@scalar/components': 0.13.59(typescript@5.8.3) + '@scalar/draggable': 0.1.11(typescript@5.8.3) + '@scalar/icons': 0.3.7(typescript@5.8.3) + '@scalar/import': 0.3.27 + '@scalar/oas-utils': 0.2.144 + '@scalar/object-utils': 1.1.14 + '@scalar/openapi-parser': 0.10.17 + '@scalar/openapi-types': 0.2.3 + '@scalar/postman-to-openapi': 0.2.17 + '@scalar/snippetz': 0.2.20 + '@scalar/themes': 0.11.3 + '@scalar/types': 0.1.16 + '@scalar/use-codemirror': 0.11.104(typescript@5.8.3) + '@scalar/use-hooks': 0.1.50(typescript@5.8.3) + '@scalar/use-toasts': 0.7.10(typescript@5.8.3) + '@scalar/use-tooltip': 1.0.7(typescript@5.8.3) + '@vueuse/core': 10.11.1(vue@3.5.29(typescript@5.8.3)) + '@vueuse/integrations': 11.3.0(axios@1.14.0)(change-case@5.4.4)(focus-trap@7.8.0)(fuse.js@7.1.0)(vue@3.5.29(typescript@5.8.3)) + focus-trap: 7.8.0 + fuse.js: 7.1.0 + microdiff: 1.5.0 + nanoid: 5.1.11 + pretty-bytes: 6.1.1 + pretty-ms: 8.0.0 + shell-quote: 1.8.4 + type-fest: 4.41.0 + vue: 3.5.29(typescript@5.8.3) + vue-router: 4.6.4(vue@3.5.29(typescript@5.8.3)) + whatwg-mimetype: 4.0.0 + yaml: 2.8.3 + zod: 3.24.1 + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + + '@scalar/api-reference-react@0.6.31(axios@1.14.0)(change-case@5.4.4)(react@19.1.6)(tailwindcss@4.1.18)(typescript@5.8.3)': + dependencies: + '@scalar/api-reference': 1.28.34(axios@1.14.0)(change-case@5.4.4)(tailwindcss@4.1.18)(typescript@5.8.3) + '@scalar/types': 0.1.16 + react: 19.1.6 + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + + '@scalar/api-reference@1.28.34(axios@1.14.0)(change-case@5.4.4)(tailwindcss@4.1.18)(typescript@5.8.3)': + dependencies: + '@floating-ui/vue': 1.1.11(vue@3.5.29(typescript@5.8.3)) + '@headlessui/vue': 1.7.23(vue@3.5.29(typescript@5.8.3)) + '@scalar/api-client': 2.3.34(axios@1.14.0)(change-case@5.4.4)(tailwindcss@4.1.18)(typescript@5.8.3) + '@scalar/code-highlight': 0.0.29 + '@scalar/components': 0.13.59(typescript@5.8.3) + '@scalar/icons': 0.3.7(typescript@5.8.3) + '@scalar/oas-utils': 0.2.144 + '@scalar/openapi-parser': 0.10.17 + '@scalar/openapi-types': 0.2.3 + '@scalar/snippetz': 0.2.20 + '@scalar/themes': 0.11.3 + '@scalar/types': 0.1.16 + '@scalar/use-hooks': 0.1.50(typescript@5.8.3) + '@scalar/use-toasts': 0.7.10(typescript@5.8.3) + '@unhead/vue': 1.11.20(vue@3.5.29(typescript@5.8.3)) + '@vueuse/core': 10.11.1(vue@3.5.29(typescript@5.8.3)) + flatted: 3.4.2 + fuse.js: 7.1.0 + github-slugger: 2.0.0 + microdiff: 1.5.0 + nanoid: 5.1.11 + vue: 3.5.29(typescript@5.8.3) + zod: 3.24.1 + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - supports-color + - tailwindcss + - typescript + - universal-cookie + + '@scalar/code-highlight@0.0.29': + dependencies: + hast-util-to-text: 4.0.2 + highlight.js: 11.11.1 + highlightjs-curl: 1.3.0 + highlightjs-vue: 1.0.0 + lowlight: 3.3.0 + rehype-external-links: 3.0.0 + rehype-format: 5.0.1 + rehype-parse: 9.0.1 + rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-stringify: 11.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - supports-color + + '@scalar/components@0.13.59(typescript@5.8.3)': + dependencies: + '@floating-ui/utils': 0.2.11 + '@floating-ui/vue': 1.1.11(vue@3.5.29(typescript@5.8.3)) + '@headlessui/vue': 1.7.23(vue@3.5.29(typescript@5.8.3)) + '@scalar/code-highlight': 0.0.29 + '@scalar/icons': 0.3.7(typescript@5.8.3) + '@scalar/themes': 0.11.3 + '@scalar/use-hooks': 0.1.50(typescript@5.8.3) + '@scalar/use-toasts': 0.7.10(typescript@5.8.3) + '@vueuse/core': 10.11.1(vue@3.5.29(typescript@5.8.3)) + cva: 1.0.0-beta.2(typescript@5.8.3) + nanoid: 5.1.11 + pretty-bytes: 6.1.1 + radix-vue: 1.9.17(vue@3.5.29(typescript@5.8.3)) + vue: 3.5.29(typescript@5.8.3) + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@scalar/draggable@0.1.11(typescript@5.8.3)': + dependencies: + vue: 3.5.29(typescript@5.8.3) + transitivePeerDependencies: + - typescript + + '@scalar/icons@0.3.7(typescript@5.8.3)': + dependencies: + '@phosphor-icons/core': 2.1.1 + '@scalar/use-hooks': 0.1.50(typescript@5.8.3) + '@types/node': 20.19.43 + chalk: 5.6.2 + vue: 3.5.29(typescript@5.8.3) + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + + '@scalar/import@0.3.27': + dependencies: + '@scalar/oas-utils': 0.2.144 + '@scalar/openapi-parser': 0.10.17 + yaml: 2.8.3 + + '@scalar/oas-utils@0.2.144': + dependencies: + '@hyperjump/browser': 1.3.1 + '@hyperjump/json-schema': 1.17.5(@hyperjump/browser@1.3.1) + '@scalar/object-utils': 1.1.14 + '@scalar/openapi-types': 0.2.3 + '@scalar/themes': 0.11.3 + '@scalar/types': 0.1.16 + flatted: 3.4.2 + microdiff: 1.5.0 + nanoid: 5.1.11 + type-fest: 4.41.0 + yaml: 2.8.3 + zod: 3.24.1 + + '@scalar/object-utils@1.1.14': + dependencies: + flatted: 3.4.2 + just-clone: 6.2.0 + ts-deepmerge: 7.0.3 + type-fest: 4.41.0 + + '@scalar/openapi-parser@0.10.17': + dependencies: + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + ajv-formats: 3.0.1(ajv@8.20.0) + jsonpointer: 5.0.1 + leven: 4.1.0 + yaml: 2.8.3 + + '@scalar/openapi-types@0.2.3': + dependencies: + zod: 3.24.1 + + '@scalar/postman-to-openapi@0.2.17': + dependencies: + '@scalar/oas-utils': 0.2.144 + '@scalar/openapi-types': 0.2.3 + + '@scalar/snippetz@0.2.20': + dependencies: + stringify-object: 5.0.0 + + '@scalar/themes@0.11.3': + dependencies: + '@scalar/types': 0.1.16 + nanoid: 5.1.11 + + '@scalar/types@0.1.16': + dependencies: + '@scalar/openapi-types': 0.2.3 + nanoid: 5.1.11 + zod: 3.24.1 + + '@scalar/use-codemirror@0.11.104(typescript@5.8.3)': + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/commands': 6.10.2 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-html': 6.4.11 + '@codemirror/lang-json': 6.0.2 + '@codemirror/lang-xml': 6.1.0 + '@codemirror/lang-yaml': 6.1.2 + '@codemirror/language': 6.12.2 + '@codemirror/lint': 6.9.4 + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + '@replit/codemirror-css-color-picker': 6.3.0(@codemirror/language@6.12.2)(@codemirror/state@6.5.4)(@codemirror/view@6.39.15) + '@scalar/components': 0.13.59(typescript@5.8.3) + codemirror: 6.0.2 + style-mod: 4.1.3 + vue: 3.5.29(typescript@5.8.3) + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@scalar/use-hooks@0.1.50(typescript@5.8.3)': + dependencies: + '@scalar/themes': 0.11.3 + '@scalar/use-toasts': 0.7.10(typescript@5.8.3) + '@vueuse/core': 10.11.1(vue@3.5.29(typescript@5.8.3)) + cva: 1.0.0-beta.2(typescript@5.8.3) + tailwind-merge: 2.6.1 + vue: 3.5.29(typescript@5.8.3) + zod: 3.24.1 + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + + '@scalar/use-toasts@0.7.10(typescript@5.8.3)': + dependencies: + nanoid: 5.1.11 + vue: 3.5.29(typescript@5.8.3) + vue-sonner: 1.3.2 + transitivePeerDependencies: + - typescript + + '@scalar/use-tooltip@1.0.7(typescript@5.8.3)': + dependencies: + tippy.js: 6.3.7 + vue: 3.5.29(typescript@5.8.3) + transitivePeerDependencies: + - typescript + '@standard-schema/spec@1.1.0': {} '@standard-schema/utils@0.3.0': {} + '@swc/helpers@0.5.20': + dependencies: + tslib: 2.8.1 + '@tailwindcss/node@4.1.18': dependencies: '@jridgewell/remapping': 2.3.5 @@ -7036,6 +8187,13 @@ snapshots: '@tanstack/table-core@8.21.3': {} + '@tanstack/virtual-core@3.13.23': {} + + '@tanstack/vue-virtual@3.13.23(vue@3.5.29(typescript@5.8.3))': + dependencies: + '@tanstack/virtual-core': 3.13.23 + vue: 3.5.29(typescript@5.8.3) + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.29.7 @@ -7281,6 +8439,10 @@ snapshots: '@types/ms@2.1.0': {} + '@types/node@20.19.43': + dependencies: + undici-types: 6.21.0 + '@types/node@24.1.0': dependencies: undici-types: 7.8.0 @@ -7339,6 +8501,8 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} + '@types/web-bluetooth@0.0.20': {} + '@types/ws@8.18.1': dependencies: '@types/node': 24.1.0 @@ -7438,6 +8602,29 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@unhead/dom@1.11.20': + dependencies: + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + + '@unhead/schema@1.11.20': + dependencies: + hookable: 5.5.3 + zhead: 2.2.4 + + '@unhead/shared@1.11.20': + dependencies: + '@unhead/schema': 1.11.20 + packrup: 0.1.2 + + '@unhead/vue@1.11.20(vue@3.5.29(typescript@5.8.3))': + dependencies: + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + hookable: 5.5.3 + unhead: 1.11.20 + vue: 3.5.29(typescript@5.8.3) + '@upsetjs/venn.js@2.0.0': optionalDependencies: d3-selection: 3.0.0 @@ -7484,6 +8671,114 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@vue/compiler-core@3.5.29': + dependencies: + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.29 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.29': + dependencies: + '@vue/compiler-core': 3.5.29 + '@vue/shared': 3.5.29 + + '@vue/compiler-sfc@3.5.29': + dependencies: + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.29 + '@vue/compiler-dom': 3.5.29 + '@vue/compiler-ssr': 3.5.29 + '@vue/shared': 3.5.29 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.13 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.29': + dependencies: + '@vue/compiler-dom': 3.5.29 + '@vue/shared': 3.5.29 + + '@vue/devtools-api@6.6.4': {} + + '@vue/reactivity@3.5.29': + dependencies: + '@vue/shared': 3.5.29 + + '@vue/runtime-core@3.5.29': + dependencies: + '@vue/reactivity': 3.5.29 + '@vue/shared': 3.5.29 + + '@vue/runtime-dom@3.5.29': + dependencies: + '@vue/reactivity': 3.5.29 + '@vue/runtime-core': 3.5.29 + '@vue/shared': 3.5.29 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.29(vue@3.5.29(typescript@5.8.3))': + dependencies: + '@vue/compiler-ssr': 3.5.29 + '@vue/shared': 3.5.29 + vue: 3.5.29(typescript@5.8.3) + + '@vue/shared@3.5.29': {} + + '@vueuse/core@10.11.1(vue@3.5.29(typescript@5.8.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.29(typescript@5.8.3)) + vue-demi: 0.14.10(vue@3.5.29(typescript@5.8.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@11.3.0(vue@3.5.29(typescript@5.8.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 11.3.0 + '@vueuse/shared': 11.3.0(vue@3.5.29(typescript@5.8.3)) + vue-demi: 0.14.10(vue@3.5.29(typescript@5.8.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/integrations@11.3.0(axios@1.14.0)(change-case@5.4.4)(focus-trap@7.8.0)(fuse.js@7.1.0)(vue@3.5.29(typescript@5.8.3))': + dependencies: + '@vueuse/core': 11.3.0(vue@3.5.29(typescript@5.8.3)) + '@vueuse/shared': 11.3.0(vue@3.5.29(typescript@5.8.3)) + vue-demi: 0.14.10(vue@3.5.29(typescript@5.8.3)) + optionalDependencies: + axios: 1.14.0 + change-case: 5.4.4 + focus-trap: 7.8.0 + fuse.js: 7.1.0 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.11.1': {} + + '@vueuse/metadata@11.3.0': {} + + '@vueuse/shared@10.11.1(vue@3.5.29(typescript@5.8.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.29(typescript@5.8.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@11.3.0(vue@3.5.29(typescript@5.8.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.29(typescript@5.8.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -7612,10 +8907,18 @@ snapshots: agent-base@7.1.3: {} + ajv-draft-04@1.0.0(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + ajv-keywords@3.5.2(ajv@6.15.0): dependencies: ajv: 6.15.0 @@ -7678,6 +8981,9 @@ snapshots: assertion-error@2.0.1: {} + asynckit@0.4.0: + optional: true + autoprefixer@10.4.27(postcss@8.5.13): dependencies: browserslist: 4.28.2 @@ -7687,6 +8993,15 @@ snapshots: postcss: 8.5.13 postcss-value-parser: 4.2.0 + axios@1.14.0: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.6 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + optional: true + babel-loader@10.0.0(@babel/core@7.29.6)(webpack@5.104.1): dependencies: '@babel/core': 7.29.6 @@ -7800,6 +9115,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + change-case@5.4.4: {} character-entities-html4@2.1.0: {} @@ -7854,6 +9171,16 @@ snapshots: - '@types/react' - '@types/react-dom' + codemirror@6.0.2: + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/commands': 6.10.2 + '@codemirror/language': 6.12.2 + '@codemirror/lint': 6.9.4 + '@codemirror/search': 6.6.0 + '@codemirror/state': 6.5.4 + '@codemirror/view': 6.39.15 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -7864,6 +9191,11 @@ snapshots: colorette@2.0.20: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + optional: true + comma-separated-tokens@2.0.3: {} commander@10.0.1: {} @@ -7950,6 +9282,8 @@ snapshots: optionalDependencies: typescript: 5.8.3 + crelt@1.0.6: {} + cron-parser@5.3.1: dependencies: luxon: 3.7.2 @@ -8003,6 +9337,12 @@ snapshots: csstype@3.2.3: {} + cva@1.0.0-beta.2(typescript@5.8.3): + dependencies: + clsx: 2.1.1 + optionalDependencies: + typescript: 5.8.3 + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.3): dependencies: cose-base: 1.0.3 @@ -8227,10 +9567,15 @@ snapshots: define-lazy-prop@3.0.0: {} + defu@6.1.7: {} + delaunator@5.1.0: dependencies: robust-predicates: 3.0.3 + delayed-stream@1.0.0: + optional: true + depd@1.1.2: {} depd@2.0.0: {} @@ -8317,6 +9662,8 @@ snapshots: entities@6.0.1: {} + entities@7.0.1: {} + env-paths@2.2.1: {} envinfo@7.14.0: {} @@ -8335,6 +9682,14 @@ snapshots: dependencies: es-errors: 1.3.0 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + optional: true + es-toolkit@1.45.1: {} es-toolkit@1.46.1: {} @@ -8488,6 +9843,8 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -8613,8 +9970,21 @@ snapshots: flatted@3.4.2: {} + focus-trap@7.8.0: + dependencies: + tabbable: 6.4.0 + follow-redirects@1.16.0: {} + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + optional: true + forwarded@0.2.0: {} fraction.js@5.3.4: {} @@ -8639,6 +10009,8 @@ snapshots: function-bind@1.1.2: {} + fuse.js@7.1.0: {} + gensync@1.0.0-beta.2: {} get-intrinsic@1.3.0: @@ -8656,6 +10028,8 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -8665,6 +10039,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + github-slugger@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -8699,6 +10075,11 @@ snapshots: has-symbols@1.1.0: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + optional: true + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -8707,6 +10088,109 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.2.1 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.2.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.6: dependencies: '@types/estree': 1.0.8 @@ -8727,16 +10211,49 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + he@1.2.0: {} + highlight.js@11.11.1: {} + + highlightjs-curl@1.3.0: {} + + highlightjs-vue@1.0.0: {} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 + hookable@5.5.3: {} + hpack.js@2.1.6: dependencies: inherits: 2.0.4 @@ -8780,6 +10297,8 @@ snapshots: html-url-attributes@3.0.1: {} + html-void-elements@3.0.0: {} + html-webpack-plugin@5.6.7(webpack@5.104.1): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -8790,6 +10309,8 @@ snapshots: optionalDependencies: webpack: 5.104.1(webpack-cli@6.0.1) + html-whitespace-sensitive-tag-names@3.0.1: {} + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -8865,6 +10386,10 @@ snapshots: dependencies: postcss: 8.5.13 + idn-hostname@15.1.8: + dependencies: + punycode: 2.3.1 + ignore@5.3.2: {} ignore@7.0.5: {} @@ -8905,6 +10430,8 @@ snapshots: ipaddr.js@2.4.0: {} + is-absolute-url@4.0.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -8942,6 +10469,8 @@ snapshots: is-number@7.0.0: {} + is-obj@3.0.0: {} + is-plain-obj@3.0.0: {} is-plain-obj@4.1.0: {} @@ -8952,6 +10481,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-regexp@3.1.0: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -9019,12 +10550,18 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-deterministic@1.0.12: {} + json5@2.2.3: {} jsonc-parser@3.3.1: {} jsonpointer@5.0.1: {} + just-clone@6.2.0: {} + + just-curry-it@5.3.0: {} + katex@0.16.45: dependencies: commander: 8.3.0 @@ -9048,6 +10585,8 @@ snapshots: layout-base@2.0.1: {} + leven@4.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -9136,6 +10675,12 @@ snapshots: dependencies: tslib: 2.8.1 + lowlight@3.3.0: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.11.1 + lru-cache@11.2.6: {} lru-cache@5.1.1: @@ -9378,6 +10923,8 @@ snapshots: methods@1.1.2: {} + microdiff@1.5.0: {} + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.2.0 @@ -9664,6 +11211,8 @@ snapshots: nanoid@3.3.12: {} + nanoid@5.1.11: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -9765,6 +11314,8 @@ snapshots: package-manager-detector@1.6.0: {} + packrup@0.1.2: {} + param-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -9797,6 +11348,8 @@ snapshots: index-to-position: 1.1.0 type-fest: 4.41.0 + parse-ms@3.0.0: {} + parse5@7.2.1: dependencies: entities: 4.5.0 @@ -9913,6 +11466,8 @@ snapshots: prettier@3.6.2: {} + pretty-bytes@6.1.1: {} + pretty-error@4.0.0: dependencies: lodash: 4.18.1 @@ -9924,6 +11479,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-ms@8.0.0: + dependencies: + parse-ms: 3.0.0 + prism-react-renderer@2.4.1(react@19.1.6): dependencies: '@types/prismjs': 1.26.5 @@ -9949,6 +11508,9 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-from-env@2.1.0: + optional: true + punycode@2.3.1: {} pvtsutils@1.3.6: @@ -9963,6 +11525,23 @@ snapshots: queue-microtask@1.2.3: {} + radix-vue@1.9.17(vue@3.5.29(typescript@5.8.3)): + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/vue': 1.1.11(vue@3.5.29(typescript@5.8.3)) + '@internationalized/date': 3.12.0 + '@internationalized/number': 3.6.5 + '@tanstack/vue-virtual': 3.13.23(vue@3.5.29(typescript@5.8.3)) + '@vueuse/core': 10.11.1(vue@3.5.29(typescript@5.8.3)) + '@vueuse/shared': 10.11.1(vue@3.5.29(typescript@5.8.3)) + aria-hidden: 1.2.6 + defu: 6.1.7 + fast-deep-equal: 3.1.3 + nanoid: 5.1.11 + vue: 3.5.29(typescript@5.8.3) + transitivePeerDependencies: + - '@vue/composition-api' + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -10133,6 +11712,43 @@ snapshots: reflect-metadata@0.2.2: {} + rehype-external-links@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + + rehype-format@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-format: 1.1.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + relateurl@0.2.7: {} remark-gfm@4.0.1: @@ -10457,6 +12073,12 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -10471,6 +12093,8 @@ snapshots: dependencies: webpack: 5.104.1(webpack-cli@6.0.1) + style-mod@4.1.3: {} + style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -10514,8 +12138,12 @@ snapshots: symbol-tree@3.2.4: {} + tabbable@6.4.0: {} + tagged-tag@1.0.0: {} + tailwind-merge@2.6.1: {} + tailwind-merge@3.3.1: {} tailwind-merge@3.5.0: {} @@ -10574,6 +12202,10 @@ snapshots: tinyrainbow@3.1.0: {} + tippy.js@6.3.7: + dependencies: + '@popperjs/core': 2.11.8 + tldts-core@7.0.23: {} tldts@7.0.23: @@ -10610,6 +12242,8 @@ snapshots: ts-dedent@2.2.0: {} + ts-deepmerge@7.0.3: {} + ts-loader@9.5.7(typescript@5.8.3)(webpack@5.104.1): dependencies: chalk: 4.1.2 @@ -10647,10 +12281,19 @@ snapshots: typescript@5.8.3: {} + undici-types@6.21.0: {} + undici-types@7.8.0: {} undici@7.25.0: {} + unhead@1.11.20: + dependencies: + '@unhead/dom': 1.11.20 + '@unhead/schema': 1.11.20 + '@unhead/shared': 1.11.20 + hookable: 5.5.3 + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -10661,6 +12304,11 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -10740,8 +12388,15 @@ snapshots: uuid@8.3.2: {} + uuid@9.0.1: {} + vary@1.1.2: {} + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 @@ -10848,6 +12503,29 @@ snapshots: vscode-uri@3.1.0: {} + vue-demi@0.14.10(vue@3.5.29(typescript@5.8.3)): + dependencies: + vue: 3.5.29(typescript@5.8.3) + + vue-router@4.6.4(vue@3.5.29(typescript@5.8.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.29(typescript@5.8.3) + + vue-sonner@1.3.2: {} + + vue@3.5.29(typescript@5.8.3): + dependencies: + '@vue/compiler-dom': 3.5.29 + '@vue/compiler-sfc': 3.5.29 + '@vue/runtime-dom': 3.5.29 + '@vue/server-renderer': 3.5.29(vue@3.5.29(typescript@5.8.3)) + '@vue/shared': 3.5.29 + optionalDependencies: + typescript: 5.8.3 + + w3c-keyname@2.2.8: {} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -10861,6 +12539,8 @@ snapshots: dependencies: minimalistic-assert: 1.0.1 + web-namespaces@2.0.1: {} + webidl-conversions@8.0.1: {} webpack-bundle-analyzer@4.10.2: @@ -11009,6 +12689,8 @@ snapshots: websocket-extensions@0.1.4: {} + whatwg-mimetype@4.0.0: {} + whatwg-mimetype@5.0.0: {} whatwg-url@16.0.0: @@ -11061,4 +12743,8 @@ snapshots: yocto-queue@0.1.0: {} + zhead@2.2.4: {} + + zod@3.24.1: {} + zwitch@2.0.4: {} diff --git a/ui/src/App.tsx b/ui/src/App.tsx index ef9f080ab7..7d318681d5 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -41,6 +41,7 @@ import { import { UserRole } from './api/v1/schema'; import AdministrationPage from './pages/administration'; import APIKeysPage from './pages/api-keys'; +import APIDocsPage from './pages/api-docs'; import AuditLogsPage from './pages/audit-logs'; import BaseConfigPage from './pages/base-config'; import DAGRuns from './pages/dag-runs'; @@ -531,6 +532,10 @@ function AppInner({ config: initialConfig }: Props): React.ReactElement { path="/home" element={} /> + } + /> } diff --git a/ui/src/__tests__/App.test.tsx b/ui/src/__tests__/App.test.tsx index 90f2feaac8..30fcd56366 100644 --- a/ui/src/__tests__/App.test.tsx +++ b/ui/src/__tests__/App.test.tsx @@ -42,6 +42,7 @@ vi.mock('../pages/administration', () => ({ default: () =>

Administration

, })); vi.mock('../pages/api-keys', () => ({ default: () =>

API Keys

})); +vi.mock('../pages/api-docs', () => ({ default: () =>

API Docs

})); vi.mock('../pages/audit-logs', () => ({ default: () =>

Audit Logs

, })); diff --git a/ui/src/__tests__/menu.test.tsx b/ui/src/__tests__/menu.test.tsx index cd5d349757..74606f4ac9 100644 --- a/ui/src/__tests__/menu.test.tsx +++ b/ui/src/__tests__/menu.test.tsx @@ -254,6 +254,9 @@ describe('sidebar menu', () => { screen.getByRole('button', { name: 'Toggle Administration section' }) ).toHaveAttribute('aria-expanded', 'false'); + expect( + screen.getByRole('link', { name: 'API Reference' }) + ).not.toBeVisible(); expect( screen.queryByRole('link', { name: 'Dashboard' }) ).not.toBeInTheDocument(); @@ -336,6 +339,7 @@ describe('sidebar menu', () => { ); const integrationSubmenuItems = [ screen.getByRole('link', { name: 'Webhooks' }), + screen.getByRole('link', { name: 'API Reference' }), ]; for (const item of integrationSubmenuItems) { expect(item).toBeVisible(); diff --git a/ui/src/layouts/ContentNavigation.tsx b/ui/src/layouts/ContentNavigation.tsx index 3ae5d23c9d..5d75f622df 100644 --- a/ui/src/layouts/ContentNavigation.tsx +++ b/ui/src/layouts/ContentNavigation.tsx @@ -24,6 +24,7 @@ const STATIC_ROUTE_LABELS: Record = { '/home': 'Home', '/dashboard': 'Timeline', '/cockpit': 'Cockpit', + '/api-docs': 'API Reference', '/integrations': 'Integrations', '/notifications': 'Notifications', '/notification-rules': 'Notification Rules', @@ -143,7 +144,7 @@ export function getBreadcrumbItems(pathname: string): BreadcrumbItemData[] { return items; } - if (['integrations', 'webhooks'].includes(segments[0] ?? '')) { + if (['integrations', 'webhooks', 'api-docs'].includes(segments[0] ?? '')) { if (normalized !== '/integrations') { items.push({ label: 'Integrations', to: '/integrations' }); } diff --git a/ui/src/menu.tsx b/ui/src/menu.tsx index 4ad7f915b7..1e54b4af34 100644 --- a/ui/src/menu.tsx +++ b/ui/src/menu.tsx @@ -799,7 +799,7 @@ export const mainListItems = React.forwardRef< icon={} label="Integrations" isOpen={isOpen} - basePath={['/integrations', '/webhooks']} + basePath={['/integrations', '/webhooks', '/api-docs']} to="/integrations" onClick={onNavItemClick} customColor={customColor} @@ -813,6 +813,13 @@ export const mainListItems = React.forwardRef< customColor={customColor} /> )} + {canManageProfiles && ( diff --git a/ui/src/pages/api-docs/ScalarViewer.tsx b/ui/src/pages/api-docs/ScalarViewer.tsx new file mode 100644 index 0000000000..00f2b3e0ed --- /dev/null +++ b/ui/src/pages/api-docs/ScalarViewer.tsx @@ -0,0 +1,66 @@ +// Copyright (C) 2026 Yota Hamada +// SPDX-License-Identifier: GPL-3.0-or-later + +import { ApiReferenceReact } from '@scalar/api-reference-react'; +import '@scalar/api-reference-react/style.css'; +import * as React from 'react'; + +type ScalarViewerProps = { + spec: Record; + preferredBearerToken?: string; +}; + +export default function ScalarViewer({ + spec, + preferredBearerToken, +}: ScalarViewerProps): React.ReactElement { + const [darkMode, setDarkMode] = React.useState( + () => + typeof document !== 'undefined' && + document.documentElement.classList.contains('dark') + ); + + React.useEffect(() => { + if (typeof document === 'undefined') { + return; + } + + const updateDarkMode = () => { + setDarkMode(document.documentElement.classList.contains('dark')); + }; + updateDarkMode(); + + const observer = new MutationObserver(updateDarkMode); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['class'], + }); + + return () => observer.disconnect(); + }, []); + + const configuration: Record = { + content: spec, + layout: 'modern', + hideDarkModeToggle: true, + withDefaultFonts: false, + forceDarkModeState: darkMode ? 'dark' : 'light', + }; + + if (preferredBearerToken) { + configuration.authentication = { + preferredSecurityScheme: 'apiToken', + securitySchemes: { + apiToken: { + token: preferredBearerToken, + }, + }, + }; + } + + return ( +
+ +
+ ); +} diff --git a/ui/src/pages/api-docs/__tests__/index.test.tsx b/ui/src/pages/api-docs/__tests__/index.test.tsx new file mode 100644 index 0000000000..f05358b302 --- /dev/null +++ b/ui/src/pages/api-docs/__tests__/index.test.tsx @@ -0,0 +1,260 @@ +// Copyright (C) 2026 Yota Hamada +// SPDX-License-Identifier: GPL-3.0-or-later + +import { + act, + fireEvent, + render, + screen, + waitFor, +} from '@testing-library/react'; +import * as React from 'react'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { AppBarContext } from '@/contexts/AppBarContext'; +import { ConfigContext, type Config } from '@/contexts/ConfigContext'; +import APIDocsPage from '../index'; + +const fetchJsonMock = vi.fn(); +const scalarViewerMock = vi.fn(); + +vi.mock('@/lib/fetchJson', () => ({ + default: (...args: unknown[]) => fetchJsonMock(...args), +})); + +vi.mock('../ScalarViewer', () => ({ + default: (props: Record) => { + scalarViewerMock(props); + return
viewer
; + }, +})); + +function makeConfig(overrides: Partial = {}): Config { + return { + apiURL: '/api/v1', + basePath: '/', + title: 'Dagu', + navbarColor: '', + tz: 'UTC', + tzOffsetInSec: 0, + version: 'test', + maxDashboardPageLimit: 100, + remoteNodes: '', + initialWorkspaces: [], + authMode: 'none', + setupRequired: false, + oidcEnabled: false, + oidcButtonLabel: '', + terminalEnabled: false, + gitSyncEnabled: false, + updateAvailable: false, + latestVersion: '', + permissions: { + writeDags: true, + runDags: true, + }, + license: { + valid: true, + plan: 'community', + expiry: '', + features: [], + gracePeriod: false, + community: true, + source: 'test', + warningCode: '', + }, + paths: { + dagsDir: '', + logDir: '', + suspendFlagsDir: '', + adminLogsDir: '', + baseConfig: '', + dagRunsDir: '', + queueDir: '', + procDir: '', + serviceRegistryDir: '', + configFileUsed: '', + gitSyncDir: '', + auditLogsDir: '', + }, + ...overrides, + }; +} + +type AppBarContextValue = React.ContextType; + +function makeAppBarContext( + overrides: Partial = {} +): AppBarContextValue { + return { + title: '', + setTitle: () => undefined, + remoteNodes: ['local'], + setRemoteNodes: () => undefined, + selectedRemoteNode: 'local', + selectRemoteNode: () => undefined, + ...overrides, + }; +} + +function renderPage( + configOverrides: Partial = {}, + appBarOverrides: Partial = {} +) { + return render( + + + + + + ); +} + +describe('APIDocsPage', () => { + beforeEach(() => { + fetchJsonMock.mockReset(); + scalarViewerMock.mockReset(); + localStorage.clear(); + }); + + it('shows a loading state while the OpenAPI document is in flight', () => { + fetchJsonMock.mockReturnValue(new Promise(() => undefined)); + + renderPage(); + + expect(screen.getByText('Loading API reference')).toBeInTheDocument(); + expect(fetchJsonMock).toHaveBeenCalledWith( + '/openapi.json?remoteNode=local' + ); + }); + + it('uses the selected remote node for the OpenAPI document and raw JSON link', async () => { + fetchJsonMock.mockResolvedValue({ + openapi: '3.0.0', + info: { + title: 'Dagu', + }, + }); + + renderPage({}, { selectedRemoteNode: 'worker-a' }); + + expect(await screen.findByTestId('scalar-viewer')).toBeInTheDocument(); + expect(fetchJsonMock).toHaveBeenCalledWith( + '/openapi.json?remoteNode=worker-a' + ); + expect(screen.getByRole('link', { name: /raw json/i })).toHaveAttribute( + 'href', + '/api/v1/openapi.json?remoteNode=worker-a' + ); + }); + + it('shows an error state when the document fetch fails', async () => { + fetchJsonMock.mockRejectedValue(new Error('request failed')); + + renderPage(); + + expect( + await screen.findByText('Unable to load the API reference') + ).toBeInTheDocument(); + expect(screen.getByText('request failed')).toBeInTheDocument(); + }); + + it('renders the viewer once the document loads', async () => { + fetchJsonMock.mockResolvedValue({ + openapi: '3.0.0', + info: { + title: 'Dagu', + }, + }); + + renderPage(); + + expect(await screen.findByTestId('scalar-viewer')).toBeInTheDocument(); + await waitFor(() => { + expect(scalarViewerMock).toHaveBeenCalledWith( + expect.objectContaining({ + spec: expect.objectContaining({ + openapi: '3.0.0', + }), + }) + ); + }); + }); + + it('keeps the latest reload result when requests finish out of order', async () => { + let resolveFirst: (value: Record) => void = () => + undefined; + let resolveSecond: (value: Record) => void = () => + undefined; + const firstRequest = new Promise>((resolve) => { + resolveFirst = resolve; + }); + const secondRequest = new Promise>((resolve) => { + resolveSecond = resolve; + }); + + fetchJsonMock + .mockReturnValueOnce(firstRequest) + .mockReturnValueOnce(secondRequest); + + renderPage(); + fireEvent.click(screen.getByRole('button', { name: /reload/i })); + + await act(async () => { + resolveSecond({ + openapi: '3.1.0', + info: { + title: 'Latest', + }, + }); + await secondRequest; + }); + + expect(await screen.findByTestId('scalar-viewer')).toBeInTheDocument(); + expect(scalarViewerMock).toHaveBeenLastCalledWith( + expect.objectContaining({ + spec: expect.objectContaining({ + openapi: '3.1.0', + }), + }) + ); + + await act(async () => { + resolveFirst({ + openapi: '3.0.0', + info: { + title: 'Stale', + }, + }); + await firstRequest; + }); + + expect(scalarViewerMock).toHaveBeenLastCalledWith( + expect.objectContaining({ + spec: expect.objectContaining({ + openapi: '3.1.0', + }), + }) + ); + }); + + it('prefills the builtin bearer token for the viewer', async () => { + localStorage.setItem('dagu_auth_token', 'builtin-token'); + fetchJsonMock.mockResolvedValue({ + openapi: '3.0.0', + info: { + title: 'Dagu', + }, + }); + + renderPage({ authMode: 'builtin' }); + + expect(await screen.findByTestId('scalar-viewer')).toBeInTheDocument(); + await waitFor(() => { + expect(scalarViewerMock).toHaveBeenCalledWith( + expect.objectContaining({ + preferredBearerToken: 'builtin-token', + }) + ); + }); + }); +}); diff --git a/ui/src/pages/api-docs/index.tsx b/ui/src/pages/api-docs/index.tsx new file mode 100644 index 0000000000..0b149d25fe --- /dev/null +++ b/ui/src/pages/api-docs/index.tsx @@ -0,0 +1,149 @@ +// Copyright (C) 2026 Yota Hamada +// SPDX-License-Identifier: GPL-3.0-or-later + +import { Button } from '@/components/ui/button'; +import { AppBarContext } from '@/contexts/AppBarContext'; +import { TOKEN_KEY } from '@/contexts/AuthContext'; +import { useConfig } from '@/contexts/ConfigContext'; +import fetchJson from '@/lib/fetchJson'; +import { + AlertCircle, + ExternalLink, + RefreshCw, + ShieldCheck, +} from 'lucide-react'; +import * as React from 'react'; +import ScalarViewer from './ScalarViewer'; + +type OpenAPIDocument = Record; + +type LoadState = + | { status: 'loading' } + | { status: 'error'; message: string } + | { status: 'ready'; spec: OpenAPIDocument }; + +export default function APIDocsPage(): React.ReactElement { + const appBarContext = React.useContext(AppBarContext); + const { selectedRemoteNode, setTitle } = appBarContext; + const config = useConfig(); + const [state, setState] = React.useState({ status: 'loading' }); + const requestSeqRef = React.useRef(0); + const remoteNode = selectedRemoteNode || 'local'; + const openAPIPath = React.useMemo( + () => `/openapi.json?remoteNode=${encodeURIComponent(remoteNode)}`, + [remoteNode] + ); + + React.useEffect(() => { + setTitle('API Docs'); + }, [setTitle]); + + const loadSpec = React.useCallback(async () => { + const requestSeq = requestSeqRef.current + 1; + requestSeqRef.current = requestSeq; + setState({ status: 'loading' }); + + try { + const spec = await fetchJson(openAPIPath); + if (requestSeqRef.current !== requestSeq) { + return; + } + setState({ status: 'ready', spec }); + } catch (error) { + if (requestSeqRef.current !== requestSeq) { + return; + } + setState({ + status: 'error', + message: + error instanceof Error + ? error.message + : 'Failed to load the API reference.', + }); + } + }, [openAPIPath]); + + React.useEffect(() => { + void loadSpec(); + }, [loadSpec]); + + const preferredBearerToken = + config.authMode === 'builtin' + ? (localStorage.getItem(TOKEN_KEY) ?? undefined) + : undefined; + + return ( +
+
+
+
+ + Authenticated reference +
+

+ REST API Docs +

+

+ The reference is loaded from the live authenticated OpenAPI document + served by this Dagu instance. +

+
+
+ + +
+
+ +
+ {state.status === 'loading' && ( +
+ +
+

+ Loading API reference +

+

+ Fetching /openapi.json with the current auth + context. +

+
+
+ )} + + {state.status === 'error' && ( +
+ +
+

+ Unable to load the API reference +

+

{state.message}

+
+ +
+ )} + + {state.status === 'ready' && ( + + )} +
+
+ ); +} diff --git a/ui/src/pages/home/index.tsx b/ui/src/pages/home/index.tsx index d6e80a3e40..3d4f973ddc 100644 --- a/ui/src/pages/home/index.tsx +++ b/ui/src/pages/home/index.tsx @@ -196,6 +196,11 @@ export default function HomePage(): React.ReactElement { }, ] : []), + { + to: '/api-docs', + label: 'API Reference', + description: 'Browse HTTP API documentation.', + }, ], }, { diff --git a/ui/src/pages/integrations/__tests__/index.test.tsx b/ui/src/pages/integrations/__tests__/index.test.tsx index 75e8b707ff..91cbef8fa1 100644 --- a/ui/src/pages/integrations/__tests__/index.test.tsx +++ b/ui/src/pages/integrations/__tests__/index.test.tsx @@ -20,14 +20,22 @@ describe('IntegrationsPage', () => { ); - expect(screen.getByRole('heading', { name: /integrations/i })).toBeVisible(); + expect( + screen.getByRole('heading', { name: /integrations/i }) + ).toBeVisible(); expect(screen.getByRole('link', { name: /webhooks/i })).toHaveAttribute( 'href', '/webhooks' ); + expect( + screen.getByRole('link', { name: /api reference/i }) + ).toHaveAttribute('href', '/api-docs'); expect( screen.getByText('Trigger workflows from external systems.') ).toBeVisible(); + expect( + screen.getByText('Explore authenticated REST API endpoints.') + ).toBeVisible(); expect(setTitle).toHaveBeenCalledWith('Integrations'); }); }); diff --git a/ui/src/pages/integrations/index.tsx b/ui/src/pages/integrations/index.tsx index 2027f23312..fd1363a75b 100644 --- a/ui/src/pages/integrations/index.tsx +++ b/ui/src/pages/integrations/index.tsx @@ -18,6 +18,11 @@ const integrationLinks: IntegrationLink[] = [ label: 'Webhooks', description: 'Trigger workflows from external systems.', }, + { + to: '/api-docs', + label: 'API Reference', + description: 'Explore authenticated REST API endpoints.', + }, ]; export default function IntegrationsPage(): React.ReactElement { diff --git a/ui/src/styles/global.css b/ui/src/styles/global.css index 0daf9304cc..7c303344d5 100644 --- a/ui/src/styles/global.css +++ b/ui/src/styles/global.css @@ -603,3 +603,81 @@ select:focus-visible { .tracking-wide { letter-spacing: 0; } + +@layer components { + .api-docs-shell { + min-height: 100%; + } + + .api-docs-viewer { + height: 100%; + min-height: 0; + background: + radial-gradient( + circle at top left, + color-mix(in srgb, var(--primary) 12%, transparent), + transparent 32% + ), + linear-gradient( + 180deg, + color-mix(in srgb, var(--card) 94%, transparent), + var(--background) + ); + --scalar-background-1: var(--background); + --scalar-background-2: var(--card); + --scalar-background-3: var(--muted); + --scalar-background-accent: var(--accent); + --scalar-color-1: var(--foreground); + --scalar-color-2: var(--muted-foreground); + --scalar-color-3: var(--text-secondary); + --scalar-border-color: var(--border); + --scalar-sidebar-background-1: color-mix( + in srgb, + var(--card) 92%, + var(--background) + ); + --scalar-sidebar-item-hover-background: var(--sidebar-hover); + --scalar-button-1: var(--primary); + --scalar-button-1-color: var(--primary-foreground); + } + + .api-docs-viewer > * { + height: 100%; + min-height: 0; + } + + @media (min-width: 1001px) { + .api-docs-viewer .references-layout { + height: 100%; + min-height: 0; + overflow: hidden; + grid-template-rows: var(--scalar-header-height, 0px) minmax(0, 1fr) auto; + --full-height: 100%; + } + + .api-docs-viewer .references-navigation, + .api-docs-viewer .references-rendered { + min-height: 0; + max-height: 100%; + } + + .api-docs-viewer .references-navigation { + overflow: hidden; + } + + .api-docs-viewer .references-navigation-list { + position: static; + top: auto; + height: 100%; + min-height: 0; + overflow-y: auto; + overscroll-behavior: contain; + } + + .api-docs-viewer .references-rendered { + height: 100%; + overflow-y: auto; + overscroll-behavior: contain; + } + } +} diff --git a/ui/src/types/scalar-api-reference-react.d.ts b/ui/src/types/scalar-api-reference-react.d.ts new file mode 100644 index 0000000000..dc29ab4b7c --- /dev/null +++ b/ui/src/types/scalar-api-reference-react.d.ts @@ -0,0 +1,13 @@ +// Copyright (C) 2026 Yota Hamada +// SPDX-License-Identifier: GPL-3.0-or-later + +declare module '@scalar/api-reference-react' { + import type * as React from 'react'; + + export const ApiReferenceReact: React.ComponentType<{ + configuration: Record; + }>; + + const DefaultExport: typeof ApiReferenceReact; + export default DefaultExport; +}