diff --git a/.changeset/purple-wombats-heal.md b/.changeset/purple-wombats-heal.md new file mode 100644 index 000000000..9db868da5 --- /dev/null +++ b/.changeset/purple-wombats-heal.md @@ -0,0 +1,6 @@ +--- +'@gitbook/react-openapi': minor +'gitbook': minor +--- + +new OpenAPI blocks design diff --git a/.changeset/swift-gorillas-juggle.md b/.changeset/swift-gorillas-juggle.md new file mode 100644 index 000000000..e5b607ec1 --- /dev/null +++ b/.changeset/swift-gorillas-juggle.md @@ -0,0 +1,6 @@ +--- +'gitbook': patch +'@gitbook/react-openapi': patch +--- + +Support deprecated and x-deprecated-sunset in OpenAPI spec diff --git a/bun.lock b/bun.lock index 2823a8ad8..7913d0235 100644 --- a/bun.lock +++ b/bun.lock @@ -46,7 +46,7 @@ "@sentry/nextjs": "8.35.0", "@sindresorhus/fnv1a": "^3.1.0", "@tailwindcss/container-queries": "^0.1.1", - "@tailwindcss/typography": "^0.5.10", + "@tailwindcss/typography": "^0.5.16", "@upstash/redis": "^1.27.1", "ajv": "^8.12.0", "assert-never": "^1.2.1", @@ -197,6 +197,8 @@ "@scalar/openapi-types": "^0.1.6", "classnames": "^2.5.1", "flatted": "^3.2.9", + "react-aria": "^3.37.0", + "react-aria-components": "^1.6.0", "swagger2openapi": "^7.0.8", "usehooks-ts": "^3.1.0", "yaml": "1.10.2", @@ -561,6 +563,16 @@ "@floating-ui/vue": ["@floating-ui/vue@1.1.5", "", { "dependencies": { "@floating-ui/dom": "^1.0.0", "@floating-ui/utils": "^0.2.8", "vue-demi": ">=0.13.0" } }, "sha512-ynL1p5Z+woPVSwgMGqeDrx6HrJfGIDzFyESFkyqJKilGW1+h/8yVY29Khn0LaU6wHBRwZ13ntG6reiHWK6jyzw=="], + "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.2", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.6", "@formatjs/intl-localematcher": "0.5.10", "decimal.js": "10", "tslib": "2" } }, "sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg=="], + + "@formatjs/fast-memoize": ["@formatjs/fast-memoize@2.2.6", "", { "dependencies": { "tslib": "2" } }, "sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw=="], + + "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@2.11.0", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.2", "@formatjs/icu-skeleton-parser": "1.8.12", "tslib": "2" } }, "sha512-Hp81uTjjdTk3FLh/dggU5NK7EIsVWc5/ZDWrIldmf2rBuPejuZ13CZ/wpVE2SToyi4EiroPTQ1XJcJuZFIxTtw=="], + + "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@1.8.12", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.2", "tslib": "2" } }, "sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg=="], + + "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.5.10", "", { "dependencies": { "tslib": "2" } }, "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q=="], + "@fortawesome/fontawesome-common-types": ["@fortawesome/fontawesome-common-types@6.6.0", "", {}, "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw=="], "@fortawesome/fontawesome-free": ["@fortawesome/fontawesome-free@6.6.0", "", {}, "sha512-60G28ke/sXdtS9KZCpZSHHkCbdsOGEhIUGlwq6yhY74UpTiToIh8np7A8yphhM4BWsvNFtIvLpi4co+h9Mr9Ow=="], @@ -643,9 +655,13 @@ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], - "@internationalized/date": ["@internationalized/date@3.5.6", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw=="], + "@internationalized/date": ["@internationalized/date@3.7.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ=="], - "@internationalized/number": ["@internationalized/number@3.5.4", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-h9huwWjNqYyE2FXZZewWqmCdkw1HeFds5q4Siuoms3hUQC5iPJK3aBmkFZoDSLN4UD0Bl8G22L/NdHpeOr+/7A=="], + "@internationalized/message": ["@internationalized/message@3.1.6", "", { "dependencies": { "@swc/helpers": "^0.5.0", "intl-messageformat": "^10.1.0" } }, "sha512-JxbK3iAcTIeNr1p0WIFg/wQJjIzJt9l/2KNY/48vXV7GRGZSv3zMxJsce008fZclk2cDC8y0Ig3odceHO7EfNQ=="], + + "@internationalized/number": ["@internationalized/number@3.6.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw=="], + + "@internationalized/string": ["@internationalized/string@3.2.5", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-rKs71Zvl2OKOHM+mzAFMIyqR5hI1d1O6BBkMK2/lkfg3fkmVh9Eeg0awcA8W2WqYqDOv6a86DIOlFpggwLtbuw=="], "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], @@ -863,6 +879,216 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.0", "", {}, "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="], + "@react-aria/autocomplete": ["@react-aria/autocomplete@3.0.0-alpha.37", "", { "dependencies": { "@react-aria/combobox": "^3.11.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/listbox": "^3.14.0", "@react-aria/searchfield": "^3.8.0", "@react-aria/textfield": "^3.16.0", "@react-aria/utils": "^3.27.0", "@react-stately/autocomplete": "3.0.0-alpha.0", "@react-stately/combobox": "^3.10.2", "@react-types/autocomplete": "3.0.0-alpha.28", "@react-types/button": "^3.10.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-a7awFG3hshJ/kX7Qti/cJAKOG0XU5F/XW6fQffKGfEge7PmiWIvaLTrT5her79/v8v/bRBykIkpEgDCFE7WGzg=="], + + "@react-aria/breadcrumbs": ["@react-aria/breadcrumbs@3.5.20", "", { "dependencies": { "@react-aria/i18n": "^3.12.5", "@react-aria/link": "^3.7.8", "@react-aria/utils": "^3.27.0", "@react-types/breadcrumbs": "^3.7.10", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-xqVSSDPpQuUFpJyIXMQv8L7zumk5CeGX7qTzo4XRvqm5T9qnNAX4XpYEMdktnLrQRY/OemCBScbx7SEwr0B3Kg=="], + + "@react-aria/button": ["@react-aria/button@3.11.1", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/interactions": "^3.23.0", "@react-aria/toolbar": "3.0.0-beta.12", "@react-aria/utils": "^3.27.0", "@react-stately/toggle": "^3.8.1", "@react-types/button": "^3.10.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-NSs2HxHSSPSuYy5bN+PMJzsCNDVsbm1fZ/nrWM2WWWHTBrx9OqyrEXZVV9ebzQCN9q0nzhwpf6D42zHIivWtJA=="], + + "@react-aria/calendar": ["@react-aria/calendar@3.7.0", "", { "dependencies": { "@internationalized/date": "^3.7.0", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/live-announcer": "^3.4.1", "@react-aria/utils": "^3.27.0", "@react-stately/calendar": "^3.7.0", "@react-types/button": "^3.10.2", "@react-types/calendar": "^3.6.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-9YUbgcox7cQgvZfQtL2BLLRsIuX4mJeclk9HkFoOsAu3RGO5HNsteah8FV54W8BMjm/bNRXIPUxtjTTP+1L6jg=="], + + "@react-aria/checkbox": ["@react-aria/checkbox@3.15.1", "", { "dependencies": { "@react-aria/form": "^3.0.12", "@react-aria/interactions": "^3.23.0", "@react-aria/label": "^3.7.14", "@react-aria/toggle": "^3.10.11", "@react-aria/utils": "^3.27.0", "@react-stately/checkbox": "^3.6.11", "@react-stately/form": "^3.1.1", "@react-stately/toggle": "^3.8.1", "@react-types/checkbox": "^3.9.1", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ETgsMDZ0IZzRXy/OVlGkazm8T+PcMHoTvsxp0c+U82c8iqdITA+VJ615eBPOQh6OkkYIIn4cRn/e+69RmGzXng=="], + + "@react-aria/collections": ["@react-aria/collections@3.0.0-alpha.7", "", { "dependencies": { "@react-aria/ssr": "^3.9.7", "@react-aria/utils": "^3.27.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-JR2Ro33Chlf26NM12zJsK+MOs5/k+PQallT5+4YawndYmbxqlDLADcoFdcORJqh0pKf9OnluWtANobCkQGd0aQ=="], + + "@react-aria/color": ["@react-aria/color@3.0.3", "", { "dependencies": { "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/numberfield": "^3.11.10", "@react-aria/slider": "^3.7.15", "@react-aria/spinbutton": "^3.6.11", "@react-aria/textfield": "^3.16.0", "@react-aria/utils": "^3.27.0", "@react-aria/visually-hidden": "^3.8.19", "@react-stately/color": "^3.8.2", "@react-stately/form": "^3.1.1", "@react-types/color": "^3.0.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-DDVma2107VHBfSuEnnmy+KJvXvxEXWSAooii2vlHHmQNb5x4rv4YTk+dP5GZl/7MgT8OgPTB9UHoC83bXFMDRA=="], + + "@react-aria/combobox": ["@react-aria/combobox@3.11.1", "", { "dependencies": { "@react-aria/i18n": "^3.12.5", "@react-aria/listbox": "^3.14.0", "@react-aria/live-announcer": "^3.4.1", "@react-aria/menu": "^3.17.0", "@react-aria/overlays": "^3.25.0", "@react-aria/selection": "^3.22.0", "@react-aria/textfield": "^3.16.0", "@react-aria/utils": "^3.27.0", "@react-stately/collections": "^3.12.1", "@react-stately/combobox": "^3.10.2", "@react-stately/form": "^3.1.1", "@react-types/button": "^3.10.2", "@react-types/combobox": "^3.13.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-TTNbGhUuqxzPcJzd6hufOxuHzX0UARkw+0bl+TuCwNPQnqrcPf20EoOZvd3MHZwGq6GCP4QV+qo0uGx83RpUvA=="], + + "@react-aria/datepicker": ["@react-aria/datepicker@3.13.0", "", { "dependencies": { "@internationalized/date": "^3.7.0", "@internationalized/number": "^3.6.0", "@internationalized/string": "^3.2.5", "@react-aria/focus": "^3.19.1", "@react-aria/form": "^3.0.12", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/label": "^3.7.14", "@react-aria/spinbutton": "^3.6.11", "@react-aria/utils": "^3.27.0", "@react-stately/datepicker": "^3.12.0", "@react-stately/form": "^3.1.1", "@react-types/button": "^3.10.2", "@react-types/calendar": "^3.6.0", "@react-types/datepicker": "^3.10.0", "@react-types/dialog": "^3.5.15", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-TmJan65P3Vk7VDBNW5rH9Z25cAn0vk8TEtaP3boCs8wJFE+HbEuB8EqLxBFu47khtuKTEqDP3dTlUh2Vt/f7Xw=="], + + "@react-aria/dialog": ["@react-aria/dialog@3.5.21", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/overlays": "^3.25.0", "@react-aria/utils": "^3.27.0", "@react-types/dialog": "^3.5.15", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-tBsn9swBhcptJ9QIm0+ur0PVR799N6qmGguva3rUdd+gfitknFScyT08d7AoMr9AbXYdJ+2R9XNSZ3H3uIWQMw=="], + + "@react-aria/disclosure": ["@react-aria/disclosure@3.0.1", "", { "dependencies": { "@react-aria/ssr": "^3.9.7", "@react-aria/utils": "^3.27.0", "@react-stately/disclosure": "^3.0.1", "@react-types/button": "^3.10.2", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-rNH8RFcePoAQizcqB7KuHbBOr7sPsysFKCUwbVSOXLPgvCfXKafIhjgFJVqekfsbn5zWvkcTupnzGVJj/F9p+g=="], + + "@react-aria/dnd": ["@react-aria/dnd@3.8.1", "", { "dependencies": { "@internationalized/string": "^3.2.5", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/live-announcer": "^3.4.1", "@react-aria/overlays": "^3.25.0", "@react-aria/utils": "^3.27.0", "@react-stately/dnd": "^3.5.1", "@react-types/button": "^3.10.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-FoXYQ4z33E9YBzIGRJM1B1oZep6CvEWgXvjCZGURatjr3qG7vf95mOqA5kVd9bjLL7QK4w0ujJWEBfog3WmufA=="], + + "@react-aria/focus": ["@react-aria/focus@3.19.1", "", { "dependencies": { "@react-aria/interactions": "^3.23.0", "@react-aria/utils": "^3.27.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg=="], + + "@react-aria/form": ["@react-aria/form@3.0.12", "", { "dependencies": { "@react-aria/interactions": "^3.23.0", "@react-aria/utils": "^3.27.0", "@react-stately/form": "^3.1.1", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-8uvPYEd3GDyGt5NRJIzdWW1Ry5HLZq37vzRZKUW8alZ2upFMH3KJJG55L9GP59KiF6zBrYBebvI/YK1Ye1PE1g=="], + + "@react-aria/grid": ["@react-aria/grid@3.11.1", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/live-announcer": "^3.4.1", "@react-aria/selection": "^3.22.0", "@react-aria/utils": "^3.27.0", "@react-stately/collections": "^3.12.1", "@react-stately/grid": "^3.10.1", "@react-stately/selection": "^3.19.0", "@react-types/checkbox": "^3.9.1", "@react-types/grid": "^3.2.11", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Wg8m68RtNWfkhP3Qjrrsl1q1et8QCjXPMRsYgKBahYRS0kq2MDcQ+UBdG1fiCQn/MfNImhTUGVeQX276dy1lww=="], + + "@react-aria/gridlist": ["@react-aria/gridlist@3.10.1", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/grid": "^3.11.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/selection": "^3.22.0", "@react-aria/utils": "^3.27.0", "@react-stately/collections": "^3.12.1", "@react-stately/list": "^3.11.2", "@react-stately/tree": "^3.8.7", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-11FlupBg5C9ehs7R6OjqMPWEOLK/4IuSrq7D1xU+Hnm7ZYI/KKcCXvNMjMmnOz/gGzOmfgVwz5PIKaY9aZarEg=="], + + "@react-aria/i18n": ["@react-aria/i18n@3.12.5", "", { "dependencies": { "@internationalized/date": "^3.7.0", "@internationalized/message": "^3.1.6", "@internationalized/number": "^3.6.0", "@internationalized/string": "^3.2.5", "@react-aria/ssr": "^3.9.7", "@react-aria/utils": "^3.27.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ooeop2pTG94PuaHoN2OTk2hpkqVuoqgEYxRvnc1t7DVAtsskfhS/gVOTqyWGsxvwAvRi7m/CnDu6FYdeQ/bK5w=="], + + "@react-aria/interactions": ["@react-aria/interactions@3.23.0", "", { "dependencies": { "@react-aria/ssr": "^3.9.7", "@react-aria/utils": "^3.27.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-0qR1atBIWrb7FzQ+Tmr3s8uH5mQdyRH78n0krYaG8tng9+u1JlSi8DGRSaC9ezKyNB84m7vHT207xnHXGeJ3Fg=="], + + "@react-aria/label": ["@react-aria/label@3.7.14", "", { "dependencies": { "@react-aria/utils": "^3.27.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-EN1Md2YvcC4sMqBoggsGYUEGlTNqUfJZWzduSt29fbQp1rKU2KlybTe+TWxKq/r2fFd+4JsRXxMeJiwB3w2AQA=="], + + "@react-aria/link": ["@react-aria/link@3.7.8", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/interactions": "^3.23.0", "@react-aria/utils": "^3.27.0", "@react-types/link": "^3.5.10", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-oiXUPQLZmf9Q9Xehb/sG1QRxfo28NFKdh9w+unD12sHI6NdLMETl5MA4CYyTgI0dfMtTjtfrF68GCnWfc7JvXQ=="], + + "@react-aria/listbox": ["@react-aria/listbox@3.14.0", "", { "dependencies": { "@react-aria/interactions": "^3.23.0", "@react-aria/label": "^3.7.14", "@react-aria/selection": "^3.22.0", "@react-aria/utils": "^3.27.0", "@react-stately/collections": "^3.12.1", "@react-stately/list": "^3.11.2", "@react-types/listbox": "^3.5.4", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-pyVbKavh8N8iyiwOx6I3JIcICvAzFXkKSFni1yarfgngJsJV3KSyOkzLomOfN9UhbjcV4sX61/fccwJuvlurlA=="], + + "@react-aria/live-announcer": ["@react-aria/live-announcer@3.4.1", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-4X2mcxgqLvvkqxv2l1n00jTzUxxe0kkLiapBGH1LHX/CxA1oQcHDqv8etJ2ZOwmS/MSBBiWnv3DwYHDOF6ubig=="], + + "@react-aria/menu": ["@react-aria/menu@3.17.0", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/overlays": "^3.25.0", "@react-aria/selection": "^3.22.0", "@react-aria/utils": "^3.27.0", "@react-stately/collections": "^3.12.1", "@react-stately/menu": "^3.9.1", "@react-stately/selection": "^3.19.0", "@react-stately/tree": "^3.8.7", "@react-types/button": "^3.10.2", "@react-types/menu": "^3.9.14", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-aiFvSv3G1YvPC0klJQ/9quB05xIDZzJ5Lt6/CykP0UwGK5i8GCqm6/cyFLwEXsS5ooUPxS3bqmdOsgdADSSgqg=="], + + "@react-aria/meter": ["@react-aria/meter@3.4.19", "", { "dependencies": { "@react-aria/progress": "^3.4.19", "@react-types/meter": "^3.4.6", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-IIA+gTHrNVbMuBgcqdGLEKd/ZiKM2hOUqS6uztbT15dwPJTmtfJiTWA2872PiY52p+gqPSanZuTc2TXYJa+rew=="], + + "@react-aria/numberfield": ["@react-aria/numberfield@3.11.10", "", { "dependencies": { "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/spinbutton": "^3.6.11", "@react-aria/textfield": "^3.16.0", "@react-aria/utils": "^3.27.0", "@react-stately/form": "^3.1.1", "@react-stately/numberfield": "^3.9.9", "@react-types/button": "^3.10.2", "@react-types/numberfield": "^3.8.8", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-bYbTfO9NbAKMFOfEGGs+lvlxk0I9L0lU3WD2PFQZWdaoBz9TCkL+vK0fJk1zsuKaVjeGsmHP9VesBPRmaP0MiA=="], + + "@react-aria/overlays": ["@react-aria/overlays@3.25.0", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/ssr": "^3.9.7", "@react-aria/utils": "^3.27.0", "@react-aria/visually-hidden": "^3.8.19", "@react-stately/overlays": "^3.6.13", "@react-types/button": "^3.10.2", "@react-types/overlays": "^3.8.12", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-UEqJJ4duowrD1JvwXpPZreBuK79pbyNjNxFUVpFSskpGEJe3oCWwsSDKz7P1O7xbx5OYp+rDiY8fk/sE5rkaKw=="], + + "@react-aria/progress": ["@react-aria/progress@3.4.19", "", { "dependencies": { "@react-aria/i18n": "^3.12.5", "@react-aria/label": "^3.7.14", "@react-aria/utils": "^3.27.0", "@react-types/progress": "^3.5.9", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-5HHnBJHqEUuY+dYsjIZDYsENeKr49VCuxeaDZ0OSahbOlloIOB1baCo/6jLBv1O1rwrAzZ2gCCPcVGed/cjrcw=="], + + "@react-aria/radio": ["@react-aria/radio@3.10.11", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/form": "^3.0.12", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/label": "^3.7.14", "@react-aria/utils": "^3.27.0", "@react-stately/radio": "^3.10.10", "@react-types/radio": "^3.8.6", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-R150HsBFPr1jLMShI4aBM8heCa1k6h0KEvnFRfTAOBu+B9hMSZOPB+d6GQOwGPysNlbset90Kej8G15FGHjqiA=="], + + "@react-aria/searchfield": ["@react-aria/searchfield@3.8.0", "", { "dependencies": { "@react-aria/i18n": "^3.12.5", "@react-aria/textfield": "^3.16.0", "@react-aria/utils": "^3.27.0", "@react-stately/searchfield": "^3.5.9", "@react-types/button": "^3.10.2", "@react-types/searchfield": "^3.5.11", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-AaZuH9YIWlMyE1m7cSjHCfOuQmlWN+w8HVW32TxeGGGL1kJsYAlSYWYHUyYFIKh245kq/m5zUxAxmw5Ygmnx5w=="], + + "@react-aria/select": ["@react-aria/select@3.15.1", "", { "dependencies": { "@react-aria/form": "^3.0.12", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/label": "^3.7.14", "@react-aria/listbox": "^3.14.0", "@react-aria/menu": "^3.17.0", "@react-aria/selection": "^3.22.0", "@react-aria/utils": "^3.27.0", "@react-aria/visually-hidden": "^3.8.19", "@react-stately/select": "^3.6.10", "@react-types/button": "^3.10.2", "@react-types/select": "^3.9.9", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-FOtY1tuHt0YTHwOEy/sf7LEIL+Nnkho3wJmfpWQuTxsvMCF7UJdQPYPd6/jGCcCdiqW7H4iqyjUkSp6nk/XRWQ=="], + + "@react-aria/selection": ["@react-aria/selection@3.22.0", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/utils": "^3.27.0", "@react-stately/selection": "^3.19.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-XFOrK525HX2eeWeLZcZscUAs5qsuC1ZxsInDXMjvLeAaUPtQNEhUKHj3psDAl6XDU4VV1IJo0qCmFTVqTTMZSg=="], + + "@react-aria/separator": ["@react-aria/separator@3.4.5", "", { "dependencies": { "@react-aria/utils": "^3.27.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RQA9sKZdAEjP1Yrv0GpDdXgmXd56kXDE8atPDHEC0/A4lpYh/YFLfXcv1JW0Hlg4kBocdX2pB2INyDGhiD+yfw=="], + + "@react-aria/slider": ["@react-aria/slider@3.7.15", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/label": "^3.7.14", "@react-aria/utils": "^3.27.0", "@react-stately/slider": "^3.6.1", "@react-types/shared": "^3.27.0", "@react-types/slider": "^3.7.8", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-v9tujsuvJYRX0vE/vMYBzTT9FXbzrLsjkOrouNq+UdBIr7wRjIWTHHM0j+khb2swyCWNTbdv6Ce316Zqx2qWFg=="], + + "@react-aria/spinbutton": ["@react-aria/spinbutton@3.6.11", "", { "dependencies": { "@react-aria/i18n": "^3.12.5", "@react-aria/live-announcer": "^3.4.1", "@react-aria/utils": "^3.27.0", "@react-types/button": "^3.10.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RM+gYS9tf9Wb+GegV18n4ArK3NBKgcsak7Nx1CkEgX9BjJ0yayWUHdfEjRRvxGXl+1z1n84cJVkZ6FUlWOWEZA=="], + + "@react-aria/ssr": ["@react-aria/ssr@3.9.7", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg=="], + + "@react-aria/switch": ["@react-aria/switch@3.6.11", "", { "dependencies": { "@react-aria/toggle": "^3.10.11", "@react-stately/toggle": "^3.8.1", "@react-types/shared": "^3.27.0", "@react-types/switch": "^3.5.8", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-paYCpH+oeL+8rgQK+cBJ+IaZ1sXSh3+50WPlg2LvLBta0QVfQhPR4juPvfXRpfHHhCjFBgF4/RGbV8q5zpl3vA=="], + + "@react-aria/table": ["@react-aria/table@3.16.1", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/grid": "^3.11.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/live-announcer": "^3.4.1", "@react-aria/utils": "^3.27.0", "@react-aria/visually-hidden": "^3.8.19", "@react-stately/collections": "^3.12.1", "@react-stately/flags": "^3.0.5", "@react-stately/table": "^3.13.1", "@react-types/checkbox": "^3.9.1", "@react-types/grid": "^3.2.11", "@react-types/shared": "^3.27.0", "@react-types/table": "^3.10.4", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-T28TIGnKnPBunyErDBmm5jUX7AyzT7NVWBo9pDSt9wUuEnz0rVNd7p9sjmP2+u7I645feGG9klcdpCvFeqrk8A=="], + + "@react-aria/tabs": ["@react-aria/tabs@3.9.9", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/i18n": "^3.12.5", "@react-aria/selection": "^3.22.0", "@react-aria/utils": "^3.27.0", "@react-stately/tabs": "^3.7.1", "@react-types/shared": "^3.27.0", "@react-types/tabs": "^3.3.12", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-oXPtANs16xu6MdMGLHjGV/2Zupvyp9CJEt7ORPLv5xAzSY5hSjuQHJLZ0te3Lh/KSG5/0o3RW/W5yEqo7pBQQQ=="], + + "@react-aria/tag": ["@react-aria/tag@3.4.9", "", { "dependencies": { "@react-aria/gridlist": "^3.10.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/label": "^3.7.14", "@react-aria/selection": "^3.22.0", "@react-aria/utils": "^3.27.0", "@react-stately/list": "^3.11.2", "@react-types/button": "^3.10.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Vnps+zk8vYyjevv2Bc6vc9kSp9HFLKrKUDmrWMc0DfseypwJMc3Ya6F965ZVTjF9nuWrojNmvgusNu7qyXFShQ=="], + + "@react-aria/textfield": ["@react-aria/textfield@3.16.0", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/form": "^3.0.12", "@react-aria/label": "^3.7.14", "@react-aria/utils": "^3.27.0", "@react-stately/form": "^3.1.1", "@react-stately/utils": "^3.10.5", "@react-types/shared": "^3.27.0", "@react-types/textfield": "^3.11.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-53RVpMeMDN/QoabqnYZ1lxTh1xTQ3IBYQARuayq5EGGMafyxoFHzttxUdSqkZGK/+zdSF2GfmjOYJVm2nDKuDQ=="], + + "@react-aria/toggle": ["@react-aria/toggle@3.10.11", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/interactions": "^3.23.0", "@react-aria/utils": "^3.27.0", "@react-stately/toggle": "^3.8.1", "@react-types/checkbox": "^3.9.1", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-J3jO3KJiUbaYVDEpeXSBwqcyKxpi9OreiHRGiaxb6VwB+FWCj7Gb2WKajByXNyfs8jc6kX9VUFaXa7jze60oEQ=="], + + "@react-aria/toolbar": ["@react-aria/toolbar@3.0.0-beta.12", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/i18n": "^3.12.5", "@react-aria/utils": "^3.27.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-a+Be27BtM2lzEdTzm19FikPbitfW65g/JZln3kyAvgpswhU6Ljl8lztaVw4ixjG4H0nqnKvVggMy4AlWwDUaVQ=="], + + "@react-aria/tooltip": ["@react-aria/tooltip@3.7.11", "", { "dependencies": { "@react-aria/focus": "^3.19.1", "@react-aria/interactions": "^3.23.0", "@react-aria/utils": "^3.27.0", "@react-stately/tooltip": "^3.5.1", "@react-types/shared": "^3.27.0", "@react-types/tooltip": "^3.4.14", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-mhZgAWUj7bUWipDeJXaVPZdqnzoBCd/uaEbdafnvgETmov1udVqPTh9w4ZKX2Oh1wa2+OdLFrBOk+8vC6QbWag=="], + + "@react-aria/tree": ["@react-aria/tree@3.0.0-beta.3", "", { "dependencies": { "@react-aria/gridlist": "^3.10.1", "@react-aria/i18n": "^3.12.5", "@react-aria/selection": "^3.22.0", "@react-aria/utils": "^3.27.0", "@react-stately/tree": "^3.8.7", "@react-types/button": "^3.10.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-eQnCtvDgpunCHInIT+Da3qdgzDzKEFW9REX2j1vMqWTsbM1YikVlBzB9AJOd9KIAWyn+p4TYdL8zzPWxvuSdfA=="], + + "@react-aria/utils": ["@react-aria/utils@3.27.0", "", { "dependencies": { "@react-aria/ssr": "^3.9.7", "@react-stately/utils": "^3.10.5", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-p681OtApnKOdbeN8ITfnnYqfdHS0z7GE+4l8EXlfLnr70Rp/9xicBO6d2rU+V/B3JujDw2gPWxYKEnEeh0CGCw=="], + + "@react-aria/virtualizer": ["@react-aria/virtualizer@4.1.1", "", { "dependencies": { "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/utils": "^3.27.0", "@react-stately/virtualizer": "^4.2.1", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-AYQmC/S9HhxGOj8HkQdxDW8/+sUEmmfcGpjkInzXB8UZCB1FQLC0LpvA8fOP7AfzLaAL+HVcYF5BvnGMPijHTQ=="], + + "@react-aria/visually-hidden": ["@react-aria/visually-hidden@3.8.19", "", { "dependencies": { "@react-aria/interactions": "^3.23.0", "@react-aria/utils": "^3.27.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-MZgCCyQ3sdG94J5iJz7I7Ai3IxoN0U5d/+EaUnA1mfK7jf2fSYQBqi6Eyp8sWUYzBTLw4giXB5h0RGAnWzk9hA=="], + + "@react-stately/autocomplete": ["@react-stately/autocomplete@3.0.0-alpha.0", "", { "dependencies": { "@react-stately/utils": "^3.10.4", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-as4si0pBcnGnggwpvemMwCLTeV0h9GS9e5eHSR3RFg14eqUHZBEzYJ0kh9oTugpsGuf1TSM/HDizo8GQk3EtPA=="], + + "@react-stately/calendar": ["@react-stately/calendar@3.7.0", "", { "dependencies": { "@internationalized/date": "^3.7.0", "@react-stately/utils": "^3.10.5", "@react-types/calendar": "^3.6.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-N15zKubP2S7eWfPSJjKVlmJA7YpWzrIGx52BFhwLSQAZcV+OPcMgvOs71WtB7PLwl6DUYQGsgc0B3tcHzzvdvQ=="], + + "@react-stately/checkbox": ["@react-stately/checkbox@3.6.11", "", { "dependencies": { "@react-stately/form": "^3.1.1", "@react-stately/utils": "^3.10.5", "@react-types/checkbox": "^3.9.1", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-jApdBis+Q1sXLivg+f7krcVaP/AMMMiQcVqcz5gwxlweQN+dRZ/NpL0BYaDOuGc26Mp0lcuVaET3jIZeHwtyxA=="], + + "@react-stately/collections": ["@react-stately/collections@3.12.1", "", { "dependencies": { "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-8QmFBL7f+P64dEP4o35pYH61/lP0T/ziSdZAvNMrCqaM+fXcMfUp2yu1E63kADVX7WRDsFJWE3CVMeqirPH6Xg=="], + + "@react-stately/color": ["@react-stately/color@3.8.2", "", { "dependencies": { "@internationalized/number": "^3.6.0", "@internationalized/string": "^3.2.5", "@react-stately/form": "^3.1.1", "@react-stately/numberfield": "^3.9.9", "@react-stately/slider": "^3.6.1", "@react-stately/utils": "^3.10.5", "@react-types/color": "^3.0.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-GXwLmv1Eos2OwOiRsGFrXBKx8+uZh2q0qzLZEVYrWsedNhIdTm7nnpwO68nCYZPHkqhv6rhhVSlOOFmDLY++ow=="], + + "@react-stately/combobox": ["@react-stately/combobox@3.10.2", "", { "dependencies": { "@react-stately/collections": "^3.12.1", "@react-stately/form": "^3.1.1", "@react-stately/list": "^3.11.2", "@react-stately/overlays": "^3.6.13", "@react-stately/select": "^3.6.10", "@react-stately/utils": "^3.10.5", "@react-types/combobox": "^3.13.2", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-uT642Dool4tQBh+8UQjlJnTisrJVtg3LqmiP/HqLQ4O3pW0O+ImbG+2r6c9dUzlAnH4kEfmEwCp9dxkBkmFWsg=="], + + "@react-stately/data": ["@react-stately/data@3.12.1", "", { "dependencies": { "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-/Nc8X1FmrJ53QU4rN/1i1JtNir4iqo+39Xn5ZOJ74Nng7T+xVVuEuWSo+OEGaycCJf2eZRsomauPxUnnZgCM1A=="], + + "@react-stately/datepicker": ["@react-stately/datepicker@3.12.0", "", { "dependencies": { "@internationalized/date": "^3.7.0", "@internationalized/string": "^3.2.5", "@react-stately/form": "^3.1.1", "@react-stately/overlays": "^3.6.13", "@react-stately/utils": "^3.10.5", "@react-types/datepicker": "^3.10.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-AfJEP36d+QgQ30GfacXtYdGsJvqY2yuCJ+JrjHct+m1nYuTkMvMMnhwNBFasgDJPLCDyHzyANlWkl2kQGfsBFw=="], + + "@react-stately/disclosure": ["@react-stately/disclosure@3.0.1", "", { "dependencies": { "@react-stately/utils": "^3.10.5", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-afpNy5b0UcqRGjU/W5OD0xkx4PbymvhMrgQZ4o4OdtDVMMvr9T5UqMF8/j3J591DxgQfXM872tJu0kotqT0L6Q=="], + + "@react-stately/dnd": ["@react-stately/dnd@3.5.1", "", { "dependencies": { "@react-stately/selection": "^3.19.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-N18wt6fka9ngJJqxfAzmdtyrk9whAnqWUxZn22CatjNQsqukI4a6KRYwZTXM9x/wm7KamhVOp+GBl85zM8GLdA=="], + + "@react-stately/flags": ["@react-stately/flags@3.0.5", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-6wks4csxUwPCp23LgJSnkBRhrWpd9jGd64DjcCTNB2AHIFu7Ab1W59pJpUL6TW7uAxVxdNKjgn6D1hlBy8qWsA=="], + + "@react-stately/form": ["@react-stately/form@3.1.1", "", { "dependencies": { "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-qavrz5X5Mdf/Q1v/QJRxc0F8UTNEyRCNSM1we/nnF7GV64+aYSDLOtaRGmzq+09RSwo1c8ZYnIkK5CnwsPhTsQ=="], + + "@react-stately/grid": ["@react-stately/grid@3.10.1", "", { "dependencies": { "@react-stately/collections": "^3.12.1", "@react-stately/selection": "^3.19.0", "@react-types/grid": "^3.2.11", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-MOIy//AdxZxIXIzvWSKpvMvaPEMZGQNj+/cOsElHepv/Veh0psNURZMh2TP6Mr0+MnDTZbX+5XIeinGkWYO3JQ=="], + + "@react-stately/layout": ["@react-stately/layout@4.1.1", "", { "dependencies": { "@react-stately/collections": "^3.12.1", "@react-stately/table": "^3.13.1", "@react-stately/virtualizer": "^4.2.1", "@react-types/grid": "^3.2.11", "@react-types/shared": "^3.27.0", "@react-types/table": "^3.10.4", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-kXeo7HKYTOcqMKru1sKFoMoZA+YywSUqHeIA90MptzRugbFhQGq4nUbIYM2p3FeHAX9HU1JAXThuLcwDOHhB8Q=="], + + "@react-stately/list": ["@react-stately/list@3.11.2", "", { "dependencies": { "@react-stately/collections": "^3.12.1", "@react-stately/selection": "^3.19.0", "@react-stately/utils": "^3.10.5", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-eU2tY3aWj0SEeC7lH9AQoeAB4LL9mwS54FvTgHHoOgc1ZIwRJUaZoiuETyWQe98AL8KMgR1nrnDJ1I+CcT1Y7g=="], + + "@react-stately/menu": ["@react-stately/menu@3.9.1", "", { "dependencies": { "@react-stately/overlays": "^3.6.13", "@react-types/menu": "^3.9.14", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-WRjGGImhQlQaer/hhahGytwd1BDq3fjpTkY/04wv3cQJPJR6lkVI5nSvGFMHfCaErsA1bNyB8/T9Y5F5u4u9ng=="], + + "@react-stately/numberfield": ["@react-stately/numberfield@3.9.9", "", { "dependencies": { "@internationalized/number": "^3.6.0", "@react-stately/form": "^3.1.1", "@react-stately/utils": "^3.10.5", "@react-types/numberfield": "^3.8.8", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-hZsLiGGHTHmffjFymbH1qVmA633rU2GNjMFQTuSsN4lqqaP8fgxngd5pPCoTCUFEkUgWjdHenw+ZFByw8lIE+g=="], + + "@react-stately/overlays": ["@react-stately/overlays@3.6.13", "", { "dependencies": { "@react-stately/utils": "^3.10.5", "@react-types/overlays": "^3.8.12", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-WsU85Gf/b+HbWsnnYw7P/Ila3wD+C37Uk/WbU4/fHgJ26IEOWsPE6wlul8j54NZ1PnLNhV9Fn+Kffi+PaJMQXQ=="], + + "@react-stately/radio": ["@react-stately/radio@3.10.10", "", { "dependencies": { "@react-stately/form": "^3.1.1", "@react-stately/utils": "^3.10.5", "@react-types/radio": "^3.8.6", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-9x3bpq87uV8iYA4NaioTTWjriQSlSdp+Huqlxll0T3W3okpyraTTejE91PbIoRTUmL5qByIh2WzxYmr4QdBgAA=="], + + "@react-stately/searchfield": ["@react-stately/searchfield@3.5.9", "", { "dependencies": { "@react-stately/utils": "^3.10.5", "@react-types/searchfield": "^3.5.11", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-7/aO/oLJ4czKEji0taI/lbHKqPJRag9p3YmRaZ4yqjIMpKxzmJCWQcov5lzWeFhG/1hINKndYlxFnVIKV/urpg=="], + + "@react-stately/select": ["@react-stately/select@3.6.10", "", { "dependencies": { "@react-stately/form": "^3.1.1", "@react-stately/list": "^3.11.2", "@react-stately/overlays": "^3.6.13", "@react-types/select": "^3.9.9", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-V7V0FCL9T+GzLjyfnJB6PUaKldFyT/8Rj6M+R9ura1A0O+s/FEOesy0pdMXFoL1l5zeUpGlCnhJrsI5HFWHfDw=="], + + "@react-stately/selection": ["@react-stately/selection@3.19.0", "", { "dependencies": { "@react-stately/collections": "^3.12.1", "@react-stately/utils": "^3.10.5", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-AvbUqnWjqVQC48RD39S9BpMKMLl55Zo5l/yx5JQFPl55cFwe9Tpku1KY0wzt3fXXiXWaqjDn/7Gkg1VJYy8esQ=="], + + "@react-stately/slider": ["@react-stately/slider@3.6.1", "", { "dependencies": { "@react-stately/utils": "^3.10.5", "@react-types/shared": "^3.27.0", "@react-types/slider": "^3.7.8", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-8kij5O82Xe233vZZ6qNGqPXidnlNQiSnyF1q613c7ktFmzAyGjkIWVUapHi23T1fqm7H2Rs3RWlmwE9bo2KecA=="], + + "@react-stately/table": ["@react-stately/table@3.13.1", "", { "dependencies": { "@react-stately/collections": "^3.12.1", "@react-stately/flags": "^3.0.5", "@react-stately/grid": "^3.10.1", "@react-stately/selection": "^3.19.0", "@react-stately/utils": "^3.10.5", "@react-types/grid": "^3.2.11", "@react-types/shared": "^3.27.0", "@react-types/table": "^3.10.4", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Im8W+F8o9EhglY5kqRa3xcMGXl8zBi6W5phGpAjXb+UGDL1tBIlAcYj733bw8g/ITCnaSz9ubsmON0HekPd6Jg=="], + + "@react-stately/tabs": ["@react-stately/tabs@3.7.1", "", { "dependencies": { "@react-stately/list": "^3.11.2", "@react-types/shared": "^3.27.0", "@react-types/tabs": "^3.3.12", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-gr9ACyuWrYuc727h7WaHdmNw8yxVlUyQlguziR94MdeRtFGQnf3V6fNQG3kxyB77Ljko69tgDF7Nf6kfPUPAQQ=="], + + "@react-stately/toggle": ["@react-stately/toggle@3.8.1", "", { "dependencies": { "@react-stately/utils": "^3.10.5", "@react-types/checkbox": "^3.9.1", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-MVpe79ghVQiwLmVzIPhF/O/UJAUc9B+ZSylVTyJiEPi0cwhbkKGQv9thOF0ebkkRkace5lojASqUAYtSTZHQJA=="], + + "@react-stately/tooltip": ["@react-stately/tooltip@3.5.1", "", { "dependencies": { "@react-stately/overlays": "^3.6.13", "@react-types/tooltip": "^3.4.14", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-0aI3U5kB7Cop9OCW9/Bag04zkivFSdUcQgy/TWL4JtpXidVWmOha8txI1WySawFSjZhH83KIyPc+wKm1msfLMQ=="], + + "@react-stately/tree": ["@react-stately/tree@3.8.7", "", { "dependencies": { "@react-stately/collections": "^3.12.1", "@react-stately/selection": "^3.19.0", "@react-stately/utils": "^3.10.5", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-hpc3pyuXWeQV5ufQ02AeNQg/MYhnzZ4NOznlY5OOUoPzpLYiI3ZJubiY3Dot4jw5N/LR7CqvDLHmrHaJPmZlHg=="], + + "@react-stately/utils": ["@react-stately/utils@3.10.5", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ=="], + + "@react-stately/virtualizer": ["@react-stately/virtualizer@4.2.1", "", { "dependencies": { "@react-aria/utils": "^3.27.0", "@react-types/shared": "^3.27.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-GHGEXV0ZRhq34U/P3LzkByCBfy2IDynYlV1SE4njkUWWGE/0AH56UegM6w2l3GeiNpXsXCgXl7jpAKeIGMEnrQ=="], + + "@react-types/autocomplete": ["@react-types/autocomplete@3.0.0-alpha.28", "", { "dependencies": { "@react-types/combobox": "^3.13.2", "@react-types/searchfield": "^3.5.11", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-meHxBVS5H2L7lVOX99jiAfhcvtG0s7EE7iF7X20/yqEnkwWSpyeMKcDKFpvx/bLGUSmRTVFCBLgvPpwUyhcFkg=="], + + "@react-types/breadcrumbs": ["@react-types/breadcrumbs@3.7.10", "", { "dependencies": { "@react-types/link": "^3.5.10", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-5HhRxkKHfAQBoyOYzyf4HT+24HgPE/C/QerxJLNNId303LXO03yeYrbvRqhYZSlD1ACLJW9OmpPpREcw5iSqgw=="], + + "@react-types/button": ["@react-types/button@3.10.2", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-h8SB/BLoCgoBulCpyzaoZ+miKXrolK9XC48+n1dKJXT8g4gImrficurDW6+PRTQWaRai0Q0A6bu8UibZOU4syg=="], + + "@react-types/calendar": ["@react-types/calendar@3.6.0", "", { "dependencies": { "@internationalized/date": "^3.7.0", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-BtFh4BFwvsYlsaSqUOVxlqXZSlJ6u4aozgO3PwHykhpemwidlzNwm9qDZhcMWPioNF/w2cU/6EqhvEKUHDnFZg=="], + + "@react-types/checkbox": ["@react-types/checkbox@3.9.1", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-0x/KQcipfNM9Nvy6UMwYG25roRLvsiqf0J3woTYylNNWzF+72XT0iI5FdJkE3w2wfa0obmSoeq4WcbFREQrH/A=="], + + "@react-types/color": ["@react-types/color@3.0.2", "", { "dependencies": { "@react-types/shared": "^3.27.0", "@react-types/slider": "^3.7.8" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-4k9c0l5SACwTtkHV0dQ0GrF0Kktk/NChkxtyu58BamyUQOsCe8sqny+uul2nPrqQvuVof/dkRjKhv/DVyyx2mw=="], + + "@react-types/combobox": ["@react-types/combobox@3.13.2", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-yl2yMcM5/v3lJiNZWjpAhQ9vRW6dD55CD4rYmO2K7XvzYJaFVT4WYI/AymPYD8RqomMp7coBmBHfHW0oupk8gg=="], + + "@react-types/datepicker": ["@react-types/datepicker@3.10.0", "", { "dependencies": { "@internationalized/date": "^3.7.0", "@react-types/calendar": "^3.6.0", "@react-types/overlays": "^3.8.12", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Att7y4NedNH1CogMDIX9URXgMLxGbZgnFCZ8oxgFAVndWzbh3TBcc4s7uoJDPvgRMAalq+z+SrlFFeoBeJmvvg=="], + + "@react-types/dialog": ["@react-types/dialog@3.5.15", "", { "dependencies": { "@react-types/overlays": "^3.8.12", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-BX1+mV35Oa0aIlhu98OzJaSB7uiCWDPQbr0AkpFBajSSlESUoAjntN+4N+QJmj24z2v6UE9zxGQ85/U/0Le+bw=="], + + "@react-types/form": ["@react-types/form@3.7.9", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-+qGDrQFdIh8umU82zmnYJ0V2rLoGSQ3yApFT02URz//NWeTA7qo0Oab2veKvXUkcBb47oSvytZYmkExPikxIEg=="], + + "@react-types/grid": ["@react-types/grid@3.2.11", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Mww9nrasppvPbsBi+uUqFnf7ya8fXN0cTVzDNG+SveD8mhW+sbtuy+gPtEpnFD2Oyi8qLuObefzt4gdekJX2Yw=="], + + "@react-types/link": ["@react-types/link@3.5.10", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-IM2mbSpB0qP44Jh1Iqpevo7bQdZAr0iDyDi13OhsiUYJeWgPMHzGEnQqdBMkrfQeOTXLtZtUyOYLXE2v39bhzQ=="], + + "@react-types/listbox": ["@react-types/listbox@3.5.4", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-5otTes0zOwRZwNtqysPD/aW4qFJSxd5znjwoWTLnzDXXOBHXPyR83IJf8ITgvIE5C0y+EFadsWR/BBO3k9Pj7g=="], + + "@react-types/menu": ["@react-types/menu@3.9.14", "", { "dependencies": { "@react-types/overlays": "^3.8.12", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RJW/S8IPwbRuohJ/A9HJ7W8QaAY816tm7Nv6+H/TLXG76zu2AS5vEgq+0TcCAWvJJwUdLDpJWJMlo0iIoIBtcg=="], + + "@react-types/meter": ["@react-types/meter@3.4.6", "", { "dependencies": { "@react-types/progress": "^3.5.9" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-YczAht1VXy3s4fR6Dq0ibGsjulGHzS/A/K4tOruSNTL6EkYH9ktHX62Xk/OhCiKHxV315EbZ136WJaCeO4BgHw=="], + + "@react-types/numberfield": ["@react-types/numberfield@3.8.8", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-825JPppxDaWh0Zxb0Q+wSslgRQYOtQPCAuhszPuWEy6d2F/M+hLR+qQqvQm9+LfMbdwiTg6QK5wxdWFCp2t7jw=="], + + "@react-types/overlays": ["@react-types/overlays@3.8.12", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ZvR1t0YV7/6j+6OD8VozKYjvsXT92+C/2LOIKozy7YUNS5KI4MkXbRZzJvkuRECVZOmx8JXKTUzhghWJM/3QuQ=="], + + "@react-types/progress": ["@react-types/progress@3.5.9", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-zFxOzx3G8XUmHgpm037Hcayls5bqzXVa182E3iM7YWTmrjxJPKZ58XL0WWBgpTd+mJD7fTpnFdAZqSmFbtDOdA=="], + + "@react-types/radio": ["@react-types/radio@3.8.6", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-woTQYdRFjPzuml4qcIf+2zmycRuM5w3fDS5vk6CQmComVUjOFPtD28zX3Z9kc9lSNzaBQz9ONZfFqkZ1gqfICA=="], + + "@react-types/searchfield": ["@react-types/searchfield@3.5.11", "", { "dependencies": { "@react-types/shared": "^3.27.0", "@react-types/textfield": "^3.11.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-MX8d9pgvxZxmgDwI0tiDaf6ijOY8XcRj0HM8Ocfttlk7PEFJK44p51WsUC+fPX1GmZni2JpFkx/haPOSLUECdw=="], + + "@react-types/select": ["@react-types/select@3.9.9", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-/hCd0o+ztn29FKCmVec+v7t4JpOzz56o+KrG7NDq2pcRWqUR9kNwCjrPhSbJIIEDm4ubtrfPu41ysIuDvRd2Bg=="], + + "@react-types/shared": ["@react-types/shared@3.27.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-gvznmLhi6JPEf0bsq7SwRYTHAKKq/wcmKqFez9sRdbED+SPMUmK5omfZ6w3EwUFQHbYUa4zPBYedQ7Knv70RMw=="], + + "@react-types/slider": ["@react-types/slider@3.7.8", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-utW1o9KT70hqFwu1zqMtyEWmP0kSATk4yx+Fm/peSR4iZa+BasRqH83yzir5GKc8OfqfE1kmEsSlO98/k986+w=="], + + "@react-types/switch": ["@react-types/switch@3.5.8", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-sL7jmh8llF8BxzY4HXkSU4bwU8YU6gx45P85D0AdYXgRHxU9Cp7BQPOMF4pJoQ8TTej05MymY5q7xvJVmxUTAQ=="], + + "@react-types/table": ["@react-types/table@3.10.4", "", { "dependencies": { "@react-types/grid": "^3.2.11", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-d0tLz/whxVteqr1rophtuuxqyknHHfTKeXrCgDjt8pAyd9U8GPDbfcFSfYPUhWdELRt7aLVyQw6VblZHioVEgQ=="], + + "@react-types/tabs": ["@react-types/tabs@3.3.12", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-E9O9G+wf9kaQ8UbDEDliW/oxYlJnh7oDCW1zaMOySwnG4yeCh7Wu02EOCvlQW4xvgn/i+lbEWgirf7L+yj5nRg=="], + + "@react-types/textfield": ["@react-types/textfield@3.11.0", "", { "dependencies": { "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-YORBgr6wlu2xfvr4MqjKFHGpj+z8LBzk14FbWDbYnnhGnv0I10pj+m2KeOHgDNFHrfkDdDOQmMIKn1UCqeUuEg=="], + + "@react-types/tooltip": ["@react-types/tooltip@3.4.14", "", { "dependencies": { "@react-types/overlays": "^3.8.12", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-J7CeYL2yPeKIasx1rPaEefyCHGEx2DOCx+7bM3XcKGmCxvNdVQLjimNJOt8IHlUA0nFJQOjmSW/mz9P0f2/kUw=="], + "@replit/codemirror-css-color-picker": ["@replit/codemirror-css-color-picker@6.3.0", "", { "peerDependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" } }, "sha512-19biDANghUm7Fz7L1SNMIhK48tagaWuCOHj4oPPxc7hxPGkTVY2lU/jVZ8tsbTKQPVG7BO2CBDzs7CBwb20t4A=="], "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@26.0.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "glob": "^10.4.1", "is-reference": "1.2.1", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ=="], @@ -1075,13 +1301,13 @@ "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], - "@swc/helpers": ["@swc/helpers@0.5.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A=="], + "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], "@szmarczak/http-timer": ["@szmarczak/http-timer@1.1.2", "", { "dependencies": { "defer-to-connect": "^1.0.1" } }, "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA=="], "@tailwindcss/container-queries": ["@tailwindcss/container-queries@0.1.1", "", { "peerDependencies": { "tailwindcss": ">=3.2.0" } }, "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA=="], - "@tailwindcss/typography": ["@tailwindcss/typography@0.5.15", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" } }, "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA=="], + "@tailwindcss/typography": ["@tailwindcss/typography@0.5.16", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA=="], "@tanstack/virtual-core": ["@tanstack/virtual-core@3.10.8", "", {}, "sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA=="], @@ -1557,6 +1783,8 @@ "decamelize-keys": ["decamelize-keys@1.1.1", "", { "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" } }, "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg=="], + "decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="], + "decode-named-character-reference": ["decode-named-character-reference@1.0.2", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg=="], "decompress-response": ["decompress-response@3.3.0", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA=="], @@ -2023,6 +2251,8 @@ "internal-slot": ["internal-slot@1.0.7", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g=="], + "intl-messageformat": ["intl-messageformat@10.7.14", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.2", "@formatjs/fast-memoize": "2.2.6", "@formatjs/icu-messageformat-parser": "2.11.0", "tslib": "2" } }, "sha512-mMGnE4E1otdEutV5vLUdCxRJygHB5ozUBxsPB5qhitewssrS/qGruq9bmvIRkkGsNeK5ZWLfYRld18UHGTIifQ=="], + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], @@ -2639,6 +2869,10 @@ "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], + "react-aria": ["react-aria@3.37.0", "", { "dependencies": { "@internationalized/string": "^3.2.5", "@react-aria/breadcrumbs": "^3.5.20", "@react-aria/button": "^3.11.1", "@react-aria/calendar": "^3.7.0", "@react-aria/checkbox": "^3.15.1", "@react-aria/color": "^3.0.3", "@react-aria/combobox": "^3.11.1", "@react-aria/datepicker": "^3.13.0", "@react-aria/dialog": "^3.5.21", "@react-aria/disclosure": "^3.0.1", "@react-aria/dnd": "^3.8.1", "@react-aria/focus": "^3.19.1", "@react-aria/gridlist": "^3.10.1", "@react-aria/i18n": "^3.12.5", "@react-aria/interactions": "^3.23.0", "@react-aria/label": "^3.7.14", "@react-aria/link": "^3.7.8", "@react-aria/listbox": "^3.14.0", "@react-aria/menu": "^3.17.0", "@react-aria/meter": "^3.4.19", "@react-aria/numberfield": "^3.11.10", "@react-aria/overlays": "^3.25.0", "@react-aria/progress": "^3.4.19", "@react-aria/radio": "^3.10.11", "@react-aria/searchfield": "^3.8.0", "@react-aria/select": "^3.15.1", "@react-aria/selection": "^3.22.0", "@react-aria/separator": "^3.4.5", "@react-aria/slider": "^3.7.15", "@react-aria/ssr": "^3.9.7", "@react-aria/switch": "^3.6.11", "@react-aria/table": "^3.16.1", "@react-aria/tabs": "^3.9.9", "@react-aria/tag": "^3.4.9", "@react-aria/textfield": "^3.16.0", "@react-aria/tooltip": "^3.7.11", "@react-aria/utils": "^3.27.0", "@react-aria/visually-hidden": "^3.8.19", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-u3WUEMTcbQFaoHauHO3KhPaBYzEv1o42EdPcLAs05GBw9Q6Axlqwo73UFgMrsc2ElwLAZ4EKpSdWHLo1R5gfiw=="], + + "react-aria-components": ["react-aria-components@1.6.0", "", { "dependencies": { "@internationalized/date": "^3.7.0", "@internationalized/string": "^3.2.5", "@react-aria/autocomplete": "3.0.0-alpha.37", "@react-aria/collections": "3.0.0-alpha.7", "@react-aria/color": "^3.0.3", "@react-aria/disclosure": "^3.0.1", "@react-aria/dnd": "^3.8.1", "@react-aria/focus": "^3.19.1", "@react-aria/interactions": "^3.23.0", "@react-aria/live-announcer": "^3.4.1", "@react-aria/menu": "^3.17.0", "@react-aria/toolbar": "3.0.0-beta.12", "@react-aria/tree": "3.0.0-beta.3", "@react-aria/utils": "^3.27.0", "@react-aria/virtualizer": "^4.1.1", "@react-stately/autocomplete": "3.0.0-alpha.0", "@react-stately/color": "^3.8.2", "@react-stately/disclosure": "^3.0.1", "@react-stately/layout": "^4.1.1", "@react-stately/menu": "^3.9.1", "@react-stately/selection": "^3.19.0", "@react-stately/table": "^3.13.1", "@react-stately/utils": "^3.10.5", "@react-stately/virtualizer": "^4.2.1", "@react-types/color": "^3.0.2", "@react-types/form": "^3.7.9", "@react-types/grid": "^3.2.11", "@react-types/shared": "^3.27.0", "@react-types/table": "^3.10.4", "@swc/helpers": "^0.5.0", "client-only": "^0.0.1", "react-aria": "^3.37.0", "react-stately": "^3.35.0", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-YfG9PUE7XrXtDDAqT4pLTGyYQaiHHTBFdAK/wNgGsypVnQSdzmyYlV3Ty8aHlZJI6hP9RWkbywvosXkU7KcPHg=="], + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], "react-hotkeys-hook": ["react-hotkeys-hook@4.5.1", "", { "peerDependencies": { "react": ">=16.8.1", "react-dom": ">=16.8.1" } }, "sha512-scAEJOh3Irm0g95NIn6+tQVf/OICCjsQsC9NBHfQws/Vxw4sfq1tDQut5fhTEvPraXhu/sHxRd9lOtxzyYuNAg=="], @@ -2649,6 +2883,8 @@ "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.6", "", { "dependencies": { "react-style-singleton": "^2.2.1", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g=="], + "react-stately": ["react-stately@3.35.0", "", { "dependencies": { "@react-stately/calendar": "^3.7.0", "@react-stately/checkbox": "^3.6.11", "@react-stately/collections": "^3.12.1", "@react-stately/color": "^3.8.2", "@react-stately/combobox": "^3.10.2", "@react-stately/data": "^3.12.1", "@react-stately/datepicker": "^3.12.0", "@react-stately/disclosure": "^3.0.1", "@react-stately/dnd": "^3.5.1", "@react-stately/form": "^3.1.1", "@react-stately/list": "^3.11.2", "@react-stately/menu": "^3.9.1", "@react-stately/numberfield": "^3.9.9", "@react-stately/overlays": "^3.6.13", "@react-stately/radio": "^3.10.10", "@react-stately/searchfield": "^3.5.9", "@react-stately/select": "^3.6.10", "@react-stately/selection": "^3.19.0", "@react-stately/slider": "^3.6.1", "@react-stately/table": "^3.13.1", "@react-stately/tabs": "^3.7.1", "@react-stately/toggle": "^3.8.1", "@react-stately/tooltip": "^3.5.1", "@react-stately/tree": "^3.8.7", "@react-types/shared": "^3.27.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-1BH21J/TOHpyZe7c+f1BU2bnRWaBDTjLH0WdBuzNfPOXu7RBG3ebPIRvqd7UkPaVfIcol2QJnxe8S0a314JWKA=="], + "react-style-singleton": ["react-style-singleton@2.2.1", "", { "dependencies": { "get-nonce": "^1.0.0", "invariant": "^2.2.4", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g=="], "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], @@ -3049,6 +3285,8 @@ "use-sidecar": ["use-sidecar@1.1.2", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw=="], + "use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], + "usehooks-ts": ["usehooks-ts@3.1.0", "", { "dependencies": { "lodash.debounce": "^4.0.8" }, "peerDependencies": { "react": "^16.8.0 || ^17 || ^18" } }, "sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw=="], "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], @@ -3859,6 +4097,16 @@ "@eslint/eslintrc/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + "@formatjs/ecma402-abstract/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@formatjs/fast-memoize/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@formatjs/icu-messageformat-parser/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@formatjs/icu-skeleton-parser/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@formatjs/intl-localematcher/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@humanwhocodes/config-array/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], "@hyperjump/json-schema/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], @@ -4183,6 +4431,8 @@ "@smithy/util-waiter/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@swc/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@tailwindcss/typography/postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], "@ts-morph/common/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], @@ -4387,6 +4637,8 @@ "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "intl-messageformat/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "is-ci/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], @@ -4427,6 +4679,8 @@ "minizlib/minipass": ["minipass@2.9.0", "", { "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg=="], + "next/@swc/helpers": ["@swc/helpers@0.5.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A=="], + "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], "normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], @@ -4453,6 +4707,10 @@ "pump/end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + "radix-vue/@internationalized/date": ["@internationalized/date@3.5.6", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw=="], + + "radix-vue/@internationalized/number": ["@internationalized/number@3.5.4", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-h9huwWjNqYyE2FXZZewWqmCdkw1HeFds5q4Siuoms3hUQC5iPJK3aBmkFZoDSLN4UD0Bl8G22L/NdHpeOr+/7A=="], + "radix-vue/nanoid": ["nanoid@5.0.7", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ=="], "raw-body/http-errors": ["http-errors@1.7.3", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } }, "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw=="], @@ -5317,8 +5575,6 @@ "gitbook-v2/next/@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.2.0-canary.33", "", { "os": "win32", "cpu": "x64" }, "sha512-hjdbGnkwIZ8zN2vlS6lNsEJO37HRtcEGimzfkruBMsi/DwJBqkJvZbNC/XCJy3HFcU58igncqV52p1IPjmAJAw=="], - "gitbook-v2/next/@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], - "gitbook-v2/next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], "gitbook-v2/next/styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], @@ -5522,6 +5778,7 @@ "@node-minify/core/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "@node-minify/core/glob/path-scurry/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], "@rollup/plugin-commonjs/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], @@ -5554,8 +5811,6 @@ "@vercel/static-config/ts-morph/@ts-morph/common/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - "gitbook-v2/next/@swc/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "read-pkg-up/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "sucrase/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], diff --git a/packages/gitbook/package.json b/packages/gitbook/package.json index cb10504a5..6ae96bbaf 100644 --- a/packages/gitbook/package.json +++ b/packages/gitbook/package.json @@ -29,7 +29,7 @@ "@sentry/nextjs": "8.35.0", "@sindresorhus/fnv1a": "^3.1.0", "@tailwindcss/container-queries": "^0.1.1", - "@tailwindcss/typography": "^0.5.10", + "@tailwindcss/typography": "^0.5.16", "@upstash/redis": "^1.27.1", "ajv": "^8.12.0", "assert-never": "^1.2.1", diff --git a/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx b/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx index 5bf534984..82534316d 100644 --- a/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx +++ b/packages/gitbook/src/components/DocumentView/OpenAPI/OpenAPI.tsx @@ -51,6 +51,7 @@ async function OpenAPIBody(props: BlockProps) { icons: { chevronDown: , chevronRight: , + plus: , }, CodeBlock: PlainCodeBlock, defaultInteractiveOpened: context.mode === 'print', diff --git a/packages/gitbook/src/components/DocumentView/OpenAPI/scalar.css b/packages/gitbook/src/components/DocumentView/OpenAPI/scalar.css index e72a378d7..b09565bfc 100644 --- a/packages/gitbook/src/components/DocumentView/OpenAPI/scalar.css +++ b/packages/gitbook/src/components/DocumentView/OpenAPI/scalar.css @@ -263,32 +263,23 @@ } .scalar-activate { width: fit-content; - margin: 0px 0.75rem 0.75rem auto; line-height: 24px; font-size: 0.75rem; cursor: pointer; font-size: 0.875rem; - font-weight: 600; display: flex; align-items: center; gap: 6px; } .scalar-activate-button { - display: flex; - gap: 6px; - align-items: center; - color: var(--scalar-color-blue); - appearance: none; - outline: none; - border: none; - background: transparent; -} -.scalar-activate-button { - padding: 0 0.5rem; -} -.scalar-activate:hover .scalar-activate-button { - background: var(--scalar-background-3); - border-radius: 3px; + @apply flex gap-1.5 items-center; + @apply bg-primary-solid text-contrast-primary-solid hover:bg-primary-solid-hover hover:text-contrast-primary-solid-hover contrast-more:ring-1 rounded-md straight-corners:rounded-none place-self-start; + @apply ring-1 ring-tint hover:ring-tint-hover; + @apply shadow-sm shadow-tint dark:shadow-tint-1 hover:shadow-md active:shadow-none; + @apply contrast-more:ring-tint-12 contrast-more:hover:ring-2 contrast-more:hover:ring-tint-12; + @apply hover:scale-105 active:scale-100 transition-all; + @apply grow-0 shrink-0 truncate; + @apply text-sm px-2.5 py-1; } .scalar-app-loading { diff --git a/packages/gitbook/src/components/DocumentView/OpenAPI/style.css b/packages/gitbook/src/components/DocumentView/OpenAPI/style.css index 616d1f97d..9179a9ff7 100644 --- a/packages/gitbook/src/components/DocumentView/OpenAPI/style.css +++ b/packages/gitbook/src/components/DocumentView/OpenAPI/style.css @@ -1,51 +1,106 @@ +/* Layout Components */ .openapi-operation { content-visibility: auto; contain-intrinsic-height: 600px; - @apply flex-1 flex flex-col gap-6; + @apply flex-1 flex flex-col gap-4 mb-14; } .openapi-columns { - @apply flex flex-col md:flex-row gap-6 print-mode:flex-col; + @apply grid grid-cols-1 lg:grid-cols-2 gap-6 print-mode:grid-cols-1 justify-stretch; } -/** Intro */ - +/* Introduction */ .openapi-intro { - @apply flex flex-col gap-3 max-w-3xl; + @apply flex flex-col gap-3; } .openapi-summary { + @apply flex flex-col items-start justify-start gap-2; +} + +.openapi-summary-title { @apply font-semibold text-xl; } -.openapi-description.openapi-markdown { - @apply prose-base; +.openapi-summary-title[data-deprecated='true'] { + @apply line-through; } -/** Method tag */ +.openapi-deprecated { + @apply py-0.5 px-1.5 min-w-[1.625rem] font-normal w-fit justify-center items-center ring-1 ring-inset ring-tint bg-tint rounded-full text-sm leading-[calc(max(1.20em,1.25rem))] before:!content-none after:!content-none; +} +.openapi-deprecated-sunset-date { + @apply font-semibold font-mono; +} + +.openapi-description.openapi-markdown { + @apply prose-sm text-[15px]; +} + +.openapi-description.openapi-markdown code { + @apply prose-sm; +} + +/* Markdown Elements */ +.openapi-markdown blockquote { + @apply !ps-3; +} + +.openapi-markdown blockquote > * { + @apply not-italic; +} + +.openapi-markdown blockquote > p { + @apply before:content-none after:content-none !font-normal; +} + +.openapi-markdown code { + @apply py-px px-1 min-w-[1.625rem] font-normal w-fit justify-center items-center ring-1 ring-inset ring-tint bg-tint rounded text-sm leading-[calc(max(1.20em,1.25rem))] before:!content-none after:!content-none; +} + +.openapi-markdown pre code { + @apply bg-transparent ring-transparent; +} + +/* Markdown Base */ +.openapi-markdown { + @apply prose text-tint-strong prose-p:!my-2 dark:prose-invert max-w-none whitespace-normal; +} + +.openapi-markdown > *:first-child { + @apply !mt-0; +} + +.openapi-markdown > *:last-child { + @apply !mb-0; +} + +/* Method Tags */ .openapi-method { - @apply rounded font-mono font-bold text-[11.5px] px-1 py-0.5 mr-2 text-tint-12/8 leading-tight align-middle inline-flex ring-1 ring-inset ring-tint-12/1 dark:ring-tint-1/1 whitespace-nowrap; + @apply rounded uppercase font-mono font-bold text-xs px-1 py-0.5 mr-2 text-tint-12/8 leading-tight align-middle inline-flex ring-1 ring-inset ring-tint-12/1 dark:ring-tint-1/1 whitespace-nowrap; } .openapi-method-get { - @apply bg-[hsl(215,54%,86%)] dark:bg-[hsla(215,54%,45%,0.24)] dark:text-[hsl(215,54%,86%)]; + /* @apply bg-[hsl(215,54%,86%)] dark:bg-[hsla(215,54%,45%,0.24)] dark:text-[hsl(215,54%,86%)]; */ + @apply bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-100; } .openapi-method-post { - @apply bg-[hsl(120,25%,80%)] dark:bg-[hsla(120,54%,32%,0.24)] dark:text-[hsl(120,25%,80%)]; + /* @apply bg-[hsl(120,25%,80%)] dark:bg-[hsla(120,54%,32%,0.24)] dark:text-[hsl(120,25%,80%)]; */ + @apply bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-100; } .openapi-method-put { - @apply bg-yellow dark:bg-yellow-600/5 dark:text-yellow; + @apply bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-100; } .openapi-method-patch { - @apply bg-teal-300 dark:bg-teal-600/5 dark:text-teal-300; + @apply bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-100; } .openapi-method-delete { - @apply bg-pomegranate-200 dark:bg-pomegranate-500/5 dark:text-pomegranate-200; + @apply bg-pomegranate-100 text-pomegranate-800 dark:bg-pomegranate-900 dark:text-pomegranate-100; } .openapi-method-head, @@ -54,8 +109,7 @@ @apply bg-tint; } -/** URL */ - +/* URL */ .openapi-url { @apply font-mono text-sm text-tint; } @@ -64,14 +118,13 @@ @apply text-tint underline underline-offset-2 decoration-tint-subtle; } -/** Columns */ - +/* Column Layout */ .openapi-column-spec { - @apply flex flex-col flex-1 gap-4 max-w-3xl; + @apply flex flex-col gap-8 flex-1; } .openapi-column-preview { - @apply flex flex-col flex-1 max-w-3xl; + @apply flex flex-col flex-1; } .openapi-column-preview-body { @@ -79,21 +132,39 @@ } .openapi-column-preview pre { - @apply max-h-60 print-mode:max-h-none; + @apply max-h-96 print-mode:max-h-none; } -/** Schemas */ - +/* Schema Structure */ .openapi-schema-root { - @apply mx-3 mb-3 mt-2; + @apply mt-2; } -.openapi-schema .openapi-schema-properties { - @apply border rounded border-tint; +.openapi-schema-properties { + @apply flex flex-col; } -.openapi-schema-properties .openapi-schema { - @apply border-b px-3 py-2 border-tint-subtle; +.openapi-schema-body { + @apply py-2.5 flex flex-col gap-2; +} + +.openapi-section-body .openapi-schema-properties { + @apply divide-y divide-tint-subtle; +} + +.openapi-disclosure-group-panel + > .openapi-schema-properties + > *:first-child + > .openapi-schema-body { + @apply pt-0; +} + +.openapi-responsebody > .openapi-schema-properties > *:last-child > .openapi-schema-body { + @apply pb-0; +} + +.openapi-responsebody > .openapi-schema-properties > *:only-child > .openapi-schema-body { + @apply py-0; } .openapi-schema-properties .openapi-schema:last-child { @@ -108,28 +179,46 @@ @apply mt-3; } +/* Schema Presentation */ +.openapi-schema-presentation { + @apply flex flex-col gap-1.5 font-normal; +} + +.openapi-schema-properties:last-child { + @apply pb-0; +} + .openapi-schema-name { /* To make double click on the property name select only the name, we disable selection on the parent and re-enable it on the children. */ - @apply select-none; + @apply select-none flex gap-2.5 items-baseline text-sm; +} + +.openapi-schema-name .openapi-deprecated { + @apply text-xs; } .openapi-schema-propertyname { - @apply select-all font-medium text-base text-tint-strong; + @apply select-all font-mono font-normal text-tint-strong; +} + +.openapi-schema-propertyname[data-deprecated='true'] { + @apply line-through opacity-9; } .openapi-schema-required { - @apply font-normal text-yellow-600; + @apply text-amber-600 text-[13px]; } .openapi-schema-type { - @apply font-mono ml-3 text-sm text-tint select-text; + @apply text-tint select-text text-[13px] font-mono; } .openapi-schema-type:only-child { @apply ml-0; } +/* Schema Header */ .openapi-schema-header { @apply flex flex-row items-center; } @@ -138,10 +227,6 @@ @apply flex-1; } -.openapi-schema-body { - @apply mt-2; -} - .openapi-schema-circular { @apply text-xs text-tint; } @@ -154,12 +239,13 @@ @apply text-base; } +/* Schema Enum */ .openapi-schema-enum { - @apply flex flex-row flex-wrap mt-1; + @apply flex flex-row text-sm leading-relaxed flex-wrap text-tint; } .openapi-schema-enum-value { - @apply font-mono text-xs px-1.5 py-1 border border-tint-subtle -ml-px -mt-px text-tint; + @apply text-sm; } .openapi-schema-enum-value:first-child { @@ -170,112 +256,118 @@ @apply rounded-r; } +/* Schema Description */ .openapi-schema-description.openapi-markdown { - @apply prose-sm; + @apply prose-sm text-tint overflow-hidden !font-normal select-text prose-strong:font-semibold prose-strong:text-inherit; } +.openapi-schema-description.openapi-markdown pre:has(code) { + @apply overflow-x-auto flex-1 w-fit max-w-full h-fit whitespace-pre; + scrollbar-width: none; + -ms-overflow-style: none; +} + +.openapi-schema-description.openapi-markdown pre::-webkit-scrollbar { + display: none; +} + +.openapi-schema-description.openapi-markdown pre code { + font-weight: inherit !important; + @apply text-xs !py-0; +} + +/* Schema Examples */ .openapi-schema-example, .openapi-schema-pattern { - @apply prose-sm mt-1 text-tint-strong; + @apply prose-sm text-tint; } -/** Authentication */ - -.openapi-securities { - @apply border rounded border-tint-subtle; +.openapi-schema-example code, +.openapi-schema-pattern code, +.openapi-schema-enum-value code { + @apply py-px px-1 min-w-[1.625rem] text-tint-strong font-normal w-fit justify-center items-center ring-1 ring-inset ring-tint bg-tint rounded text-xs leading-[calc(max(1.20em,1.25rem))] before:!content-none after:!content-none; } +/* Authentication */ .openapi-securities-header { - @apply px-3 py-2; -} - -.openapi-securities.openapi-securities-closed:hover { - @apply border-tint-hover cursor-pointer; -} - -.openapi-securities-header-content { - @apply font-semibold text-base text-tint-strong; + @apply py-2 border-b border-tint-subtle max-w-full flex-1; } .openapi-securities-body { - @apply mx-3 mb-2 flex flex-col gap-2; + @apply flex flex-col gap-2; } .openapi-securities-description.openapi-markdown { - @apply prose-sm; + @apply prose-sm text-tint !font-normal select-text prose-strong:font-semibold prose-strong:text-inherit; } .openapi-securities-label { @apply font-medium text-sm text-tint-strong; } -/** Parameters */ - -.openapi-parameters { - @apply border rounded border-tint-subtle; -} - -.openapi-parameters.openapi-parameters-closed:hover { - @apply border-tint-hover cursor-pointer; -} - +/* Parameters */ .openapi-parameters-header { - @apply px-3 py-2; + @apply py-2 border-b border-tint-subtle max-w-full flex-1; } .openapi-parameters-header-content { - @apply font-semibold text-base text-tint-strong; -} - -/** Request body */ -.openapi-requestbody { - @apply border rounded border-tint-subtle; } +/* Request Body */ .openapi-requestbody-header { - @apply px-3 py-2; + @apply py-2 border-b border-tint-subtle max-w-full flex-1; } .openapi-requestbody-header-content { - @apply font-semibold text-base text-tint-strong; } .openapi-requestbody-description.openapi-markdown { - @apply px-3 prose-sm; -} - -.openapi-requestbody-description.openapi-markdown { - @apply px-3 prose-sm; -} - -.openapi-requestbody-description.openapi-markdown { - @apply px-3 prose-sm; -} - -/** Responses */ -.openapi-responses { - @apply border rounded border-tint-subtle; + @apply prose-sm text-tint !font-normal select-text prose-strong:font-semibold prose-strong:text-inherit; } +/* Responses */ .openapi-responses-header { - @apply px-3 py-2; -} - -.openapi-responses-body { - @apply flex flex-col gap-3; + @apply py-2 border-b border-tint-subtle max-w-full flex-1; } .openapi-responses-header-content { - @apply font-semibold text-tint-strong; } -/** Response */ +.openapi-response-tab-content { + @apply overflow-hidden max-w-full flex items-baseline gap-2; +} + .openapi-response-description.openapi-markdown { - @apply px-3 prose-sm; + @apply prose-sm text-[13px] h-auto relative leading-[18px] text-tint !font-normal truncate select-text prose-strong:font-semibold prose-strong:text-inherit; } -.openapi-response-description:last-child { - @apply mb-3; +.openapi-response-description.openapi-markdown::-webkit-scrollbar { + display: none; +} + +.openapi-response-description p { + @apply truncate max-w-full inline pr-1; +} + +.openapi-response-statuscode { + @apply tabular-nums text-sm font-normal font-mono shrink-0; +} + +.openapi-response-content-type { + @apply text-xs text-tint-8 ml-auto shrink-0; +} + +.openapi-response-body { + @apply flex flex-col gap-3; +} + +/* Response Body and Headers */ +.openapi-responsebody .openapi-schema-name { + @apply mb-0; +} + +.openapi-responsebody .openapi-schema-presentation { + @apply py-0; } .openapi-responsebody-header, @@ -285,65 +377,119 @@ .openapi-responsebody-header-content, .openapi-responseheaders-header-content { - @apply text-base text-tint; } -/** Code sample */ - +/* Code Sample */ .openapi-codesample { @apply border rounded bg-tint border-tint-subtle; } .openapi-codesample-header { - @apply flex flex-row items-center px-3 py-2; + @apply flex flex-row items-center; } -.openapi-codesample-title { - @apply flex-1 font-semibold text-base; +.openapi-codesample-header-content { + @apply flex flex-row items-center h-fit; } -/** Response example */ +/* Path */ +.openapi-path { + @apply flex items-center bg-tint-base text-sm gap-2 p-2 border rounded-md border-tint-subtle; +} +.openapi-path .openapi-method { + @apply text-[13px] m-0 px-1; +} + +.openapi-path-title { + @apply flex-1 relative font-normal whitespace-nowrap overflow-x-auto font-mono text-tint-strong; + scrollbar-width: none; + -ms-overflow-style: none; +} + +.openapi-path-title[data-deprecated='true'] { + @apply line-through; +} + +.openapi-path-title::-webkit-scrollbar { + display: none; +} + +/* .openapi-path-copy { + @apply absolute opacity-0 h-fit right-0 top-1/2 -translate-y-1/2 bg-light dark:bg-dark border rounded-md border-tint-subtle px-1.5 py-0; +} + +.openapi-path-title:hover .openapi-path-copy { + @apply opacity-11; +} */ + +.openapi-path-title em { + @apply not-italic text-primary font-medium; +} + +.openapi-path-separator { + @apply text-tint; +} + +.openapi-path-overlay { + @apply flex flex-row items-center py-2 px-3 justify-end border-t border-tint-subtle; +} + +/* Response Example */ .openapi-response-example { @apply border rounded bg-tint border-tint-subtle; } -.openapi-response-example-header { - @apply flex flex-row items-center px-3 py-2; +.openapi-response-example-empty { + @apply relative text-tint bg-tint min-h-20 flex flex-col justify-center items-center; } -.openapi-response-example-title { - @apply flex-1 font-semibold text-base; +/* Common Elements */ +.openapi-select { + @apply max-w-60 rounded font-mono text-xs leading-6 px-1 py-0.5 border border-tint-subtle bg-tint; } -/** Common */ - .openapi-select { - @apply max-w-48 rounded font-mono text-xs leading-6 px-1 py-0.5 border border-tint bg-tint; -} - -/** Section */ - -.openapi-section { + min-width: fit-content; + max-width: fit-content; +} +.openapi-select:focus { + width: auto; } +/* Section Components */ .openapi-section-header { - @apply flex flex-row items-start; + @apply flex flex-row items-center; } .openapi-section-header-content { - @apply flex-1; + @apply flex-1 text-base gap-1.5 flex w-full font-medium text-tint-strong; } .openapi-section-header-controls { @apply flex flex-row items-center gap-2; } -.openapi-section-toggle { - @apply flex items-center justify-end size-6 text-tint-subtle contrast-more:text-tint-strong; +.openapi-section-header-content:has(.openapi-section-toggle) { + @apply cursor-pointer; +} + +.openapi-section-header-content:hover .openapi-section-toggle { + @apply text-tint; +} + +.openapi-section-toggle { + @apply text-tint-subtle contrast-more:text-tint-strong; +} + +.openapi-section-toggle > svg { + @apply transition-all; +} + +.openapi-section-toggle[aria-expanded='true'] > svg { + @apply rotate-90; } -.openapi-section-toggle:focus-visible, .openapi-section-toggle:focus-visible { @apply text-primary; } @@ -352,15 +498,120 @@ @apply size-3; } -/** Markdown */ -.openapi-markdown { - @apply prose dark:prose-invert text-tint-strong max-w-none whitespace-normal; +/* Tabs */ +.openapi-tabs-list { + @apply flex flex-row gap-3 py-1.5 px-2.5 border-b border-tint-subtle w-full; } -.openapi-markdown > *:first-child { - @apply mt-0; +.openapi-tabs-tab { + @apply hover:bg-primary-hover font-mono font-normal tabular-nums hover:text-primary cursor-pointer transition-all relative text-[13px] text-tint px-1 border border-transparent rounded; } -.openapi-markdown > *:last-child { - @apply mb-0; +.openapi-tabs-tab[aria-selected='true'] { + @apply text-primary after:absolute after:-bottom-2 after:left-0 after:w-full after:h-px after:bg-primary-solid after:transition-all; +} + +.openapi-tabs-panel { + @apply flex-1 text-sm focus-visible:outline-none; +} + +.openapi-tabs-footer { + @apply px-3 py-2 pt-2.5 border-t border-tint-subtle text-[13px] text-tint; +} + +/* Disclosure group */ +.openapi-disclosure-group { + @apply border-b border-tint-subtle relative; +} + +.openapi-disclosure-group-header { + @apply flex flex-row items-center justify-between gap-3; +} + +.openapi-disclosure-group-trigger { + @apply flex items-center relative flex-1 gap-2.5 py-2 truncate -outline-offset-1; +} + +.openapi-disclosure-group-trigger:disabled { + @apply cursor-default; +} + +.openapi-disclosure-group:only-child, +.openapi-disclosure-group:last-child { + @apply border-b-0; +} + +.openapi-disclosure-group-trigger:disabled .openapi-disclosure-group-icon { + @apply invisible; +} + +.openapi-disclosure-group-icon > svg { + @apply size-3 text-tint-subtle transition-all duration-300; +} + +.openapi-disclosure-group-trigger:hover > .openapi-disclosure-group-icon svg { + @apply text-tint-strong; +} + +.openapi-disclosure-group-panel { + @apply pb-2.5; +} + +.openapi-disclosure-group-trigger[aria-expanded='true'] > .openapi-disclosure-group-icon > svg { + @apply rotate-90; +} + +.openapi-disclosure-group:hover .openapi-disclosure-group-mediatype, +.openapi-disclosure-group[aria-expanded='true'] .openapi-disclosure-group-mediatype { + @apply opacity-11 flex; +} + +.openapi-disclosure-group-mediatype { + @apply opacity-0 hidden transition-all duration-200 shrink-0; +} + +.openapi-disclosure-group-mediatype > span { + @apply text-xs text-tint-subtle; +} + +/* Disclosure */ +.openapi-disclosure-trigger { + @apply transition-all duration-300 hover:text-tint-strong rounded-2xl border border-tint-subtle px-2.5 py-1 text-[13px] text-tint flex flex-row items-center gap-1.5 -outline-offset-1; +} + +.openapi-disclosure svg { + @apply size-3 transition-transform duration-300; +} + +.openapi-disclosure-trigger[aria-expanded='true'] svg { + @apply rotate-45; +} + +.openapi-disclosure-trigger[aria-expanded='true'] { + @apply w-full rounded-lg border-b rounded-b-none; +} + +.openapi-disclosure-trigger[aria-expanded='false'] { + @apply w-auto; +} + +.openapi-disclosure-panel[aria-hidden='false'] { + @apply border-b border-x border-tint-subtle rounded-b-lg; +} + +.openapi-disclosure-panel .openapi-schema-body { + @apply p-2.5; +} + +.openapi-disclosure .openapi-schema-properties .openapi-schema:only-child, +.openapi-disclosure .openapi-schema-properties .openapi-schema:only-child .openapi-schema-name { + @apply !m-0; +} + +.openapi-disclosure .openapi-schema-properties .openapi-schema-enum { + @apply pt-0 mt-0; +} + +.openapi-section-body.openapi-schema.openapi-schema-root-body { + @apply space-y-2.5; } diff --git a/packages/gitbook/src/components/PageAside/ScrollSectionsList.tsx b/packages/gitbook/src/components/PageAside/ScrollSectionsList.tsx index 64ebb3697..c66691372 100644 --- a/packages/gitbook/src/components/PageAside/ScrollSectionsList.tsx +++ b/packages/gitbook/src/components/PageAside/ScrollSectionsList.tsx @@ -126,7 +126,17 @@ export function ScrollSectionsList(props: { sections: DocumentSection[] }) { ) : null} - {section.title} + + {section.title} + ))} diff --git a/packages/gitbook/src/fonts/index.ts b/packages/gitbook/src/fonts/index.ts index f3a555e09..59df72aea 100644 --- a/packages/gitbook/src/fonts/index.ts +++ b/packages/gitbook/src/fonts/index.ts @@ -34,6 +34,7 @@ export const fontNotoColorEmoji = Noto_Color_Emoji({ */ const inter = Inter({ + weight: ['400', '500', '600', '700'], variable: '--font-content', preload: false, display: 'swap', @@ -41,7 +42,7 @@ const inter = Inter({ }); export const ibmPlexMono = IBM_Plex_Mono({ - weight: ['400', '600'], + weight: ['400', '500', '600', '700'], variable: '--font-mono', style: 'normal', display: 'swap', @@ -59,7 +60,7 @@ const firaSans = Fira_Sans_Extra_Condensed({ }); const ibmPlexSerif = IBM_Plex_Serif({ - weight: ['400', '500', '700'], + weight: ['400', '500', '600', '700'], variable: '--font-content', preload: false, display: 'swap', @@ -83,7 +84,7 @@ const merriweather = Merriweather({ }); const notoSans = Noto_Sans({ - weight: ['400', '500', '700', '800'], + weight: ['400', '500', '600', '700'], variable: '--font-content', preload: false, display: 'swap', @@ -91,7 +92,7 @@ const notoSans = Noto_Sans({ }); const openSans = Open_Sans({ - weight: ['400', '600', '700', '800'], + weight: ['400', '500', '600', '700'], variable: '--font-content', preload: false, display: 'swap', @@ -99,6 +100,7 @@ const openSans = Open_Sans({ }); const overpass = Overpass({ + weight: ['400', '500', '600', '700'], variable: '--font-content', preload: false, display: 'swap', @@ -130,7 +132,7 @@ const roboto = Roboto({ }); const robotoSlab = Roboto_Slab({ - weight: ['400', '500', '700'], + weight: ['400', '500', '600', '700'], variable: '--font-content', preload: false, display: 'swap', @@ -138,7 +140,7 @@ const robotoSlab = Roboto_Slab({ }); const sourceSansPro = Source_Sans_3({ - weight: ['400', '600', '700'], + weight: ['400', '500', '600', '700'], variable: '--font-content', preload: false, display: 'swap', diff --git a/packages/gitbook/src/lib/document-sections.ts b/packages/gitbook/src/lib/document-sections.ts index b7535696b..51abac2b9 100644 --- a/packages/gitbook/src/lib/document-sections.ts +++ b/packages/gitbook/src/lib/document-sections.ts @@ -9,6 +9,7 @@ export interface DocumentSection { tag?: string; title: string; depth: number; + deprecated?: boolean; } /** @@ -44,6 +45,7 @@ export async function getDocumentSections( tag: operation.method.toUpperCase(), title: operation.operation.summary ?? operation.path, depth: 1, + deprecated: operation.operation.deprecated, }); } } diff --git a/packages/react-openapi/package.json b/packages/react-openapi/package.json index a07606b30..b7b931242 100644 --- a/packages/react-openapi/package.json +++ b/packages/react-openapi/package.json @@ -17,6 +17,8 @@ "classnames": "^2.5.1", "flatted": "^3.2.9", "swagger2openapi": "^7.0.8", + "react-aria-components": "^1.6.0", + "react-aria": "^3.37.0", "usehooks-ts": "^3.1.0", "yaml": "1.10.2" }, diff --git a/packages/react-openapi/src/InteractiveSection.tsx b/packages/react-openapi/src/InteractiveSection.tsx index 077506bdb..e8bfa91bb 100644 --- a/packages/react-openapi/src/InteractiveSection.tsx +++ b/packages/react-openapi/src/InteractiveSection.tsx @@ -2,6 +2,8 @@ import classNames from 'classnames'; import React, { useCallback } from 'react'; +import { mergeProps, useButton, useDisclosure, useFocusRing } from 'react-aria'; +import { useDisclosureState } from 'react-stately'; interface InteractiveSectionTab { key: string; @@ -45,15 +47,14 @@ export function InteractiveSection(props: { toggeable?: boolean; /** Default state of the toggle */ defaultOpened?: boolean; - /** Icons to display for the toggle */ - toggleOpenIcon?: React.ReactNode; - toggleCloseIcon?: React.ReactNode; + /** Icon to display for the toggle */ + toggleIcon?: React.ReactNode; /** Tabs of content to display */ tabs?: Array; /** Default tab to have opened */ defaultTab?: string; /** Content of the header */ - header: React.ReactNode; + header?: React.ReactNode; /** Body of the section */ children?: React.ReactNode; /** Children to display within the container */ @@ -71,8 +72,7 @@ export function InteractiveSection(props: { header, children, overlay, - toggleOpenIcon = '▶', - toggleCloseIcon = '▼', + toggleIcon = '▶', stateKey, } = props; const [syncedTabs, setSyncedTabs] = useSyncedTabsGlobalState(); @@ -80,12 +80,19 @@ export function InteractiveSection(props: { stateKey && stateKey in syncedTabs ? tabs.find((tab) => tab.key === syncedTabs[stateKey]) : undefined; - - const [opened, setOpened] = React.useState(defaultOpened); const [selectedTabKey, setSelectedTab] = React.useState(tabFromState?.key ?? defaultTab); const selectedTab: InteractiveSectionTab | undefined = tabFromState ?? tabs.find((tab) => tab.key === selectedTabKey) ?? tabs[0]; + const state = useDisclosureState({ + defaultExpanded: defaultOpened, + }); + const panelRef = React.useRef(null); + const triggerRef = React.useRef(null); + const { buttonProps: triggerProps, panelProps } = useDisclosure({}, state, panelRef); + const { buttonProps } = useButton(triggerProps, triggerRef); + const { isFocusVisible, focusProps } = useFocusRing(); + return (
-
{ - if (toggeable) { - setOpened(!opened); - } - }} - className={classNames('openapi-section-header', `${className}-header`)} - > + {header ? (
- {header} -
-
{ - event.stopPropagation(); + onClick={() => { + if (toggeable) { + state.toggle(); + } }} + className={classNames('openapi-section-header', `${className}-header`)} > - {tabs.length ? ( - - ) : null} - {(children || selectedTab?.body) && toggeable ? ( - - ) : null} +
+ {(children || selectedTab?.body) && toggeable ? ( + + ) : null} + {header} +
+
{ + event.stopPropagation(); + }} + > + {tabs.length > 1 ? ( + + ) : null} +
-
- {(!toggeable || opened) && (children || selectedTab?.body) ? ( -
+ ) : null} + {(!toggeable || state.isExpanded) && (children || selectedTab?.body) ? ( +
{children} {selectedTab?.body}
) : null} - {overlay} + {overlay ? ( +
+ {overlay} +
+ ) : null}
); } diff --git a/packages/react-openapi/src/Markdown.tsx b/packages/react-openapi/src/Markdown.tsx index d85b026eb..fa2cbf29b 100644 --- a/packages/react-openapi/src/Markdown.tsx +++ b/packages/react-openapi/src/Markdown.tsx @@ -1,4 +1,3 @@ -import * as React from 'react'; import classNames from 'classnames'; export function Markdown(props: { source: string; className?: string }) { diff --git a/packages/react-openapi/src/OpenAPICodeSample.tsx b/packages/react-openapi/src/OpenAPICodeSample.tsx index ac3c06c70..fd8c18cd5 100644 --- a/packages/react-openapi/src/OpenAPICodeSample.tsx +++ b/packages/react-openapi/src/OpenAPICodeSample.tsx @@ -1,14 +1,14 @@ -import * as React from 'react'; +import React from 'react'; import { CodeSampleInput, codeSampleGenerators } from './code-samples'; import { OpenAPIOperationData } from './fetchOpenAPIOperation'; import { generateMediaTypeExample, generateSchemaExample } from './generateSchemaExample'; import { InteractiveSection } from './InteractiveSection'; import { getServersURL } from './OpenAPIServerURL'; -import { ScalarApiButton } from './ScalarApiButton'; import { OpenAPIContextProps } from './types'; import { noReference } from './utils'; import { stringifyOpenAPI } from './stringifyOpenAPI'; +import { OpenAPITabs, OpenAPITabsList, OpenAPITabsPanels } from './OpenAPITabs'; /** * Display code samples to execute the operation. @@ -112,25 +112,17 @@ export function OpenAPICodeSample(props: { const codeSamplesDisabled = data['x-codeSamples'] === false || data.operation['x-codeSamples'] === false; const samples = customCodeSamples ?? (!codeSamplesDisabled ? autoCodeSamples : []); + if (samples.length === 0) { return null; } return ( - - ) - } - /> + + } className="openapi-codesample"> + + + ); } @@ -138,6 +130,7 @@ function getSecurityHeaders(securities: OpenAPIOperationData['securities']): { [key: string]: string; } { const security = securities[0]; + if (!security) { return {}; } diff --git a/packages/react-openapi/src/OpenAPIDisclosure.tsx b/packages/react-openapi/src/OpenAPIDisclosure.tsx new file mode 100644 index 000000000..e4ce1643a --- /dev/null +++ b/packages/react-openapi/src/OpenAPIDisclosure.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import { OpenAPIClientContext } from './types'; +import { mergeProps, useButton, useDisclosure, useFocusRing } from 'react-aria'; +import { useDisclosureState } from 'react-stately'; + +interface Props { + context: OpenAPIClientContext; + children: React.ReactNode; + label?: string; +} + +/** + * Display an interactive OpenAPI disclosure. + * The label is optional and defaults to "child attributes". + */ +export function OpenAPIDisclosure({ context, children, label }: Props): JSX.Element { + const state = useDisclosureState({}); + const panelRef = React.useRef(null); + const triggerRef = React.useRef(null); + const { buttonProps: triggerProps, panelProps } = useDisclosure({}, state, panelRef); + const { buttonProps } = useButton(triggerProps, triggerRef); + const { isFocusVisible, focusProps } = useFocusRing(); + + return ( +
+ + + {state.isExpanded && ( +
+ {children} +
+ )} +
+ ); +} diff --git a/packages/react-openapi/src/OpenAPIDisclosureGroup.tsx b/packages/react-openapi/src/OpenAPIDisclosureGroup.tsx new file mode 100644 index 000000000..bfb4baa33 --- /dev/null +++ b/packages/react-openapi/src/OpenAPIDisclosureGroup.tsx @@ -0,0 +1,142 @@ +import React from 'react'; + +interface Props { + groups: TDisclosureGroup[]; + icon?: React.ReactNode; +} + +type TDisclosureGroup = { + id: string; + label: string | React.ReactNode; + tabs?: { + id: string; + label: string | React.ReactNode; + body?: React.ReactNode; + }[]; +}; + +import { mergeProps, useButton, useDisclosure, useFocusRing, useId } from 'react-aria'; +import { + DisclosureGroupProps, + DisclosureGroupState, + useDisclosureGroupState, + useDisclosureState, +} from 'react-stately'; +import classNames from 'classnames'; + +const DisclosureGroupStateContext = React.createContext(null); + +/** + * Display an interactive OpenAPI disclosure group. + */ +export function OpenAPIDisclosureGroup(props: DisclosureGroupProps & Props) { + const { icon, groups } = props; + + const state = useDisclosureGroupState(props); + + return ( + + {groups.map((group) => ( + + ))} + + ); +} + +function DisclosureItem(props: { group: TDisclosureGroup; icon?: React.ReactNode }) { + const { icon, group } = props; + + const defaultId = useId(); + const id = group.id || defaultId; + const groupState = React.useContext(DisclosureGroupStateContext); + const isExpanded = groupState?.expandedKeys.has(id) || false; + const state = useDisclosureState({ + isExpanded, + onExpandedChange() { + if (groupState) { + groupState.toggleKey(id); + } + }, + }); + + const panelRef = React.useRef(null); + const triggerRef = React.useRef(null); + const isDisabled = groupState?.isDisabled || !group.tabs?.length || false; + const { buttonProps: triggerProps, panelProps } = useDisclosure( + { + ...props, + isExpanded, + isDisabled, + }, + state, + panelRef, + ); + const { buttonProps } = useButton(triggerProps, triggerRef); + const { isFocusVisible, focusProps } = useFocusRing(); + + const defaultTab = group.tabs?.[0]?.id || ''; + const [selectedTabKey, setSelectedTabKey] = React.useState(defaultTab); + const selectedTab = group.tabs?.find((tab) => tab.id === selectedTabKey); + + return ( +
+
+ + {group.tabs ? ( +
+ {group.tabs?.length > 1 ? ( + + ) : !!group.tabs[0] ? ( + {group.tabs[0].label} + ) : null} +
+ ) : null} +
+ + {state.isExpanded && selectedTab && ( +
+ {selectedTab.body} +
+ )} +
+ ); +} diff --git a/packages/react-openapi/src/OpenAPIOperation.tsx b/packages/react-openapi/src/OpenAPIOperation.tsx index ffb2269d6..2b348ce51 100644 --- a/packages/react-openapi/src/OpenAPIOperation.tsx +++ b/packages/react-openapi/src/OpenAPIOperation.tsx @@ -5,9 +5,9 @@ import { OpenAPIOperationData } from './fetchOpenAPIOperation'; import { Markdown } from './Markdown'; import { OpenAPICodeSample } from './OpenAPICodeSample'; import { OpenAPIResponseExample } from './OpenAPIResponseExample'; -import { OpenAPIServerURL } from './OpenAPIServerURL'; import { OpenAPISpec } from './OpenAPISpec'; import { OpenAPIClientContext, OpenAPIContextProps } from './types'; +import { OpenAPIPath } from './OpenAPIPath'; /** * Display an interactive OpenAPI operation. @@ -18,7 +18,7 @@ export function OpenAPIOperation(props: { context: OpenAPIContextProps; }) { const { className, data, context } = props; - const { operation, servers, method, path } = data; + const { operation } = data; const clientContext: OpenAPIClientContext = { defaultInteractiveOpened: context.defaultInteractiveOpened, @@ -26,32 +26,33 @@ export function OpenAPIOperation(props: { blockKey: context.blockKey, }; + const trimmedDescription = operation.description?.trim(); + return (
-
-

+
+

{operation.summary}

- {operation.description ? ( - - ) : null} -
- - {method.toUpperCase()} - - - - {path} - -
+ {operation.deprecated &&
Deprecated
}
+ {operation['x-deprecated-sunset'] ? ( +
+ This operation is deprecated and will be sunset on{' '} + + {operation['x-deprecated-sunset']} + + {`.`} +
+ ) : null} + {trimmedDescription ? ( +
+ +
+ ) : null} +
diff --git a/packages/react-openapi/src/OpenAPIPath.tsx b/packages/react-openapi/src/OpenAPIPath.tsx new file mode 100644 index 000000000..954162625 --- /dev/null +++ b/packages/react-openapi/src/OpenAPIPath.tsx @@ -0,0 +1,66 @@ +import { OpenAPIOperationData } from './fetchOpenAPIOperation'; +import { ScalarApiButton } from './ScalarApiButton'; +import { OpenAPIContextProps } from './types'; + +/** + * Display the path of an operation. + */ +export function OpenAPIPath(props: { + data: OpenAPIOperationData; + context: OpenAPIContextProps; +}): JSX.Element { + const { data, context } = props; + const { method, path } = data; + const { specUrl } = context; + + return ( +
+
{method}
+
+

{formatPath(path)}

+
+ {data['x-hideTryItPanel'] || data.operation['x-hideTryItPanel'] ? null : ( + + )} +
+ ); +} + +// Format the path to highlight placeholders +function formatPath(path: string) { + // Matches placeholders like {id}, {userId}, etc. + const regex = /\{(\w+)\}/g; + + const parts: (string | JSX.Element)[] = []; + let lastIndex = 0; + + // Replace placeholders with tags + path.replace(regex, (match, key, offset) => { + parts.push(path.slice(lastIndex, offset)); + parts.push({`{${key}}`}); + lastIndex = offset + match.length; + return match; + }); + + // Push remaining text after the last placeholder + parts.push(path.slice(lastIndex)); + + // Join parts with separators wrapped in + const formattedPath = parts.reduce( + (acc, part, index) => { + if (typeof part === 'string' && index > 0 && part === '/') { + return [ + ...acc, + + / + , + part, + ]; + } + return [...acc, part]; + }, + [] as (string | JSX.Element)[], + ); + + return {formattedPath}; +} diff --git a/packages/react-openapi/src/OpenAPIRequestBody.tsx b/packages/react-openapi/src/OpenAPIRequestBody.tsx index d8fb8feae..cc58a3eea 100644 --- a/packages/react-openapi/src/OpenAPIRequestBody.tsx +++ b/packages/react-openapi/src/OpenAPIRequestBody.tsx @@ -5,7 +5,6 @@ import { OpenAPIRootSchema } from './OpenAPISchema'; import { noReference } from './utils'; import { OpenAPIClientContext } from './types'; import { InteractiveSection } from './InteractiveSection'; -import { Markdown } from './Markdown'; /** * Display an interactive request body. @@ -34,14 +33,6 @@ export function OpenAPIRequestBody(props: { }; }, )} - defaultOpened={context.defaultInteractiveOpened} - > - {requestBody.description ? ( - - ) : null} - + /> ); } diff --git a/packages/react-openapi/src/OpenAPIResponse.tsx b/packages/react-openapi/src/OpenAPIResponse.tsx index 6fe795274..a51a7f82e 100644 --- a/packages/react-openapi/src/OpenAPIResponse.tsx +++ b/packages/react-openapi/src/OpenAPIResponse.tsx @@ -4,41 +4,30 @@ import { OpenAPIV3 } from '@scalar/openapi-types'; import { OpenAPIRootSchema, OpenAPISchemaProperties } from './OpenAPISchema'; import { noReference } from './utils'; import { OpenAPIClientContext } from './types'; -import { InteractiveSection } from './InteractiveSection'; -import { Markdown } from './Markdown'; +import { OpenAPIDisclosure } from './OpenAPIDisclosure'; /** * Display an interactive response body. */ export function OpenAPIResponse(props: { response: OpenAPIV3.ResponseObject; + mediaType: OpenAPIV3.MediaTypeObject; context: OpenAPIClientContext; }) { - const { response, context } = props; - const content = Object.entries(response.content ?? {}); + const { response, context, mediaType } = props; const headers = Object.entries(response.headers ?? {}).map( ([name, header]) => [name, noReference(header) ?? {}] as const, ); + const content = Object.entries(mediaType.schema ?? {}); if (content.length === 0 && !response.description && headers.length === 0) { return null; } return ( - <> - {response.description ? ( - - ) : null} - +
{headers.length > 0 ? ( - + ({ propertyName: name, @@ -47,26 +36,20 @@ export function OpenAPIResponse(props: { }))} context={context} /> - + ) : null} - {content.length > 0 ? ( - { - return { - key: contentType, - label: contentType, - body: ( - - ), - }; - })} + +
+ - ) : null} - +
+
); } diff --git a/packages/react-openapi/src/OpenAPIResponseExample.tsx b/packages/react-openapi/src/OpenAPIResponseExample.tsx index bc5d793f6..ce9a79b47 100644 --- a/packages/react-openapi/src/OpenAPIResponseExample.tsx +++ b/packages/react-openapi/src/OpenAPIResponseExample.tsx @@ -1,11 +1,12 @@ import * as React from 'react'; -import { InteractiveSection } from './InteractiveSection'; import { OpenAPIOperationData } from './fetchOpenAPIOperation'; import { generateSchemaExample } from './generateSchemaExample'; import { OpenAPIContextProps } from './types'; -import { createStateKey, noReference } from './utils'; +import { noReference } from './utils'; import { stringifyOpenAPI } from './stringifyOpenAPI'; import { OpenAPIV3 } from '@scalar/openapi-types'; +import { OpenAPITabs, OpenAPITabsList, OpenAPITabsPanels } from './OpenAPITabs'; +import { InteractiveSection } from './InteractiveSection'; /** * Display an example of the response content. @@ -53,7 +54,12 @@ export function OpenAPIResponseExample(props: { })(); if (!mediaTypeObject) { - return null; + return { + key: key, + label: key, + description: responseObject.description, + body: , + }; } const example: OpenAPIV3.ExampleObject | null = noReference( @@ -81,14 +87,11 @@ export function OpenAPIResponseExample(props: { })(), ); - if (!example?.value) { - return null; - } - return { key: key, label: key, - body: ( + description: responseObject.description, + body: example?.value ? ( + ) : ( + ), }; }) - .filter((val): val is { key: string; label: string; body: any } => Boolean(val)); + .filter((val): val is { key: string; label: string; body: any; description: string } => + Boolean(val), + ); if (examples.length === 0) { return null; } return ( - + + } className="openapi-response-example"> + + + + ); +} + +function OpenAPIEmptyResponseExample() { + return ( +
+            

No body

+
); } diff --git a/packages/react-openapi/src/OpenAPIResponses.tsx b/packages/react-openapi/src/OpenAPIResponses.tsx index 33372f124..10a63a647 100644 --- a/packages/react-openapi/src/OpenAPIResponses.tsx +++ b/packages/react-openapi/src/OpenAPIResponses.tsx @@ -5,6 +5,10 @@ import { OpenAPIResponse } from './OpenAPIResponse'; import { OpenAPIClientContext } from './types'; import { InteractiveSection } from './InteractiveSection'; import { OpenAPIV3, OpenAPIV3_1 } from '@scalar/openapi-types'; +import { OpenAPIDisclosureGroup } from './OpenAPIDisclosureGroup'; +import { Markdown } from './Markdown'; +import { OpenAPIRootSchema, OpenAPISchemaProperties, OpenAPISchemaProperty } from './OpenAPISchema'; +import { OpenAPIDisclosure } from './OpenAPIDisclosure'; /** * Display an interactive response body. @@ -18,15 +22,50 @@ export function OpenAPIResponses(props: { return ( { - return { - key: statusCode, - label: statusCode, - body: , - }; - })} - /> + > + { + const content = Object.entries(response.content ?? {}); + + return { + id: statusCode, + label: ( +
+ + {statusCode} + + {response.description ? ( + + ) : null} +
+ ), + tabs: content.map(([contentType, mediaType]) => ({ + id: contentType, + label: contentType, + body: ( + + ), + })), + }; + }, + )} + /> +
); } diff --git a/packages/react-openapi/src/OpenAPISchema.tsx b/packages/react-openapi/src/OpenAPISchema.tsx index ec875242f..e37d6c2b9 100644 --- a/packages/react-openapi/src/OpenAPISchema.tsx +++ b/packages/react-openapi/src/OpenAPISchema.tsx @@ -7,10 +7,12 @@ import { Markdown } from './Markdown'; import { OpenAPIClientContext } from './types'; import { checkIsReference, noReference } from './utils'; import { stringifyOpenAPI } from './stringifyOpenAPI'; +import { OpenAPISchemaName } from './OpenAPISchemaName'; +import { OpenAPIDisclosure } from './OpenAPIDisclosure'; type CircularRefsIds = Map; -interface OpenAPISchemaPropertyEntry { +export interface OpenAPISchemaPropertyEntry { propertyName?: string; required?: boolean; schema: OpenAPIV3.SchemaObject; @@ -28,8 +30,6 @@ export function OpenAPISchemaProperty( }, ) { const { - propertyName, - required, schema, circularRefs: parentCircularRefs = new Map(), context, @@ -47,75 +47,41 @@ export function OpenAPISchemaProperty( ? null : getSchemaAlternatives(schema, new Set(circularRefs.keys())); - const shouldDisplayExample = (schema: OpenAPIV3.SchemaObject): boolean => { + if ((properties && !!properties.length) || schema.type === 'object') { return ( - typeof schema.example === 'string' || - typeof schema.example === 'number' || - typeof schema.example === 'boolean' || - (Array.isArray(schema.example) && schema.example.length > 0) || - (typeof schema.example === 'object' && - schema.example !== null && - Object.keys(schema.example).length > 0) + + + + {properties && properties.length > 0 ? ( + + ) : null} + + ); - }; - return ( - ({ - key: `${index}`, - label: getSchemaTitle(alternative, alternatives[1]), - body: circularRefs.has(alternative) ? ( - - ) : ( + } + + if (alternatives?.[0]?.length) { + return ( + + + {alternatives[0].map((alternative, index) => ( - ), - }))} - header={ -
-
- {propertyName ? ( - - {propertyName} - - ) : null} - {required ? ( - * - ) : null} - - {getSchemaTitle(schema)} - -
- {schema.description ? ( - - ) : null} - {shouldDisplayExample(schema) ? ( -
- Example: {stringifyOpenAPI(schema.example)} -
- ) : null} - {schema.pattern ? ( -
- Pattern: {schema.pattern} -
- ) : null} -
- } - > + ))} +
+ ); + } + + return ( + + {(properties && properties.length > 0) || (schema.enum && schema.enum.length > 0) || parentCircularRef ? ( @@ -127,9 +93,6 @@ export function OpenAPISchemaProperty( context={context} /> ) : null} - {schema.enum && schema.enum.length > 0 ? ( - - ) : null} {parentCircularRef ? ( ) : null} @@ -204,12 +167,14 @@ function OpenAPISchemaAlternative(props: { const subProperties = getSchemaProperties(schema); return ( - + + + ); } @@ -235,9 +200,71 @@ export function OpenAPISchemaEnum(props: { enumValues: any[] }) { return (
- {enumValues.map((value, index) => ( - {`${value}`} - ))} + + Options:{' '} + {enumValues.map((value, index) => ( + + {`${value}`} + {index < enumValues.length - 1 ? ', ' : ''} + + ))} + +
+ ); +} + +export function OpenAPISchemaPresentation(props: OpenAPISchemaPropertyEntry) { + const { schema, propertyName, required } = props; + + const shouldDisplayExample = (schema: OpenAPIV3.SchemaObject): boolean => { + return ( + typeof schema.example === 'string' || + typeof schema.example === 'number' || + typeof schema.example === 'boolean' || + (Array.isArray(schema.example) && schema.example.length > 0) || + (typeof schema.example === 'object' && + schema.example !== null && + Object.keys(schema.example).length > 0) + ); + }; + + return ( +
+ + {schema['x-deprecated-sunset'] ? ( +
+ Sunset date:{' '} + + {schema['x-deprecated-sunset']} + +
+ ) : null} + {schema.description ? ( + + ) : null} + {shouldDisplayExample(schema) ? ( +
+ Example:{' '} + + {typeof schema.example === 'string' + ? schema.example + : stringifyOpenAPI(schema.example)} + +
+ ) : null} + {schema.pattern ? ( +
+ Pattern: {schema.pattern} +
+ ) : null} + {schema.enum && schema.enum.length > 0 ? ( + + ) : null}
); } @@ -282,9 +309,6 @@ function getSchemaProperties(schema: OpenAPIV3.SchemaObject): null | OpenAPISche const propertySchema: OpenAPIV3.SchemaObject = isReference ? { propertyName } : rawPropertySchema; - if (propertySchema.deprecated) { - return; - } result.push({ propertyName, @@ -356,7 +380,7 @@ function flattenAlternatives( }, [] as OpenAPIV3.SchemaObject[]); } -function getSchemaTitle( +export function getSchemaTitle( schema: OpenAPIV3.SchemaObject, /** If the title is inferred in a oneOf with discriminator, we can use it to optimize the title */ @@ -384,12 +408,12 @@ function getSchemaTitle( type = 'enum'; // check array AND schema.items as this is sometimes null despite what the type indicates } else if (schema.type === 'array' && !!schema.items) { - type = `array of ${getSchemaTitle(noReference(schema.items))}`; + type = `${getSchemaTitle(noReference(schema.items))}[]`; } else if (schema.type || schema.properties) { type = schema.type ?? 'object'; if (schema.format) { - type += ` (${schema.format})`; + type += ` ${schema.format}`; } } else if ('anyOf' in schema) { type = 'any of'; diff --git a/packages/react-openapi/src/OpenAPISchemaName.tsx b/packages/react-openapi/src/OpenAPISchemaName.tsx new file mode 100644 index 000000000..36d9a0479 --- /dev/null +++ b/packages/react-openapi/src/OpenAPISchemaName.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import classNames from 'classnames'; + +interface OpenAPISchemaNameProps { + propertyName?: string | JSX.Element; + required?: boolean; + type?: string; + deprecated?: boolean; +} + +/** + * Display the schema name row. + * It includes the property name, type, required and deprecated status. + */ +export function OpenAPISchemaName(props: OpenAPISchemaNameProps): JSX.Element { + const { type, propertyName, required, deprecated } = props; + + return ( +
+ {propertyName ? ( + + {propertyName} + + ) : null} + {type ? {type} : null} + {required ? ( + required + ) : null} + {deprecated ? ( + Deprecated + ) : null} +
+ ); +} diff --git a/packages/react-openapi/src/OpenAPISecurities.tsx b/packages/react-openapi/src/OpenAPISecurities.tsx index f9ea33e29..84c47c528 100644 --- a/packages/react-openapi/src/OpenAPISecurities.tsx +++ b/packages/react-openapi/src/OpenAPISecurities.tsx @@ -4,6 +4,7 @@ import { OpenAPIClientContext } from './types'; import { InteractiveSection } from './InteractiveSection'; import { Markdown } from './Markdown'; import { OpenAPIOperationData } from './fetchOpenAPIOperation'; +import { OpenAPISchemaName } from './OpenAPISchemaName'; /** * Present securities authorization that can be used for this operation. @@ -20,26 +21,28 @@ export function OpenAPISecurities(props: { return ( { return { key: key, label: key, body: ( - <> -

{getLabelForType(security)}

- {security.description ? ( - - ) : null} - +
+
+ {getLabelForType(security)} + + {security.description ? ( + + ) : null} +
+
), }; })} @@ -47,24 +50,35 @@ export function OpenAPISecurities(props: { ); } -function getLabelForType(security: OpenAPIV3_1.SecuritySchemeObject): string { +function getLabelForType(security: OpenAPIV3_1.SecuritySchemeObject) { switch (security.type) { case 'apiKey': - return 'API Key'; + return ; case 'http': if (security.scheme === 'basic') { return 'Basic Auth'; } if (security.scheme == 'bearer') { - return `Bearer Token ${security.bearerFormat ? `(${security.bearerFormat})` : ''}`; + return ( + <> + + {/** Show a default description if none is provided */} + {!security.description ? ( + + ) : null} + + ); } - return 'HTTP'; + return ; case 'oauth2': - return 'OAuth2'; + return ; case 'openIdConnect': - return 'OpenID Connect'; + return ; default: // @ts-ignore return security.type; diff --git a/packages/react-openapi/src/OpenAPISpec.tsx b/packages/react-openapi/src/OpenAPISpec.tsx index 6e87424bc..1b83500f0 100644 --- a/packages/react-openapi/src/OpenAPISpec.tsx +++ b/packages/react-openapi/src/OpenAPISpec.tsx @@ -1,7 +1,6 @@ 'use client'; -import * as React from 'react'; -import { OpenAPIV3, OpenAPIV2, OpenAPI } from '@scalar/openapi-types'; +import { OpenAPI } from '@scalar/openapi-types'; import { OpenAPIOperationData, fromJSON } from './fetchOpenAPIOperation'; import { InteractiveSection } from './InteractiveSection'; @@ -36,11 +35,7 @@ export function OpenAPISpec(props: { data: OpenAPIOperationData; context: OpenAP ({ @@ -50,6 +45,8 @@ export function OpenAPISpec(props: { data: OpenAPIOperationData; context: OpenAP // we use display it if the schema doesn't override it description: parameter.description, example: parameter.example, + // Deprecated can be defined at the parameter level + deprecated: parameter.deprecated, ...(noReference(parameter.schema) ?? {}), }, required: parameter.required, @@ -85,20 +82,22 @@ function groupParameters(parameters: OpenAPI.Parameters): Array<{ parameters: OpenAPI.Parameters; }> = []; - parameters.forEach((parameter) => { - const key = parameter.in; - const label = getParameterGroupName(parameter.in); - const group = groups.find((group) => group.key === key); - if (group) { - group.parameters.push(parameter); - } else { - groups.push({ - key, - label, - parameters: [parameter], - }); - } - }); + parameters + .filter((parameter) => parameter.in) + .forEach((parameter) => { + const key = parameter.in; + const label = getParameterGroupName(parameter.in); + const group = groups.find((group) => group.key === key); + if (group) { + group.parameters.push(parameter); + } else { + groups.push({ + key, + label, + parameters: [parameter], + }); + } + }); groups.sort((a, b) => sorted.indexOf(a.key) - sorted.indexOf(b.key)); diff --git a/packages/react-openapi/src/OpenAPITabs.tsx b/packages/react-openapi/src/OpenAPITabs.tsx new file mode 100644 index 000000000..b53380f24 --- /dev/null +++ b/packages/react-openapi/src/OpenAPITabs.tsx @@ -0,0 +1,106 @@ +'use client'; + +import React, { useMemo } from 'react'; +import { Key, Tab, TabList, TabPanel, Tabs, TabsProps } from 'react-aria-components'; +import { Markdown } from './Markdown'; + +export type Tab = { + key: Key; + label: string; + body: React.ReactNode; + description?: string; +}; + +type OpenAPITabsContextData = { + items: Tab[]; + selectedKey: Key; + setSelectedKey: (key: Key) => void; +}; + +const OpenAPITabsContext = React.createContext(null); + +function useOpenAPITabsContext() { + const context = React.useContext(OpenAPITabsContext); + if (!context) { + throw new Error('OpenAPITabsContext is missing'); + } + return context; +} + +/** + * The OpenAPI Tabs wrapper component. + */ +export function OpenAPITabs(props: React.PropsWithChildren) { + const { children, items } = props; + const [selectedKey, setSelectedKey] = React.useState(items[0].key); + + const contextValue = { items, selectedKey, setSelectedKey }; + + return ( + + + {children} + + + ); +} + +/** + * The OpenAPI Tabs list component. + * This component should be used as a child of the OpenAPITabs component. + * It renders the list of tabs. + */ +export function OpenAPITabsList() { + const { items } = useOpenAPITabsContext(); + + return ( + + {items.map((tab) => ( + ({ + outline: isFocusVisible + ? '2px solid rgb(var(--primary-color-500)/0.4)' + : 'none', + })} + className="openapi-tabs-tab" + key={`Tab-${tab.key}`} + id={tab.key} + > + {tab.label} + + ))} + + ); +} + +/** + * The OpenAPI Tabs panels component. + * This component should be used as a child of the OpenAPITabs component. + * It renders the content of the selected tab. + */ +export function OpenAPITabsPanels() { + const { selectedKey, items } = useOpenAPITabsContext(); + + const tab = useMemo(() => items.find((tab) => tab.key === selectedKey), [items, selectedKey]); + + if (!tab) { + return null; + } + + return ( + + {tab.body} + {tab.description ? ( + + ) : null} + + ); +} diff --git a/packages/react-openapi/src/ScalarApiButton.tsx b/packages/react-openapi/src/ScalarApiButton.tsx index bc6650eca..8c16086c7 100644 --- a/packages/react-openapi/src/ScalarApiButton.tsx +++ b/packages/react-openapi/src/ScalarApiButton.tsx @@ -24,7 +24,7 @@ export function ScalarApiButton({ return (