diff --git a/README.md b/README.md index b52221bbc5..244475ca86 100644 --- a/README.md +++ b/README.md @@ -92,16 +92,16 @@ View more options & deployment guides in the [**self-hosting documentation**](ht docker run -p 6420:6420 rivetkit/engine # macOS (Apple Silicon) -curl -o rivet-engine "https://releases.rivet.gg/engine/latest/rivet-engine-aarch64-apple-darwin" && chmod +x rivet-engine && ./rivet-engine start +curl -o rivet-engine "https://releases.rivet.dev/rivet/latest/rivet-engine-aarch64-apple-darwin" && chmod +x rivet-engine && ./rivet-engine start # macOS (Intel) -curl -o rivet-engine "https://releases.rivet.gg/engine/latest/rivet-engine-x86_64-apple-darwin" && chmod +x rivet-engine && ./rivet-engine start +curl -o rivet-engine "https://releases.rivet.dev/rivet/latest/rivet-engine-x86_64-apple-darwin" && chmod +x rivet-engine && ./rivet-engine start # Linux (x86) -curl -o rivet-engine "https://releases.rivet.gg/engine/latest/rivet-engine-x86_64-unknown-linux-musl" && chmod +x rivet-engine && ./rivet-engine start +curl -o rivet-engine "https://releases.rivet.dev/rivet/latest/rivet-engine-x86_64-unknown-linux-musl" && chmod +x rivet-engine && ./rivet-engine start # Windows (x86_64) -curl.exe -o rivet-engine.exe "https://releases.rivet.gg/engine/latest/rivet-engine-x86_64-pc-windows-gnu.exe" +curl.exe -o rivet-engine.exe "https://releases.rivet.dev/rivet/latest/rivet-engine-x86_64-pc-windows-gnu.exe" .\rivet-engine.exe start ``` diff --git a/biome.json b/biome.json index 3b18c66041..73d728459a 100644 --- a/biome.json +++ b/biome.json @@ -12,6 +12,7 @@ "frontend/**/*.ts", "!frontend/packages", "!rivetkit-openapi/openapi.json", + "rivetkit-typescript/**/devtools/**/*.tsx", "!scripts", "!website", "!site" diff --git a/frontend/src/components/lib/modules.ts b/frontend/src/components/lib/modules.ts index 63708e156f..7a75aaae27 100644 --- a/frontend/src/components/lib/modules.ts +++ b/frontend/src/components/lib/modules.ts @@ -78,11 +78,11 @@ const CATEGORIES = [ export async function loadModulesMeta() { const versionMetaResponse = await fetch( - "https://releases.rivet.gg/backend/index.json", + "https://releases.rivet.dev/backend/index.json", ); const { latestVersion } = await versionMetaResponse.json(); const modulesMetaResponse = await fetch( - `https://releases.rivet.gg/backend/${latestVersion}/index.json`, + `https://releases.rivet.dev/backend/${latestVersion}/index.json`, ); return await modulesMetaResponse.json(); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac7cde2cff..0665eccc2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2204,7 +2204,7 @@ importers: version: 3.13.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@uiw/codemirror-extensions-basic-setup': specifier: ^4.25.1 - version: 4.25.1(@codemirror/autocomplete@6.19.0)(@codemirror/commands@6.9.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.2) + version: 4.25.1(@codemirror/autocomplete@6.19.0)(@codemirror/commands@6.8.1)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.2) '@uiw/codemirror-theme-github': specifier: ^4.25.1 version: 4.25.1(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.38.2) @@ -2426,6 +2426,43 @@ importers: specifier: ^3.1.1 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.7.1)(less@4.4.1)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.44.1) + rivetkit-typescript/packages/devtools: + dependencies: + '@floating-ui/react': + specifier: ^0.27.16 + version: 0.27.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@types/react': + specifier: ^19 + version: 19.2.2 + '@types/react-dom': + specifier: ^19 + version: 19.2.2(@types/react@19.2.2) + motion: + specifier: ^12.23.25 + version: 12.25.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: + specifier: ^19.2.1 + version: 19.2.3 + react-dom: + specifier: ^19.2.1 + version: 19.2.3(react@19.2.3) + devDependencies: + concurrently: + specifier: ^9.2.1 + version: 9.2.1 + rivetkit: + specifier: workspace:* + version: link:../rivetkit + serve: + specifier: ^14.2.5 + version: 14.2.5 + tsup: + specifier: ^8.4.0 + version: 8.5.1(@microsoft/api-extractor@7.53.2(@types/node@25.0.3))(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.2) + typescript: + specifier: ^5.5.2 + version: 5.9.3 + rivetkit-typescript/packages/framework-base: dependencies: '@tanstack/store': @@ -5181,6 +5218,12 @@ packages: react: '>=17.0.0' react-dom: '>=17.0.0' + '@floating-ui/react@0.27.16': + resolution: {integrity: sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} @@ -8251,6 +8294,9 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@zeit/schemas@2.36.0': + resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} + '@zxcvbn-ts/core@3.0.4': resolution: {integrity: sha512-aQeiT0F09FuJaAqNrxynlAwZ2mW/1MdXakKWNmGM1Qp/VaY6CnB/GfnMS2T8gB2231Esp1/maCWd8vTG4OuShw==} @@ -8402,6 +8448,9 @@ packages: anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -8445,6 +8494,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -8737,6 +8789,10 @@ packages: blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + boxen@7.0.0: + resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} + engines: {node: '>=14.16'} + bplist-creator@0.1.0: resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} @@ -8802,6 +8858,10 @@ packages: peerDependencies: esbuild: '>=0.18' + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -8841,6 +8901,10 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + caniuse-lite@1.0.30001741: resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} @@ -8874,6 +8938,10 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + chalk-template@0.4.0: + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -8882,6 +8950,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.0.1: + resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -8963,6 +9035,10 @@ packages: class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + cli-cursor@2.1.0: resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} engines: {node: '>=4'} @@ -8978,6 +9054,10 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clipboardy@3.0.0: + resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -9105,6 +9185,10 @@ packages: constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -9964,6 +10048,10 @@ packages: exec-async@2.2.0: resolution: {integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -10332,6 +10420,20 @@ packages: react-dom: optional: true + framer-motion@12.25.0: + resolution: {integrity: sha512-mlWqd0rApIjeyhTCSNCqPYsUAEhkcUukZxH3ke6KbstBRPcxhEpuIjmiUQvB+1E9xkEm5SpNHBgHCapH/QHTWg==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + freeport-async@2.0.0: resolution: {integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==} engines: {node: '>=8'} @@ -10422,6 +10524,10 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -10687,6 +10793,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -10894,6 +11004,10 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-port-reachable@4.0.0: + resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -10906,6 +11020,10 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -11791,6 +11909,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -11799,6 +11921,10 @@ packages: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} + mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -11822,6 +11948,10 @@ packages: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -11899,12 +12029,32 @@ packages: motion-dom@12.23.23: resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==} + motion-dom@12.24.11: + resolution: {integrity: sha512-DlWOmsXMJrV8lzZyd+LKjG2CXULUs++bkq8GZ2Sr0R0RRhs30K2wtY+LKiTjhmJU3W61HK+rB0GLz6XmPvTA1A==} + motion-utils@11.18.1: resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} motion-utils@12.23.6: resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} + motion-utils@12.24.10: + resolution: {integrity: sha512-x5TFgkCIP4pPsRLpKoI86jv/q8t8FQOiM/0E8QKBzfMozWHfkKap2gA1hOki+B5g3IsBNpxbUnfOum1+dgvYww==} + + motion@12.25.0: + resolution: {integrity: sha512-jBFohEYklpZ+TL64zv03sHdqr1Tsc8/yDy7u68hVzi7hTJYtv53AduchqCiY3aWi4vY1hweS8DWtgCuckusYdQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -12095,6 +12245,10 @@ packages: resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} engines: {node: ^16.14.0 || >=18.0.0} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -12192,6 +12346,10 @@ packages: resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} engines: {node: '>=4'} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -12356,6 +12514,9 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -12379,6 +12540,9 @@ packages: resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} engines: {node: 20 || >=22} + path-to-regexp@3.3.0: + resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -12782,6 +12946,10 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + range-parser@1.2.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -12825,6 +12993,11 @@ packages: peerDependencies: react: ^19.2.0 + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + peerDependencies: + react: ^19.2.3 + react-error-boundary@6.0.3: resolution: {integrity: sha512-5guqn2UYpCFjE8UDMA8J7Kke+YSGBFrKQRJb3XdcaGZXYINZfQXgBt3ifY6MvjkN7QROc5A8zclyoSCwrcRUKw==} peerDependencies: @@ -12990,6 +13163,10 @@ packages: resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -13081,6 +13258,13 @@ packages: resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} + registry-auth-token@3.3.2: + resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + + registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} @@ -13329,10 +13513,18 @@ packages: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} + serve-handler@6.1.6: + resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} + serve-static@1.16.3: resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} + serve@14.2.5: + resolution: {integrity: sha512-Qn/qMkzCcMFVPb60E/hQy+iRLpiU8PamOfOSYoAHmmF+fFFmpPpqa6Oci2iWYpTdOUM3VF+TINud7CfbQnsZbA==} + engines: {node: '>= 14'} + hasBin: true + server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -13638,6 +13830,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -14079,6 +14275,10 @@ packages: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -14301,6 +14501,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-check@1.5.4: + resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} @@ -14764,6 +14967,10 @@ packages: engines: {node: '>=8'} hasBin: true + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + wonka@6.3.5: resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} @@ -17329,6 +17536,12 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) + '@floating-ui/react-dom@2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + '@floating-ui/react@0.26.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -17345,6 +17558,14 @@ snapshots: react-dom: 19.1.1(react@19.1.1) tabbable: 6.2.0 + '@floating-ui/react@0.27.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@floating-ui/utils': 0.2.10 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tabbable: 6.3.0 + '@floating-ui/utils@0.2.10': {} '@formkit/auto-animate@0.8.4': {} @@ -18589,6 +18810,11 @@ snapshots: '@babel/runtime': 7.28.4 react: 19.2.0 + '@radix-ui/react-compose-refs@1.0.0(react@19.2.3)': + dependencies: + '@babel/runtime': 7.28.4 + react: 19.2.3 + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.1.1)': dependencies: react: 19.1.1 @@ -18946,6 +19172,12 @@ snapshots: '@radix-ui/react-compose-refs': 1.0.0(react@19.2.0) react: 19.2.0 + '@radix-ui/react-slot@1.0.1(react@19.2.3)': + dependencies: + '@babel/runtime': 7.28.4 + '@radix-ui/react-compose-refs': 1.0.0(react@19.2.3) + react: 19.2.3 + '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.1.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.1.1) @@ -19320,6 +19552,18 @@ snapshots: transitivePeerDependencies: - '@react-native-masked-view/masked-view' + '@react-navigation/bottom-tabs@7.4.9(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native-screens@4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3)': + dependencies: + '@react-navigation/elements': 2.6.5(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3) + '@react-navigation/native': 7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + color: 4.2.3 + react: 19.2.3 + react-native: 0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1) + react-native-safe-area-context: 5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + react-native-screens: 4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + '@react-navigation/core@7.12.4(react@19.2.0)': dependencies: '@react-navigation/routers': 7.5.1 @@ -19331,6 +19575,17 @@ snapshots: use-latest-callback: 0.2.6(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) + '@react-navigation/core@7.12.4(react@19.2.3)': + dependencies: + '@react-navigation/routers': 7.5.1 + escape-string-regexp: 4.0.0 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.2.3 + react-is: 19.2.0 + use-latest-callback: 0.2.6(react@19.2.3) + use-sync-external-store: 1.6.0(react@19.2.3) + '@react-navigation/elements@2.6.5(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1)': dependencies: '@react-navigation/native': 7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) @@ -19352,6 +19607,16 @@ snapshots: use-latest-callback: 0.2.6(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) + '@react-navigation/elements@2.6.5(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3)': + dependencies: + '@react-navigation/native': 7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + color: 4.2.3 + react: 19.2.3 + react-native: 0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1) + react-native-safe-area-context: 5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + use-latest-callback: 0.2.6(react@19.2.3) + use-sync-external-store: 1.6.0(react@19.2.3) + '@react-navigation/native-stack@7.3.28(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native-screens@4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1)': dependencies: '@react-navigation/elements': 2.6.5(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) @@ -19377,6 +19642,18 @@ snapshots: transitivePeerDependencies: - '@react-native-masked-view/masked-view' + '@react-navigation/native-stack@7.3.28(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native-screens@4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3)': + dependencies: + '@react-navigation/elements': 2.6.5(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3) + '@react-navigation/native': 7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + react: 19.2.3 + react-native: 0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1) + react-native-safe-area-context: 5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + react-native-screens: 4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + warn-once: 0.1.1 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + '@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1)': dependencies: '@react-navigation/core': 7.12.4(react@19.2.0) @@ -19387,6 +19664,16 @@ snapshots: react-native: 0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1) use-latest-callback: 0.2.6(react@19.2.0) + '@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3)': + dependencies: + '@react-navigation/core': 7.12.4(react@19.2.3) + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + react: 19.2.3 + react-native: 0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1) + use-latest-callback: 0.2.6(react@19.2.3) + '@react-navigation/routers@7.5.1': dependencies: nanoid: 3.3.11 @@ -20149,6 +20436,11 @@ snapshots: '@tanstack/query-core': 5.87.1 react: 19.2.0 + '@tanstack/react-query@5.87.1(react@19.2.3)': + dependencies: + '@tanstack/query-core': 5.87.1 + react: 19.2.3 + '@tanstack/react-router-devtools@1.131.36(@tanstack/react-router@1.131.36(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.36)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)(tiny-invariant@1.3.3)': dependencies: '@tanstack/react-router': 1.131.36(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -20674,16 +20966,6 @@ snapshots: '@codemirror/state': 6.5.2 '@codemirror/view': 6.38.2 - '@uiw/codemirror-extensions-basic-setup@4.25.1(@codemirror/autocomplete@6.19.0)(@codemirror/commands@6.9.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.9.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.2)': - dependencies: - '@codemirror/autocomplete': 6.19.0 - '@codemirror/commands': 6.9.0 - '@codemirror/language': 6.11.3 - '@codemirror/lint': 6.9.0 - '@codemirror/search': 6.5.11 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.2 - '@uiw/codemirror-theme-github@4.25.1(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.38.2)': dependencies: '@uiw/codemirror-themes': 4.25.1(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.38.2) @@ -21157,6 +21439,8 @@ snapshots: '@xtuc/long@4.2.2': {} + '@zeit/schemas@2.36.0': {} + '@zxcvbn-ts/core@3.0.4': dependencies: fastest-levenshtein: 1.0.16 @@ -21282,7 +21566,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - optional: true ajv@8.13.0: dependencies: @@ -21303,6 +21586,10 @@ snapshots: anser@1.4.10: {} + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -21334,6 +21621,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arch@2.2.0: {} + arg@5.0.2: {} argparse@1.0.10: @@ -21705,6 +21994,17 @@ snapshots: blake3-wasm@2.1.5: {} + boxen@7.0.0: + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + bplist-creator@0.1.0: dependencies: stream-buffers: 2.2.0 @@ -21791,6 +22091,8 @@ snapshots: esbuild: 0.27.2 load-tsconfig: 0.2.5 + bytes@3.0.0: {} + bytes@3.1.2: {} cac@6.7.14: {} @@ -21825,6 +22127,8 @@ snapshots: camelcase@6.3.0: {} + camelcase@7.0.1: {} + caniuse-lite@1.0.30001741: {} caniuse-lite@1.0.30001756: {} @@ -21875,6 +22179,10 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 + chalk-template@0.4.0: + dependencies: + chalk: 4.1.2 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -21886,6 +22194,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.0.1: {} + chalk@5.6.2: {} change-case@4.1.2: @@ -21984,6 +22294,8 @@ snapshots: dependencies: clsx: 2.1.1 + cli-boxes@3.0.0: {} + cli-cursor@2.1.0: dependencies: restore-cursor: 2.0.0 @@ -21994,6 +22306,12 @@ snapshots: client-only@0.0.1: {} + clipboardy@3.0.0: + dependencies: + arch: 2.2.0 + execa: 5.1.1 + is-wsl: 2.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -22137,6 +22455,8 @@ snapshots: tslib: 2.8.1 upper-case: 2.0.2 + content-disposition@0.5.2: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -22887,7 +23207,7 @@ snapshots: eslint: 9.39.1(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7)))(eslint@9.39.1(jiti@1.21.7)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7)))(eslint@9.39.1(jiti@1.21.7)))(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@1.21.7)) eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@1.21.7)) eslint-plugin-react-hooks: 7.0.1(eslint@9.39.1(jiti@1.21.7)) @@ -22920,7 +23240,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7)))(eslint@9.39.1(jiti@1.21.7)))(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)) transitivePeerDependencies: - supports-color @@ -22935,7 +23255,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7)))(eslint@9.39.1(jiti@1.21.7)))(eslint@9.39.1(jiti@1.21.7)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -23163,6 +23483,18 @@ snapshots: exec-async@2.2.0: {} + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -23321,6 +23653,33 @@ snapshots: - react-native - supports-color + expo-router@4.0.21(expo-constants@18.0.13)(expo-linking@7.0.5)(expo@54.0.18)(react-dom@18.3.1(react@18.3.1))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native-screens@4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3): + dependencies: + '@expo/metro-runtime': 4.0.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1)) + '@expo/server': 0.5.3 + '@radix-ui/react-slot': 1.0.1(react@19.2.3) + '@react-navigation/bottom-tabs': 7.4.9(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native-screens@4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3) + '@react-navigation/native': 7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3) + '@react-navigation/native-stack': 7.3.28(@react-navigation/native@7.1.18(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native-screens@4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3) + client-only: 0.0.1 + expo: 54.0.18(@babel/core@7.28.5)(@expo/metro-runtime@4.0.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1)))(expo-router@4.0.21)(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + expo-constants: 18.0.13(expo@54.0.18)(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1)) + expo-linking: 7.0.5(expo@54.0.18)(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@19.2.3) + react-native-helmet-async: 2.0.4(react@19.2.3) + react-native-is-edge-to-edge: 1.2.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3) + react-native-safe-area-context: 5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + react-native-screens: 4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1) + schema-utils: 4.3.3 + semver: 7.6.3 + server-only: 0.0.1 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + - react + - react-dom + - react-native + - supports-color + expo-server@1.0.5: {} expo@54.0.18(@babel/core@7.28.5)(@expo/metro-runtime@4.0.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1)))(expo-router@4.0.21)(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1): @@ -23596,18 +23955,27 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) + framer-motion@12.25.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + motion-dom: 12.24.11 + motion-utils: 12.24.10 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + freeport-async@2.0.0: {} freestyle-sandboxes@0.0.66(expo-constants@18.0.13)(expo-linking@7.0.5)(expo@54.0.18)(react-dom@18.3.1(react@18.3.1))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native-screens@4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(ws@8.19.0): dependencies: '@hey-api/client-fetch': 0.5.7 - '@tanstack/react-query': 5.87.1(react@19.2.0) - expo-router: 4.0.21(expo-constants@18.0.13)(expo-linking@7.0.5)(expo@54.0.18)(react-dom@18.3.1(react@18.3.1))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native-screens@4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.0) + '@tanstack/react-query': 5.87.1(react@19.2.3) + expo-router: 4.0.21(expo-constants@18.0.13)(expo-linking@7.0.5)(expo@54.0.18)(react-dom@18.3.1(react@18.3.1))(react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native-screens@4.17.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1))(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3) glob: 11.0.3 hono: 4.11.3 openai: 4.104.0(ws@8.19.0)(zod@3.25.76) openapi: 1.0.1 - react: 19.2.0 + react: 19.2.3 zod: 3.25.76 transitivePeerDependencies: - '@react-native-masked-view/masked-view' @@ -23729,6 +24097,8 @@ snapshots: dependencies: pump: 3.0.3 + get-stream@6.0.1: {} + get-stream@8.0.1: {} get-stream@9.0.1: @@ -24110,6 +24480,8 @@ snapshots: transitivePeerDependencies: - supports-color + human-signals@2.1.0: {} + human-signals@5.0.0: {} human-signals@8.0.1: {} @@ -24289,6 +24661,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-port-reachable@4.0.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -24302,6 +24676,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-stream@2.0.1: {} + is-stream@3.0.0: {} is-stream@4.0.1: {} @@ -25674,10 +26050,16 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.33.0: {} + mime-db@1.52.0: {} mime-db@1.54.0: {} + mime-types@2.1.18: + dependencies: + mime-db: 1.33.0 + mime-types@2.1.35: dependencies: mime-db: 1.52.0 @@ -25690,6 +26072,8 @@ snapshots: mimic-fn@1.2.0: {} + mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} mimic-response@3.1.0: {} @@ -25775,10 +26159,24 @@ snapshots: dependencies: motion-utils: 12.23.6 + motion-dom@12.24.11: + dependencies: + motion-utils: 12.24.10 + motion-utils@11.18.1: {} motion-utils@12.23.6: {} + motion-utils@12.24.10: {} + + motion@12.25.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + framer-motion: 12.25.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + tslib: 2.8.1 + optionalDependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + mrmime@2.0.1: {} ms@2.0.0: {} @@ -25981,6 +26379,10 @@ snapshots: semver: 7.7.3 validate-npm-package-name: 5.0.1 + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -26074,6 +26476,10 @@ snapshots: dependencies: mimic-fn: 1.2.0 + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -26293,6 +26699,8 @@ snapshots: path-is-absolute@1.0.1: {} + path-is-inside@1.0.2: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -26314,6 +26722,8 @@ snapshots: lru-cache: 11.2.4 minipass: 7.1.2 + path-to-regexp@3.3.0: {} + path-to-regexp@6.3.0: {} path-type@4.0.0: {} @@ -26707,6 +27117,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + range-parser@1.2.0: {} + range-parser@1.2.1: {} rc@1.2.8: @@ -26755,6 +27167,11 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 + react-dom@19.2.3(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + react-error-boundary@6.0.3(react@19.1.1): dependencies: react: 19.1.1 @@ -26791,6 +27208,16 @@ snapshots: react-fast-compare: 3.2.2 shallowequal: 1.1.0 + react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@19.2.3): + dependencies: + '@babel/runtime': 7.28.4 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 19.2.3 + react-dom: 18.3.1(react@18.3.1) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + react-highlight-words@0.21.0(react@19.2.0): dependencies: highlight-words-core: 1.2.3 @@ -26846,6 +27273,13 @@ snapshots: react-fast-compare: 3.2.2 shallowequal: 1.1.0 + react-native-helmet-async@2.0.4(react@19.2.3): + dependencies: + invariant: 2.2.4 + react: 19.2.3 + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + react-native-is-edge-to-edge@1.2.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -26857,6 +27291,11 @@ snapshots: react: 19.2.0 react-native: 0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1) + react-native-is-edge-to-edge@1.2.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1) + react-native-safe-area-context@5.6.1(react-native@0.82.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -26980,6 +27419,8 @@ snapshots: react@19.2.0: {} + react@19.2.3: {} + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -27127,6 +27568,15 @@ snapshots: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 + registry-auth-token@3.3.2: + dependencies: + rc: 1.2.8 + safe-buffer: 5.2.1 + + registry-url@3.1.0: + dependencies: + rc: 1.2.8 + regjsgen@0.8.0: {} regjsparser@0.13.0: @@ -27468,6 +27918,16 @@ snapshots: seroval@1.3.2: {} + serve-handler@6.1.6: + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + mime-types: 2.1.18 + minimatch: 3.1.2 + path-is-inside: 1.0.2 + path-to-regexp: 3.3.0 + range-parser: 1.2.0 + serve-static@1.16.3: dependencies: encodeurl: 2.0.0 @@ -27477,6 +27937,22 @@ snapshots: transitivePeerDependencies: - supports-color + serve@14.2.5: + dependencies: + '@zeit/schemas': 2.36.0 + ajv: 8.12.0 + arg: 5.0.2 + boxen: 7.0.0 + chalk: 5.0.1 + chalk-template: 0.4.0 + clipboardy: 3.0.0 + compression: 1.8.1 + is-port-reachable: 4.0.0 + serve-handler: 6.1.6 + update-check: 1.5.4 + transitivePeerDependencies: + - supports-color + server-only@0.0.1: {} set-function-length@1.2.2: @@ -27902,6 +28378,8 @@ snapshots: strip-bom@3.0.0: {} + strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} strip-final-newline@4.0.0: {} @@ -28614,6 +29092,35 @@ snapshots: - tsx - yaml + tsup@8.5.1(@microsoft/api-extractor@7.53.2(@types/node@25.0.3))(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.2): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.2) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.2 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.2) + resolve-from: 5.0.0 + rollup: 4.53.3 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + optionalDependencies: + '@microsoft/api-extractor': 7.53.2(@types/node@25.0.3) + postcss: 8.5.6 + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsx@3.14.0: dependencies: esbuild: 0.18.20 @@ -28679,6 +29186,8 @@ snapshots: type-fest@0.7.1: {} + type-fest@2.19.0: {} + type-fest@4.41.0: {} typed-array-buffer@1.0.3: @@ -28978,6 +29487,11 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-check@1.5.4: + dependencies: + registry-auth-token: 3.3.2 + registry-url: 3.1.0 + upper-case-first@2.0.2: dependencies: tslib: 2.8.1 @@ -29019,6 +29533,10 @@ snapshots: dependencies: react: 19.2.0 + use-latest-callback@0.2.6(react@19.2.3): + dependencies: + react: 19.2.3 + use-sidecar@1.1.3(@types/react@19.2.2)(react@19.1.1): dependencies: detect-node-es: 1.1.0 @@ -29047,6 +29565,10 @@ snapshots: dependencies: react: 19.2.0 + use-sync-external-store@1.6.0(react@19.2.3): + dependencies: + react: 19.2.3 + usehooks-ts@3.1.1(react@19.1.1): dependencies: lodash.debounce: 4.0.8 @@ -29836,6 +30358,10 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + wonka@6.3.5: {} word-wrap@1.2.5: {} diff --git a/rivetkit-typescript/packages/devtools/README.md b/rivetkit-typescript/packages/devtools/README.md new file mode 100644 index 0000000000..da73e2d45c --- /dev/null +++ b/rivetkit-typescript/packages/devtools/README.md @@ -0,0 +1,28 @@ +# RivetKit DevTools + + +## Contributing + +To contribute to the RivetKit DevTools package, please follow these steps: + +1. Set up assets server for the `dist` folder: + ```bash + pnpm dlx serve dist + ``` + +2. Set your `CUSTOM_RIVETKIT_DEVTOOLS_URL` environment variable to point to the assets server (default is `http://localhost:3000`): + ```bash + export CUSTOM_RIVETKIT_DEVTOOLS_URL=http://localhost:5000 + ``` + + This will ensure that the RivetKit will use local devtool assets instead of fetching them from the CDN. + +3. In another terminal, run the development build: + ```bash + pnpm dev + ``` + + or run the production build: + ```bash + pnpm build + ``` diff --git a/rivetkit-typescript/packages/devtools/package.json b/rivetkit-typescript/packages/devtools/package.json new file mode 100644 index 0000000000..b5bd8bc9cf --- /dev/null +++ b/rivetkit-typescript/packages/devtools/package.json @@ -0,0 +1,52 @@ +{ + "name": "@rivetkit/devtools", + "private": true, + "version": "2.0.24-rc.1", + "description": "RivetKit DevTools - A set of development tools for RivetKit", + "license": "Apache-2.0", + "keywords": [ + "rivetkit" + ], + "sideEffects": [ + "./dist/chunk-*.js", + "./dist/chunk-*.cjs" + ], + "files": [ + "dist", + "package.json" + ], + "exports": { + ".": { + "import": { + "types": "./dist/mod.d.mts", + "default": "./dist/mod.mjs" + }, + "require": { + "types": "./dist/mod.d.ts", + "default": "./dist/mod.js" + } + } + }, + "scripts": { + "dev": "concurrently \"pnpm build --watch\" \"pnpm serve\"", + "build": "tsup src/mod.tsx", + "serve": "pnpx serve dist", + "check-types": "tsc --noEmit" + }, + "devDependencies": { + "concurrently": "^9.2.1", + "rivetkit": "workspace:*", + "serve": "^14.2.5", + "tsup": "^8.4.0", + "typescript": "^5.5.2" + }, + "stableVersion": "0.8.0", + "dependencies": { + "@floating-ui/react": "^0.27.16", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.2", + "motion": "^12.23.25", + "react": "^19.2.1", + "react-dom": "^19.2.1" + } +} diff --git a/rivetkit-typescript/packages/devtools/src/components/DevButton.tsx b/rivetkit-typescript/packages/devtools/src/components/DevButton.tsx new file mode 100644 index 0000000000..67358d2109 --- /dev/null +++ b/rivetkit-typescript/packages/devtools/src/components/DevButton.tsx @@ -0,0 +1,180 @@ +import { + arrow, + flip, + offset, + shift, + useFloating, + useHover, + useInteractions, +} from "@floating-ui/react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { + getCornerButtonStyle, + getCornerFromPosition, + useCornerPosition, +} from "../hooks/useCornerPosition"; +import { useDraggable } from "../hooks/useDraggable"; + +const INDICATOR_PADDING = 20; +const STORAGE_KEY = "__rivetkit-devtools"; + +interface DevButtonProps { + children: React.ReactNode; + onClick?: () => void; +} + +export function DevButton({ children, onClick }: DevButtonProps) { + const [isOpen, setIsOpen] = useState(false); + const arrowRef = useRef(null); + + const { refs, floatingStyles, context, middlewareData } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + placement: "top", + middleware: [ + offset(10), + flip(), + shift({ padding: 8 }), + arrow({ element: arrowRef }), + ], + }); + + const hover = useHover(context, { + delay: { open: 0, close: 0 }, + }); + + const { getReferenceProps, getFloatingProps } = useInteractions([hover]); + + const { updateCorner, isRightSide, isBottom } = useCornerPosition({ + storageKey: STORAGE_KEY, + defaultCorner: "bottom-right", + }); + + const handleBeforeSnap = useCallback((x: number, y: number) => { + const newCorner = getCornerFromPosition(x, y); + const isRightSide = newCorner.endsWith("right"); + const isBottom = newCorner.startsWith("bottom"); + + return { + ...(isBottom + ? { bottom: INDICATOR_PADDING } + : { top: INDICATOR_PADDING }), + ...(isRightSide + ? { right: INDICATOR_PADDING } + : { left: INDICATOR_PADDING }), + }; + }, []); + + const handleDragEnd = useCallback( + (x: number, y: number) => { + const newCorner = getCornerFromPosition(x, y); + updateCorner(newCorner); + }, + [updateCorner], + ); + + const { + ref: dragRef, + isDragging, + hasDragged, + handlers, + } = useDraggable({ + onBeforeSnap: handleBeforeSnap, + onDragEnd: handleDragEnd, + }); + + const buttonStyle = getCornerButtonStyle({ + isBottom, + isRightSide, + isDragging, + padding: INDICATOR_PADDING, + }); + + // Merge refs for draggable and floating UI + const setRefs = useCallback( + (node: HTMLButtonElement | null) => { + dragRef.current = node; + refs.setReference(node); + }, + [refs], + ); + + // Close tooltip when dragging starts + useEffect(() => { + if (isDragging && isOpen) { + setIsOpen(false); + } + }, [isDragging, isOpen]); + + const arrowX = middlewareData.arrow?.x; + const arrowY = middlewareData.arrow?.y; + + // Get reference props but don't spread all of them to avoid conflicts + const referenceProps = getReferenceProps(); + + // Determine arrow side based on actual placement (after flip) + const { placement } = context; + const arrowSide = placement.split("-")[0]; + + const arrowStyle = useMemo((): React.CSSProperties => { + const style: React.CSSProperties = { + left: arrowX != null ? `${arrowX}px` : "", + top: arrowY != null ? `${arrowY}px` : "", + }; + + // Position arrow on the correct side + if (arrowSide === "top") { + style.bottom = "-4px"; + } else if (arrowSide === "bottom") { + style.top = "-4px"; + } else if (arrowSide === "left") { + style.right = "-4px"; + } else if (arrowSide === "right") { + style.left = "-4px"; + } + + return style; + }, [arrowX, arrowY, arrowSide]); + + const handleClick = useCallback(() => { + if (!hasDragged && onClick) { + onClick(); + } + }, [hasDragged, onClick]); + + return ( + <> + + {isOpen && !isDragging && ( +
+
Open Inspector
+
+
+ )} + + ); +} diff --git a/rivetkit-typescript/packages/devtools/src/globals.d.ts b/rivetkit-typescript/packages/devtools/src/globals.d.ts new file mode 100644 index 0000000000..84210ac866 --- /dev/null +++ b/rivetkit-typescript/packages/devtools/src/globals.d.ts @@ -0,0 +1,9 @@ +declare module "*.css" { + const content: string; + export default content; +} + +declare module "*.svg" { + const content: string; + export default content; +} diff --git a/rivetkit-typescript/packages/devtools/src/hooks/useCornerPosition.tsx b/rivetkit-typescript/packages/devtools/src/hooks/useCornerPosition.tsx new file mode 100644 index 0000000000..11f0c0bdab --- /dev/null +++ b/rivetkit-typescript/packages/devtools/src/hooks/useCornerPosition.tsx @@ -0,0 +1,80 @@ +import { useEffect, useState } from "react"; + +type Corner = "top-left" | "top-right" | "bottom-left" | "bottom-right"; + +interface UseCornerPositionOptions { + storageKey: string; + defaultCorner?: Corner; +} + +export function useCornerPosition(options: UseCornerPositionOptions) { + const { storageKey, defaultCorner = "bottom-right" } = options; + const [corner, setCorner] = useState(defaultCorner); + + useEffect(() => { + const saved = localStorage.getItem(storageKey); + if (saved) { + setCorner(saved as Corner); + } + }, [storageKey]); + + const updateCorner = (newCorner: Corner) => { + setCorner(newCorner); + localStorage.setItem(storageKey, newCorner); + }; + + const isRightSide = corner.endsWith("right"); + const isBottom = corner.startsWith("bottom"); + + return { + corner, + updateCorner, + isRightSide, + isBottom, + }; +} + +interface CornerButtonStyleOptions { + isBottom: boolean; + isRightSide: boolean; + isDragging: boolean; + padding?: number; + paddingVertical?: number; + paddingHorizontal?: number; +} + +export function getCornerButtonStyle( + options: CornerButtonStyleOptions, +): React.CSSProperties { + const { isBottom, isRightSide, isDragging, padding = 20, paddingVertical, paddingHorizontal } = options; + + const verticalPadding = paddingVertical ?? padding; + const horizontalPadding = paddingHorizontal ?? padding; + + return { + position: "fixed", + ...(isBottom ? { bottom: verticalPadding } : { top: verticalPadding }), + ...(isRightSide ? { right: horizontalPadding } : { left: horizontalPadding }), + transform: isDragging + ? "translate(var(--drag-x, 0px), var(--drag-y, 0px))" + : undefined, + cursor: isDragging ? "grabbing" : "pointer", + flexDirection: isRightSide ? "row-reverse" : "row", + }; +} + +export function getCornerFromPosition(x: number, y: number): Corner { + const centerX = window.innerWidth / 2; + const centerY = window.innerHeight / 2; + + if (x < centerX && y < centerY) { + return "top-left"; + } + if (x >= centerX && y < centerY) { + return "top-right"; + } + if (x < centerX && y >= centerY) { + return "bottom-left"; + } + return "bottom-right"; +} diff --git a/rivetkit-typescript/packages/devtools/src/hooks/useDraggable.ts b/rivetkit-typescript/packages/devtools/src/hooks/useDraggable.ts new file mode 100644 index 0000000000..8811a02fdd --- /dev/null +++ b/rivetkit-typescript/packages/devtools/src/hooks/useDraggable.ts @@ -0,0 +1,189 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { flushSync } from "react-dom"; + +interface UseDraggableOptions { + onDragEnd?: (x: number, y: number) => void; + onBeforeSnap?: ( + x: number, + y: number, + ) => { top?: number; bottom?: number; left?: number; right?: number }; +} + +export function useDraggable( + options?: UseDraggableOptions, +) { + const [isDragging, setIsDragging] = useState(false); + const [hasDragged, setHasDragged] = useState(false); + const elementRef = useRef(null); + const dragStartRef = useRef({ x: 0, y: 0 }); + const animationRef = useRef(null); + const isPointerDownRef = useRef(false); + + // Cleanup animation on unmount + useEffect(() => { + return () => { + if (animationRef.current) { + animationRef.current.cancel(); + animationRef.current = null; + } + }; + }, []); + + const handlePointerDown = useCallback((e: React.PointerEvent) => { + if (e.button !== 0) return; + isPointerDownRef.current = true; + setHasDragged(false); + dragStartRef.current = { x: e.clientX, y: e.clientY }; + (e.target as HTMLElement).setPointerCapture(e.pointerId); + }, []); + + const handlePointerMove = useCallback((e: React.PointerEvent) => { + if (!elementRef.current || !isPointerDownRef.current) return; + + const offsetX = e.clientX - dragStartRef.current.x; + const offsetY = e.clientY - dragStartRef.current.y; + + // Consider it a drag if moved more than 5 pixels + if (Math.abs(offsetX) > 5 || Math.abs(offsetY) > 5) { + setHasDragged(true); + setIsDragging(true); + } + + elementRef.current.style.setProperty("--drag-x", `${offsetX}px`); + elementRef.current.style.setProperty("--drag-y", `${offsetY}px`); + }, []); + + const handlePointerUpOrCancel = useCallback( + (e: React.PointerEvent) => { + if (!elementRef.current || !isPointerDownRef.current) return; + isPointerDownRef.current = false; + + // Try to release pointer capture, but don't fail if it's already released + try { + (e.target as HTMLElement).releasePointerCapture(e.pointerId); + } catch { + // Ignore errors if pointer capture was already released + } + + const element = elementRef.current; + + // Get current drag offset + const dragOffsetX = + Number.parseFloat(element.style.getPropertyValue("--drag-x")) || + 0; + const dragOffsetY = + Number.parseFloat(element.style.getPropertyValue("--drag-y")) || + 0; + + // If we didn't actually drag, just clean up and return + if (Math.abs(dragOffsetX) <= 5 && Math.abs(dragOffsetY) <= 5) { + element.style.setProperty("--drag-x", "0px"); + element.style.setProperty("--drag-y", "0px"); + setIsDragging(false); + return; + } + + // Get current position WITH drag offset applied + const rect = element.getBoundingClientRect(); + + // Calculate the final position based on current position + drag offset + const finalX = rect.left + dragOffsetX + rect.width / 2; + const finalY = rect.top + dragOffsetY + rect.height / 2; + + // Get the target corner position + const targetPosition = options?.onBeforeSnap?.(finalX, finalY); + + // If no target position, just clean up + if (!targetPosition) { + element.style.setProperty("--drag-x", "0px"); + element.style.setProperty("--drag-y", "0px"); + setIsDragging(false); + return; + } + + // Calculate target screen position + let targetScreenX = 0; + let targetScreenY = 0; + + if (targetPosition.left !== undefined) { + targetScreenX = targetPosition.left; + } else if (targetPosition.right !== undefined) { + targetScreenX = + window.innerWidth - targetPosition.right - rect.width; + } + + if (targetPosition.top !== undefined) { + targetScreenY = targetPosition.top; + } else if (targetPosition.bottom !== undefined) { + targetScreenY = + window.innerHeight - targetPosition.bottom - rect.height; + } + + // Calculate the offset needed to reach target from current dragged position + const deltaX = targetScreenX - rect.left; + const deltaY = targetScreenY - rect.top; + + // Animate from current dragged position to target + const animation = element.animate( + [ + { + transform: `translate(${dragOffsetX}px, ${dragOffsetY}px)`, + }, + { + transform: `translate(${dragOffsetX + deltaX}px, ${dragOffsetY + deltaY}px)`, + }, + ], + { + duration: 400, + easing: "cubic-bezier(0.34, 1.2, 0.64, 1)", + fill: "forwards", + }, + ); + + animationRef.current = animation; + + // Reset CSS variables + element.style.setProperty("--drag-x", "0px"); + element.style.setProperty("--drag-y", "0px"); + + // Wait for animation to finish before updating corner position + animation.finished + .then(() => { + // Commit the animation effect by applying the final transform + animation.commitStyles(); + // Cancel the animation to remove it from the element + animation.cancel(); + animationRef.current = null; + // Update state and corner position synchronously + flushSync(() => { + setIsDragging(false); + options?.onDragEnd?.(finalX, finalY); + }); + // Clean up the committed transform after React has rendered + element.style.transform = ""; + }) + .catch(() => { + // Animation was cancelled, clean up + animationRef.current = null; + }); + }, + [options], + ); + + const handlers = useMemo( + () => ({ + onPointerDown: handlePointerDown, + onPointerMove: handlePointerMove, + onPointerUp: handlePointerUpOrCancel, + onPointerCancel: handlePointerUpOrCancel, + }), + [handlePointerDown, handlePointerMove, handlePointerUpOrCancel], + ); + + return { + ref: elementRef, + isDragging, + hasDragged, + handlers, + }; +} diff --git a/rivetkit-typescript/packages/devtools/src/icon.svg b/rivetkit-typescript/packages/devtools/src/icon.svg new file mode 100644 index 0000000000..287c425791 --- /dev/null +++ b/rivetkit-typescript/packages/devtools/src/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rivetkit-typescript/packages/devtools/src/mod.tsx b/rivetkit-typescript/packages/devtools/src/mod.tsx new file mode 100644 index 0000000000..1313b86d56 --- /dev/null +++ b/rivetkit-typescript/packages/devtools/src/mod.tsx @@ -0,0 +1,80 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { DevButton } from "./components/DevButton"; +import svg from "./icon.svg"; +import styles from "./styles.css"; + +declare global { + interface Window { + __rivetkit?: Array< + Parameters[0] + >; + } +} + +const root = document.createElement("rivetkit-devtools"); +root.style.zIndex = "2147483647"; +root.style.pointerEvents = "none"; +const shadow = root.attachShadow({ mode: "open" }); + +createRoot(shadow).render( + + +