From 7e2cd4ede3b131e024c1a797f5f094ba3a5cd73b Mon Sep 17 00:00:00 2001 From: kak-rastoky Date: Sat, 30 May 2026 02:56:22 +0700 Subject: [PATCH 1/3] test: add unit tests for all slices and playwright --- .gitignore | 8 +- e2e/constructor.spec.ts | 62 +++++++++ ...eb3bb914f845e67d235ab21e1c1b0d8a240b9.json | 1 + ...05780f21157dc52d4ab08b6cc4ed90ed9e6da4.dat | 31 +++++ ...67e4b3d7a28444b948ab5a105c283be73028a.json | 1 + ...45f46258aa112371af3da7d4a1a9d0348419d7.dat | 95 +++++++++++++ ...41f24b8be06b345533dad402af3d8fc270767.json | 1 + e2e/har/api.har | 1 + ...be289f094212944c18a7ad617604f8e58b8a7.json | 1 + ...b75ff6f125b6088a63ab93ff555555dc08159.json | 1 + ...ae27f1b64abca1dc028ad11002997e7fdc4ee.json | 1 + ...a8d7aae5af49dccb0893b92f03b9ce952d3245.dat | 125 ++++++++++++++++++ ...76441826967cb34b0c37bf7436e87430babf5.json | 1 + index.html | 2 +- package-lock.json | 47 +++---- package.json | 14 +- playwright.config.ts | 63 +-------- src/components/modal/modal.tsx | 3 +- .../constructor/constructorSlice.test.ts | 107 +++++++++++++++ .../ingredient/ingredientSlice.test.ts | 48 +++++++ src/services/user/userSlice.test.ts | 111 ++++++++++++++++ src/setupTests.ts | 1 + tsconfig.app.json | 7 +- vite.config.ts | 18 ++- 24 files changed, 649 insertions(+), 101 deletions(-) create mode 100644 e2e/constructor.spec.ts create mode 100644 e2e/har/079eb3bb914f845e67d235ab21e1c1b0d8a240b9.json create mode 100644 e2e/har/4705780f21157dc52d4ab08b6cc4ed90ed9e6da4.dat create mode 100644 e2e/har/6f267e4b3d7a28444b948ab5a105c283be73028a.json create mode 100644 e2e/har/7545f46258aa112371af3da7d4a1a9d0348419d7.dat create mode 100644 e2e/har/9b741f24b8be06b345533dad402af3d8fc270767.json create mode 100644 e2e/har/api.har create mode 100644 e2e/har/ccebe289f094212944c18a7ad617604f8e58b8a7.json create mode 100644 e2e/har/e14b75ff6f125b6088a63ab93ff555555dc08159.json create mode 100644 e2e/har/e67ae27f1b64abca1dc028ad11002997e7fdc4ee.json create mode 100644 e2e/har/f2a8d7aae5af49dccb0893b92f03b9ce952d3245.dat create mode 100644 e2e/har/f6776441826967cb34b0c37bf7436e87430babf5.json create mode 100644 src/services/constructor/constructorSlice.test.ts create mode 100644 src/services/ingredient/ingredientSlice.test.ts create mode 100644 src/services/user/userSlice.test.ts create mode 100644 src/setupTests.ts diff --git a/.gitignore b/.gitignore index 668d0b1..44a92d0 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,10 @@ storybook-static *.sw? playwright-report -test-results \ No newline at end of file +test-results + +# Playwright +/playwright-report/ +/blob-report/ +/playwright/.cache/ +/playwright/.auth/ diff --git a/e2e/constructor.spec.ts b/e2e/constructor.spec.ts new file mode 100644 index 0000000..2586ccb --- /dev/null +++ b/e2e/constructor.spec.ts @@ -0,0 +1,62 @@ +import { test, expect } from '@playwright/test'; + +const API_URL = '*://new-stellarburgers.education-services.ru/api'; + +test.describe('Страница Конструктор', () => { + test.beforeEach(async ({ page, context }) => { + await page.routeFromHAR('e2e/har/api.har', { + url: `${API_URL}/**`, + update: false, + }); + + await context.addCookies([ + { + name: 'accessToken', + value: 'mock-access-token', + domain: 'localhost', + path: '/', + }, + ]); + + await page.addInitScript(() => { + window.localStorage.setItem('refreshToken', 'mock-refresh-token'); + }); + + await page.goto('http://localhost:5173'); + }); + + test('Полный путь пользователя -> сборка бургера, просмотр ингредиента и оформление заказа', async ({ page }) => { + const modal = page.locator('#modals > div').first(); + const constructorSection = page.locator('section[class*="burger_constructor"]'); + + const bunIngredient = page.getByText('Краторная булка N-200i').first(); + const sauceIngredient = page.getByText('Соус с шипами Антарианского плоскоходца').first(); + + const bunTarget = page.getByText('Пожалуйста, перенесите сюда булку').first(); + const sauceTarget = page.getByText('Здесь расположите начинки и соусы').first(); + + await bunIngredient.click(); + + await expect(modal).toBeVisible(); + await expect(modal.getByText('Детали ингредиента')).toBeVisible(); + await expect(modal.getByText('Краторная булка N-200i')).toBeVisible(); + await expect(modal.getByText('420')).toBeVisible(); + + await modal.locator('button').first().click(); + await expect(modal).not.toBeVisible(); + + await bunIngredient.dragTo(bunTarget); + await sauceIngredient.dragTo(sauceTarget); + + await expect(constructorSection.getByText('Краторная булка N-200i (верх)')).toBeVisible(); + await expect(constructorSection.getByText('Соус с шипами Антарианского плоскоходца')).toBeVisible(); + + await page.getByRole('button', { name: /оформить заказ/i }).click(); + + await expect(modal).toBeVisible(); + await expect(modal.getByText('Детали заказа')).toBeVisible(); + + await modal.locator('button').first().click(); + await expect(modal).not.toBeVisible(); + }); +}); diff --git a/e2e/har/079eb3bb914f845e67d235ab21e1c1b0d8a240b9.json b/e2e/har/079eb3bb914f845e67d235ab21e1c1b0d8a240b9.json new file mode 100644 index 0000000..01b5380 --- /dev/null +++ b/e2e/har/079eb3bb914f845e67d235ab21e1c1b0d8a240b9.json @@ -0,0 +1 @@ +{"success":false,"message":"Token is invalid"} \ No newline at end of file diff --git a/e2e/har/4705780f21157dc52d4ab08b6cc4ed90ed9e6da4.dat b/e2e/har/4705780f21157dc52d4ab08b6cc4ed90ed9e6da4.dat new file mode 100644 index 0000000..10b09e2 --- /dev/null +++ b/e2e/har/4705780f21157dc52d4ab08b6cc4ed90ed9e6da4.dat @@ -0,0 +1,31 @@ +import { createApi, fetchBaseQuery } from "/node_modules/.vite/deps/@reduxjs_toolkit_query_react.js?v=59810ea1"; +import Cookies from "/node_modules/.vite/deps/js-cookie.js?v=dd4b359e"; +import API_URL from "/src/utils/constants.ts"; +export const ingredientsApi = createApi({ + reducerPath: "ingredientsApi", + baseQuery: fetchBaseQuery({ + baseUrl: API_URL, + prepareHeaders: (headers) => { + const token = Cookies.get("accessToken"); + if (token) { + headers.set("authorization", token); + } + return headers; + } + }), + endpoints: (builder) => ({ + getIngredients: builder.query({ + query: () => "/ingredients" + }), + createOrder: builder.mutation({ + query: (orderData) => ({ + url: "/orders", + method: "POST", + body: orderData + }) + }) + }) +}); +export const { useGetIngredientsQuery, useCreateOrderMutation } = ingredientsApi; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZ3JlZGllbnRzQXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUFwaSwgZmV0Y2hCYXNlUXVlcnkgfSBmcm9tICdAcmVkdXhqcy90b29sa2l0L3F1ZXJ5L3JlYWN0JztcclxuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcclxuXHJcbmltcG9ydCBBUElfVVJMIGZyb20gJy4uLy4uL3V0aWxzL2NvbnN0YW50cyc7XHJcblxyXG5pbXBvcnQgdHlwZSB7IFRJbmdyZWRpZW50IH0gZnJvbSAnQC91dGlscy9iYXNlVHlwZXMnO1xyXG5cclxudHlwZSBUSW5ncmVkaWVudHNSZXNwb25zZSA9IHtcclxuICBzdWNjZXNzOiBib29sZWFuO1xyXG4gIGRhdGE6IFRJbmdyZWRpZW50W107XHJcbn07XHJcblxyXG50eXBlIFRPcmRlclJlc3BvbnNlID0ge1xyXG4gIHN1Y2Nlc3M6IGJvb2xlYW47XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIG9yZGVyOiB7XHJcbiAgICBudW1iZXI6IG51bWJlcjtcclxuICB9O1xyXG59O1xyXG5cclxudHlwZSBUT3JkZXJEYXRhID0ge1xyXG4gIGluZ3JlZGllbnRzOiBzdHJpbmdbXTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbmdyZWRpZW50c0FwaSA9IGNyZWF0ZUFwaSh7XHJcbiAgcmVkdWNlclBhdGg6ICdpbmdyZWRpZW50c0FwaScsXHJcbiAgYmFzZVF1ZXJ5OiBmZXRjaEJhc2VRdWVyeSh7XHJcbiAgICBiYXNlVXJsOiBBUElfVVJMLFxyXG4gICAgcHJlcGFyZUhlYWRlcnM6IChoZWFkZXJzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRva2VuID0gQ29va2llcy5nZXQoJ2FjY2Vzc1Rva2VuJyk7XHJcbiAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgIGhlYWRlcnMuc2V0KCdhdXRob3JpemF0aW9uJywgdG9rZW4pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBoZWFkZXJzO1xyXG4gICAgfSxcclxuICB9KSxcclxuICBlbmRwb2ludHM6IChidWlsZGVyKSA9PiAoe1xyXG4gICAgZ2V0SW5ncmVkaWVudHM6IGJ1aWxkZXIucXVlcnk8VEluZ3JlZGllbnRzUmVzcG9uc2UsIHZvaWQ+KHtcclxuICAgICAgcXVlcnk6ICgpID0+ICcvaW5ncmVkaWVudHMnLFxyXG4gICAgfSksXHJcbiAgICBjcmVhdGVPcmRlcjogYnVpbGRlci5tdXRhdGlvbjxUT3JkZXJSZXNwb25zZSwgVE9yZGVyRGF0YT4oe1xyXG4gICAgICBxdWVyeTogKG9yZGVyRGF0YSkgPT4gKHtcclxuICAgICAgICB1cmw6ICcvb3JkZXJzJyxcclxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICBib2R5OiBvcmRlckRhdGEsXHJcbiAgICAgIH0pLFxyXG4gICAgfSksXHJcbiAgfSksXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHsgdXNlR2V0SW5ncmVkaWVudHNRdWVyeSwgdXNlQ3JlYXRlT3JkZXJNdXRhdGlvbiB9ID0gaW5ncmVkaWVudHNBcGk7XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxXQUFXLHNCQUFzQjtBQUMxQyxPQUFPLGFBQWE7QUFFcEIsT0FBTyxhQUFhO0FBcUJiLGFBQU0saUJBQWlCLFVBQVU7QUFBQSxFQUN0QyxhQUFhO0FBQUEsRUFDYixXQUFXLGVBQWU7QUFBQSxJQUN4QixTQUFTO0FBQUEsSUFDVCxnQkFBZ0IsQ0FBQyxZQUFZO0FBQzNCLFlBQU0sUUFBUSxRQUFRLElBQUksYUFBYTtBQUN2QyxVQUFJLE9BQU87QUFDVCxnQkFBUSxJQUFJLGlCQUFpQixLQUFLO0FBQUEsTUFDcEM7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0YsQ0FBQztBQUFBLEVBQ0QsV0FBVyxDQUFDLGFBQWE7QUFBQSxJQUN2QixnQkFBZ0IsUUFBUSxNQUFrQztBQUFBLE1BQ3hELE9BQU8sTUFBTTtBQUFBLElBQ2YsQ0FBQztBQUFBLElBQ0QsYUFBYSxRQUFRLFNBQXFDO0FBQUEsTUFDeEQsT0FBTyxDQUFDLGVBQWU7QUFBQSxRQUNyQixLQUFLO0FBQUEsUUFDTCxRQUFRO0FBQUEsUUFDUixNQUFNO0FBQUEsTUFDUjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFDRixDQUFDO0FBRU0sYUFBTSxFQUFFLHdCQUF3Qix1QkFBdUIsSUFBSTsiLCJuYW1lcyI6W119 \ No newline at end of file diff --git a/e2e/har/6f267e4b3d7a28444b948ab5a105c283be73028a.json b/e2e/har/6f267e4b3d7a28444b948ab5a105c283be73028a.json new file mode 100644 index 0000000..d3a0764 --- /dev/null +++ b/e2e/har/6f267e4b3d7a28444b948ab5a105c283be73028a.json @@ -0,0 +1 @@ +{"success":true,"user":{"email":"krivonra@mail.ru","name":"krivonraf"}} \ No newline at end of file diff --git a/e2e/har/7545f46258aa112371af3da7d4a1a9d0348419d7.dat b/e2e/har/7545f46258aa112371af3da7d4a1a9d0348419d7.dat new file mode 100644 index 0000000..77c5c4f --- /dev/null +++ b/e2e/har/7545f46258aa112371af3da7d4a1a9d0348419d7.dat @@ -0,0 +1,95 @@ +import { createApi, fetchBaseQuery } from "/node_modules/.vite/deps/@reduxjs_toolkit_query_react.js?v=59810ea1"; +import Cookies from "/node_modules/.vite/deps/js-cookie.js?v=dd4b359e"; +import API_URL from "/src/utils/constants.ts"; +import { setTokens } from "/src/utils/token.ts"; +export const ordersApi = createApi({ + reducerPath: "ordersApi", + baseQuery: fetchBaseQuery({ baseUrl: API_URL }), + endpoints: (builder) => ({ + getFeed: builder.query({ + queryFn: () => ({ data: { success: false, orders: [], total: 0, totalToday: 0 } }), + async onCacheEntryAdded(_arg, { updateCachedData, cacheDataLoaded, cacheEntryRemoved }) { + const ws = new WebSocket( + "wss://new-stellarburgers.education-services.ru/orders/all" + ); + try { + await cacheDataLoaded; + ws.addEventListener("message", (event) => { + const data = JSON.parse(event.data); + if (data.success) { + updateCachedData((draft) => { + draft.success = data.success; + draft.orders = data.orders; + draft.total = data.total; + draft.totalToday = data.totalToday; + }); + } + }); + } catch (err) { + console.error(err); + } + await cacheEntryRemoved; + ws.close(); + } + }), + getProfileOrders: builder.query({ + queryFn: () => ({ data: { success: false, orders: [], total: 0, totalToday: 0 } }), + async onCacheEntryAdded(_arg, { updateCachedData, cacheDataLoaded, cacheEntryRemoved }) { + const token = Cookies.get("accessToken")?.replace("Bearer ", ""); + let ws = new WebSocket( + `wss://new-stellarburgers.education-services.ru/orders?token=${token}` + ); + try { + await cacheDataLoaded; + const handleMessage = async (event) => { + const data = JSON.parse(event.data); + if (data.message === "Invalid or missing token") { + ws.close(); + const refreshToken = localStorage.getItem("refreshToken"); + if (refreshToken) { + try { + const res = await fetch(`${API_URL}/auth/token`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ token: refreshToken }) + }); + const refreshData = await res.json(); + if (refreshData.success) { + setTokens(refreshData.accessToken, refreshData.refreshToken); + const newToken = refreshData.accessToken.replace("Bearer ", ""); + ws = new WebSocket( + `wss://new-stellarburgers.education-services.ru/orders?token=${newToken}` + ); + ws.addEventListener("message", handleMessage); + } + } catch (err) { + console.error(err); + } + } + return; + } + if (data.success) { + updateCachedData((draft) => { + draft.success = data.success; + draft.orders = data.orders; + draft.total = data.total; + draft.totalToday = data.totalToday; + }); + } + }; + ws.addEventListener("message", handleMessage); + } catch (err) { + console.error(err); + } + await cacheEntryRemoved; + ws.close(); + } + }), + getOrderById: builder.query({ + query: (orderId) => `/orders/${orderId}` + }) + }) +}); +export const { useGetFeedQuery, useGetProfileOrdersQuery, useGetOrderByIdQuery } = ordersApi; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm9yZGVyc0FwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBcGksIGZldGNoQmFzZVF1ZXJ5IH0gZnJvbSAnQHJlZHV4anMvdG9vbGtpdC9xdWVyeS9yZWFjdCc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuXG5pbXBvcnQgQVBJX1VSTCBmcm9tICdAL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBzZXRUb2tlbnMgfSBmcm9tICdAL3V0aWxzL3Rva2VuJztcblxuaW1wb3J0IHR5cGUgeyBUV1NSZXNwb25zZSwgVE9yZGVyIH0gZnJvbSAnQC91dGlscy9iYXNlVHlwZXMnO1xuXG50eXBlIFRTaW5nbGVPcmRlclJlc3BvbnNlID0ge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBvcmRlcnM6IFRPcmRlcltdO1xufTtcblxuZXhwb3J0IGNvbnN0IG9yZGVyc0FwaSA9IGNyZWF0ZUFwaSh7XG4gIHJlZHVjZXJQYXRoOiAnb3JkZXJzQXBpJyxcbiAgYmFzZVF1ZXJ5OiBmZXRjaEJhc2VRdWVyeSh7IGJhc2VVcmw6IEFQSV9VUkwgfSksXG4gIGVuZHBvaW50czogKGJ1aWxkZXIpID0+ICh7XG4gICAgZ2V0RmVlZDogYnVpbGRlci5xdWVyeTxUV1NSZXNwb25zZSwgdm9pZD4oe1xuICAgICAgcXVlcnlGbjogKCkgPT4gKHsgZGF0YTogeyBzdWNjZXNzOiBmYWxzZSwgb3JkZXJzOiBbXSwgdG90YWw6IDAsIHRvdGFsVG9kYXk6IDAgfSB9KSxcbiAgICAgIGFzeW5jIG9uQ2FjaGVFbnRyeUFkZGVkKFxuICAgICAgICBfYXJnLFxuICAgICAgICB7IHVwZGF0ZUNhY2hlZERhdGEsIGNhY2hlRGF0YUxvYWRlZCwgY2FjaGVFbnRyeVJlbW92ZWQgfVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldChcbiAgICAgICAgICAnd3NzOi8vbmV3LXN0ZWxsYXJidXJnZXJzLmVkdWNhdGlvbi1zZXJ2aWNlcy5ydS9vcmRlcnMvYWxsJ1xuICAgICAgICApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2FjaGVEYXRhTG9hZGVkO1xuICAgICAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICB1cGRhdGVDYWNoZWREYXRhKChkcmFmdCkgPT4ge1xuICAgICAgICAgICAgICAgIGRyYWZ0LnN1Y2Nlc3MgPSBkYXRhLnN1Y2Nlc3M7XG4gICAgICAgICAgICAgICAgZHJhZnQub3JkZXJzID0gZGF0YS5vcmRlcnM7XG4gICAgICAgICAgICAgICAgZHJhZnQudG90YWwgPSBkYXRhLnRvdGFsO1xuICAgICAgICAgICAgICAgIGRyYWZ0LnRvdGFsVG9kYXkgPSBkYXRhLnRvdGFsVG9kYXk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBjYWNoZUVudHJ5UmVtb3ZlZDtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgZ2V0UHJvZmlsZU9yZGVyczogYnVpbGRlci5xdWVyeTxUV1NSZXNwb25zZSwgdm9pZD4oe1xuICAgICAgcXVlcnlGbjogKCkgPT4gKHsgZGF0YTogeyBzdWNjZXNzOiBmYWxzZSwgb3JkZXJzOiBbXSwgdG90YWw6IDAsIHRvdGFsVG9kYXk6IDAgfSB9KSxcbiAgICAgIGFzeW5jIG9uQ2FjaGVFbnRyeUFkZGVkKFxuICAgICAgICBfYXJnLFxuICAgICAgICB7IHVwZGF0ZUNhY2hlZERhdGEsIGNhY2hlRGF0YUxvYWRlZCwgY2FjaGVFbnRyeVJlbW92ZWQgfVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gQ29va2llcy5nZXQoJ2FjY2Vzc1Rva2VuJyk/LnJlcGxhY2UoJ0JlYXJlciAnLCAnJyk7XG4gICAgICAgIGxldCB3cyA9IG5ldyBXZWJTb2NrZXQoXG4gICAgICAgICAgYHdzczovL25ldy1zdGVsbGFyYnVyZ2Vycy5lZHVjYXRpb24tc2VydmljZXMucnUvb3JkZXJzP3Rva2VuPSR7dG9rZW59YFxuICAgICAgICApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2FjaGVEYXRhTG9hZGVkO1xuXG4gICAgICAgICAgY29uc3QgaGFuZGxlTWVzc2FnZSA9IGFzeW5jIChldmVudDogTWVzc2FnZUV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcblxuICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZSA9PT0gJ0ludmFsaWQgb3IgbWlzc2luZyB0b2tlbicpIHtcbiAgICAgICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZnJlc2hUb2tlbicpO1xuICAgICAgICAgICAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9VUkx9L2F1dGgvdG9rZW5gLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0b2tlbjogcmVmcmVzaFRva2VuIH0pLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWZyZXNoRGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICBpZiAocmVmcmVzaERhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICBzZXRUb2tlbnMocmVmcmVzaERhdGEuYWNjZXNzVG9rZW4sIHJlZnJlc2hEYXRhLnJlZnJlc2hUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gcmVmcmVzaERhdGEuYWNjZXNzVG9rZW4ucmVwbGFjZSgnQmVhcmVyICcsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgd3MgPSBuZXcgV2ViU29ja2V0KFxuICAgICAgICAgICAgICAgICAgICAgIGB3c3M6Ly9uZXctc3RlbGxhcmJ1cmdlcnMuZWR1Y2F0aW9uLXNlcnZpY2VzLnJ1L29yZGVycz90b2tlbj0ke25ld1Rva2VufWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgdXBkYXRlQ2FjaGVkRGF0YSgoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgICBkcmFmdC5zdWNjZXNzID0gZGF0YS5zdWNjZXNzO1xuICAgICAgICAgICAgICAgIGRyYWZ0Lm9yZGVycyA9IGRhdGEub3JkZXJzO1xuICAgICAgICAgICAgICAgIGRyYWZ0LnRvdGFsID0gZGF0YS50b3RhbDtcbiAgICAgICAgICAgICAgICBkcmFmdC50b3RhbFRvZGF5ID0gZGF0YS50b3RhbFRvZGF5O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBjYWNoZUVudHJ5UmVtb3ZlZDtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgZ2V0T3JkZXJCeUlkOiBidWlsZGVyLnF1ZXJ5PFRTaW5nbGVPcmRlclJlc3BvbnNlLCBzdHJpbmc+KHtcbiAgICAgIHF1ZXJ5OiAob3JkZXJJZCkgPT4gYC9vcmRlcnMvJHtvcmRlcklkfWAsXG4gICAgfSksXG4gIH0pLFxufSk7XG5cbmV4cG9ydCBjb25zdCB7IHVzZUdldEZlZWRRdWVyeSwgdXNlR2V0UHJvZmlsZU9yZGVyc1F1ZXJ5LCB1c2VHZXRPcmRlckJ5SWRRdWVyeSB9ID1cbiAgb3JkZXJzQXBpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTLFdBQVcsc0JBQXNCO0FBQzFDLE9BQU8sYUFBYTtBQUVwQixPQUFPLGFBQWE7QUFDcEIsU0FBUyxpQkFBaUI7QUFTbkIsYUFBTSxZQUFZLFVBQVU7QUFBQSxFQUNqQyxhQUFhO0FBQUEsRUFDYixXQUFXLGVBQWUsRUFBRSxTQUFTLFFBQVEsQ0FBQztBQUFBLEVBQzlDLFdBQVcsQ0FBQyxhQUFhO0FBQUEsSUFDdkIsU0FBUyxRQUFRLE1BQXlCO0FBQUEsTUFDeEMsU0FBUyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsT0FBTyxRQUFRLENBQUMsR0FBRyxPQUFPLEdBQUcsWUFBWSxFQUFFLEVBQUU7QUFBQSxNQUNoRixNQUFNLGtCQUNKLE1BQ0EsRUFBRSxrQkFBa0IsaUJBQWlCLGtCQUFrQixHQUN2RDtBQUNBLGNBQU0sS0FBSyxJQUFJO0FBQUEsVUFDYjtBQUFBLFFBQ0Y7QUFFQSxZQUFJO0FBQ0YsZ0JBQU07QUFDTixhQUFHLGlCQUFpQixXQUFXLENBQUMsVUFBVTtBQUN4QyxrQkFBTSxPQUFPLEtBQUssTUFBTSxNQUFNLElBQUk7QUFDbEMsZ0JBQUksS0FBSyxTQUFTO0FBQ2hCLCtCQUFpQixDQUFDLFVBQVU7QUFDMUIsc0JBQU0sVUFBVSxLQUFLO0FBQ3JCLHNCQUFNLFNBQVMsS0FBSztBQUNwQixzQkFBTSxRQUFRLEtBQUs7QUFDbkIsc0JBQU0sYUFBYSxLQUFLO0FBQUEsY0FDMUIsQ0FBQztBQUFBLFlBQ0g7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNILFNBQVMsS0FBSztBQUNaLGtCQUFRLE1BQU0sR0FBRztBQUFBLFFBQ25CO0FBRUEsY0FBTTtBQUNOLFdBQUcsTUFBTTtBQUFBLE1BQ1g7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUNELGtCQUFrQixRQUFRLE1BQXlCO0FBQUEsTUFDakQsU0FBUyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsT0FBTyxRQUFRLENBQUMsR0FBRyxPQUFPLEdBQUcsWUFBWSxFQUFFLEVBQUU7QUFBQSxNQUNoRixNQUFNLGtCQUNKLE1BQ0EsRUFBRSxrQkFBa0IsaUJBQWlCLGtCQUFrQixHQUN2RDtBQUNBLGNBQU0sUUFBUSxRQUFRLElBQUksYUFBYSxHQUFHLFFBQVEsV0FBVyxFQUFFO0FBQy9ELFlBQUksS0FBSyxJQUFJO0FBQUEsVUFDWCwrREFBK0QsS0FBSztBQUFBLFFBQ3RFO0FBRUEsWUFBSTtBQUNGLGdCQUFNO0FBRU4sZ0JBQU0sZ0JBQWdCLE9BQU8sVUFBdUM7QUFDbEUsa0JBQU0sT0FBTyxLQUFLLE1BQU0sTUFBTSxJQUFJO0FBRWxDLGdCQUFJLEtBQUssWUFBWSw0QkFBNEI7QUFDL0MsaUJBQUcsTUFBTTtBQUNULG9CQUFNLGVBQWUsYUFBYSxRQUFRLGNBQWM7QUFDeEQsa0JBQUksY0FBYztBQUNoQixvQkFBSTtBQUNGLHdCQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsT0FBTyxlQUFlO0FBQUEsb0JBQy9DLFFBQVE7QUFBQSxvQkFDUixTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLG9CQUM5QyxNQUFNLEtBQUssVUFBVSxFQUFFLE9BQU8sYUFBYSxDQUFDO0FBQUEsa0JBQzlDLENBQUM7QUFDRCx3QkFBTSxjQUFjLE1BQU0sSUFBSSxLQUFLO0FBQ25DLHNCQUFJLFlBQVksU0FBUztBQUN2Qiw4QkFBVSxZQUFZLGFBQWEsWUFBWSxZQUFZO0FBQzNELDBCQUFNLFdBQVcsWUFBWSxZQUFZLFFBQVEsV0FBVyxFQUFFO0FBQzlELHlCQUFLLElBQUk7QUFBQSxzQkFDUCwrREFBK0QsUUFBUTtBQUFBLG9CQUN6RTtBQUNBLHVCQUFHLGlCQUFpQixXQUFXLGFBQWE7QUFBQSxrQkFDOUM7QUFBQSxnQkFDRixTQUFTLEtBQUs7QUFDWiwwQkFBUSxNQUFNLEdBQUc7QUFBQSxnQkFDbkI7QUFBQSxjQUNGO0FBQ0E7QUFBQSxZQUNGO0FBRUEsZ0JBQUksS0FBSyxTQUFTO0FBQ2hCLCtCQUFpQixDQUFDLFVBQVU7QUFDMUIsc0JBQU0sVUFBVSxLQUFLO0FBQ3JCLHNCQUFNLFNBQVMsS0FBSztBQUNwQixzQkFBTSxRQUFRLEtBQUs7QUFDbkIsc0JBQU0sYUFBYSxLQUFLO0FBQUEsY0FDMUIsQ0FBQztBQUFBLFlBQ0g7QUFBQSxVQUNGO0FBRUEsYUFBRyxpQkFBaUIsV0FBVyxhQUFhO0FBQUEsUUFDOUMsU0FBUyxLQUFLO0FBQ1osa0JBQVEsTUFBTSxHQUFHO0FBQUEsUUFDbkI7QUFFQSxjQUFNO0FBQ04sV0FBRyxNQUFNO0FBQUEsTUFDWDtBQUFBLElBQ0YsQ0FBQztBQUFBLElBQ0QsY0FBYyxRQUFRLE1BQW9DO0FBQUEsTUFDeEQsT0FBTyxDQUFDLFlBQVksV0FBVyxPQUFPO0FBQUEsSUFDeEMsQ0FBQztBQUFBLEVBQ0g7QUFDRixDQUFDO0FBRU0sYUFBTSxFQUFFLGlCQUFpQiwwQkFBMEIscUJBQXFCLElBQzdFOyIsIm5hbWVzIjpbXX0= \ No newline at end of file diff --git a/e2e/har/9b741f24b8be06b345533dad402af3d8fc270767.json b/e2e/har/9b741f24b8be06b345533dad402af3d8fc270767.json new file mode 100644 index 0000000..dfb6f29 --- /dev/null +++ b/e2e/har/9b741f24b8be06b345533dad402af3d8fc270767.json @@ -0,0 +1 @@ +{"ingredients":["692889f16bf770001bfeb4cc","692889f16bf770001bfeb4d5","692889f16bf770001bfeb4cc"]} \ No newline at end of file diff --git a/e2e/har/api.har b/e2e/har/api.har new file mode 100644 index 0000000..7ee7c16 --- /dev/null +++ b/e2e/har/api.har @@ -0,0 +1 @@ +{"log":{"version":"1.2","creator":{"name":"Playwright","version":"1.60.0"},"browser":{"name":"chromium","version":"148.0.7778.96"},"entries":[{"startedDateTime":"2026-05-29T19:46:08.369Z","time":3126.206,"request":{"method":"GET","url":"https://new-stellarburgers.education-services.ru/api/auth/user","httpVersion":"HTTP/2.0","cookies":[],"headers":[{"name":":authority","value":"new-stellarburgers.education-services.ru"},{"name":":method","value":"GET"},{"name":":path","value":"/api/auth/user"},{"name":":scheme","value":"https"},{"name":"accept","value":"application/json"},{"name":"accept-encoding","value":"gzip, deflate, br, zstd"},{"name":"accept-language","value":"en-US"},{"name":"authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY5ZGYyZGUzNDFjZmY1MDAxYjZlMWY2ZSIsImlhdCI6MTc4MDA4Mzc0MiwiZXhwIjoxNzgwMDg0OTQyfQ.2QzbqMzTKhV35HQO1XOMC5gvGNx7At_-HujTisZMkv4"},{"name":"origin","value":"http://localhost:5173"},{"name":"priority","value":"u=1, i"},{"name":"referer","value":"http://localhost:5173/"},{"name":"sec-ch-ua","value":"\"Chromium\";v=\"148\", \"HeadlessChrome\";v=\"148\", \"Not/A)Brand\";v=\"99\""},{"name":"sec-ch-ua-mobile","value":"?0"},{"name":"sec-ch-ua-platform","value":"\"Windows\""},{"name":"sec-fetch-dest","value":"empty"},{"name":"sec-fetch-mode","value":"cors"},{"name":"sec-fetch-site","value":"cross-site"},{"name":"user-agent","value":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7778.96 Safari/537.36"}],"queryString":[],"headersSize":-1,"bodySize":-1},"response":{"status":200,"statusText":"","httpVersion":"HTTP/2.0","cookies":[],"headers":[{"name":"access-control-allow-origin","value":"*"},{"name":"content-length","value":"71"},{"name":"content-type","value":"application/json; charset=utf-8"},{"name":"date","value":"Fri, 29 May 2026 19:46:11 GMT"},{"name":"etag","value":"W/\"47-byZ+Sz16KERLlIq1oQXCg75zAoo\""},{"name":"server","value":"nginx"},{"name":"x-powered-by","value":"Express"}],"content":{"size":-1,"mimeType":"application/json; charset=utf-8","_file":"6f267e4b3d7a28444b948ab5a105c283be73028a.json"},"headersSize":-1,"bodySize":-1,"redirectURL":""},"cache":{},"timings":{"send":-1,"wait":-1,"receive":3126.206}},{"startedDateTime":"2026-05-29T19:46:11.637Z","time":71.534,"request":{"method":"GET","url":"https://new-stellarburgers.education-services.ru/api/ingredients","httpVersion":"HTTP/2.0","cookies":[],"headers":[{"name":":authority","value":"new-stellarburgers.education-services.ru"},{"name":":method","value":"GET"},{"name":":path","value":"/api/ingredients"},{"name":":scheme","value":"https"},{"name":"accept","value":"application/json"},{"name":"accept-encoding","value":"gzip, deflate, br, zstd"},{"name":"accept-language","value":"en-US"},{"name":"authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY5ZGYyZGUzNDFjZmY1MDAxYjZlMWY2ZSIsImlhdCI6MTc4MDA4Mzc0MiwiZXhwIjoxNzgwMDg0OTQyfQ.2QzbqMzTKhV35HQO1XOMC5gvGNx7At_-HujTisZMkv4"},{"name":"origin","value":"http://localhost:5173"},{"name":"priority","value":"u=1, i"},{"name":"referer","value":"http://localhost:5173/"},{"name":"sec-ch-ua","value":"\"Chromium\";v=\"148\", \"HeadlessChrome\";v=\"148\", \"Not/A)Brand\";v=\"99\""},{"name":"sec-ch-ua-mobile","value":"?0"},{"name":"sec-ch-ua-platform","value":"\"Windows\""},{"name":"sec-fetch-dest","value":"empty"},{"name":"sec-fetch-mode","value":"cors"},{"name":"sec-fetch-site","value":"cross-site"},{"name":"user-agent","value":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7778.96 Safari/537.36"}],"queryString":[],"headersSize":-1,"bodySize":-1},"response":{"status":200,"statusText":"","httpVersion":"HTTP/2.0","cookies":[],"headers":[{"name":"access-control-allow-origin","value":"*"},{"name":"content-length","value":"5957"},{"name":"content-type","value":"application/json; charset=utf-8"},{"name":"date","value":"Fri, 29 May 2026 19:46:11 GMT"},{"name":"etag","value":"W/\"1745-5nrifxtkq8odwCitEQApl+f9xO4\""},{"name":"server","value":"nginx"},{"name":"x-powered-by","value":"Express"}],"content":{"size":-1,"mimeType":"application/json; charset=utf-8","_file":"e67ae27f1b64abca1dc028ad11002997e7fdc4ee.json"},"headersSize":-1,"bodySize":-1,"redirectURL":""},"cache":{},"timings":{"send":-1,"wait":-1,"receive":71.534}},{"startedDateTime":"2026-05-29T19:46:14.598Z","time":73.485,"request":{"method":"POST","url":"https://new-stellarburgers.education-services.ru/api/orders","httpVersion":"HTTP/2.0","cookies":[],"headers":[{"name":":authority","value":"new-stellarburgers.education-services.ru"},{"name":":method","value":"POST"},{"name":":path","value":"/api/orders"},{"name":":scheme","value":"https"},{"name":"accept","value":"application/json"},{"name":"accept-encoding","value":"gzip, deflate, br, zstd"},{"name":"accept-language","value":"en-US"},{"name":"authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY5ZGYyZGUzNDFjZmY1MDAxYjZlMWY2ZSIsImlhdCI6MTc4MDA4Mzc0MiwiZXhwIjoxNzgwMDg0OTQyfQ.2QzbqMzTKhV35HQO1XOMC5gvGNx7At_-HujTisZMkv4"},{"name":"content-length","value":"98"},{"name":"content-type","value":"application/json"},{"name":"origin","value":"http://localhost:5173"},{"name":"priority","value":"u=1, i"},{"name":"referer","value":"http://localhost:5173/"},{"name":"sec-ch-ua","value":"\"Chromium\";v=\"148\", \"HeadlessChrome\";v=\"148\", \"Not/A)Brand\";v=\"99\""},{"name":"sec-ch-ua-mobile","value":"?0"},{"name":"sec-ch-ua-platform","value":"\"Windows\""},{"name":"sec-fetch-dest","value":"empty"},{"name":"sec-fetch-mode","value":"cors"},{"name":"sec-fetch-site","value":"cross-site"},{"name":"user-agent","value":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.7778.96 Safari/537.36"}],"queryString":[],"headersSize":-1,"bodySize":-1,"postData":{"mimeType":"application/json","text":"","params":[],"_file":"9b741f24b8be06b345533dad402af3d8fc270767.json"}},"response":{"status":200,"statusText":"","httpVersion":"HTTP/2.0","cookies":[],"headers":[{"name":"access-control-allow-origin","value":"*"},{"name":"content-length","value":"1633"},{"name":"content-type","value":"application/json; charset=utf-8"},{"name":"date","value":"Fri, 29 May 2026 19:46:14 GMT"},{"name":"etag","value":"W/\"661-4Ut1/28SW2CIpjq5P/VVVV3AgVk\""},{"name":"server","value":"nginx"},{"name":"x-powered-by","value":"Express"}],"content":{"size":-1,"mimeType":"application/json; charset=utf-8","_file":"e14b75ff6f125b6088a63ab93ff555555dc08159.json"},"headersSize":-1,"bodySize":-1,"redirectURL":""},"cache":{},"timings":{"send":-1,"wait":-1,"receive":73.485}}]}} \ No newline at end of file diff --git a/e2e/har/ccebe289f094212944c18a7ad617604f8e58b8a7.json b/e2e/har/ccebe289f094212944c18a7ad617604f8e58b8a7.json new file mode 100644 index 0000000..9ad0474 --- /dev/null +++ b/e2e/har/ccebe289f094212944c18a7ad617604f8e58b8a7.json @@ -0,0 +1 @@ +{"token":"mock-refresh-token"} \ No newline at end of file diff --git a/e2e/har/e14b75ff6f125b6088a63ab93ff555555dc08159.json b/e2e/har/e14b75ff6f125b6088a63ab93ff555555dc08159.json new file mode 100644 index 0000000..efb0414 --- /dev/null +++ b/e2e/har/e14b75ff6f125b6088a63ab93ff555555dc08159.json @@ -0,0 +1 @@ +{"success":true,"name":"Краторный антарианский бургер","order":{"ingredients":[{"_id":"692889f16bf770001bfeb4cc","name":"Краторная булка N-200i","type":"bun","proteins":80,"fat":24,"carbohydrates":53,"calories":420,"price":1255,"image":"https://code.s3.yandex.net/react/code/bun-02.png","image_mobile":"https://code.s3.yandex.net/react/code/bun-02-mobile.png","image_large":"https://code.s3.yandex.net/react/code/bun-02-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d5","name":"Соус с шипами Антарианского плоскоходца","type":"sauce","proteins":101,"fat":99,"carbohydrates":100,"calories":100,"price":88,"image":"https://code.s3.yandex.net/react/code/sauce-01.png","image_mobile":"https://code.s3.yandex.net/react/code/sauce-01-mobile.png","image_large":"https://code.s3.yandex.net/react/code/sauce-01-large.png","__v":0},{"_id":"692889f16bf770001bfeb4cc","name":"Краторная булка N-200i","type":"bun","proteins":80,"fat":24,"carbohydrates":53,"calories":420,"price":1255,"image":"https://code.s3.yandex.net/react/code/bun-02.png","image_mobile":"https://code.s3.yandex.net/react/code/bun-02-mobile.png","image_large":"https://code.s3.yandex.net/react/code/bun-02-large.png","__v":0}],"_id":"6a19ed0641cff5001b6e336b","owner":{"name":"krivonraf","email":"krivonra@mail.ru","createdAt":"2026-04-15T06:19:15.591Z","updatedAt":"2026-05-22T04:22:03.182Z"},"status":"done","name":"Краторный антарианский бургер","createdAt":"2026-05-29T19:46:14.680Z","updatedAt":"2026-05-29T19:46:14.713Z","number":1143,"price":2598}} \ No newline at end of file diff --git a/e2e/har/e67ae27f1b64abca1dc028ad11002997e7fdc4ee.json b/e2e/har/e67ae27f1b64abca1dc028ad11002997e7fdc4ee.json new file mode 100644 index 0000000..df372db --- /dev/null +++ b/e2e/har/e67ae27f1b64abca1dc028ad11002997e7fdc4ee.json @@ -0,0 +1 @@ +{"success":true,"data":[{"_id":"692889f16bf770001bfeb4cc","name":"Краторная булка N-200i","type":"bun","proteins":80,"fat":24,"carbohydrates":53,"calories":420,"price":1255,"image":"https://code.s3.yandex.net/react/code/bun-02.png","image_mobile":"https://code.s3.yandex.net/react/code/bun-02-mobile.png","image_large":"https://code.s3.yandex.net/react/code/bun-02-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d6","name":"Хрустящие минеральные кольца","type":"main","proteins":808,"fat":689,"carbohydrates":609,"calories":986,"price":300,"image":"https://code.s3.yandex.net/react/code/mineral_rings.png","image_mobile":"https://code.s3.yandex.net/react/code/mineral_rings-mobile.png","image_large":"https://code.s3.yandex.net/react/code/mineral_rings-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d7","name":"Плоды Фалленианского дерева","type":"main","proteins":20,"fat":5,"carbohydrates":55,"calories":77,"price":874,"image":"https://code.s3.yandex.net/react/code/sp_1.png","image_mobile":"https://code.s3.yandex.net/react/code/sp_1-mobile.png","image_large":"https://code.s3.yandex.net/react/code/sp_1-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d8","name":"Кристаллы марсианских альфа-сахаридов","type":"main","proteins":234,"fat":432,"carbohydrates":111,"calories":189,"price":762,"image":"https://code.s3.yandex.net/react/code/core.png","image_mobile":"https://code.s3.yandex.net/react/code/core-mobile.png","image_large":"https://code.s3.yandex.net/react/code/core-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d9","name":"Мини-салат Экзо-Плантаго","type":"main","proteins":1,"fat":2,"carbohydrates":3,"calories":6,"price":4400,"image":"https://code.s3.yandex.net/react/code/salad.png","image_mobile":"https://code.s3.yandex.net/react/code/salad-mobile.png","image_large":"https://code.s3.yandex.net/react/code/salad-large.png","__v":0},{"_id":"692889f16bf770001bfeb4da","name":"Сыр с астероидной плесенью","type":"main","proteins":84,"fat":48,"carbohydrates":420,"calories":3377,"price":4142,"image":"https://code.s3.yandex.net/react/code/cheese.png","image_mobile":"https://code.s3.yandex.net/react/code/cheese-mobile.png","image_large":"https://code.s3.yandex.net/react/code/cheese-large.png","__v":0},{"_id":"692889f16bf770001bfeb4cd","name":"Флюоресцентная булка R2-D3","type":"bun","proteins":44,"fat":26,"carbohydrates":85,"calories":643,"price":988,"image":"https://code.s3.yandex.net/react/code/bun-01.png","image_mobile":"https://code.s3.yandex.net/react/code/bun-01-mobile.png","image_large":"https://code.s3.yandex.net/react/code/bun-01-large.png","__v":0},{"_id":"692889f16bf770001bfeb4ce","name":"Филе Люминесцентного тетраодонтимформа","type":"main","proteins":44,"fat":26,"carbohydrates":85,"calories":643,"price":988,"image":"https://code.s3.yandex.net/react/code/meat-03.png","image_mobile":"https://code.s3.yandex.net/react/code/meat-03-mobile.png","image_large":"https://code.s3.yandex.net/react/code/meat-03-large.png","__v":0},{"_id":"692889f16bf770001bfeb4cf","name":"Мясо бессмертных моллюсков Protostomia","type":"main","proteins":433,"fat":244,"carbohydrates":33,"calories":420,"price":1337,"image":"https://code.s3.yandex.net/react/code/meat-02.png","image_mobile":"https://code.s3.yandex.net/react/code/meat-02-mobile.png","image_large":"https://code.s3.yandex.net/react/code/meat-02-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d0","name":"Говяжий метеорит (отбивная)","type":"main","proteins":800,"fat":800,"carbohydrates":300,"calories":2674,"price":3000,"image":"https://code.s3.yandex.net/react/code/meat-04.png","image_mobile":"https://code.s3.yandex.net/react/code/meat-04-mobile.png","image_large":"https://code.s3.yandex.net/react/code/meat-04-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d1","name":"Биокотлета из марсианской Магнолии","type":"main","proteins":420,"fat":142,"carbohydrates":242,"calories":4242,"price":424,"image":"https://code.s3.yandex.net/react/code/meat-01.png","image_mobile":"https://code.s3.yandex.net/react/code/meat-01-mobile.png","image_large":"https://code.s3.yandex.net/react/code/meat-01-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d2","name":"Соус Spicy-X","type":"sauce","proteins":30,"fat":20,"carbohydrates":40,"calories":30,"price":90,"image":"https://code.s3.yandex.net/react/code/sauce-02.png","image_mobile":"https://code.s3.yandex.net/react/code/sauce-02-mobile.png","image_large":"https://code.s3.yandex.net/react/code/sauce-02-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d3","name":"Соус фирменный Space Sauce","type":"sauce","proteins":50,"fat":22,"carbohydrates":11,"calories":14,"price":80,"image":"https://code.s3.yandex.net/react/code/sauce-04.png","image_mobile":"https://code.s3.yandex.net/react/code/sauce-04-mobile.png","image_large":"https://code.s3.yandex.net/react/code/sauce-04-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d4","name":"Соус традиционный галактический","type":"sauce","proteins":42,"fat":24,"carbohydrates":42,"calories":99,"price":15,"image":"https://code.s3.yandex.net/react/code/sauce-03.png","image_mobile":"https://code.s3.yandex.net/react/code/sauce-03-mobile.png","image_large":"https://code.s3.yandex.net/react/code/sauce-03-large.png","__v":0},{"_id":"692889f16bf770001bfeb4d5","name":"Соус с шипами Антарианского плоскоходца","type":"sauce","proteins":101,"fat":99,"carbohydrates":100,"calories":100,"price":88,"image":"https://code.s3.yandex.net/react/code/sauce-01.png","image_mobile":"https://code.s3.yandex.net/react/code/sauce-01-mobile.png","image_large":"https://code.s3.yandex.net/react/code/sauce-01-large.png","__v":0}]} \ No newline at end of file diff --git a/e2e/har/f2a8d7aae5af49dccb0893b92f03b9ce952d3245.dat b/e2e/har/f2a8d7aae5af49dccb0893b92f03b9ce952d3245.dat new file mode 100644 index 0000000..3a66504 --- /dev/null +++ b/e2e/har/f2a8d7aae5af49dccb0893b92f03b9ce952d3245.dat @@ -0,0 +1,125 @@ +import { + createApi, + fetchBaseQuery +} from "/node_modules/.vite/deps/@reduxjs_toolkit_query_react.js?v=59810ea1"; +import Cookies from "/node_modules/.vite/deps/js-cookie.js?v=dd4b359e"; +import API_URL from "/src/utils/constants.ts"; +import { setTokens, dropTokens } from "/src/utils/token.ts"; +const baseQuery = fetchBaseQuery({ + baseUrl: API_URL, + prepareHeaders: (headers) => { + const token = Cookies.get("accessToken"); + if (token) { + headers.set("authorization", token); + } + return headers; + } +}); +const baseQueryWithRefresh = async (args, api, extraOptions) => { + let result = await baseQuery(args, api, extraOptions); + if (result.error && (result.error.status === 401 || result.error.status === 403)) { + const refreshResult = await baseQuery( + { + url: "auth/token", + method: "POST", + body: { token: localStorage.getItem("refreshToken") } + }, + api, + extraOptions + ); + if (refreshResult.data) { + const data = refreshResult.data; + setTokens(data.accessToken, data.refreshToken); + result = await baseQuery(args, api, extraOptions); + } else { + dropTokens(); + } + } + return result; +}; +export const authApi = createApi({ + reducerPath: "authApi", + baseQuery: baseQueryWithRefresh, + endpoints: (builder) => ({ + getUser: builder.query({ + query: () => "auth/user" + }), + updateUser: builder.mutation({ + query: (data) => ({ + url: "auth/user", + method: "PATCH", + body: data + }) + }), + register: builder.mutation({ + query: (data) => ({ + url: "auth/register", + method: "POST", + body: data + }), + async onQueryStarted(_arg, { queryFulfilled }) { + try { + const { data } = await queryFulfilled; + setTokens(data.accessToken, data.refreshToken); + } catch (err) { + console.error("api error:", err); + } + } + }), + login: builder.mutation({ + query: (data) => ({ + url: "auth/login", + method: "POST", + body: data + }), + async onQueryStarted(_arg, { queryFulfilled }) { + try { + const { data } = await queryFulfilled; + setTokens(data.accessToken, data.refreshToken); + } catch (err) { + console.error("api error:", err); + } + } + }), + logout: builder.mutation({ + query: () => ({ + url: "auth/logout", + method: "POST", + body: { token: localStorage.getItem("refreshToken") } + }), + async onQueryStarted(_arg, { queryFulfilled }) { + try { + await queryFulfilled; + dropTokens(); + } catch (err) { + console.error("api error:", err); + } + } + }), + forgotPassword: builder.mutation({ + query: (email) => ({ + url: "password-reset", + method: "POST", + body: { email } + }) + }), + resetPassword: builder.mutation({ + query: (data) => ({ + url: "password-reset/reset", + method: "POST", + body: data + }) + }) + }) +}); +export const { + useGetUserQuery, + useRegisterMutation, + useLoginMutation, + useUpdateUserMutation, + useLogoutMutation, + useForgotPasswordMutation, + useResetPasswordMutation +} = authApi; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImF1dGhBcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY3JlYXRlQXBpLFxuICBmZXRjaEJhc2VRdWVyeSxcbiAgdHlwZSBCYXNlUXVlcnlGbixcbiAgdHlwZSBGZXRjaEFyZ3MsXG4gIHR5cGUgRmV0Y2hCYXNlUXVlcnlFcnJvcixcbn0gZnJvbSAnQHJlZHV4anMvdG9vbGtpdC9xdWVyeS9yZWFjdCc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuXG5pbXBvcnQgQVBJX1VSTCBmcm9tICdAL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBzZXRUb2tlbnMsIGRyb3BUb2tlbnMgfSBmcm9tICdAL3V0aWxzL3Rva2VuJztcblxuaW1wb3J0IHR5cGUgeyBUVXNlciB9IGZyb20gJ0AvdXRpbHMvYmFzZVR5cGVzJztcblxuLy8gLS0tINCY0J3QotCV0KDQpNCV0JnQodCrINCe0KLQktCV0KLQntCSINCh0JXQoNCS0JXQoNCQXG50eXBlIFRBdXRoUmVzcG9uc2UgPSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIHVzZXI6IFRVc2VyO1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbn07XG5cbnR5cGUgVFVzZXJSZXNwb25zZSA9IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgdXNlcjogVFVzZXI7XG59O1xuXG50eXBlIFRNZXNzYWdlUmVzcG9uc2UgPSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbn07XG5cbi8vIC0t0JHQkNCX0J7QktCr0Jkg0JfQkNCf0KDQntChIC0tLVxuY29uc3QgYmFzZVF1ZXJ5ID0gZmV0Y2hCYXNlUXVlcnkoe1xuICBiYXNlVXJsOiBBUElfVVJMLFxuICBwcmVwYXJlSGVhZGVyczogKGhlYWRlcnMpID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IENvb2tpZXMuZ2V0KCdhY2Nlc3NUb2tlbicpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgaGVhZGVycy5zZXQoJ2F1dGhvcml6YXRpb24nLCB0b2tlbik7XG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzO1xuICB9LFxufSk7XG5cbi8vIC0tLSDQotCY0J/QmNCX0JDQptCY0K8g0J7QkdCV0KDQotCa0JggUkVGUkVTSC0tLVxuY29uc3QgYmFzZVF1ZXJ5V2l0aFJlZnJlc2g6IEJhc2VRdWVyeUZuPFxuICBzdHJpbmcgfCBGZXRjaEFyZ3MsXG4gIHVua25vd24sXG4gIEZldGNoQmFzZVF1ZXJ5RXJyb3Jcbj4gPSBhc3luYyAoYXJncywgYXBpLCBleHRyYU9wdGlvbnMpID0+IHtcbiAgbGV0IHJlc3VsdCA9IGF3YWl0IGJhc2VRdWVyeShhcmdzLCBhcGksIGV4dHJhT3B0aW9ucyk7XG5cbiAgaWYgKHJlc3VsdC5lcnJvciAmJiAocmVzdWx0LmVycm9yLnN0YXR1cyA9PT0gNDAxIHx8IHJlc3VsdC5lcnJvci5zdGF0dXMgPT09IDQwMykpIHtcbiAgICBjb25zdCByZWZyZXNoUmVzdWx0ID0gYXdhaXQgYmFzZVF1ZXJ5KFxuICAgICAge1xuICAgICAgICB1cmw6ICdhdXRoL3Rva2VuJyxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IHsgdG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZWZyZXNoVG9rZW4nKSB9LFxuICAgICAgfSxcbiAgICAgIGFwaSxcbiAgICAgIGV4dHJhT3B0aW9uc1xuICAgICk7XG5cbiAgICBpZiAocmVmcmVzaFJlc3VsdC5kYXRhKSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVmcmVzaFJlc3VsdC5kYXRhIGFzIFRBdXRoUmVzcG9uc2U7XG4gICAgICBzZXRUb2tlbnMoZGF0YS5hY2Nlc3NUb2tlbiwgZGF0YS5yZWZyZXNoVG9rZW4pO1xuICAgICAgcmVzdWx0ID0gYXdhaXQgYmFzZVF1ZXJ5KGFyZ3MsIGFwaSwgZXh0cmFPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZHJvcFRva2VucygpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAtLS3QntCf0JjQodCQ0J3QmNCVIEFQSS0tLVxuZXhwb3J0IGNvbnN0IGF1dGhBcGkgPSBjcmVhdGVBcGkoe1xuICByZWR1Y2VyUGF0aDogJ2F1dGhBcGknLFxuICBiYXNlUXVlcnk6IGJhc2VRdWVyeVdpdGhSZWZyZXNoLFxuICBlbmRwb2ludHM6IChidWlsZGVyKSA9PiAoe1xuICAgIGdldFVzZXI6IGJ1aWxkZXIucXVlcnk8VFVzZXJSZXNwb25zZSwgdm9pZD4oe1xuICAgICAgcXVlcnk6ICgpID0+ICdhdXRoL3VzZXInLFxuICAgIH0pLFxuXG4gICAgdXBkYXRlVXNlcjogYnVpbGRlci5tdXRhdGlvbjxUVXNlclJlc3BvbnNlLCBQYXJ0aWFsPFRVc2VyPiAmIHsgcGFzc3dvcmQ/OiBzdHJpbmcgfT4oe1xuICAgICAgcXVlcnk6IChkYXRhKSA9PiAoe1xuICAgICAgICB1cmw6ICdhdXRoL3VzZXInLFxuICAgICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICAgIGJvZHk6IGRhdGEsXG4gICAgICB9KSxcbiAgICB9KSxcblxuICAgIHJlZ2lzdGVyOiBidWlsZGVyLm11dGF0aW9uPFRBdXRoUmVzcG9uc2UsIFRVc2VyICYgeyBwYXNzd29yZDogc3RyaW5nIH0+KHtcbiAgICAgIHF1ZXJ5OiAoZGF0YSkgPT4gKHtcbiAgICAgICAgdXJsOiAnYXV0aC9yZWdpc3RlcicsXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgfSksXG4gICAgICBhc3luYyBvblF1ZXJ5U3RhcnRlZChfYXJnLCB7IHF1ZXJ5RnVsZmlsbGVkIH0pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHF1ZXJ5RnVsZmlsbGVkO1xuICAgICAgICAgIHNldFRva2VucyhkYXRhLmFjY2Vzc1Rva2VuLCBkYXRhLnJlZnJlc2hUb2tlbik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2FwaSBlcnJvcjonLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pLFxuXG4gICAgbG9naW46IGJ1aWxkZXIubXV0YXRpb248VEF1dGhSZXNwb25zZSwgT21pdDxUVXNlciwgJ25hbWUnPiAmIHsgcGFzc3dvcmQ6IHN0cmluZyB9Pih7XG4gICAgICBxdWVyeTogKGRhdGEpID0+ICh7XG4gICAgICAgIHVybDogJ2F1dGgvbG9naW4nLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZGF0YSxcbiAgICAgIH0pLFxuICAgICAgYXN5bmMgb25RdWVyeVN0YXJ0ZWQoX2FyZywgeyBxdWVyeUZ1bGZpbGxlZCB9KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBxdWVyeUZ1bGZpbGxlZDtcbiAgICAgICAgICBzZXRUb2tlbnMoZGF0YS5hY2Nlc3NUb2tlbiwgZGF0YS5yZWZyZXNoVG9rZW4pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdhcGkgZXJyb3I6JywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KSxcblxuICAgIGxvZ291dDogYnVpbGRlci5tdXRhdGlvbjxUTWVzc2FnZVJlc3BvbnNlLCB2b2lkPih7XG4gICAgICBxdWVyeTogKCkgPT4gKHtcbiAgICAgICAgdXJsOiAnYXV0aC9sb2dvdXQnLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogeyB0b2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZnJlc2hUb2tlbicpIH0sXG4gICAgICB9KSxcbiAgICAgIGFzeW5jIG9uUXVlcnlTdGFydGVkKF9hcmcsIHsgcXVlcnlGdWxmaWxsZWQgfSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHF1ZXJ5RnVsZmlsbGVkO1xuICAgICAgICAgIGRyb3BUb2tlbnMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignYXBpIGVycm9yOicsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSksXG5cbiAgICBmb3Jnb3RQYXNzd29yZDogYnVpbGRlci5tdXRhdGlvbjxUTWVzc2FnZVJlc3BvbnNlLCBzdHJpbmc+KHtcbiAgICAgIHF1ZXJ5OiAoZW1haWwpID0+ICh7XG4gICAgICAgIHVybDogJ3Bhc3N3b3JkLXJlc2V0JyxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IHsgZW1haWwgfSxcbiAgICAgIH0pLFxuICAgIH0pLFxuXG4gICAgcmVzZXRQYXNzd29yZDogYnVpbGRlci5tdXRhdGlvbjxcbiAgICAgIFRNZXNzYWdlUmVzcG9uc2UsXG4gICAgICBSZWNvcmQ8J3Bhc3N3b3JkJyB8ICd0b2tlbicsIHN0cmluZz5cbiAgICA+KHtcbiAgICAgIHF1ZXJ5OiAoZGF0YSkgPT4gKHtcbiAgICAgICAgdXJsOiAncGFzc3dvcmQtcmVzZXQvcmVzZXQnLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZGF0YSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICB9KSxcbn0pO1xuXG5leHBvcnQgY29uc3Qge1xuICB1c2VHZXRVc2VyUXVlcnksXG4gIHVzZVJlZ2lzdGVyTXV0YXRpb24sXG4gIHVzZUxvZ2luTXV0YXRpb24sXG4gIHVzZVVwZGF0ZVVzZXJNdXRhdGlvbixcbiAgdXNlTG9nb3V0TXV0YXRpb24sXG4gIHVzZUZvcmdvdFBhc3N3b3JkTXV0YXRpb24sXG4gIHVzZVJlc2V0UGFzc3dvcmRNdXRhdGlvbixcbn0gPSBhdXRoQXBpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FJSztBQUNQLE9BQU8sYUFBYTtBQUVwQixPQUFPLGFBQWE7QUFDcEIsU0FBUyxXQUFXLGtCQUFrQjtBQXVCdEMsTUFBTSxZQUFZLGVBQWU7QUFBQSxFQUMvQixTQUFTO0FBQUEsRUFDVCxnQkFBZ0IsQ0FBQyxZQUFZO0FBQzNCLFVBQU0sUUFBUSxRQUFRLElBQUksYUFBYTtBQUN2QyxRQUFJLE9BQU87QUFDVCxjQUFRLElBQUksaUJBQWlCLEtBQUs7QUFBQSxJQUNwQztBQUNBLFdBQU87QUFBQSxFQUNUO0FBQ0YsQ0FBQztBQUdELE1BQU0sdUJBSUYsT0FBTyxNQUFNLEtBQUssaUJBQWlCO0FBQ3JDLE1BQUksU0FBUyxNQUFNLFVBQVUsTUFBTSxLQUFLLFlBQVk7QUFFcEQsTUFBSSxPQUFPLFVBQVUsT0FBTyxNQUFNLFdBQVcsT0FBTyxPQUFPLE1BQU0sV0FBVyxNQUFNO0FBQ2hGLFVBQU0sZ0JBQWdCLE1BQU07QUFBQSxNQUMxQjtBQUFBLFFBQ0UsS0FBSztBQUFBLFFBQ0wsUUFBUTtBQUFBLFFBQ1IsTUFBTSxFQUFFLE9BQU8sYUFBYSxRQUFRLGNBQWMsRUFBRTtBQUFBLE1BQ3REO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsUUFBSSxjQUFjLE1BQU07QUFDdEIsWUFBTSxPQUFPLGNBQWM7QUFDM0IsZ0JBQVUsS0FBSyxhQUFhLEtBQUssWUFBWTtBQUM3QyxlQUFTLE1BQU0sVUFBVSxNQUFNLEtBQUssWUFBWTtBQUFBLElBQ2xELE9BQU87QUFDTCxpQkFBVztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBR08sYUFBTSxVQUFVLFVBQVU7QUFBQSxFQUMvQixhQUFhO0FBQUEsRUFDYixXQUFXO0FBQUEsRUFDWCxXQUFXLENBQUMsYUFBYTtBQUFBLElBQ3ZCLFNBQVMsUUFBUSxNQUEyQjtBQUFBLE1BQzFDLE9BQU8sTUFBTTtBQUFBLElBQ2YsQ0FBQztBQUFBLElBRUQsWUFBWSxRQUFRLFNBQWdFO0FBQUEsTUFDbEYsT0FBTyxDQUFDLFVBQVU7QUFBQSxRQUNoQixLQUFLO0FBQUEsUUFDTCxRQUFRO0FBQUEsUUFDUixNQUFNO0FBQUEsTUFDUjtBQUFBLElBQ0YsQ0FBQztBQUFBLElBRUQsVUFBVSxRQUFRLFNBQXNEO0FBQUEsTUFDdEUsT0FBTyxDQUFDLFVBQVU7QUFBQSxRQUNoQixLQUFLO0FBQUEsUUFDTCxRQUFRO0FBQUEsUUFDUixNQUFNO0FBQUEsTUFDUjtBQUFBLE1BQ0EsTUFBTSxlQUFlLE1BQU0sRUFBRSxlQUFlLEdBQUc7QUFDN0MsWUFBSTtBQUNGLGdCQUFNLEVBQUUsS0FBSyxJQUFJLE1BQU07QUFDdkIsb0JBQVUsS0FBSyxhQUFhLEtBQUssWUFBWTtBQUFBLFFBQy9DLFNBQVMsS0FBSztBQUNaLGtCQUFRLE1BQU0sY0FBYyxHQUFHO0FBQUEsUUFDakM7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBQUEsSUFFRCxPQUFPLFFBQVEsU0FBb0U7QUFBQSxNQUNqRixPQUFPLENBQUMsVUFBVTtBQUFBLFFBQ2hCLEtBQUs7QUFBQSxRQUNMLFFBQVE7QUFBQSxRQUNSLE1BQU07QUFBQSxNQUNSO0FBQUEsTUFDQSxNQUFNLGVBQWUsTUFBTSxFQUFFLGVBQWUsR0FBRztBQUM3QyxZQUFJO0FBQ0YsZ0JBQU0sRUFBRSxLQUFLLElBQUksTUFBTTtBQUN2QixvQkFBVSxLQUFLLGFBQWEsS0FBSyxZQUFZO0FBQUEsUUFDL0MsU0FBUyxLQUFLO0FBQ1osa0JBQVEsTUFBTSxjQUFjLEdBQUc7QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELFFBQVEsUUFBUSxTQUFpQztBQUFBLE1BQy9DLE9BQU8sT0FBTztBQUFBLFFBQ1osS0FBSztBQUFBLFFBQ0wsUUFBUTtBQUFBLFFBQ1IsTUFBTSxFQUFFLE9BQU8sYUFBYSxRQUFRLGNBQWMsRUFBRTtBQUFBLE1BQ3REO0FBQUEsTUFDQSxNQUFNLGVBQWUsTUFBTSxFQUFFLGVBQWUsR0FBRztBQUM3QyxZQUFJO0FBQ0YsZ0JBQU07QUFDTixxQkFBVztBQUFBLFFBQ2IsU0FBUyxLQUFLO0FBQ1osa0JBQVEsTUFBTSxjQUFjLEdBQUc7QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELGdCQUFnQixRQUFRLFNBQW1DO0FBQUEsTUFDekQsT0FBTyxDQUFDLFdBQVc7QUFBQSxRQUNqQixLQUFLO0FBQUEsUUFDTCxRQUFRO0FBQUEsUUFDUixNQUFNLEVBQUUsTUFBTTtBQUFBLE1BQ2hCO0FBQUEsSUFDRixDQUFDO0FBQUEsSUFFRCxlQUFlLFFBQVEsU0FHckI7QUFBQSxNQUNBLE9BQU8sQ0FBQyxVQUFVO0FBQUEsUUFDaEIsS0FBSztBQUFBLFFBQ0wsUUFBUTtBQUFBLFFBQ1IsTUFBTTtBQUFBLE1BQ1I7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0YsQ0FBQztBQUVNLGFBQU07QUFBQSxFQUNYO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsSUFBSTsiLCJuYW1lcyI6W119 \ No newline at end of file diff --git a/e2e/har/f6776441826967cb34b0c37bf7436e87430babf5.json b/e2e/har/f6776441826967cb34b0c37bf7436e87430babf5.json new file mode 100644 index 0000000..7bdb0d9 --- /dev/null +++ b/e2e/har/f6776441826967cb34b0c37bf7436e87430babf5.json @@ -0,0 +1 @@ +{"success":false,"message":"You should be authorised"} \ No newline at end of file diff --git a/index.html b/index.html index b921cda..e65b153 100644 --- a/index.html +++ b/index.html @@ -9,6 +9,6 @@
- + diff --git a/package-lock.json b/package-lock.json index 031516b..4e6cac6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,12 +26,13 @@ }, "devDependencies": { "@eslint/js": "^9.36.0", - "@playwright/test": "^1.57.0", - "@testing-library/jest-dom": "^6.9.0", - "@testing-library/react": "^16.3.0", + "@playwright/test": "^1.60.0", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", "@types/js-cookie": "^3.0.6", - "@types/node": "^25.0.9", + "@types/node": "^25.9.1", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.3", @@ -54,7 +55,7 @@ "gh-pages": "^6.3.0", "globals": "^16.4.0", "husky": "^9.1.7", - "jsdom": "^27.0.0", + "jsdom": "^27.4.0", "lint-staged": "^16.2.3", "prettier": "^3.6.2", "stylelint": "^16.24.0", @@ -1996,13 +1997,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", - "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz", + "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.59.1" + "playwright": "1.60.0" }, "bin": { "playwright": "cli.js" @@ -2731,13 +2732,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", - "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", "devOptional": true, "license": "MIT", "dependencies": { - "undici-types": "~7.19.0" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/@types/react": { @@ -9371,13 +9372,13 @@ } }, "node_modules/playwright": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz", + "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.59.1" + "playwright-core": "1.60.0" }, "bin": { "playwright": "cli.js" @@ -9390,9 +9391,9 @@ } }, "node_modules/playwright-core": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -12111,9 +12112,9 @@ } }, "node_modules/undici-types": { - "version": "7.19.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", - "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "devOptional": true, "license": "MIT" }, diff --git a/package.json b/package.json index a05e892..e1ed3bb 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "preview": "vite preview", "stylelint": "stylelint \"./src/**/*.css\" --fix", "test": "vitest", - "test:ui": "vitest --ui" + "test:ui": "vitest --ui", + "coverage": "vitest --coverage" }, "dependencies": { "@babel/runtime": "^7.28.4", @@ -41,12 +42,13 @@ }, "devDependencies": { "@eslint/js": "^9.36.0", - "@playwright/test": "^1.57.0", - "@testing-library/jest-dom": "^6.9.0", - "@testing-library/react": "^16.3.0", + "@playwright/test": "^1.60.0", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", "@types/js-cookie": "^3.0.6", - "@types/node": "^25.0.9", + "@types/node": "^25.9.1", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.3", @@ -69,7 +71,7 @@ "gh-pages": "^6.3.0", "globals": "^16.4.0", "husky": "^9.1.7", - "jsdom": "^27.0.0", + "jsdom": "^27.4.0", "lint-staged": "^16.2.3", "prettier": "^3.6.2", "stylelint": "^16.24.0", diff --git a/playwright.config.ts b/playwright.config.ts index dfe72ab..5a0a0bb 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,79 +1,22 @@ -import { defineConfig, devices } from '@playwright/test'; +declare const process: any; -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// import dotenv from 'dotenv'; -// import path from 'path'; -// dotenv.config({ path: path.resolve(__dirname, '.env') }); +import { defineConfig, devices } from '@playwright/test'; -/** - * See https://playwright.dev/docs/test-configuration. - */ export default defineConfig({ testDir: './e2e', - /* Run tests in files in parallel */ fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, - /* Retry on CI only */ retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { - /* Base URL to use in actions like `await page.goto('')`. */ - // baseURL: 'http://localhost:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + baseURL: 'http://localhost:5173', trace: 'on-first-retry', }, - - /* Configure projects for major browsers */ projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'] }, }, - - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - { - name: 'webkit', - use: { ...devices['Desktop Safari'] }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, - // }, ], - - /* Run your local dev server before starting the tests */ - // webServer: { - // command: 'npm run start', - // url: 'http://localhost:3000', - // reuseExistingServer: !process.env.CI, - // }, }); diff --git a/src/components/modal/modal.tsx b/src/components/modal/modal.tsx index 2e22067..f4554b5 100644 --- a/src/components/modal/modal.tsx +++ b/src/components/modal/modal.tsx @@ -14,14 +14,13 @@ type TModalProps = { onClose: () => void; }; -const modalRoot: HTMLElement | null = document.getElementById('modals'); - export const Modal = ({ children, title, onClose, }: TModalProps): ReactElement | null => { const [isOpened, setIsOpened] = useState(false); + const modalRoot = document.getElementById('modals'); useEffect((): (() => void) => { const timeoutId: ReturnType = setTimeout( diff --git a/src/services/constructor/constructorSlice.test.ts b/src/services/constructor/constructorSlice.test.ts new file mode 100644 index 0000000..4c4b8c9 --- /dev/null +++ b/src/services/constructor/constructorSlice.test.ts @@ -0,0 +1,107 @@ +// ТЕСТЫ СЛАЙСА КОНСТРУКТОРА +import { describe, it, expect } from 'vitest'; + +import constructorReducer, { + addBun, + addFilling, + removeFilling, + moveFilling, + clearConstructor, +} from './constructorSlice'; + +import type { TIngredient } from '@/utils/baseTypes'; + +describe('burgerConstructor reducer', () => { + const initialState = { + bun: null, + filling: [], + }; + + const mockBun: TIngredient = { + _id: '1', + name: 'Краторная булка N-200i', + type: 'bun', + proteins: 80, + fat: 24, + carbohydrates: 53, + calories: 420, + price: 1255, + image: 'https://resources.burgers/bun.png', + image_mobile: 'https://resources.burgers/bun-mobile.png', + image_large: 'https://resources.burgers/bun-large.png', + }; + const mockFilling1: TIngredient = { + _id: '2', + name: 'Соус с шипами Антарианского плоскоходца', + type: 'sauce', + proteins: 101, + fat: 99, + carbohydrates: 22, + calories: 14, + price: 88, + image: 'https://resources.burgers/sauce.png', + image_mobile: 'https://resources.burgers/sauce-mobile.png', + image_large: 'https://resources.burgers/sauce-large.png', + uniqueId: 'test-nano-id-123', + }; + const mockFilling2: TIngredient = { + _id: '3', + name: 'Филе сочного Аватар-кока', + type: 'main', + proteins: 320, + fat: 110, + carbohydrates: 5, + calories: 220, + price: 1500, + image: 'https://resources.burgers/meat.png', + image_mobile: 'https://resources.burgers/meat-mobile.png', + image_large: 'https://resources.burgers/meat-large.png', + uniqueId: 'test-nano-id-456', + }; + + // стейт по умолчанию + it('должен вернуть стейт по умолчанию при инициализации, если пусто', (): void => { + const result = constructorReducer(undefined, { type: 'UNKNOWN_ACTION' }); + expect(result).toEqual(initialState); + }); + + it('должен добавлять булку в стейт при вызове addBun', (): void => { + const result = constructorReducer(initialState, addBun(mockBun)); + expect(result.bun).toEqual(mockBun); + }); + + it('должен добавлять начинку в массив при вызове addFilling', (): void => { + const result = constructorReducer(initialState, addFilling(mockFilling1)); + expect(result.filling).toEqual([mockFilling1]); + }); + + it('должен удалять начинку из массива по индексу при вызове removeFilling', (): void => { + const stateWithFilling = { + bun: null, + filling: [mockFilling1], + }; + const result = constructorReducer(stateWithFilling, removeFilling(0)); + expect(result.filling).toEqual([]); + }); + + it('менять начинку местами при вызове moveFilling', (): void => { + const stateWithMultipleFillings = { + bun: null, + filling: [mockFilling1, mockFilling2], + }; + const result = constructorReducer( + stateWithMultipleFillings, + moveFilling({ fromId: 0, toId: 1 }) + ); + expect(result.filling).toEqual([mockFilling2, mockFilling1]); + }); + + it('должен очищать весь конструктор при вызове clearConstructor', (): void => { + const dirtyState = { + bun: mockBun, + filling: [mockFilling1, mockFilling2], + }; + const result = constructorReducer(dirtyState, clearConstructor()); + expect(result).toEqual(initialState); + }); +}); diff --git a/src/services/ingredient/ingredientSlice.test.ts b/src/services/ingredient/ingredientSlice.test.ts new file mode 100644 index 0000000..d5dccdd --- /dev/null +++ b/src/services/ingredient/ingredientSlice.test.ts @@ -0,0 +1,48 @@ +// ТЕСТЫ СЛАЙСА ДЕТАЛЕЙ ИНГРЕДИЕНТА +import { describe, it, expect } from 'vitest'; + +import ingredientReducer, { + setIngredientDetails, + clearIngredientDetails, +} from './ingredientSlice'; + +import type { TIngredient } from '@/utils/baseTypes'; + +describe('ingredientSlice reducer', () => { + // Начальное состояние стейта + const initialState = { + currentIngredient: null, + }; + + const mockIngredient: TIngredient = { + _id: '1', + name: 'Краторная булка N-200i', + type: 'bun', + proteins: 80, + fat: 24, + carbohydrates: 53, + calories: 420, + price: 1255, + image: 'https://resources.burgers/bun.png', + image_mobile: 'https://resources.burgers/bun-mobile.png', + image_large: 'https://resources.burgers/bun-large.png', + }; + + it('должен вернуть стейт по умолчанию при инициализации, если пришел пустой экшен', (): void => { + const result = ingredientReducer(undefined, { type: 'UNKNOWN_ACTION' }); + expect(result).toEqual(initialState); + }); + + it('должен сохранять детали ингредиента в стейт при вызове setIngredientDetails', (): void => { + const result = ingredientReducer(initialState, setIngredientDetails(mockIngredient)); + expect(result.currentIngredient).toEqual(mockIngredient); + }); + + it('должен очищать детали ингредиента (сбрасывать в null) при вызове clearIngredientDetails', (): void => { + const dirtyState = { + currentIngredient: mockIngredient, + }; + const result = ingredientReducer(dirtyState, clearIngredientDetails()); + expect(result.currentIngredient).toBeNull(); + }); +}); diff --git a/src/services/user/userSlice.test.ts b/src/services/user/userSlice.test.ts new file mode 100644 index 0000000..ce9f572 --- /dev/null +++ b/src/services/user/userSlice.test.ts @@ -0,0 +1,111 @@ +// ТЕСТЫ СЛАЙСА ПОЛЬЗОВАТЕЛЯ +import { describe, it, expect } from 'vitest'; + +import userReducer, { setAuthChecked, setUser } from './userSlice'; + +import type { TUser } from '@/utils/baseTypes'; + +describe('userSlice reducer', () => { + const initialState = { + user: null, + isAuthChecked: false, + }; + + const mockUser: TUser = { + email: 'space-burger@yandex.ru', + name: 'Космический Космонавт', + }; + + // стейт + it('должен вернуть стейт, который задается при инициализации, если пусто', (): void => { + const result = userReducer(undefined, { type: 'UNKNOWN_ACTION' }); + expect(result).toEqual(initialState); + }); + + // setAuthChecekd + it('should handle setAuthChecked', (): void => { + const result = userReducer(initialState, setAuthChecked(true)); + expect(result.isAuthChecked).toBe(true); + }); + + // юзер ставится + it('should handle setUser', (): void => { + const result = userReducer(initialState, setUser(mockUser)); + expect(result.user).toEqual(mockUser); + }); + + // экстраредусер - авторизация юзера + it('Успешное получения польователя с сервера', (): void => { + const action = { + type: 'authApi/executeQuery/fulfilled', + payload: { user: mockUser }, + meta: { + arg: { + endpointName: 'getUser', + }, + reducerPath: 'authApi', + }, + }; + const result = userReducer(initialState, action); + expect(result.user).toEqual(mockUser); + expect(result.isAuthChecked).toBe(true); + }); + + it('Запрос пользователя отклоняется сервером', (): void => { + const action = { + type: 'authApi/executeQuery/rejected', + meta: { + arg: { + endpointName: 'getUser', + }, + reducerPath: 'authApi', + }, + }; + const dirtyState = { + user: mockUser, + isAuthChecked: false, + }; + + const result = userReducer(dirtyState, action); + expect(result.user).toBeNull(); + expect(result.isAuthChecked).toBe(true); + }); + + it('Успешный логин - > пользователь записывается в хранилище, а проверка авторизации завершаетс', (): void => { + const action = { + type: 'authApi/executeMutation/fulfilled', + payload: { user: mockUser }, + meta: { + arg: { + endpointName: 'login', + }, + reducerPath: 'authApi', + }, + }; + + const result = userReducer(initialState, action); + expect(result.user).toEqual(mockUser); + expect(result.isAuthChecked).toBe(true); + }); + + it('Успешный выход пользователя - > юзер отчищается до нуля', (): void => { + const action = { + type: 'authApi/executeMutation/fulfilled', + meta: { + arg: { + endpointName: 'logout', + }, + reducerPath: 'authApi', + }, + }; + + const loggedInState = { + user: mockUser, + isAuthChecked: true, + }; + + const result = userReducer(loggedInState, action); + + expect(result.user).toBeNull(); + }); +}); diff --git a/src/setupTests.ts b/src/setupTests.ts new file mode 100644 index 0000000..7b0828b --- /dev/null +++ b/src/setupTests.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; diff --git a/tsconfig.app.json b/tsconfig.app.json index c6ac971..730f1d0 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -5,9 +5,10 @@ "useDefineForClassFields": true, "lib": ["ES2022", "DOM", "DOM.Iterable"], "module": "ESNext", - "types": ["@testing-library/jest-dom/vitest", "vite/client"], + "types": ["@testing-library/jest-dom/vitest", "vite/client", "vitest/globals", "node"], "skipLibCheck": true, + /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, @@ -36,7 +37,9 @@ "noUnusedParameters": true, "erasableSyntaxOnly": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true + "noUncheckedSideEffectImports": true, + + }, "include": ["src", "e2e"] } diff --git a/vite.config.ts b/vite.config.ts index 79fe525..a9fb4e4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,18 +1,15 @@ import react from '@vitejs/plugin-react'; import { checker } from 'vite-plugin-checker'; -import readableClassnames from 'vite-plugin-readable-classnames'; import sassDts from 'vite-plugin-sass-dts'; import tsconfigPaths from 'vite-tsconfig-paths'; -import { defineConfig } from 'vitest/config'; +import { defineConfig, configDefaults } from 'vitest/config'; -// https://vitejs.dev/config/ export default defineConfig({ plugins: [ checker({ typescript: true, }), react(), - // readableClassnames(), sassDts({ enabledMode: ['development'], esmExport: true, @@ -20,10 +17,19 @@ export default defineConfig({ tsconfigPaths(), ], base: '', + optimizeDeps: { + include: [ + '@reduxjs/toolkit/query/react', + '@reduxjs/toolkit', + 'react-redux', + 'js-cookie' + ], + }, test: { - globals: true, environment: 'jsdom', - setupFiles: ['./vitest-setup.js'], + setupFiles: './src/setupTests.ts', + globals: true, + exclude: [...configDefaults.exclude, 'e2e/**'], }, server: { open: true, From cb4420b2c349a0f2b867012369b4d6288fe72622 Mon Sep 17 00:00:00 2001 From: kak-rastoky Date: Sat, 30 May 2026 14:19:59 +0700 Subject: [PATCH 2/3] feat:final + change favicon --- README.md | 25 +--- index.html | 2 +- .../assets/index-C6nTsmTw.js | 12 ++ .../assets/index-DTxCX1zs.css | 1 + kakrastoki@158.160.164.129/index.html | 15 +++ kakrastoki@158.160.164.129/logo.svg | 104 ++++++++++++++++ public/logo.svg | 115 ++---------------- 7 files changed, 147 insertions(+), 127 deletions(-) create mode 100644 kakrastoki@158.160.164.129/assets/index-C6nTsmTw.js create mode 100644 kakrastoki@158.160.164.129/assets/index-DTxCX1zs.css create mode 100644 kakrastoki@158.160.164.129/index.html create mode 100644 kakrastoki@158.160.164.129/logo.svg diff --git a/README.md b/README.md index cd4e53a..8848263 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,6 @@ # Стартер на JavaScript для проекта Stellar Burger -## Процедура создания коммита с проверками - -При создании коммита автоматически запускаются проверка линтерами `stylelint`, `eslint` и форматирование `prettier`. - -Если линтер обнаружит ошибки: - -- Коммит создан не будет -- Необходимо исправить все выявленные проблемы -- Добавить исправленные файлы в индекс: `git add .` -- Повторить коммит - -**Рекомендация:** -Для предотвращения ошибок на этапе коммита предварительно выполните: -`npm run lint`. Это позволит выявить и исправить проблемы до создания коммита. - -Есть также команды для запуска проверок по отдельности: - -- `npm run eslint` - запускает проверку линтера и исправляет проблемы, которые можно исправить автоматически, -- `npm run stylelint` - запускает проверку литера для файлов стилей и исправляет проблемы, которые можно исправить автоматически, -- `npm run prettier` - исправляет ошибки форматирования кода. - -Можно добавить автозапуск этих команд при сохранении файла в вашей IDE. - -Для создания коммита рекомендуется запускать команду `npm run commit`. Она позволяет обеспечить соответствие описаний коммитов [общепринятым соглашениям](https://www.conventionalcommits.org/en/v1.0.0/). +**Ссылка на деплой проекта:** [https://stellar-rastoki.ru](https://stellar-rastoki.ru) В проекте настроены алиасы, которые можно использовать при импорте модулей: diff --git a/index.html b/index.html index e65b153..2ee7853 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - Vite + React + TS + Stellar Burdger !
diff --git a/kakrastoki@158.160.164.129/assets/index-C6nTsmTw.js b/kakrastoki@158.160.164.129/assets/index-C6nTsmTw.js new file mode 100644 index 0000000..5022e62 --- /dev/null +++ b/kakrastoki@158.160.164.129/assets/index-C6nTsmTw.js @@ -0,0 +1,12 @@ +(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))s(c);new MutationObserver(c=>{for(const f of c)if(f.type==="childList")for(const d of f.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&s(d)}).observe(document,{childList:!0,subtree:!0});function i(c){const f={};return c.integrity&&(f.integrity=c.integrity),c.referrerPolicy&&(f.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?f.credentials="include":c.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function s(c){if(c.ep)return;c.ep=!0;const f=i(c);fetch(c.href,f)}})();function dd(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var of={exports:{}},Ul={};var Vm;function Ay(){if(Vm)return Ul;Vm=1;var a=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function i(s,c,f){var d=null;if(f!==void 0&&(d=""+f),c.key!==void 0&&(d=""+c.key),"key"in c){f={};for(var m in c)m!=="key"&&(f[m]=c[m])}else f=c;return c=f.ref,{$$typeof:a,type:s,key:d,ref:c!==void 0?c:null,props:f}}return Ul.Fragment=r,Ul.jsx=i,Ul.jsxs=i,Ul}var Gm;function xy(){return Gm||(Gm=1,of.exports=Ay()),of.exports}var A=xy(),ff={exports:{}},ge={};var Qm;function Sy(){if(Qm)return ge;Qm=1;var a=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),f=Symbol.for("react.consumer"),d=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),b=Symbol.for("react.activity"),z=Symbol.iterator;function D(O){return O===null||typeof O!="object"?null:(O=z&&O[z]||O["@@iterator"],typeof O=="function"?O:null)}var T={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E=Object.assign,x={};function j(O,W,ie){this.props=O,this.context=W,this.refs=x,this.updater=ie||T}j.prototype.isReactComponent={},j.prototype.setState=function(O,W){if(typeof O!="object"&&typeof O!="function"&&O!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,O,W,"setState")},j.prototype.forceUpdate=function(O){this.updater.enqueueForceUpdate(this,O,"forceUpdate")};function Z(){}Z.prototype=j.prototype;function S(O,W,ie){this.props=O,this.context=W,this.refs=x,this.updater=ie||T}var L=S.prototype=new Z;L.constructor=S,E(L,j.prototype),L.isPureReactComponent=!0;var w=Array.isArray;function N(){}var q={H:null,A:null,T:null,S:null},Q=Object.prototype.hasOwnProperty;function K(O,W,ie){var le=ie.ref;return{$$typeof:a,type:O,key:W,ref:le!==void 0?le:null,props:ie}}function B(O,W){return K(O.type,W,O.props)}function R(O){return typeof O=="object"&&O!==null&&O.$$typeof===a}function k(O){var W={"=":"=0",":":"=2"};return"$"+O.replace(/[=:]/g,function(ie){return W[ie]})}var U=/\/+/g;function J(O,W){return typeof O=="object"&&O!==null&&O.key!=null?k(""+O.key):W.toString(36)}function re(O){switch(O.status){case"fulfilled":return O.value;case"rejected":throw O.reason;default:switch(typeof O.status=="string"?O.then(N,N):(O.status="pending",O.then(function(W){O.status==="pending"&&(O.status="fulfilled",O.value=W)},function(W){O.status==="pending"&&(O.status="rejected",O.reason=W)})),O.status){case"fulfilled":return O.value;case"rejected":throw O.reason}}throw O}function X(O,W,ie,le,ce){var fe=typeof O;(fe==="undefined"||fe==="boolean")&&(O=null);var ue=!1;if(O===null)ue=!0;else switch(fe){case"bigint":case"string":case"number":ue=!0;break;case"object":switch(O.$$typeof){case a:case r:ue=!0;break;case y:return ue=O._init,X(ue(O._payload),W,ie,le,ce)}}if(ue)return ce=ce(O),ue=le===""?"."+J(O,0):le,w(ce)?(ie="",ue!=null&&(ie=ue.replace(U,"$&/")+"/"),X(ce,W,ie,"",function(Ae){return Ae})):ce!=null&&(R(ce)&&(ce=B(ce,ie+(ce.key==null||O&&O.key===ce.key?"":(""+ce.key).replace(U,"$&/")+"/")+ue)),W.push(ce)),1;ue=0;var xe=le===""?".":le+":";if(w(O))for(var he=0;he"u"&&(i=r,r=void 0),typeof i<"u"){if(typeof i!="function")throw new Error(Qt(1));return i(hg)(a,r)}if(typeof a!="function")throw new Error(Qt(2));var c=a,f=r,d=[],m=d,p=!1;function g(){m===d&&(m=d.slice())}function y(){if(p)throw new Error(Qt(3));return f}function b(E){if(typeof E!="function")throw new Error(Qt(4));if(p)throw new Error(Qt(5));var x=!0;return g(),m.push(E),function(){if(x){if(p)throw new Error(Qt(6));x=!1,g();var Z=m.indexOf(E);m.splice(Z,1),d=null}}}function z(E){if(!Cy(E))throw new Error(Qt(7));if(typeof E.type>"u")throw new Error(Qt(8));if(p)throw new Error(Qt(9));try{p=!0,f=c(f,E)}finally{p=!1}for(var x=d=m,j=0;js&&s[c]?s[c]:i||null,a)}function Ty(a,r){return a.filter(i=>i!==r)}function mg(a){return typeof a=="object"}function Ey(a,r){const i=new Map,s=f=>{i.set(f,i.has(f)?i.get(f)+1:1)};a.forEach(s),r.forEach(s);const c=[];return i.forEach((f,d)=>{f===1&&c.push(d)}),c}function My(a,r){return a.filter(i=>r.indexOf(i)>-1)}const hd="dnd-core/INIT_COORDS",wu="dnd-core/BEGIN_DRAG",md="dnd-core/PUBLISH_DRAG_SOURCE",ju="dnd-core/HOVER",Ru="dnd-core/DROP",Nu="dnd-core/END_DRAG";function Jm(a,r){return{type:hd,payload:{sourceClientOffset:r||null,clientOffset:a||null}}}const Dy={type:hd,payload:{clientOffset:null,sourceClientOffset:null}};function wy(a){return function(i=[],s={publishSource:!0}){const{publishSource:c=!0,clientOffset:f,getSourceClientOffset:d}=s,m=a.getMonitor(),p=a.getRegistry();a.dispatch(Jm(f)),jy(i,m,p);const g=Ly(i,m);if(g==null){a.dispatch(Dy);return}let y=null;if(f){if(!d)throw new Error("getSourceClientOffset must be defined");Ry(d),y=d(g)}a.dispatch(Jm(f,y));const z=p.getSource(g).beginDrag(m,g);if(z==null)return;Ny(z),p.pinSource(g);const D=p.getSourceType(g);return{type:wu,payload:{itemType:D,item:z,sourceId:g,clientOffset:f||null,sourceClientOffset:y||null,isSourcePublic:!!c}}}}function jy(a,r,i){ye(!r.isDragging(),"Cannot call beginDrag while dragging."),a.forEach(function(s){ye(i.getSource(s),"Expected sourceIds to be registered.")})}function Ry(a){ye(typeof a=="function","When clientOffset is provided, getSourceClientOffset must be a function.")}function Ny(a){ye(mg(a),"Item must be an object.")}function Ly(a,r){let i=null;for(let s=a.length-1;s>=0;s--)if(r.canDragSource(a[s])){i=a[s];break}return i}function Zy(a,r,i){return r in a?Object.defineProperty(a,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):a[r]=i,a}function Hy(a){for(var r=1;r{const p=Xy(d,m,c,s),g={type:Ru,payload:{dropResult:Hy({},i,p)}};a.dispatch(g)})}}function ky(a){ye(a.isDragging(),"Cannot call drop while not dragging."),ye(!a.didDrop(),"Cannot call drop twice during one drag operation.")}function Xy(a,r,i,s){const c=i.getTarget(a);let f=c?c.drop(s,a):void 0;return Yy(f),typeof f>"u"&&(f=r===0?{}:s.getDropResult()),f}function Yy(a){ye(typeof a>"u"||mg(a),"Drop result must either be an object or undefined.")}function By(a){const r=a.getTargetIds().filter(a.canDropOnTarget,a);return r.reverse(),r}function Fy(a){return function(){const i=a.getMonitor(),s=a.getRegistry();Uy(i);const c=i.getSourceId();return c!=null&&(s.getSource(c,!0).endDrag(i,c),s.unpinSource()),{type:Nu}}}function Uy(a){ye(a.isDragging(),"Cannot call endDrag while not dragging.")}function Uf(a,r){return r===null?a===null:Array.isArray(a)?a.some(i=>i===r):a===r}function Vy(a){return function(i,{clientOffset:s}={}){Gy(i);const c=i.slice(0),f=a.getMonitor(),d=a.getRegistry(),m=f.getItemType();return Ky(c,d,m),Qy(c,f,d),Py(c,f,d),{type:ju,payload:{targetIds:c,clientOffset:s||null}}}}function Gy(a){ye(Array.isArray(a),"Expected targetIds to be an array.")}function Qy(a,r,i){ye(r.isDragging(),"Cannot call hover while not dragging."),ye(!r.didDrop(),"Cannot call hover after drop.");for(let s=0;s=0;s--){const c=a[s],f=r.getTargetType(c);Uf(f,i)||a.splice(s,1)}}function Py(a,r,i){a.forEach(function(s){i.getTarget(s).hover(r,s)})}function Iy(a){return function(){if(a.getMonitor().isDragging())return{type:md}}}function Wy(a){return{beginDrag:wy(a),publishDragSource:Iy(a),hover:Vy(a),drop:qy(a),endDrag:Fy(a)}}class Jy{receiveBackend(r){this.backend=r}getMonitor(){return this.monitor}getBackend(){return this.backend}getRegistry(){return this.monitor.registry}getActions(){const r=this,{dispatch:i}=this.store;function s(f){return(...d)=>{const m=f.apply(r,d);typeof m<"u"&&i(m)}}const c=Wy(this);return Object.keys(c).reduce((f,d)=>{const m=c[d];return f[d]=s(m),f},{})}dispatch(r){this.store.dispatch(r)}constructor(r,i){this.isSetUp=!1,this.handleRefCountChange=()=>{const s=this.store.getState().refCount>0;this.backend&&(s&&!this.isSetUp?(this.backend.setup(),this.isSetUp=!0):!s&&this.isSetUp&&(this.backend.teardown(),this.isSetUp=!1))},this.store=r,this.monitor=i,r.subscribe(this.handleRefCountChange)}}function _y(a,r){return{x:a.x+r.x,y:a.y+r.y}}function pg(a,r){return{x:a.x-r.x,y:a.y-r.y}}function $y(a){const{clientOffset:r,initialClientOffset:i,initialSourceClientOffset:s}=a;return!r||!i||!s?null:pg(_y(r,s),i)}function e5(a){const{clientOffset:r,initialClientOffset:i}=a;return!r||!i?null:pg(r,i)}const ti=[],pd=[];ti.__IS_NONE__=!0;pd.__IS_ALL__=!0;function t5(a,r){return a===ti?!1:a===pd||typeof r>"u"?!0:My(r,a).length>0}class n5{subscribeToStateChange(r,i={}){const{handlerIds:s}=i;ye(typeof r=="function","listener must be a function."),ye(typeof s>"u"||Array.isArray(s),"handlerIds, when specified, must be an array of strings.");let c=this.store.getState().stateId;const f=()=>{const d=this.store.getState(),m=d.stateId;try{m===c||m===c+1&&!t5(d.dirtyHandlerIds,s)||r()}finally{c=m}};return this.store.subscribe(f)}subscribeToOffsetChange(r){ye(typeof r=="function","listener must be a function.");let i=this.store.getState().dragOffset;const s=()=>{const c=this.store.getState().dragOffset;c!==i&&(i=c,r())};return this.store.subscribe(s)}canDragSource(r){if(!r)return!1;const i=this.registry.getSource(r);return ye(i,`Expected to find a valid source. sourceId=${r}`),this.isDragging()?!1:i.canDrag(this,r)}canDropOnTarget(r){if(!r)return!1;const i=this.registry.getTarget(r);if(ye(i,`Expected to find a valid target. targetId=${r}`),!this.isDragging()||this.didDrop())return!1;const s=this.registry.getTargetType(r),c=this.getItemType();return Uf(s,c)&&i.canDrop(this,r)}isDragging(){return!!this.getItemType()}isDraggingSource(r){if(!r)return!1;const i=this.registry.getSource(r,!0);if(ye(i,`Expected to find a valid source. sourceId=${r}`),!this.isDragging()||!this.isSourcePublic())return!1;const s=this.registry.getSourceType(r),c=this.getItemType();return s!==c?!1:i.isDragging(this,r)}isOverTarget(r,i={shallow:!1}){if(!r)return!1;const{shallow:s}=i;if(!this.isDragging())return!1;const c=this.registry.getTargetType(r),f=this.getItemType();if(f&&!Uf(c,f))return!1;const d=this.getTargetIds();if(!d.length)return!1;const m=d.indexOf(r);return s?m===d.length-1:m>-1}getItemType(){return this.store.getState().dragOperation.itemType}getItem(){return this.store.getState().dragOperation.item}getSourceId(){return this.store.getState().dragOperation.sourceId}getTargetIds(){return this.store.getState().dragOperation.targetIds}getDropResult(){return this.store.getState().dragOperation.dropResult}didDrop(){return this.store.getState().dragOperation.didDrop}isSourcePublic(){return!!this.store.getState().dragOperation.isSourcePublic}getInitialClientOffset(){return this.store.getState().dragOffset.initialClientOffset}getInitialSourceClientOffset(){return this.store.getState().dragOffset.initialSourceClientOffset}getClientOffset(){return this.store.getState().dragOffset.clientOffset}getSourceClientOffset(){return $y(this.store.getState().dragOffset)}getDifferenceFromInitialOffset(){return e5(this.store.getState().dragOffset)}constructor(r,i){this.store=r,this.registry=i}}const _m=typeof global<"u"?global:self,gg=_m.MutationObserver||_m.WebKitMutationObserver;function vg(a){return function(){const i=setTimeout(c,0),s=setInterval(c,50);function c(){clearTimeout(i),clearInterval(s),a()}}}function a5(a){let r=1;const i=new gg(a),s=document.createTextNode("");return i.observe(s,{characterData:!0}),function(){r=-r,s.data=r}}const r5=typeof gg=="function"?a5:vg;class l5{enqueueTask(r){const{queue:i,requestFlush:s}=this;i.length||(s(),this.flushing=!0),i[i.length]=r}constructor(){this.queue=[],this.pendingErrors=[],this.flushing=!1,this.index=0,this.capacity=1024,this.flush=()=>{const{queue:r}=this;for(;this.indexthis.capacity){for(let s=0,c=r.length-this.index;s{this.pendingErrors.push(r),this.requestErrorThrow()},this.requestFlush=r5(this.flush),this.requestErrorThrow=vg(()=>{if(this.pendingErrors.length)throw this.pendingErrors.shift()})}}class i5{call(){try{this.task&&this.task()}catch(r){this.onError(r)}finally{this.task=null,this.release(this)}}constructor(r,i){this.onError=r,this.release=i,this.task=null}}class s5{create(r){const i=this.freeTasks,s=i.length?i.pop():new i5(this.onError,c=>i[i.length]=c);return s.task=r,s}constructor(r){this.onError=r,this.freeTasks=[]}}const yg=new l5,u5=new s5(yg.registerPendingError);function c5(a){yg.enqueueTask(u5.create(a))}const gd="dnd-core/ADD_SOURCE",vd="dnd-core/ADD_TARGET",yd="dnd-core/REMOVE_SOURCE",Lu="dnd-core/REMOVE_TARGET";function o5(a){return{type:gd,payload:{sourceId:a}}}function f5(a){return{type:vd,payload:{targetId:a}}}function d5(a){return{type:yd,payload:{sourceId:a}}}function h5(a){return{type:Lu,payload:{targetId:a}}}function m5(a){ye(typeof a.canDrag=="function","Expected canDrag to be a function."),ye(typeof a.beginDrag=="function","Expected beginDrag to be a function."),ye(typeof a.endDrag=="function","Expected endDrag to be a function.")}function p5(a){ye(typeof a.canDrop=="function","Expected canDrop to be a function."),ye(typeof a.hover=="function","Expected hover to be a function."),ye(typeof a.drop=="function","Expected beginDrag to be a function.")}function Vf(a,r){if(r&&Array.isArray(a)){a.forEach(i=>Vf(i,!1));return}ye(typeof a=="string"||typeof a=="symbol",r?"Type can only be a string, a symbol, or an array of either.":"Type can only be a string or a symbol.")}var It;(function(a){a.SOURCE="SOURCE",a.TARGET="TARGET"})(It||(It={}));let g5=0;function v5(){return g5++}function y5(a){const r=v5().toString();switch(a){case It.SOURCE:return`S${r}`;case It.TARGET:return`T${r}`;default:throw new Error(`Unknown Handler Role: ${a}`)}}function $m(a){switch(a[0]){case"S":return It.SOURCE;case"T":return It.TARGET;default:throw new Error(`Cannot parse handler ID: ${a}`)}}function ep(a,r){const i=a.entries();let s=!1;do{const{done:c,value:[,f]}=i.next();if(f===r)return!0;s=!!c}while(!s);return!1}class b5{addSource(r,i){Vf(r),m5(i);const s=this.addHandler(It.SOURCE,r,i);return this.store.dispatch(o5(s)),s}addTarget(r,i){Vf(r,!0),p5(i);const s=this.addHandler(It.TARGET,r,i);return this.store.dispatch(f5(s)),s}containsHandler(r){return ep(this.dragSources,r)||ep(this.dropTargets,r)}getSource(r,i=!1){return ye(this.isSourceId(r),"Expected a valid source ID."),i&&r===this.pinnedSourceId?this.pinnedSource:this.dragSources.get(r)}getTarget(r){return ye(this.isTargetId(r),"Expected a valid target ID."),this.dropTargets.get(r)}getSourceType(r){return ye(this.isSourceId(r),"Expected a valid source ID."),this.types.get(r)}getTargetType(r){return ye(this.isTargetId(r),"Expected a valid target ID."),this.types.get(r)}isSourceId(r){return $m(r)===It.SOURCE}isTargetId(r){return $m(r)===It.TARGET}removeSource(r){ye(this.getSource(r),"Expected an existing source."),this.store.dispatch(d5(r)),c5(()=>{this.dragSources.delete(r),this.types.delete(r)})}removeTarget(r){ye(this.getTarget(r),"Expected an existing target."),this.store.dispatch(h5(r)),this.dropTargets.delete(r),this.types.delete(r)}pinSource(r){const i=this.getSource(r);ye(i,"Expected an existing source."),this.pinnedSourceId=r,this.pinnedSource=i}unpinSource(){ye(this.pinnedSource,"No source is pinned at the time."),this.pinnedSourceId=null,this.pinnedSource=null}addHandler(r,i,s){const c=y5(r);return this.types.set(c,i),r===It.SOURCE?this.dragSources.set(c,s):r===It.TARGET&&this.dropTargets.set(c,s),c}constructor(r){this.types=new Map,this.dragSources=new Map,this.dropTargets=new Map,this.pinnedSourceId=null,this.pinnedSource=null,this.store=r}}const A5=(a,r)=>a===r;function x5(a,r){return!a&&!r?!0:!a||!r?!1:a.x===r.x&&a.y===r.y}function S5(a,r,i=A5){if(a.length!==r.length)return!1;for(let s=0;s0||!S5(i,s)))return ti;const d=s[s.length-1],m=i[i.length-1];return d!==m&&(d&&c.push(d),m&&c.push(m)),c}function z5(a,r,i){return r in a?Object.defineProperty(a,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):a[r]=i,a}function O5(a){for(var r=1;r=0)&&Object.prototype.propertyIsEnumerable.call(a,s)&&(i[s]=a[s])}return i}function k5(a,r){if(a==null)return{};var i={},s=Object.keys(a),c,f;for(f=0;f=0)&&(i[c]=a[c]);return i}let np=0;const iu=Symbol.for("__REACT_DND_CONTEXT_INSTANCE__");var X5=C.memo(function(r){var{children:i}=r,s=q5(r,["children"]);const[c,f]=Y5(s);return C.useEffect(()=>{if(f){const d=bg();return++np,()=>{--np===0&&(d[iu]=null)}}},[]),A.jsx(dg.Provider,{value:c,children:i})});function Y5(a){if("manager"in a)return[{dragDropManager:a.manager},!1];const r=B5(a.backend,a.context,a.options,a.debugMode),i=!a.context;return[r,i]}function B5(a,r=bg(),i,s){const c=r;return c[iu]||(c[iu]={dragDropManager:Z5(a,r,i,s)}),c[iu]}function bg(){return typeof global<"u"?global:window}var df,ap;function F5(){return ap||(ap=1,df=function a(r,i){if(r===i)return!0;if(r&&i&&typeof r=="object"&&typeof i=="object"){if(r.constructor!==i.constructor)return!1;var s,c,f;if(Array.isArray(r)){if(s=r.length,s!=i.length)return!1;for(c=s;c--!==0;)if(!a(r[c],i[c]))return!1;return!0}if(r.constructor===RegExp)return r.source===i.source&&r.flags===i.flags;if(r.valueOf!==Object.prototype.valueOf)return r.valueOf()===i.valueOf();if(r.toString!==Object.prototype.toString)return r.toString()===i.toString();if(f=Object.keys(r),s=f.length,s!==Object.keys(i).length)return!1;for(c=s;c--!==0;)if(!Object.prototype.hasOwnProperty.call(i,f[c]))return!1;for(c=s;c--!==0;){var d=f[c];if(!a(r[d],i[d]))return!1}return!0}return r!==r&&i!==i}),df}var U5=F5();const V5=dd(U5),Ga=typeof window<"u"?C.useLayoutEffect:C.useEffect;function G5(a,r,i){const[s,c]=C.useState(()=>r(a)),f=C.useCallback(()=>{const d=r(a);V5(s,d)||(c(d),i&&i())},[s,a,i]);return Ga(f),[s,f]}function Q5(a,r,i){const[s,c]=G5(a,r,i);return Ga(function(){const d=a.getHandlerId();if(d!=null)return a.subscribeToStateChange(c,{handlerIds:[d]})},[a,c]),s}function Ag(a,r,i){return Q5(r,a||(()=>({})),()=>i.reconnect())}function xg(a,r){const i=[];return typeof a!="function"&&i.push(a),C.useMemo(()=>typeof a=="function"?a():a,i)}function K5(a){return C.useMemo(()=>a.hooks.dragSource(),[a])}function P5(a){return C.useMemo(()=>a.hooks.dragPreview(),[a])}let hf=!1,mf=!1;class I5{receiveHandlerId(r){this.sourceId=r}getHandlerId(){return this.sourceId}canDrag(){ye(!hf,"You may not call monitor.canDrag() inside your canDrag() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return hf=!0,this.internalMonitor.canDragSource(this.sourceId)}finally{hf=!1}}isDragging(){if(!this.sourceId)return!1;ye(!mf,"You may not call monitor.isDragging() inside your isDragging() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return mf=!0,this.internalMonitor.isDraggingSource(this.sourceId)}finally{mf=!1}}subscribeToStateChange(r,i){return this.internalMonitor.subscribeToStateChange(r,i)}isDraggingSource(r){return this.internalMonitor.isDraggingSource(r)}isOverTarget(r,i){return this.internalMonitor.isOverTarget(r,i)}getTargetIds(){return this.internalMonitor.getTargetIds()}isSourcePublic(){return this.internalMonitor.isSourcePublic()}getSourceId(){return this.internalMonitor.getSourceId()}subscribeToOffsetChange(r){return this.internalMonitor.subscribeToOffsetChange(r)}canDragSource(r){return this.internalMonitor.canDragSource(r)}canDropOnTarget(r){return this.internalMonitor.canDropOnTarget(r)}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(r){this.sourceId=null,this.internalMonitor=r.getMonitor()}}let pf=!1;class W5{receiveHandlerId(r){this.targetId=r}getHandlerId(){return this.targetId}subscribeToStateChange(r,i){return this.internalMonitor.subscribeToStateChange(r,i)}canDrop(){if(!this.targetId)return!1;ye(!pf,"You may not call monitor.canDrop() inside your canDrop() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target-monitor");try{return pf=!0,this.internalMonitor.canDropOnTarget(this.targetId)}finally{pf=!1}}isOver(r){return this.targetId?this.internalMonitor.isOverTarget(this.targetId,r):!1}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(r){this.targetId=null,this.internalMonitor=r.getMonitor()}}function J5(a,r,i){const s=i.getRegistry(),c=s.addTarget(a,r);return[c,()=>s.removeTarget(c)]}function _5(a,r,i){const s=i.getRegistry(),c=s.addSource(a,r);return[c,()=>s.removeSource(c)]}function Gf(a,r,i,s){let c;if(c!==void 0)return!!c;if(a===r)return!0;if(typeof a!="object"||!a||typeof r!="object"||!r)return!1;const f=Object.keys(a),d=Object.keys(r);if(f.length!==d.length)return!1;const m=Object.prototype.hasOwnProperty.bind(r);for(let p=0;p, or turn it into a drag source or a drop target itself.`)}function e4(a){return(r=null,i=null)=>{if(!C.isValidElement(r)){const f=r;return a(f,i),f}const s=r;return $5(s),t4(s,i?f=>a(f,i):a)}}function Sg(a){const r={};return Object.keys(a).forEach(i=>{const s=a[i];if(i.endsWith("Ref"))r[i]=a[i];else{const c=e4(s);r[i]=()=>c}}),r}function rp(a,r){typeof a=="function"?a(r):a.current=r}function t4(a,r){const i=a.ref;return ye(typeof i!="string","Cannot connect React DnD to an element with an existing string ref. Please convert it to use a callback ref instead, or wrap it into a or
. Read more: https://reactjs.org/docs/refs-and-the-dom.html#callback-refs"),i?C.cloneElement(a,{ref:s=>{rp(i,s),rp(r,s)}}):C.cloneElement(a,{ref:r})}class n4{receiveHandlerId(r){this.handlerId!==r&&(this.handlerId=r,this.reconnect())}get connectTarget(){return this.dragSource}get dragSourceOptions(){return this.dragSourceOptionsInternal}set dragSourceOptions(r){this.dragSourceOptionsInternal=r}get dragPreviewOptions(){return this.dragPreviewOptionsInternal}set dragPreviewOptions(r){this.dragPreviewOptionsInternal=r}reconnect(){const r=this.reconnectDragSource();this.reconnectDragPreview(r)}reconnectDragSource(){const r=this.dragSource,i=this.didHandlerIdChange()||this.didConnectedDragSourceChange()||this.didDragSourceOptionsChange();return i&&this.disconnectDragSource(),this.handlerId?r?(i&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragSource=r,this.lastConnectedDragSourceOptions=this.dragSourceOptions,this.dragSourceUnsubscribe=this.backend.connectDragSource(this.handlerId,r,this.dragSourceOptions)),i):(this.lastConnectedDragSource=r,i):i}reconnectDragPreview(r=!1){const i=this.dragPreview,s=r||this.didHandlerIdChange()||this.didConnectedDragPreviewChange()||this.didDragPreviewOptionsChange();if(s&&this.disconnectDragPreview(),!!this.handlerId){if(!i){this.lastConnectedDragPreview=i;return}s&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragPreview=i,this.lastConnectedDragPreviewOptions=this.dragPreviewOptions,this.dragPreviewUnsubscribe=this.backend.connectDragPreview(this.handlerId,i,this.dragPreviewOptions))}}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didConnectedDragSourceChange(){return this.lastConnectedDragSource!==this.dragSource}didConnectedDragPreviewChange(){return this.lastConnectedDragPreview!==this.dragPreview}didDragSourceOptionsChange(){return!Gf(this.lastConnectedDragSourceOptions,this.dragSourceOptions)}didDragPreviewOptionsChange(){return!Gf(this.lastConnectedDragPreviewOptions,this.dragPreviewOptions)}disconnectDragSource(){this.dragSourceUnsubscribe&&(this.dragSourceUnsubscribe(),this.dragSourceUnsubscribe=void 0)}disconnectDragPreview(){this.dragPreviewUnsubscribe&&(this.dragPreviewUnsubscribe(),this.dragPreviewUnsubscribe=void 0,this.dragPreviewNode=null,this.dragPreviewRef=null)}get dragSource(){return this.dragSourceNode||this.dragSourceRef&&this.dragSourceRef.current}get dragPreview(){return this.dragPreviewNode||this.dragPreviewRef&&this.dragPreviewRef.current}clearDragSource(){this.dragSourceNode=null,this.dragSourceRef=null}clearDragPreview(){this.dragPreviewNode=null,this.dragPreviewRef=null}constructor(r){this.hooks=Sg({dragSource:(i,s)=>{this.clearDragSource(),this.dragSourceOptions=s||null,Qf(i)?this.dragSourceRef=i:this.dragSourceNode=i,this.reconnectDragSource()},dragPreview:(i,s)=>{this.clearDragPreview(),this.dragPreviewOptions=s||null,Qf(i)?this.dragPreviewRef=i:this.dragPreviewNode=i,this.reconnectDragPreview()}}),this.handlerId=null,this.dragSourceRef=null,this.dragSourceOptionsInternal=null,this.dragPreviewRef=null,this.dragPreviewOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDragSource=null,this.lastConnectedDragSourceOptions=null,this.lastConnectedDragPreview=null,this.lastConnectedDragPreviewOptions=null,this.backend=r}}class a4{get connectTarget(){return this.dropTarget}reconnect(){const r=this.didHandlerIdChange()||this.didDropTargetChange()||this.didOptionsChange();r&&this.disconnectDropTarget();const i=this.dropTarget;if(this.handlerId){if(!i){this.lastConnectedDropTarget=i;return}r&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDropTarget=i,this.lastConnectedDropTargetOptions=this.dropTargetOptions,this.unsubscribeDropTarget=this.backend.connectDropTarget(this.handlerId,i,this.dropTargetOptions))}}receiveHandlerId(r){r!==this.handlerId&&(this.handlerId=r,this.reconnect())}get dropTargetOptions(){return this.dropTargetOptionsInternal}set dropTargetOptions(r){this.dropTargetOptionsInternal=r}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didDropTargetChange(){return this.lastConnectedDropTarget!==this.dropTarget}didOptionsChange(){return!Gf(this.lastConnectedDropTargetOptions,this.dropTargetOptions)}disconnectDropTarget(){this.unsubscribeDropTarget&&(this.unsubscribeDropTarget(),this.unsubscribeDropTarget=void 0)}get dropTarget(){return this.dropTargetNode||this.dropTargetRef&&this.dropTargetRef.current}clearDropTarget(){this.dropTargetRef=null,this.dropTargetNode=null}constructor(r){this.hooks=Sg({dropTarget:(i,s)=>{this.clearDropTarget(),this.dropTargetOptions=s,Qf(i)?this.dropTargetRef=i:this.dropTargetNode=i,this.reconnect()}}),this.handlerId=null,this.dropTargetRef=null,this.dropTargetOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDropTarget=null,this.lastConnectedDropTargetOptions=null,this.backend=r}}function Gr(){const{dragDropManager:a}=C.useContext(dg);return ye(a!=null,"Expected drag drop context"),a}function r4(a,r){const i=Gr(),s=C.useMemo(()=>new n4(i.getBackend()),[i]);return Ga(()=>(s.dragSourceOptions=a||null,s.reconnect(),()=>s.disconnectDragSource()),[s,a]),Ga(()=>(s.dragPreviewOptions=r||null,s.reconnect(),()=>s.disconnectDragPreview()),[s,r]),s}function l4(){const a=Gr();return C.useMemo(()=>new I5(a),[a])}class i4{beginDrag(){const r=this.spec,i=this.monitor;let s=null;return typeof r.item=="object"?s=r.item:typeof r.item=="function"?s=r.item(i):s={},s??null}canDrag(){const r=this.spec,i=this.monitor;return typeof r.canDrag=="boolean"?r.canDrag:typeof r.canDrag=="function"?r.canDrag(i):!0}isDragging(r,i){const s=this.spec,c=this.monitor,{isDragging:f}=s;return f?f(c):i===r.getSourceId()}endDrag(){const r=this.spec,i=this.monitor,s=this.connector,{end:c}=r;c&&c(i.getItem(),i),s.reconnect()}constructor(r,i,s){this.spec=r,this.monitor=i,this.connector=s}}function s4(a,r,i){const s=C.useMemo(()=>new i4(a,r,i),[r,i]);return C.useEffect(()=>{s.spec=a},[a]),s}function u4(a){return C.useMemo(()=>{const r=a.type;return ye(r!=null,"spec.type must be defined"),r},[a])}function c4(a,r,i){const s=Gr(),c=s4(a,r,i),f=u4(a);Ga(function(){if(f!=null){const[m,p]=_5(f,c,s);return r.receiveHandlerId(m),i.receiveHandlerId(m),p}},[s,r,i,c,f])}function Cg(a,r){const i=xg(a);ye(!i.begin,"useDrag::spec.begin was deprecated in v14. Replace spec.begin() with spec.item(). (see more here - https://react-dnd.github.io/react-dnd/docs/api/use-drag)");const s=l4(),c=r4(i.options,i.previewOptions);return c4(i,s,c),[Ag(i.collect,s,c),K5(c),P5(c)]}function o4(a){return C.useMemo(()=>a.hooks.dropTarget(),[a])}function f4(a){const r=Gr(),i=C.useMemo(()=>new a4(r.getBackend()),[r]);return Ga(()=>(i.dropTargetOptions=a||null,i.reconnect(),()=>i.disconnectDropTarget()),[a]),i}function d4(){const a=Gr();return C.useMemo(()=>new W5(a),[a])}function h4(a){const{accept:r}=a;return C.useMemo(()=>(ye(a.accept!=null,"accept must be defined"),Array.isArray(r)?r:[r]),[r])}class m4{canDrop(){const r=this.spec,i=this.monitor;return r.canDrop?r.canDrop(i.getItem(),i):!0}hover(){const r=this.spec,i=this.monitor;r.hover&&r.hover(i.getItem(),i)}drop(){const r=this.spec,i=this.monitor;if(r.drop)return r.drop(i.getItem(),i)}constructor(r,i){this.spec=r,this.monitor=i}}function p4(a,r){const i=C.useMemo(()=>new m4(a,r),[r]);return C.useEffect(()=>{i.spec=a},[a]),i}function g4(a,r,i){const s=Gr(),c=p4(a,r),f=h4(a);Ga(function(){const[m,p]=J5(f,c,s);return r.receiveHandlerId(m),i.receiveHandlerId(m),p},[s,r,c,i,f.map(d=>d.toString()).join("|")])}function zg(a,r){const i=xg(a),s=d4(),c=f4(i.options);return g4(i,s,c),[Ag(i.collect,s,c),o4(c)]}function Og(a){let r=null;return()=>(r==null&&(r=a()),r)}function v4(a,r){return a.filter(i=>i!==r)}function y4(a,r){const i=new Set,s=f=>i.add(f);a.forEach(s),r.forEach(s);const c=[];return i.forEach(f=>c.push(f)),c}class b4{enter(r){const i=this.entered.length,s=c=>this.isNodeInDocument(c)&&(!c.contains||c.contains(r));return this.entered=y4(this.entered.filter(s),[r]),i===0&&this.entered.length>0}leave(r){const i=this.entered.length;return this.entered=v4(this.entered.filter(this.isNodeInDocument),r),i>0&&this.entered.length===0}reset(){this.entered=[]}constructor(r){this.entered=[],this.isNodeInDocument=r}}class A4{initializeExposedProperties(){Object.keys(this.config.exposeProperties).forEach(r=>{Object.defineProperty(this.item,r,{configurable:!0,enumerable:!0,get(){return console.warn(`Browser doesn't allow reading "${r}" until the drop event.`),null}})})}loadDataTransfer(r){if(r){const i={};Object.keys(this.config.exposeProperties).forEach(s=>{const c=this.config.exposeProperties[s];c!=null&&(i[s]={value:c(r,this.config.matchesTypes),configurable:!0,enumerable:!0})}),Object.defineProperties(this.item,i)}}canDrag(){return!0}beginDrag(){return this.item}isDragging(r,i){return i===r.getSourceId()}endDrag(){}constructor(r){this.config=r,this.item={},this.initializeExposedProperties()}}const Tg="__NATIVE_FILE__",Eg="__NATIVE_URL__",Mg="__NATIVE_TEXT__",Dg="__NATIVE_HTML__",lp=Object.freeze(Object.defineProperty({__proto__:null,FILE:Tg,HTML:Dg,TEXT:Mg,URL:Eg},Symbol.toStringTag,{value:"Module"}));function gf(a,r,i){const s=r.reduce((c,f)=>c||a.getData(f),"");return s??i}const Kf={[Tg]:{exposeProperties:{files:a=>Array.prototype.slice.call(a.files),items:a=>a.items,dataTransfer:a=>a},matchesTypes:["Files"]},[Dg]:{exposeProperties:{html:(a,r)=>gf(a,r,""),dataTransfer:a=>a},matchesTypes:["Html","text/html"]},[Eg]:{exposeProperties:{urls:(a,r)=>gf(a,r,"").split(` +`),dataTransfer:a=>a},matchesTypes:["Url","text/uri-list"]},[Mg]:{exposeProperties:{text:(a,r)=>gf(a,r,""),dataTransfer:a=>a},matchesTypes:["Text","text/plain"]}};function x4(a,r){const i=Kf[a];if(!i)throw new Error(`native type ${a} has no configuration`);const s=new A4(i);return s.loadDataTransfer(r),s}function vf(a){if(!a)return null;const r=Array.prototype.slice.call(a.types||[]);return Object.keys(Kf).filter(i=>{const s=Kf[i];return s?.matchesTypes?s.matchesTypes.some(c=>r.indexOf(c)>-1):!1})[0]||null}const S4=Og(()=>/firefox/i.test(navigator.userAgent)),wg=Og(()=>!!window.safari);class ip{interpolate(r){const{xs:i,ys:s,c1s:c,c2s:f,c3s:d}=this;let m=i.length-1;if(r===i[m])return s[m];let p=0,g=d.length-1,y;for(;p<=g;){y=Math.floor(.5*(p+g));const D=i[y];if(Dr)g=y-1;else return s[y]}m=Math.max(0,g);const b=r-i[m],z=b*b;return s[m]+c[m]*b+f[m]*z+d[m]*b*z}constructor(r,i){const{length:s}=r,c=[];for(let D=0;Dr[D]{let N=new ip([0,.5,1],[p.y,p.y/y*T,p.y+T-y]).interpolate(z);return wg()&&f&&(N+=(window.devicePixelRatio-1)*T),N},x=()=>new ip([0,.5,1],[p.x,p.x/g*D,p.x+D-g]).interpolate(b),{offsetX:j,offsetY:Z}=c,S=j===0||j,L=Z===0||Z;return{x:S?j:x(),y:L?Z:E()}}class E4{get window(){if(this.globalContext)return this.globalContext;if(typeof window<"u")return window}get document(){var r;return!((r=this.globalContext)===null||r===void 0)&&r.document?this.globalContext.document:this.window?this.window.document:void 0}get rootElement(){var r;return((r=this.optionsArgs)===null||r===void 0?void 0:r.rootElement)||this.window}constructor(r,i){this.ownerDocument=null,this.globalContext=r,this.optionsArgs=i}}function M4(a,r,i){return r in a?Object.defineProperty(a,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):a[r]=i,a}function sp(a){for(var r=1;r{this.sourcePreviewNodes.delete(r),this.sourcePreviewNodeOptions.delete(r)}}connectDragSource(r,i,s){this.sourceNodes.set(r,i),this.sourceNodeOptions.set(r,s);const c=d=>this.handleDragStart(d,r),f=d=>this.handleSelectStart(d);return i.setAttribute("draggable","true"),i.addEventListener("dragstart",c),i.addEventListener("selectstart",f),()=>{this.sourceNodes.delete(r),this.sourceNodeOptions.delete(r),i.removeEventListener("dragstart",c),i.removeEventListener("selectstart",f),i.setAttribute("draggable","false")}}connectDropTarget(r,i){const s=d=>this.handleDragEnter(d,r),c=d=>this.handleDragOver(d,r),f=d=>this.handleDrop(d,r);return i.addEventListener("dragenter",s),i.addEventListener("dragover",c),i.addEventListener("drop",f),()=>{i.removeEventListener("dragenter",s),i.removeEventListener("dragover",c),i.removeEventListener("drop",f)}}addEventListeners(r){r.addEventListener&&(r.addEventListener("dragstart",this.handleTopDragStart),r.addEventListener("dragstart",this.handleTopDragStartCapture,!0),r.addEventListener("dragend",this.handleTopDragEndCapture,!0),r.addEventListener("dragenter",this.handleTopDragEnter),r.addEventListener("dragenter",this.handleTopDragEnterCapture,!0),r.addEventListener("dragleave",this.handleTopDragLeaveCapture,!0),r.addEventListener("dragover",this.handleTopDragOver),r.addEventListener("dragover",this.handleTopDragOverCapture,!0),r.addEventListener("drop",this.handleTopDrop),r.addEventListener("drop",this.handleTopDropCapture,!0))}removeEventListeners(r){r.removeEventListener&&(r.removeEventListener("dragstart",this.handleTopDragStart),r.removeEventListener("dragstart",this.handleTopDragStartCapture,!0),r.removeEventListener("dragend",this.handleTopDragEndCapture,!0),r.removeEventListener("dragenter",this.handleTopDragEnter),r.removeEventListener("dragenter",this.handleTopDragEnterCapture,!0),r.removeEventListener("dragleave",this.handleTopDragLeaveCapture,!0),r.removeEventListener("dragover",this.handleTopDragOver),r.removeEventListener("dragover",this.handleTopDragOverCapture,!0),r.removeEventListener("drop",this.handleTopDrop),r.removeEventListener("drop",this.handleTopDropCapture,!0))}getCurrentSourceNodeOptions(){const r=this.monitor.getSourceId(),i=this.sourceNodeOptions.get(r);return sp({dropEffect:this.altKeyPressed?"copy":"move"},i||{})}getCurrentDropEffect(){return this.isDraggingNativeItem()?"copy":this.getCurrentSourceNodeOptions().dropEffect}getCurrentSourcePreviewNodeOptions(){const r=this.monitor.getSourceId(),i=this.sourcePreviewNodeOptions.get(r);return sp({anchorX:.5,anchorY:.5,captureDraggingState:!1},i||{})}isDraggingNativeItem(){const r=this.monitor.getItemType();return Object.keys(lp).some(i=>lp[i]===r)}beginDragNativeItem(r,i){this.clearCurrentDragSourceNode(),this.currentNativeSource=x4(r,i),this.currentNativeHandle=this.registry.addSource(r,this.currentNativeSource),this.actions.beginDrag([this.currentNativeHandle])}setCurrentDragSourceNode(r){this.clearCurrentDragSourceNode(),this.currentDragSourceNode=r;const i=1e3;this.mouseMoveTimeoutTimer=setTimeout(()=>{var s;return(s=this.rootElement)===null||s===void 0?void 0:s.addEventListener("mousemove",this.endDragIfSourceWasRemovedFromDOM,!0)},i)}clearCurrentDragSourceNode(){if(this.currentDragSourceNode){if(this.currentDragSourceNode=null,this.rootElement){var r;(r=this.window)===null||r===void 0||r.clearTimeout(this.mouseMoveTimeoutTimer||void 0),this.rootElement.removeEventListener("mousemove",this.endDragIfSourceWasRemovedFromDOM,!0)}return this.mouseMoveTimeoutTimer=null,!0}return!1}handleDragStart(r,i){r.defaultPrevented||(this.dragStartSourceIds||(this.dragStartSourceIds=[]),this.dragStartSourceIds.unshift(i))}handleDragEnter(r,i){this.dragEnterTargetIds.unshift(i)}handleDragOver(r,i){this.dragOverTargetIds===null&&(this.dragOverTargetIds=[]),this.dragOverTargetIds.unshift(i)}handleDrop(r,i){this.dropTargetIds.unshift(i)}constructor(r,i,s){this.sourcePreviewNodes=new Map,this.sourcePreviewNodeOptions=new Map,this.sourceNodes=new Map,this.sourceNodeOptions=new Map,this.dragStartSourceIds=null,this.dropTargetIds=[],this.dragEnterTargetIds=[],this.currentNativeSource=null,this.currentNativeHandle=null,this.currentDragSourceNode=null,this.altKeyPressed=!1,this.mouseMoveTimeoutTimer=null,this.asyncEndDragFrameId=null,this.dragOverTargetIds=null,this.lastClientOffset=null,this.hoverRafId=null,this.getSourceClientOffset=c=>{const f=this.sourceNodes.get(c);return f&&jg(f)||null},this.endDragNativeItem=()=>{this.isDraggingNativeItem()&&(this.actions.endDrag(),this.currentNativeHandle&&this.registry.removeSource(this.currentNativeHandle),this.currentNativeHandle=null,this.currentNativeSource=null)},this.isNodeInDocument=c=>!!(c&&this.document&&this.document.body&&this.document.body.contains(c)),this.endDragIfSourceWasRemovedFromDOM=()=>{const c=this.currentDragSourceNode;c==null||this.isNodeInDocument(c)||(this.clearCurrentDragSourceNode()&&this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover())},this.scheduleHover=c=>{this.hoverRafId===null&&typeof requestAnimationFrame<"u"&&(this.hoverRafId=requestAnimationFrame(()=>{this.monitor.isDragging()&&this.actions.hover(c||[],{clientOffset:this.lastClientOffset}),this.hoverRafId=null}))},this.cancelHover=()=>{this.hoverRafId!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(this.hoverRafId),this.hoverRafId=null)},this.handleTopDragStartCapture=()=>{this.clearCurrentDragSourceNode(),this.dragStartSourceIds=[]},this.handleTopDragStart=c=>{if(c.defaultPrevented)return;const{dragStartSourceIds:f}=this;this.dragStartSourceIds=null;const d=Us(c);this.monitor.isDragging()&&(this.actions.endDrag(),this.cancelHover()),this.actions.beginDrag(f||[],{publishSource:!1,getSourceClientOffset:this.getSourceClientOffset,clientOffset:d});const{dataTransfer:m}=c,p=vf(m);if(this.monitor.isDragging()){if(m&&typeof m.setDragImage=="function"){const y=this.monitor.getSourceId(),b=this.sourceNodes.get(y),z=this.sourcePreviewNodes.get(y)||b;if(z){const{anchorX:D,anchorY:T,offsetX:E,offsetY:x}=this.getCurrentSourcePreviewNodeOptions(),S=T4(b,z,d,{anchorX:D,anchorY:T},{offsetX:E,offsetY:x});m.setDragImage(z,S.x,S.y)}}try{m?.setData("application/json",{})}catch{}this.setCurrentDragSourceNode(c.target);const{captureDraggingState:g}=this.getCurrentSourcePreviewNodeOptions();g?this.actions.publishDragSource():setTimeout(()=>this.actions.publishDragSource(),0)}else if(p)this.beginDragNativeItem(p);else{if(m&&!m.types&&(c.target&&!c.target.hasAttribute||!c.target.hasAttribute("draggable")))return;c.preventDefault()}},this.handleTopDragEndCapture=()=>{this.clearCurrentDragSourceNode()&&this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover()},this.handleTopDragEnterCapture=c=>{if(this.dragEnterTargetIds=[],this.isDraggingNativeItem()){var f;(f=this.currentNativeSource)===null||f===void 0||f.loadDataTransfer(c.dataTransfer)}if(!this.enterLeaveCounter.enter(c.target)||this.monitor.isDragging())return;const{dataTransfer:m}=c,p=vf(m);p&&this.beginDragNativeItem(p,m)},this.handleTopDragEnter=c=>{const{dragEnterTargetIds:f}=this;if(this.dragEnterTargetIds=[],!this.monitor.isDragging())return;this.altKeyPressed=c.altKey,f.length>0&&this.actions.hover(f,{clientOffset:Us(c)}),f.some(m=>this.monitor.canDropOnTarget(m))&&(c.preventDefault(),c.dataTransfer&&(c.dataTransfer.dropEffect=this.getCurrentDropEffect()))},this.handleTopDragOverCapture=c=>{if(this.dragOverTargetIds=[],this.isDraggingNativeItem()){var f;(f=this.currentNativeSource)===null||f===void 0||f.loadDataTransfer(c.dataTransfer)}},this.handleTopDragOver=c=>{const{dragOverTargetIds:f}=this;if(this.dragOverTargetIds=[],!this.monitor.isDragging()){c.preventDefault(),c.dataTransfer&&(c.dataTransfer.dropEffect="none");return}this.altKeyPressed=c.altKey,this.lastClientOffset=Us(c),this.scheduleHover(f),(f||[]).some(m=>this.monitor.canDropOnTarget(m))?(c.preventDefault(),c.dataTransfer&&(c.dataTransfer.dropEffect=this.getCurrentDropEffect())):this.isDraggingNativeItem()?c.preventDefault():(c.preventDefault(),c.dataTransfer&&(c.dataTransfer.dropEffect="none"))},this.handleTopDragLeaveCapture=c=>{this.isDraggingNativeItem()&&c.preventDefault(),this.enterLeaveCounter.leave(c.target)&&(this.isDraggingNativeItem()&&setTimeout(()=>this.endDragNativeItem(),0),this.cancelHover())},this.handleTopDropCapture=c=>{if(this.dropTargetIds=[],this.isDraggingNativeItem()){var f;c.preventDefault(),(f=this.currentNativeSource)===null||f===void 0||f.loadDataTransfer(c.dataTransfer)}else vf(c.dataTransfer)&&c.preventDefault();this.enterLeaveCounter.reset()},this.handleTopDrop=c=>{const{dropTargetIds:f}=this;this.dropTargetIds=[],this.actions.hover(f,{clientOffset:Us(c)}),this.actions.drop({dropEffect:this.getCurrentDropEffect()}),this.isDraggingNativeItem()?this.endDragNativeItem():this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover()},this.handleSelectStart=c=>{const f=c.target;typeof f.dragDrop=="function"&&(f.tagName==="INPUT"||f.tagName==="SELECT"||f.tagName==="TEXTAREA"||f.isContentEditable||(c.preventDefault(),f.dragDrop()))},this.options=new E4(i,s),this.actions=r.getActions(),this.monitor=r.getMonitor(),this.registry=r.getRegistry(),this.enterLeaveCounter=new b4(this.isNodeInDocument)}}const w4=function(r,i,s){return new D4(r,i,s)};var yf={exports:{}},Vl={},bf={exports:{}},Af={};var up;function j4(){return up||(up=1,(function(a){function r(X,$){var te=X.length;X.push($);e:for(;0>>1,se=X[ae];if(0>>1;aec(ie,te))lec(ce,ie)?(X[ae]=ce,X[le]=te,ae=le):(X[ae]=ie,X[W]=te,ae=W);else if(lec(ce,te))X[ae]=ce,X[le]=te,ae=le;else break e}}return $}function c(X,$){var te=X.sortIndex-$.sortIndex;return te!==0?te:X.id-$.id}if(a.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var f=performance;a.unstable_now=function(){return f.now()}}else{var d=Date,m=d.now();a.unstable_now=function(){return d.now()-m}}var p=[],g=[],y=1,b=null,z=3,D=!1,T=!1,E=!1,x=!1,j=typeof setTimeout=="function"?setTimeout:null,Z=typeof clearTimeout=="function"?clearTimeout:null,S=typeof setImmediate<"u"?setImmediate:null;function L(X){for(var $=i(g);$!==null;){if($.callback===null)s(g);else if($.startTime<=X)s(g),$.sortIndex=$.expirationTime,r(p,$);else break;$=i(g)}}function w(X){if(E=!1,L(X),!T)if(i(p)!==null)T=!0,N||(N=!0,k());else{var $=i(g);$!==null&&re(w,$.startTime-X)}}var N=!1,q=-1,Q=5,K=-1;function B(){return x?!0:!(a.unstable_now()-KX&&B());){var ae=b.callback;if(typeof ae=="function"){b.callback=null,z=b.priorityLevel;var se=ae(b.expirationTime<=X);if(X=a.unstable_now(),typeof se=="function"){b.callback=se,L(X),$=!0;break t}b===i(p)&&s(p),L(X)}else s(p);b=i(p)}if(b!==null)$=!0;else{var O=i(g);O!==null&&re(w,O.startTime-X),$=!1}}break e}finally{b=null,z=te,D=!1}$=void 0}}finally{$?k():N=!1}}}var k;if(typeof S=="function")k=function(){S(R)};else if(typeof MessageChannel<"u"){var U=new MessageChannel,J=U.port2;U.port1.onmessage=R,k=function(){J.postMessage(null)}}else k=function(){j(R,0)};function re(X,$){q=j(function(){X(a.unstable_now())},$)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(X){X.callback=null},a.unstable_forceFrameRate=function(X){0>X||125ae?(X.sortIndex=te,r(g,X),i(p)===null&&X===i(g)&&(E?(Z(q),q=-1):E=!0,re(w,te-ae))):(X.sortIndex=se,r(p,X),T||D||(T=!0,N||(N=!0,k()))),X},a.unstable_shouldYield=B,a.unstable_wrapCallback=function(X){var $=z;return function(){var te=z;z=$;try{return X.apply(this,arguments)}finally{z=te}}}})(Af)),Af}var cp;function R4(){return cp||(cp=1,bf.exports=j4()),bf.exports}var xf={exports:{}},ot={};var op;function N4(){if(op)return ot;op=1;var a=Du();function r(p){var g="https://react.dev/errors/"+p;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),xf.exports=N4(),xf.exports}var dp;function L4(){if(dp)return Vl;dp=1;var a=R4(),r=Du(),i=Rg();function s(e){var t="https://react.dev/errors/"+e;if(1se||(e.current=ae[se],ae[se]=null,se--)}function ie(e,t){se++,ae[se]=e.current,e.current=t}var le=O(null),ce=O(null),fe=O(null),ue=O(null);function xe(e,t){switch(ie(fe,t),ie(ce,e),ie(le,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?hm(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=hm(t),e=mm(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}W(le),ie(le,e)}function he(){W(le),W(ce),W(fe)}function Ae(e){e.memoizedState!==null&&ie(ue,e);var t=le.current,n=mm(t,e.type);t!==n&&(ie(ce,e),ie(le,n))}function dt(e){ce.current===e&&(W(le),W(ce)),ue.current===e&&(W(ue),Xl._currentValue=te)}var $e,mn;function et(e){if($e===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);$e=t&&t[1]||"",mn=-1)":-1u||M[l]!==G[u]){var _=` +`+M[l].replace(" at new "," at ");return e.displayName&&_.includes("")&&(_=_.replace("",e.displayName)),_}while(1<=l&&0<=u);break}}}finally{un=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?et(n):""}function Vn(e,t){switch(e.tag){case 26:case 27:case 5:return et(e.type);case 16:return et("Lazy");case 13:return e.child!==t&&t!==null?et("Suspense Fallback"):et("Suspense");case 19:return et("SuspenseList");case 0:case 15:return Zt(e.type,!1);case 11:return Zt(e.type.render,!1);case 1:return Zt(e.type,!0);case 31:return et("Activity");default:return""}}function Wa(e){try{var t="",n=null;do t+=Vn(e,n),n=e,e=e.return;while(e);return t}catch(l){return` +Error generating stack: `+l.message+` +`+l.stack}}var xa=Object.prototype.hasOwnProperty,Wr=a.unstable_scheduleCallback,Ja=a.unstable_cancelCallback,Iu=a.unstable_shouldYield,$v=a.unstable_requestPaint,xt=a.unstable_now,e3=a.unstable_getCurrentPriorityLevel,Gd=a.unstable_ImmediatePriority,Qd=a.unstable_UserBlockingPriority,Ti=a.unstable_NormalPriority,t3=a.unstable_LowPriority,Kd=a.unstable_IdlePriority,n3=a.log,a3=a.unstable_setDisableYieldValue,Jr=null,St=null;function Gn(e){if(typeof n3=="function"&&a3(e),St&&typeof St.setStrictMode=="function")try{St.setStrictMode(Jr,e)}catch{}}var Ct=Math.clz32?Math.clz32:i3,r3=Math.log,l3=Math.LN2;function i3(e){return e>>>=0,e===0?32:31-(r3(e)/l3|0)|0}var Ei=256,Mi=262144,Di=4194304;function Sa(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function wi(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var u=0,o=e.suspendedLanes,h=e.pingedLanes;e=e.warmLanes;var v=l&134217727;return v!==0?(l=v&~o,l!==0?u=Sa(l):(h&=v,h!==0?u=Sa(h):n||(n=v&~e,n!==0&&(u=Sa(n))))):(v=l&~o,v!==0?u=Sa(v):h!==0?u=Sa(h):n||(n=l&~e,n!==0&&(u=Sa(n)))),u===0?0:t!==0&&t!==u&&(t&o)===0&&(o=u&-u,n=t&-t,o>=n||o===32&&(n&4194048)!==0)?t:u}function _r(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function s3(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Pd(){var e=Di;return Di<<=1,(Di&62914560)===0&&(Di=4194304),e}function Wu(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function $r(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function u3(e,t,n,l,u,o){var h=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var v=e.entanglements,M=e.expirationTimes,G=e.hiddenUpdates;for(n=h&~n;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var m3=/[\n"\\]/g;function qt(e){return e.replace(m3,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function nc(e,t,n,l,u,o,h,v){e.name="",h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"?e.type=h:e.removeAttribute("type"),t!=null?h==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Ht(t)):e.value!==""+Ht(t)&&(e.value=""+Ht(t)):h!=="submit"&&h!=="reset"||e.removeAttribute("value"),t!=null?ac(e,h,Ht(t)):n!=null?ac(e,h,Ht(n)):l!=null&&e.removeAttribute("value"),u==null&&o!=null&&(e.defaultChecked=!!o),u!=null&&(e.checked=u&&typeof u!="function"&&typeof u!="symbol"),v!=null&&typeof v!="function"&&typeof v!="symbol"&&typeof v!="boolean"?e.name=""+Ht(v):e.removeAttribute("name")}function s1(e,t,n,l,u,o,h,v){if(o!=null&&typeof o!="function"&&typeof o!="symbol"&&typeof o!="boolean"&&(e.type=o),t!=null||n!=null){if(!(o!=="submit"&&o!=="reset"||t!=null)){tc(e);return}n=n!=null?""+Ht(n):"",t=t!=null?""+Ht(t):n,v||t===e.value||(e.value=t),e.defaultValue=t}l=l??u,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=v?e.checked:!!l,e.defaultChecked=!!l,h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.name=h),tc(e)}function ac(e,t,n){t==="number"&&Ni(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function ar(e,t,n,l){if(e=e.options,t){t={};for(var u=0;u"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),uc=!1;if(vn)try{var al={};Object.defineProperty(al,"passive",{get:function(){uc=!0}}),window.addEventListener("test",al,al),window.removeEventListener("test",al,al)}catch{uc=!1}var Kn=null,cc=null,Zi=null;function m1(){if(Zi)return Zi;var e,t=cc,n=t.length,l,u="value"in Kn?Kn.value:Kn.textContent,o=u.length;for(e=0;e=il),A1=" ",x1=!1;function S1(e,t){switch(e){case"keyup":return F3.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function C1(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var sr=!1;function V3(e,t){switch(e){case"compositionend":return C1(t);case"keypress":return t.which!==32?null:(x1=!0,A1);case"textInput":return e=t.data,e===A1&&x1?null:e;default:return null}}function G3(e,t){if(sr)return e==="compositionend"||!mc&&S1(e,t)?(e=m1(),Zi=cc=Kn=null,sr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=l}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=j1(n)}}function N1(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?N1(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function L1(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Ni(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Ni(e.document)}return t}function vc(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var $3=vn&&"documentMode"in document&&11>=document.documentMode,ur=null,yc=null,ol=null,bc=!1;function Z1(e,t,n){var l=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;bc||ur==null||ur!==Ni(l)||(l=ur,"selectionStart"in l&&vc(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),ol&&cl(ol,l)||(ol=l,l=Ms(yc,"onSelect"),0>=h,u-=h,cn=1<<32-Ct(t)+u|n<be?(Oe=de,de=null):Oe=de.sibling;var Me=P(Y,de,V[be],ee);if(Me===null){de===null&&(de=Oe);break}e&&de&&Me.alternate===null&&t(Y,de),H=o(Me,H,be),Ee===null?me=Me:Ee.sibling=Me,Ee=Me,de=Oe}if(be===V.length)return n(Y,de),Te&&bn(Y,be),me;if(de===null){for(;bebe?(Oe=de,de=null):Oe=de.sibling;var pa=P(Y,de,Me.value,ee);if(pa===null){de===null&&(de=Oe);break}e&&de&&pa.alternate===null&&t(Y,de),H=o(pa,H,be),Ee===null?me=pa:Ee.sibling=pa,Ee=pa,de=Oe}if(Me.done)return n(Y,de),Te&&bn(Y,be),me;if(de===null){for(;!Me.done;be++,Me=V.next())Me=ne(Y,Me.value,ee),Me!==null&&(H=o(Me,H,be),Ee===null?me=Me:Ee.sibling=Me,Ee=Me);return Te&&bn(Y,be),me}for(de=l(de);!Me.done;be++,Me=V.next())Me=I(de,Y,be,Me.value,ee),Me!==null&&(e&&Me.alternate!==null&&de.delete(Me.key===null?be:Me.key),H=o(Me,H,be),Ee===null?me=Me:Ee.sibling=Me,Ee=Me);return e&&de.forEach(function(by){return t(Y,by)}),Te&&bn(Y,be),me}function Le(Y,H,V,ee){if(typeof V=="object"&&V!==null&&V.type===E&&V.key===null&&(V=V.props.children),typeof V=="object"&&V!==null){switch(V.$$typeof){case D:e:{for(var me=V.key;H!==null;){if(H.key===me){if(me=V.type,me===E){if(H.tag===7){n(Y,H.sibling),ee=u(H,V.props.children),ee.return=Y,Y=ee;break e}}else if(H.elementType===me||typeof me=="object"&&me!==null&&me.$$typeof===Q&&Na(me)===H.type){n(Y,H.sibling),ee=u(H,V.props),gl(ee,V),ee.return=Y,Y=ee;break e}n(Y,H);break}else t(Y,H);H=H.sibling}V.type===E?(ee=Ma(V.props.children,Y.mode,ee,V.key),ee.return=Y,Y=ee):(ee=Gi(V.type,V.key,V.props,null,Y.mode,ee),gl(ee,V),ee.return=Y,Y=ee)}return h(Y);case T:e:{for(me=V.key;H!==null;){if(H.key===me)if(H.tag===4&&H.stateNode.containerInfo===V.containerInfo&&H.stateNode.implementation===V.implementation){n(Y,H.sibling),ee=u(H,V.children||[]),ee.return=Y,Y=ee;break e}else{n(Y,H);break}else t(Y,H);H=H.sibling}ee=Tc(V,Y.mode,ee),ee.return=Y,Y=ee}return h(Y);case Q:return V=Na(V),Le(Y,H,V,ee)}if(re(V))return oe(Y,H,V,ee);if(k(V)){if(me=k(V),typeof me!="function")throw Error(s(150));return V=me.call(V),pe(Y,H,V,ee)}if(typeof V.then=="function")return Le(Y,H,_i(V),ee);if(V.$$typeof===S)return Le(Y,H,Pi(Y,V),ee);$i(Y,V)}return typeof V=="string"&&V!==""||typeof V=="number"||typeof V=="bigint"?(V=""+V,H!==null&&H.tag===6?(n(Y,H.sibling),ee=u(H,V),ee.return=Y,Y=ee):(n(Y,H),ee=Oc(V,Y.mode,ee),ee.return=Y,Y=ee),h(Y)):n(Y,H)}return function(Y,H,V,ee){try{pl=0;var me=Le(Y,H,V,ee);return br=null,me}catch(de){if(de===yr||de===Wi)throw de;var Ee=Ot(29,de,null,Y.mode);return Ee.lanes=ee,Ee.return=Y,Ee}}}var Za=r2(!0),l2=r2(!1),_n=!1;function kc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Xc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function $n(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ea(e,t,n){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(De&2)!==0){var u=l.pending;return u===null?t.next=t:(t.next=u.next,u.next=t),l.pending=t,t=Vi(e),F1(e,null,n),t}return Ui(e,l,t,n),Vi(e)}function vl(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,Wd(e,n)}}function Yc(e,t){var n=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,n===l)){var u=null,o=null;if(n=n.firstBaseUpdate,n!==null){do{var h={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};o===null?u=o=h:o=o.next=h,n=n.next}while(n!==null);o===null?u=o=t:o=o.next=t}else u=o=t;n={baseState:l.baseState,firstBaseUpdate:u,lastBaseUpdate:o,shared:l.shared,callbacks:l.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Bc=!1;function yl(){if(Bc){var e=vr;if(e!==null)throw e}}function bl(e,t,n,l){Bc=!1;var u=e.updateQueue;_n=!1;var o=u.firstBaseUpdate,h=u.lastBaseUpdate,v=u.shared.pending;if(v!==null){u.shared.pending=null;var M=v,G=M.next;M.next=null,h===null?o=G:h.next=G,h=M;var _=e.alternate;_!==null&&(_=_.updateQueue,v=_.lastBaseUpdate,v!==h&&(v===null?_.firstBaseUpdate=G:v.next=G,_.lastBaseUpdate=M))}if(o!==null){var ne=u.baseState;h=0,_=G=M=null,v=o;do{var P=v.lane&-536870913,I=P!==v.lane;if(I?(ze&P)===P:(l&P)===P){P!==0&&P===gr&&(Bc=!0),_!==null&&(_=_.next={lane:0,tag:v.tag,payload:v.payload,callback:null,next:null});e:{var oe=e,pe=v;P=t;var Le=n;switch(pe.tag){case 1:if(oe=pe.payload,typeof oe=="function"){ne=oe.call(Le,ne,P);break e}ne=oe;break e;case 3:oe.flags=oe.flags&-65537|128;case 0:if(oe=pe.payload,P=typeof oe=="function"?oe.call(Le,ne,P):oe,P==null)break e;ne=b({},ne,P);break e;case 2:_n=!0}}P=v.callback,P!==null&&(e.flags|=64,I&&(e.flags|=8192),I=u.callbacks,I===null?u.callbacks=[P]:I.push(P))}else I={lane:P,tag:v.tag,payload:v.payload,callback:v.callback,next:null},_===null?(G=_=I,M=ne):_=_.next=I,h|=P;if(v=v.next,v===null){if(v=u.shared.pending,v===null)break;I=v,v=I.next,I.next=null,u.lastBaseUpdate=I,u.shared.pending=null}}while(!0);_===null&&(M=ne),u.baseState=M,u.firstBaseUpdate=G,u.lastBaseUpdate=_,o===null&&(u.shared.lanes=0),la|=h,e.lanes=h,e.memoizedState=ne}}function i2(e,t){if(typeof e!="function")throw Error(s(191,e));e.call(t)}function s2(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;eo?o:8;var h=X.T,v={};X.T=v,io(e,!1,t,n);try{var M=u(),G=X.S;if(G!==null&&G(v,M),M!==null&&typeof M=="object"&&typeof M.then=="function"){var _=u0(M,l);Sl(e,t,_,wt(e))}else Sl(e,t,l,wt(e))}catch(ne){Sl(e,t,{then:function(){},status:"rejected",reason:ne},wt())}finally{$.p=o,h!==null&&v.types!==null&&(h.types=v.types),X.T=h}}function m0(){}function ro(e,t,n,l){if(e.tag!==5)throw Error(s(476));var u=X2(e).queue;k2(e,u,t,te,n===null?m0:function(){return Y2(e),n(l)})}function X2(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:te,baseState:te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Cn,lastRenderedState:te},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Cn,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Y2(e){var t=X2(e);t.next===null&&(t=e.alternate.memoizedState),Sl(e,t.next.queue,{},wt())}function lo(){return at(Xl)}function B2(){return Ve().memoizedState}function F2(){return Ve().memoizedState}function p0(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=wt();e=$n(n);var l=ea(t,e,n);l!==null&&(At(l,t,n),vl(l,t,n)),t={cache:Lc()},e.payload=t;return}t=t.return}}function g0(e,t,n){var l=wt();n={lane:l,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},cs(e)?V2(t,n):(n=Cc(e,t,n,l),n!==null&&(At(n,e,l),G2(n,t,l)))}function U2(e,t,n){var l=wt();Sl(e,t,n,l)}function Sl(e,t,n,l){var u={lane:l,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(cs(e))V2(t,u);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var h=t.lastRenderedState,v=o(h,n);if(u.hasEagerState=!0,u.eagerState=v,zt(v,h))return Ui(e,t,u,0),Ze===null&&Fi(),!1}catch{}if(n=Cc(e,t,u,l),n!==null)return At(n,e,l),G2(n,t,l),!0}return!1}function io(e,t,n,l){if(l={lane:2,revertLane:Xo(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},cs(e)){if(t)throw Error(s(479))}else t=Cc(e,n,l,2),t!==null&&At(t,e,2)}function cs(e){var t=e.alternate;return e===ve||t!==null&&t===ve}function V2(e,t){xr=ns=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function G2(e,t,n){if((n&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,Wd(e,n)}}var Cl={readContext:at,use:ls,useCallback:Be,useContext:Be,useEffect:Be,useImperativeHandle:Be,useLayoutEffect:Be,useInsertionEffect:Be,useMemo:Be,useReducer:Be,useRef:Be,useState:Be,useDebugValue:Be,useDeferredValue:Be,useTransition:Be,useSyncExternalStore:Be,useId:Be,useHostTransitionStatus:Be,useFormState:Be,useActionState:Be,useOptimistic:Be,useMemoCache:Be,useCacheRefresh:Be};Cl.useEffectEvent=Be;var Q2={readContext:at,use:ls,useCallback:function(e,t){return ht().memoizedState=[e,t===void 0?null:t],e},useContext:at,useEffect:D2,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,ss(4194308,4,N2.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ss(4194308,4,e,t)},useInsertionEffect:function(e,t){ss(4,2,e,t)},useMemo:function(e,t){var n=ht();t=t===void 0?null:t;var l=e();if(Ha){Gn(!0);try{e()}finally{Gn(!1)}}return n.memoizedState=[l,t],l},useReducer:function(e,t,n){var l=ht();if(n!==void 0){var u=n(t);if(Ha){Gn(!0);try{n(t)}finally{Gn(!1)}}}else u=t;return l.memoizedState=l.baseState=u,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:u},l.queue=e,e=e.dispatch=g0.bind(null,ve,e),[l.memoizedState,e]},useRef:function(e){var t=ht();return e={current:e},t.memoizedState=e},useState:function(e){e=$c(e);var t=e.queue,n=U2.bind(null,ve,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:no,useDeferredValue:function(e,t){var n=ht();return ao(n,e,t)},useTransition:function(){var e=$c(!1);return e=k2.bind(null,ve,e.queue,!0,!1),ht().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var l=ve,u=ht();if(Te){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),Ze===null)throw Error(s(349));(ze&127)!==0||h2(l,t,n)}u.memoizedState=n;var o={value:n,getSnapshot:t};return u.queue=o,D2(p2.bind(null,l,o,e),[e]),l.flags|=2048,Cr(9,{destroy:void 0},m2.bind(null,l,o,n,t),null),n},useId:function(){var e=ht(),t=Ze.identifierPrefix;if(Te){var n=on,l=cn;n=(l&~(1<<32-Ct(l)-1)).toString(32)+n,t="_"+t+"R_"+n,n=as++,0<\/script>",o=o.removeChild(o.firstChild);break;case"select":o=typeof l.is=="string"?h.createElement("select",{is:l.is}):h.createElement("select"),l.multiple?o.multiple=!0:l.size&&(o.size=l.size);break;default:o=typeof l.is=="string"?h.createElement(u,{is:l.is}):h.createElement(u)}}o[tt]=t,o[mt]=l;e:for(h=t.child;h!==null;){if(h.tag===5||h.tag===6)o.appendChild(h.stateNode);else if(h.tag!==4&&h.tag!==27&&h.child!==null){h.child.return=h,h=h.child;continue}if(h===t)break e;for(;h.sibling===null;){if(h.return===null||h.return===t)break e;h=h.return}h.sibling.return=h.return,h=h.sibling}t.stateNode=o;e:switch(lt(o,u,l),u){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&On(t)}}return qe(t),xo(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&On(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(s(166));if(e=fe.current,mr(t)){if(e=t.stateNode,n=t.memoizedProps,l=null,u=nt,u!==null)switch(u.tag){case 27:case 5:l=u.memoizedProps}e[tt]=t,e=!!(e.nodeValue===n||l!==null&&l.suppressHydrationWarning===!0||fm(e.nodeValue,n)),e||Wn(t,!0)}else e=Ds(e).createTextNode(l),e[tt]=t,t.stateNode=e}return qe(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(l=mr(t),n!==null){if(e===null){if(!l)throw Error(s(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(s(557));e[tt]=t}else Da(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;qe(t),e=!1}else n=wc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(Et(t),t):(Et(t),null);if((t.flags&128)!==0)throw Error(s(558))}return qe(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(u=mr(t),l!==null&&l.dehydrated!==null){if(e===null){if(!u)throw Error(s(318));if(u=t.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(s(317));u[tt]=t}else Da(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;qe(t),u=!1}else u=wc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=u),u=!0;if(!u)return t.flags&256?(Et(t),t):(Et(t),null)}return Et(t),(t.flags&128)!==0?(t.lanes=n,t):(n=l!==null,e=e!==null&&e.memoizedState!==null,n&&(l=t.child,u=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(u=l.alternate.memoizedState.cachePool.pool),o=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(o=l.memoizedState.cachePool.pool),o!==u&&(l.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),ms(t,t.updateQueue),qe(t),null);case 4:return he(),e===null&&Uo(t.stateNode.containerInfo),qe(t),null;case 10:return xn(t.type),qe(t),null;case 19:if(W(Ue),l=t.memoizedState,l===null)return qe(t),null;if(u=(t.flags&128)!==0,o=l.rendering,o===null)if(u)Ol(l,!1);else{if(Fe!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(o=ts(e),o!==null){for(t.flags|=128,Ol(l,!1),e=o.updateQueue,t.updateQueue=e,ms(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)U1(n,e),n=n.sibling;return ie(Ue,Ue.current&1|2),Te&&bn(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&xt()>bs&&(t.flags|=128,u=!0,Ol(l,!1),t.lanes=4194304)}else{if(!u)if(e=ts(o),e!==null){if(t.flags|=128,u=!0,e=e.updateQueue,t.updateQueue=e,ms(t,e),Ol(l,!0),l.tail===null&&l.tailMode==="hidden"&&!o.alternate&&!Te)return qe(t),null}else 2*xt()-l.renderingStartTime>bs&&n!==536870912&&(t.flags|=128,u=!0,Ol(l,!1),t.lanes=4194304);l.isBackwards?(o.sibling=t.child,t.child=o):(e=l.last,e!==null?e.sibling=o:t.child=o,l.last=o)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=xt(),e.sibling=null,n=Ue.current,ie(Ue,u?n&1|2:n&1),Te&&bn(t,l.treeForkCount),e):(qe(t),null);case 22:case 23:return Et(t),Uc(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(n&536870912)!==0&&(t.flags&128)===0&&(qe(t),t.subtreeFlags&6&&(t.flags|=8192)):qe(t),n=t.updateQueue,n!==null&&ms(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==n&&(t.flags|=2048),e!==null&&W(Ra),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),xn(Ge),qe(t),null;case 25:return null;case 30:return null}throw Error(s(156,t.tag))}function x0(e,t){switch(Mc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return xn(Ge),he(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return dt(t),null;case 31:if(t.memoizedState!==null){if(Et(t),t.alternate===null)throw Error(s(340));Da()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Et(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Da()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return W(Ue),null;case 4:return he(),null;case 10:return xn(t.type),null;case 22:case 23:return Et(t),Uc(),e!==null&&W(Ra),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return xn(Ge),null;case 25:return null;default:return null}}function gh(e,t){switch(Mc(t),t.tag){case 3:xn(Ge),he();break;case 26:case 27:case 5:dt(t);break;case 4:he();break;case 31:t.memoizedState!==null&&Et(t);break;case 13:Et(t);break;case 19:W(Ue);break;case 10:xn(t.type);break;case 22:case 23:Et(t),Uc(),e!==null&&W(Ra);break;case 24:xn(Ge)}}function Tl(e,t){try{var n=t.updateQueue,l=n!==null?n.lastEffect:null;if(l!==null){var u=l.next;n=u;do{if((n.tag&e)===e){l=void 0;var o=n.create,h=n.inst;l=o(),h.destroy=l}n=n.next}while(n!==u)}}catch(v){je(t,t.return,v)}}function aa(e,t,n){try{var l=t.updateQueue,u=l!==null?l.lastEffect:null;if(u!==null){var o=u.next;l=o;do{if((l.tag&e)===e){var h=l.inst,v=h.destroy;if(v!==void 0){h.destroy=void 0,u=t;var M=n,G=v;try{G()}catch(_){je(u,M,_)}}}l=l.next}while(l!==o)}}catch(_){je(t,t.return,_)}}function vh(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{s2(t,n)}catch(l){je(e,e.return,l)}}}function yh(e,t,n){n.props=qa(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(l){je(e,t,l)}}function El(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof n=="function"?e.refCleanup=n(l):n.current=l}}catch(u){je(e,t,u)}}function fn(e,t){var n=e.ref,l=e.refCleanup;if(n!==null)if(typeof l=="function")try{l()}catch(u){je(e,t,u)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n=="function")try{n(null)}catch(u){je(e,t,u)}else n.current=null}function bh(e){var t=e.type,n=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&l.focus();break e;case"img":n.src?l.src=n.src:n.srcSet&&(l.srcset=n.srcSet)}}catch(u){je(e,e.return,u)}}function So(e,t,n){try{var l=e.stateNode;U0(l,e.type,n,t),l[mt]=t}catch(u){je(e,e.return,u)}}function Ah(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&oa(e.type)||e.tag===4}function Co(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ah(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&oa(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function zo(e,t,n){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=gn));else if(l!==4&&(l===27&&oa(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(zo(e,t,n),e=e.sibling;e!==null;)zo(e,t,n),e=e.sibling}function ps(e,t,n){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(l!==4&&(l===27&&oa(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(ps(e,t,n),e=e.sibling;e!==null;)ps(e,t,n),e=e.sibling}function xh(e){var t=e.stateNode,n=e.memoizedProps;try{for(var l=e.type,u=t.attributes;u.length;)t.removeAttributeNode(u[0]);lt(t,l,n),t[tt]=e,t[mt]=n}catch(o){je(e,e.return,o)}}var Tn=!1,Pe=!1,Oo=!1,Sh=typeof WeakSet=="function"?WeakSet:Set,Je=null;function S0(e,t){if(e=e.containerInfo,Qo=Hs,e=L1(e),vc(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var l=n.getSelection&&n.getSelection();if(l&&l.rangeCount!==0){n=l.anchorNode;var u=l.anchorOffset,o=l.focusNode;l=l.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var h=0,v=-1,M=-1,G=0,_=0,ne=e,P=null;t:for(;;){for(var I;ne!==n||u!==0&&ne.nodeType!==3||(v=h+u),ne!==o||l!==0&&ne.nodeType!==3||(M=h+l),ne.nodeType===3&&(h+=ne.nodeValue.length),(I=ne.firstChild)!==null;)P=ne,ne=I;for(;;){if(ne===e)break t;if(P===n&&++G===u&&(v=h),P===o&&++_===l&&(M=h),(I=ne.nextSibling)!==null)break;ne=P,P=ne.parentNode}ne=I}n=v===-1||M===-1?null:{start:v,end:M}}else n=null}n=n||{start:0,end:0}}else n=null;for(Ko={focusedElem:e,selectionRange:n},Hs=!1,Je=t;Je!==null;)if(t=Je,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Je=e;else for(;Je!==null;){switch(t=Je,o=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(n=0;n title"))),lt(o,l,n),o[tt]=e,We(o),l=o;break e;case"link":var h=Mm("link","href",u).get(l+(n.href||""));if(h){for(var v=0;vLe&&(h=Le,Le=pe,pe=h);var Y=R1(v,pe),H=R1(v,Le);if(Y&&H&&(I.rangeCount!==1||I.anchorNode!==Y.node||I.anchorOffset!==Y.offset||I.focusNode!==H.node||I.focusOffset!==H.offset)){var V=ne.createRange();V.setStart(Y.node,Y.offset),I.removeAllRanges(),pe>Le?(I.addRange(V),I.extend(H.node,H.offset)):(V.setEnd(H.node,H.offset),I.addRange(V))}}}}for(ne=[],I=v;I=I.parentNode;)I.nodeType===1&&ne.push({element:I,left:I.scrollLeft,top:I.scrollTop});for(typeof v.focus=="function"&&v.focus(),v=0;vn?32:n,X.T=null,n=Ro,Ro=null;var o=sa,h=jn;if(Ie=0,Mr=sa=null,jn=0,(De&6)!==0)throw Error(s(331));var v=De;if(De|=4,Nh(o.current),wh(o,o.current,h,n),De=v,Nl(0,!1),St&&typeof St.onPostCommitFiberRoot=="function")try{St.onPostCommitFiberRoot(Jr,o)}catch{}return!0}finally{$.p=u,X.T=l,Jh(e,t)}}function $h(e,t,n){t=Xt(n,t),t=oo(e.stateNode,t,2),e=ea(e,t,2),e!==null&&($r(e,2),dn(e))}function je(e,t,n){if(e.tag===3)$h(e,e,n);else for(;t!==null;){if(t.tag===3){$h(t,e,n);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(ia===null||!ia.has(l))){e=Xt(n,e),n=eh(2),l=ea(t,n,2),l!==null&&(th(n,l,t,e),$r(l,2),dn(l));break}}t=t.return}}function Ho(e,t,n){var l=e.pingCache;if(l===null){l=e.pingCache=new O0;var u=new Set;l.set(t,u)}else u=l.get(t),u===void 0&&(u=new Set,l.set(t,u));u.has(n)||(Mo=!0,u.add(n),e=w0.bind(null,e,t,n),t.then(e,e))}function w0(e,t,n){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Ze===e&&(ze&n)===n&&(Fe===4||Fe===3&&(ze&62914560)===ze&&300>xt()-ys?(De&2)===0&&Dr(e,0):Do|=n,Er===ze&&(Er=0)),dn(e)}function em(e,t){t===0&&(t=Pd()),e=Ea(e,t),e!==null&&($r(e,t),dn(e))}function j0(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),em(e,n)}function R0(e,t){var n=0;switch(e.tag){case 31:case 13:var l=e.stateNode,u=e.memoizedState;u!==null&&(n=u.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(s(314))}l!==null&&l.delete(t),em(e,n)}function N0(e,t){return Wr(e,t)}var Os=null,jr=null,qo=!1,Ts=!1,ko=!1,ca=0;function dn(e){e!==jr&&e.next===null&&(jr===null?Os=jr=e:jr=jr.next=e),Ts=!0,qo||(qo=!0,Z0())}function Nl(e,t){if(!ko&&Ts){ko=!0;do for(var n=!1,l=Os;l!==null;){if(e!==0){var u=l.pendingLanes;if(u===0)var o=0;else{var h=l.suspendedLanes,v=l.pingedLanes;o=(1<<31-Ct(42|e)+1)-1,o&=u&~(h&~v),o=o&201326741?o&201326741|1:o?o|2:0}o!==0&&(n=!0,rm(l,o))}else o=ze,o=wi(l,l===Ze?o:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(o&3)===0||_r(l,o)||(n=!0,rm(l,o));l=l.next}while(n);ko=!1}}function L0(){tm()}function tm(){Ts=qo=!1;var e=0;ca!==0&&G0()&&(e=ca);for(var t=xt(),n=null,l=Os;l!==null;){var u=l.next,o=nm(l,t);o===0?(l.next=null,n===null?Os=u:n.next=u,u===null&&(jr=n)):(n=l,(e!==0||(o&3)!==0)&&(Ts=!0)),l=u}Ie!==0&&Ie!==5||Nl(e),ca!==0&&(ca=0)}function nm(e,t){for(var n=e.suspendedLanes,l=e.pingedLanes,u=e.expirationTimes,o=e.pendingLanes&-62914561;0v)break;var _=M.transferSize,ne=M.initiatorType;_&&dm(ne)&&(M=M.responseEnd,h+=_*(M"u"?null:document;function zm(e,t,n){var l=Rr;if(l&&typeof t=="string"&&t){var u=qt(t);u='link[rel="'+e+'"][href="'+u+'"]',typeof n=="string"&&(u+='[crossorigin="'+n+'"]'),Cm.has(u)||(Cm.add(u),e={rel:e,crossOrigin:n,href:t},l.querySelector(u)===null&&(t=l.createElement("link"),lt(t,"link",e),We(t),l.head.appendChild(t)))}}function ey(e){Rn.D(e),zm("dns-prefetch",e,null)}function ty(e,t){Rn.C(e,t),zm("preconnect",e,t)}function ny(e,t,n){Rn.L(e,t,n);var l=Rr;if(l&&e&&t){var u='link[rel="preload"][as="'+qt(t)+'"]';t==="image"&&n&&n.imageSrcSet?(u+='[imagesrcset="'+qt(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(u+='[imagesizes="'+qt(n.imageSizes)+'"]')):u+='[href="'+qt(e)+'"]';var o=u;switch(t){case"style":o=Nr(e);break;case"script":o=Lr(e)}Gt.has(o)||(e=b({rel:"preload",href:t==="image"&&n&&n.imageSrcSet?void 0:e,as:t},n),Gt.set(o,e),l.querySelector(u)!==null||t==="style"&&l.querySelector(ql(o))||t==="script"&&l.querySelector(kl(o))||(t=l.createElement("link"),lt(t,"link",e),We(t),l.head.appendChild(t)))}}function ay(e,t){Rn.m(e,t);var n=Rr;if(n&&e){var l=t&&typeof t.as=="string"?t.as:"script",u='link[rel="modulepreload"][as="'+qt(l)+'"][href="'+qt(e)+'"]',o=u;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":o=Lr(e)}if(!Gt.has(o)&&(e=b({rel:"modulepreload",href:e},t),Gt.set(o,e),n.querySelector(u)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(kl(o)))return}l=n.createElement("link"),lt(l,"link",e),We(l),n.head.appendChild(l)}}}function ry(e,t,n){Rn.S(e,t,n);var l=Rr;if(l&&e){var u=tr(l).hoistableStyles,o=Nr(e);t=t||"default";var h=u.get(o);if(!h){var v={loading:0,preload:null};if(h=l.querySelector(ql(o)))v.loading=5;else{e=b({rel:"stylesheet",href:e,"data-precedence":t},n),(n=Gt.get(o))&&ef(e,n);var M=h=l.createElement("link");We(M),lt(M,"link",e),M._p=new Promise(function(G,_){M.onload=G,M.onerror=_}),M.addEventListener("load",function(){v.loading|=1}),M.addEventListener("error",function(){v.loading|=2}),v.loading|=4,js(h,t,l)}h={type:"stylesheet",instance:h,count:1,state:v},u.set(o,h)}}}function ly(e,t){Rn.X(e,t);var n=Rr;if(n&&e){var l=tr(n).hoistableScripts,u=Lr(e),o=l.get(u);o||(o=n.querySelector(kl(u)),o||(e=b({src:e,async:!0},t),(t=Gt.get(u))&&tf(e,t),o=n.createElement("script"),We(o),lt(o,"link",e),n.head.appendChild(o)),o={type:"script",instance:o,count:1,state:null},l.set(u,o))}}function iy(e,t){Rn.M(e,t);var n=Rr;if(n&&e){var l=tr(n).hoistableScripts,u=Lr(e),o=l.get(u);o||(o=n.querySelector(kl(u)),o||(e=b({src:e,async:!0,type:"module"},t),(t=Gt.get(u))&&tf(e,t),o=n.createElement("script"),We(o),lt(o,"link",e),n.head.appendChild(o)),o={type:"script",instance:o,count:1,state:null},l.set(u,o))}}function Om(e,t,n,l){var u=(u=fe.current)?ws(u):null;if(!u)throw Error(s(446));switch(e){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(t=Nr(n.href),n=tr(u).hoistableStyles,l=n.get(t),l||(l={type:"style",instance:null,count:0,state:null},n.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){e=Nr(n.href);var o=tr(u).hoistableStyles,h=o.get(e);if(h||(u=u.ownerDocument||u,h={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},o.set(e,h),(o=u.querySelector(ql(e)))&&!o._p&&(h.instance=o,h.state.loading=5),Gt.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},Gt.set(e,n),o||sy(u,e,n,h.state))),t&&l===null)throw Error(s(528,""));return h}if(t&&l!==null)throw Error(s(529,""));return null;case"script":return t=n.async,n=n.src,typeof n=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Lr(n),n=tr(u).hoistableScripts,l=n.get(t),l||(l={type:"script",instance:null,count:0,state:null},n.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Nr(e){return'href="'+qt(e)+'"'}function ql(e){return'link[rel="stylesheet"]['+e+"]"}function Tm(e){return b({},e,{"data-precedence":e.precedence,precedence:null})}function sy(e,t,n,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),lt(t,"link",n),We(t),e.head.appendChild(t))}function Lr(e){return'[src="'+qt(e)+'"]'}function kl(e){return"script[async]"+e}function Em(e,t,n){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+qt(n.href)+'"]');if(l)return t.instance=l,We(l),l;var u=b({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),We(l),lt(l,"style",u),js(l,n.precedence,e),t.instance=l;case"stylesheet":u=Nr(n.href);var o=e.querySelector(ql(u));if(o)return t.state.loading|=4,t.instance=o,We(o),o;l=Tm(n),(u=Gt.get(u))&&ef(l,u),o=(e.ownerDocument||e).createElement("link"),We(o);var h=o;return h._p=new Promise(function(v,M){h.onload=v,h.onerror=M}),lt(o,"link",l),t.state.loading|=4,js(o,n.precedence,e),t.instance=o;case"script":return o=Lr(n.src),(u=e.querySelector(kl(o)))?(t.instance=u,We(u),u):(l=n,(u=Gt.get(o))&&(l=b({},n),tf(l,u)),e=e.ownerDocument||e,u=e.createElement("script"),We(u),lt(u,"link",l),e.head.appendChild(u),t.instance=u);case"void":return null;default:throw Error(s(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,js(l,n.precedence,e));return t.instance}function js(e,t,n){for(var l=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),u=l.length?l[l.length-1]:null,o=u,h=0;h title"):null)}function uy(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;return t.rel==="stylesheet"?(e=t.disabled,typeof t.precedence=="string"&&e==null):!0;case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function wm(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function cy(e,t,n,l){if(n.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(n.state.loading&4)===0){if(n.instance===null){var u=Nr(l.href),o=t.querySelector(ql(u));if(o){t=o._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Ns.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=o,We(o);return}o=t.ownerDocument||t,l=Tm(l),(u=Gt.get(u))&&ef(l,u),o=o.createElement("link"),We(o);var h=o;h._p=new Promise(function(v,M){h.onload=v,h.onerror=M}),lt(o,"link",l),n.instance=o}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&(n.state.loading&3)===0&&(e.count++,n=Ns.bind(e),t.addEventListener("load",n),t.addEventListener("error",n))}}var nf=0;function oy(e,t){return e.stylesheets&&e.count===0&&Zs(e,e.stylesheets),0nf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(u)}}:null}function Ns(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Zs(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Ls=null;function Zs(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Ls=new Map,t.forEach(fy,e),Ls=null,Ns.call(e))}function fy(e,t){if(!(t.state.loading&4)){var n=Ls.get(e);if(n)var l=n.get(null);else{n=new Map,Ls.set(e,n);for(var u=e.querySelectorAll("link[data-precedence],style[data-precedence]"),o=0;o"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),yf.exports=L4(),yf.exports}var H4=Z4(),Sf={exports:{}},Cf={};var mp;function q4(){if(mp)return Cf;mp=1;var a=Du();function r(p,g){return p===g&&(p!==0||1/p===1/g)||p!==p&&g!==g}var i=typeof Object.is=="function"?Object.is:r,s=a.useSyncExternalStore,c=a.useRef,f=a.useEffect,d=a.useMemo,m=a.useDebugValue;return Cf.useSyncExternalStoreWithSelector=function(p,g,y,b,z){var D=c(null);if(D.current===null){var T={hasValue:!1,value:null};D.current=T}else T=D.current;D=d(function(){function x(w){if(!j){if(j=!0,Z=w,w=b(w),z!==void 0&&T.hasValue){var N=T.value;if(z(N,w))return S=N}return S=w}if(N=S,i(Z,w))return N;var q=b(w);return z!==void 0&&z(N,q)?(Z=w,N):(Z=w,S=q)}var j=!1,Z,S,L=y===void 0?null:y;return[function(){return x(g())},L===null?void 0:function(){return x(L())}]},[g,y,b,z]);var E=s(p,D[0],D[1]);return f(function(){T.hasValue=!0,T.value=E},[E]),m(E),E},Cf}var pp;function k4(){return pp||(pp=1,Sf.exports=q4()),Sf.exports}var X4=k4();function Ng(a){a()}function Y4(){let a=null,r=null;return{clear(){a=null,r=null},notify(){Ng(()=>{let i=a;for(;i;)i.callback(),i=i.next})},get(){const i=[];let s=a;for(;s;)i.push(s),s=s.next;return i},subscribe(i){let s=!0;const c=r={callback:i,next:null,prev:r};return c.prev?c.prev.next=c:a=c,function(){!s||a===null||(s=!1,c.next?c.next.prev=c.prev:r=c.prev,c.prev?c.prev.next=c.next:a=c.next)}}}}var gp={notify(){},get:()=>[]};function B4(a,r){let i,s=gp,c=0,f=!1;function d(E){y();const x=s.subscribe(E);let j=!1;return()=>{j||(j=!0,x(),b())}}function m(){s.notify()}function p(){T.onStateChange&&T.onStateChange()}function g(){return f}function y(){c++,i||(i=a.subscribe(p),s=Y4())}function b(){c--,i&&c===0&&(i(),i=void 0,s.clear(),s=gp)}function z(){f||(f=!0,y())}function D(){f&&(f=!1,b())}const T={addNestedSub:d,notifyNestedSubs:m,handleChangeWrapper:p,isSubscribed:g,trySubscribe:z,tryUnsubscribe:D,getListeners:()=>s};return T}var F4=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",U4=F4(),V4=()=>typeof navigator<"u"&&navigator.product==="ReactNative",G4=V4(),Q4=()=>U4||G4?C.useLayoutEffect:C.useEffect,K4=Q4();function vp(a,r){return a===r?a!==0||r!==0||1/a===1/r:a!==a&&r!==r}function ni(a,r){if(vp(a,r))return!0;if(typeof a!="object"||a===null||typeof r!="object"||r===null)return!1;const i=Object.keys(a),s=Object.keys(r);if(i.length!==s.length)return!1;for(let c=0;c{const p=B4(c);return{store:c,subscription:p,getServerState:s?()=>s:void 0}},[c,s]),d=C.useMemo(()=>c.getState(),[c]);K4(()=>{const{subscription:p}=f;return p.onStateChange=p.notifyNestedSubs,p.trySubscribe(),d!==c.getState()&&p.notifyNestedSubs(),()=>{p.tryUnsubscribe(),p.onStateChange=void 0}},[f,d]);const m=i||va;return C.createElement(m.Provider,{value:f},r)}var _4=J4;function bd(a=va){return function(){return C.useContext(a)}}var Lg=bd();function Zg(a=va){const r=a===va?Lg:bd(a),i=()=>{const{store:s}=r();return s};return Object.assign(i,{withTypes:()=>i}),i}var Hg=Zg();function $4(a=va){const r=a===va?Hg:Zg(a),i=()=>r().dispatch;return Object.assign(i,{withTypes:()=>i}),i}var qg=$4(),e8=(a,r)=>a===r;function t8(a=va){const r=a===va?Lg:bd(a),i=(s,c={})=>{const{equalityFn:f=e8}=typeof c=="function"?{equalityFn:c}:c,d=r(),{store:m,subscription:p,getServerState:g}=d;C.useRef(!0);const y=C.useCallback({[s.name](z){return s(z)}}[s.name],[s]),b=X4.useSyncExternalStoreWithSelector(p.addNestedSub,m.getState,g||m.getState,y,f);return C.useDebugValue(b),b};return Object.assign(i,{withTypes:()=>i}),i}var kg=t8(),n8=Ng;var yp="popstate";function bp(a){return typeof a=="object"&&a!=null&&"pathname"in a&&"search"in a&&"hash"in a&&"state"in a&&"key"in a}function a8(a={}){function r(s,c){let f=c.state?.masked,{pathname:d,search:m,hash:p}=f||s.location;return Pf("",{pathname:d,search:m,hash:p},c.state&&c.state.usr||null,c.state&&c.state.key||"default",f?{pathname:s.location.pathname,search:s.location.search,hash:s.location.hash}:void 0)}function i(s,c){return typeof c=="string"?c:ii(c)}return l8(r,i,null,a)}function Xe(a,r){if(a===!1||a===null||typeof a>"u")throw new Error(r)}function sn(a,r){if(!a){typeof console<"u"&&console.warn(r);try{throw new Error(r)}catch{}}}function r8(){return Math.random().toString(36).substring(2,10)}function Ap(a,r){return{usr:a.state,key:a.key,idx:r,masked:a.unstable_mask?{pathname:a.pathname,search:a.search,hash:a.hash}:void 0}}function Pf(a,r,i=null,s,c){return{pathname:typeof a=="string"?a:a.pathname,search:"",hash:"",...typeof r=="string"?Qr(r):r,state:i,key:r&&r.key||s||r8(),unstable_mask:c}}function ii({pathname:a="/",search:r="",hash:i=""}){return r&&r!=="?"&&(a+=r.charAt(0)==="?"?r:"?"+r),i&&i!=="#"&&(a+=i.charAt(0)==="#"?i:"#"+i),a}function Qr(a){let r={};if(a){let i=a.indexOf("#");i>=0&&(r.hash=a.substring(i),a=a.substring(0,i));let s=a.indexOf("?");s>=0&&(r.search=a.substring(s),a=a.substring(0,s)),a&&(r.pathname=a)}return r}function l8(a,r,i,s={}){let{window:c=document.defaultView,v5Compat:f=!1}=s,d=c.history,m="POP",p=null,g=y();g==null&&(g=0,d.replaceState({...d.state,idx:g},""));function y(){return(d.state||{idx:null}).idx}function b(){m="POP";let x=y(),j=x==null?null:x-g;g=x,p&&p({action:m,location:E.location,delta:j})}function z(x,j){m="PUSH";let Z=bp(x)?x:Pf(E.location,x,j);g=y()+1;let S=Ap(Z,g),L=E.createHref(Z.unstable_mask||Z);try{d.pushState(S,"",L)}catch(w){if(w instanceof DOMException&&w.name==="DataCloneError")throw w;c.location.assign(L)}f&&p&&p({action:m,location:E.location,delta:1})}function D(x,j){m="REPLACE";let Z=bp(x)?x:Pf(E.location,x,j);g=y();let S=Ap(Z,g),L=E.createHref(Z.unstable_mask||Z);d.replaceState(S,"",L),f&&p&&p({action:m,location:E.location,delta:0})}function T(x){return i8(x)}let E={get action(){return m},get location(){return a(c,d)},listen(x){if(p)throw new Error("A history only accepts one active listener");return c.addEventListener(yp,b),p=x,()=>{c.removeEventListener(yp,b),p=null}},createHref(x){return r(c,x)},createURL:T,encodeLocation(x){let j=T(x);return{pathname:j.pathname,search:j.search,hash:j.hash}},push:z,replace:D,go(x){return d.go(x)}};return E}function i8(a,r=!1){let i="http://localhost";typeof window<"u"&&(i=window.location.origin!=="null"?window.location.origin:window.location.href),Xe(i,"No window.location.(origin|href) available to create URL");let s=typeof a=="string"?a:ii(a);return s=s.replace(/ $/,"%20"),!r&&s.startsWith("//")&&(s=i+s),new URL(s,i)}function Xg(a,r,i="/"){return s8(a,r,i,!1)}function s8(a,r,i,s){let c=typeof r=="string"?Qr(r):r,f=Xn(c.pathname||"/",i);if(f==null)return null;let d=Yg(a);u8(d);let m=null;for(let p=0;m==null&&p{let y={relativePath:g===void 0?d.path||"":g,caseSensitive:d.caseSensitive===!0,childrenIndex:m,route:d};if(y.relativePath.startsWith("/")){if(!y.relativePath.startsWith(s)&&p)return;Xe(y.relativePath.startsWith(s),`Absolute route path "${y.relativePath}" nested under path "${s}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),y.relativePath=y.relativePath.slice(s.length)}let b=an([s,y.relativePath]),z=i.concat(y);d.children&&d.children.length>0&&(Xe(d.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${b}".`),Yg(d.children,r,z,b,p)),!(d.path==null&&!d.index)&&r.push({path:b,score:p8(b,d.index),routesMeta:z})};return a.forEach((d,m)=>{if(d.path===""||!d.path?.includes("?"))f(d,m);else for(let p of Bg(d.path))f(d,m,!0,p)}),r}function Bg(a){let r=a.split("/");if(r.length===0)return[];let[i,...s]=r,c=i.endsWith("?"),f=i.replace(/\?$/,"");if(s.length===0)return c?[f,""]:[f];let d=Bg(s.join("/")),m=[];return m.push(...d.map(p=>p===""?f:[f,p].join("/"))),c&&m.push(...d),m.map(p=>a.startsWith("/")&&p===""?"/":p)}function u8(a){a.sort((r,i)=>r.score!==i.score?i.score-r.score:g8(r.routesMeta.map(s=>s.childrenIndex),i.routesMeta.map(s=>s.childrenIndex)))}var c8=/^:[\w-]+$/,o8=3,f8=2,d8=1,h8=10,m8=-2,xp=a=>a==="*";function p8(a,r){let i=a.split("/"),s=i.length;return i.some(xp)&&(s+=m8),r&&(s+=f8),i.filter(c=>!xp(c)).reduce((c,f)=>c+(c8.test(f)?o8:f===""?d8:h8),s)}function g8(a,r){return a.length===r.length&&a.slice(0,-1).every((s,c)=>s===r[c])?a[a.length-1]-r[r.length-1]:0}function v8(a,r,i=!1){let{routesMeta:s}=a,c={},f="/",d=[];for(let m=0;m{if(y==="*"){let T=m[z]||"";d=f.slice(0,f.length-T.length).replace(/(.)\/+$/,"$1")}const D=m[z];return b&&!D?g[y]=void 0:g[y]=(D||"").replace(/%2F/g,"/"),g},{}),pathname:f,pathnameBase:d,pattern:a}}function y8(a,r=!1,i=!0){sn(a==="*"||!a.endsWith("*")||a.endsWith("/*"),`Route path "${a}" will be treated as if it were "${a.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${a.replace(/\*$/,"/*")}".`);let s=[],c="^"+a.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(d,m,p,g,y)=>{if(s.push({paramName:m,isOptional:p!=null}),p){let b=y.charAt(g+d.length);return b&&b!=="/"?"/([^\\/]*)":"(?:/([^\\/]*))?"}return"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return a.endsWith("*")?(s.push({paramName:"*"}),c+=a==="*"||a==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):i?c+="\\/*$":a!==""&&a!=="/"&&(c+="(?:(?=\\/|$))"),[new RegExp(c,r?void 0:"i"),s]}function b8(a){try{return a.split("/").map(r=>decodeURIComponent(r).replace(/\//g,"%2F")).join("/")}catch(r){return sn(!1,`The URL path "${a}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${r}).`),a}}function Xn(a,r){if(r==="/")return a;if(!a.toLowerCase().startsWith(r.toLowerCase()))return null;let i=r.endsWith("/")?r.length-1:r.length,s=a.charAt(i);return s&&s!=="/"?null:a.slice(i)||"/"}var A8=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function x8(a,r="/"){let{pathname:i,search:s="",hash:c=""}=typeof a=="string"?Qr(a):a,f;return i?(i=Fg(i),i.startsWith("/")?f=Sp(i.substring(1),"/"):f=Sp(i,r)):f=r,{pathname:f,search:z8(s),hash:O8(c)}}function Sp(a,r){let i=mu(r).split("/");return a.split("/").forEach(c=>{c===".."?i.length>1&&i.pop():c!=="."&&i.push(c)}),i.length>1?i.join("/"):"/"}function zf(a,r,i,s){return`Cannot include a '${a}' character in a manually specified \`to.${r}\` field [${JSON.stringify(s)}]. Please separate it out to the \`to.${i}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function S8(a){return a.filter((r,i)=>i===0||r.route.path&&r.route.path.length>0)}function Ad(a){let r=S8(a);return r.map((i,s)=>s===r.length-1?i.pathname:i.pathnameBase)}function Zu(a,r,i,s=!1){let c;typeof a=="string"?c=Qr(a):(c={...a},Xe(!c.pathname||!c.pathname.includes("?"),zf("?","pathname","search",c)),Xe(!c.pathname||!c.pathname.includes("#"),zf("#","pathname","hash",c)),Xe(!c.search||!c.search.includes("#"),zf("#","search","hash",c)));let f=a===""||c.pathname==="",d=f?"/":c.pathname,m;if(d==null)m=i;else{let b=r.length-1;if(!s&&d.startsWith("..")){let z=d.split("/");for(;z[0]==="..";)z.shift(),b-=1;c.pathname=z.join("/")}m=b>=0?r[b]:"/"}let p=x8(c,m),g=d&&d!=="/"&&d.endsWith("/"),y=(f||d===".")&&i.endsWith("/");return!p.pathname.endsWith("/")&&(g||y)&&(p.pathname+="/"),p}var Fg=a=>a.replace(/\/\/+/g,"/"),an=a=>Fg(a.join("/")),mu=a=>a.replace(/\/+$/,""),C8=a=>mu(a).replace(/^\/*/,"/"),z8=a=>!a||a==="?"?"":a.startsWith("?")?a:"?"+a,O8=a=>!a||a==="#"?"":a.startsWith("#")?a:"#"+a,T8=class{constructor(a,r,i,s=!1){this.status=a,this.statusText=r||"",this.internal=s,i instanceof Error?(this.data=i.toString(),this.error=i):this.data=i}};function E8(a){return a!=null&&typeof a.status=="number"&&typeof a.statusText=="string"&&typeof a.internal=="boolean"&&"data"in a}function M8(a){let r=a.map(i=>i.route.path).filter(Boolean);return an(r)||"/"}var Ug=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Vg(a,r){let i=a;if(typeof i!="string"||!A8.test(i))return{absoluteURL:void 0,isExternal:!1,to:i};let s=i,c=!1;if(Ug)try{let f=new URL(window.location.href),d=i.startsWith("//")?new URL(f.protocol+i):new URL(i),m=Xn(d.pathname,r);d.origin===f.origin&&m!=null?i=m+d.search+d.hash:c=!0}catch{sn(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:s,isExternal:c,to:i}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Gg=["POST","PUT","PATCH","DELETE"];new Set(Gg);var D8=["GET",...Gg];new Set(D8);var Kr=C.createContext(null);Kr.displayName="DataRouter";var Hu=C.createContext(null);Hu.displayName="DataRouterState";var Qg=C.createContext(!1);function w8(){return C.useContext(Qg)}var Kg=C.createContext({isTransitioning:!1});Kg.displayName="ViewTransition";var j8=C.createContext(new Map);j8.displayName="Fetchers";var R8=C.createContext(null);R8.displayName="Await";var Lt=C.createContext(null);Lt.displayName="Navigation";var mi=C.createContext(null);mi.displayName="Location";var Jt=C.createContext({outlet:null,matches:[],isDataRoute:!1});Jt.displayName="Route";var xd=C.createContext(null);xd.displayName="RouteError";var Pg="REACT_ROUTER_ERROR",N8="REDIRECT",L8="ROUTE_ERROR_RESPONSE";function Z8(a){if(a.startsWith(`${Pg}:${N8}:{`))try{let r=JSON.parse(a.slice(28));if(typeof r=="object"&&r&&typeof r.status=="number"&&typeof r.statusText=="string"&&typeof r.location=="string"&&typeof r.reloadDocument=="boolean"&&typeof r.replace=="boolean")return r}catch{}}function H8(a){if(a.startsWith(`${Pg}:${L8}:{`))try{let r=JSON.parse(a.slice(40));if(typeof r=="object"&&r&&typeof r.status=="number"&&typeof r.statusText=="string")return new T8(r.status,r.statusText,r.data)}catch{}}function q8(a,{relative:r}={}){Xe(Pr(),"useHref() may be used only in the context of a component.");let{basename:i,navigator:s}=C.useContext(Lt),{hash:c,pathname:f,search:d}=pi(a,{relative:r}),m=f;return i!=="/"&&(m=f==="/"?i:an([i,f])),s.createHref({pathname:m,search:d,hash:c})}function Pr(){return C.useContext(mi)!=null}function ft(){return Xe(Pr(),"useLocation() may be used only in the context of a component."),C.useContext(mi).location}var Ig="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Wg(a){C.useContext(Lt).static||C.useLayoutEffect(a)}function Un(){let{isDataRoute:a}=C.useContext(Jt);return a?_8():k8()}function k8(){Xe(Pr(),"useNavigate() may be used only in the context of a component.");let a=C.useContext(Kr),{basename:r,navigator:i}=C.useContext(Lt),{matches:s}=C.useContext(Jt),{pathname:c}=ft(),f=JSON.stringify(Ad(s)),d=C.useRef(!1);return Wg(()=>{d.current=!0}),C.useCallback((p,g={})=>{if(sn(d.current,Ig),!d.current)return;if(typeof p=="number"){i.go(p);return}let y=Zu(p,JSON.parse(f),c,g.relative==="path");a==null&&r!=="/"&&(y.pathname=y.pathname==="/"?r:an([r,y.pathname])),(g.replace?i.replace:i.push)(y,g.state,g)},[r,i,f,c,a])}var X8=C.createContext(null);function Y8(a){let r=C.useContext(Jt).outlet;return C.useMemo(()=>r&&C.createElement(X8.Provider,{value:a},r),[r,a])}function Sd(){let{matches:a}=C.useContext(Jt);return a[a.length-1]?.params??{}}function pi(a,{relative:r}={}){let{matches:i}=C.useContext(Jt),{pathname:s}=ft(),c=JSON.stringify(Ad(i));return C.useMemo(()=>Zu(a,JSON.parse(c),s,r==="path"),[a,c,s,r])}function B8(a,r){return Jg(a,r)}function Jg(a,r,i){Xe(Pr(),"useRoutes() may be used only in the context of a component.");let{navigator:s}=C.useContext(Lt),{matches:c}=C.useContext(Jt),f=c[c.length-1],d=f?f.params:{},m=f?f.pathname:"/",p=f?f.pathnameBase:"/",g=f&&f.route;{let x=g&&g.path||"";$g(m,!g||x.endsWith("*")||x.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${m}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + +Please change the parent to .`)}let y=ft(),b;if(r){let x=typeof r=="string"?Qr(r):r;Xe(p==="/"||x.pathname?.startsWith(p),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${p}" but pathname "${x.pathname}" was given in the \`location\` prop.`),b=x}else b=y;let z=b.pathname||"/",D=z;if(p!=="/"){let x=p.replace(/^\//,"").split("/");D="/"+z.replace(/^\//,"").split("/").slice(x.length).join("/")}let T=Xg(a,{pathname:D});sn(g||T!=null,`No routes matched location "${b.pathname}${b.search}${b.hash}" `),sn(T==null||T[T.length-1].route.element!==void 0||T[T.length-1].route.Component!==void 0||T[T.length-1].route.lazy!==void 0,`Matched leaf route at location "${b.pathname}${b.search}${b.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let E=Q8(T&&T.map(x=>Object.assign({},x,{params:Object.assign({},d,x.params),pathname:an([p,s.encodeLocation?s.encodeLocation(x.pathname.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:x.pathname]),pathnameBase:x.pathnameBase==="/"?p:an([p,s.encodeLocation?s.encodeLocation(x.pathnameBase.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:x.pathnameBase])})),c,i);return r&&E?C.createElement(mi.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",unstable_mask:void 0,...b},navigationType:"POP"}},E):E}function F8(){let a=J8(),r=E8(a)?`${a.status} ${a.statusText}`:a instanceof Error?a.message:JSON.stringify(a),i=a instanceof Error?a.stack:null,s="rgba(200,200,200, 0.5)",c={padding:"0.5rem",backgroundColor:s},f={padding:"2px 4px",backgroundColor:s},d=null;return console.error("Error handled by React Router default ErrorBoundary:",a),d=C.createElement(C.Fragment,null,C.createElement("p",null,"💿 Hey developer 👋"),C.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",C.createElement("code",{style:f},"ErrorBoundary")," or"," ",C.createElement("code",{style:f},"errorElement")," prop on your route.")),C.createElement(C.Fragment,null,C.createElement("h2",null,"Unexpected Application Error!"),C.createElement("h3",{style:{fontStyle:"italic"}},r),i?C.createElement("pre",{style:c},i):null,d)}var U8=C.createElement(F8,null),_g=class extends C.Component{constructor(a){super(a),this.state={location:a.location,revalidation:a.revalidation,error:a.error}}static getDerivedStateFromError(a){return{error:a}}static getDerivedStateFromProps(a,r){return r.location!==a.location||r.revalidation!=="idle"&&a.revalidation==="idle"?{error:a.error,location:a.location,revalidation:a.revalidation}:{error:a.error!==void 0?a.error:r.error,location:r.location,revalidation:a.revalidation||r.revalidation}}componentDidCatch(a,r){this.props.onError?this.props.onError(a,r):console.error("React Router caught the following error during render",a)}render(){let a=this.state.error;if(this.context&&typeof a=="object"&&a&&"digest"in a&&typeof a.digest=="string"){const i=H8(a.digest);i&&(a=i)}let r=a!==void 0?C.createElement(Jt.Provider,{value:this.props.routeContext},C.createElement(xd.Provider,{value:a,children:this.props.component})):this.props.children;return this.context?C.createElement(V8,{error:a},r):r}};_g.contextType=Qg;var Of=new WeakMap;function V8({children:a,error:r}){let{basename:i}=C.useContext(Lt);if(typeof r=="object"&&r&&"digest"in r&&typeof r.digest=="string"){let s=Z8(r.digest);if(s){let c=Of.get(r);if(c)throw c;let f=Vg(s.location,i);if(Ug&&!Of.get(r))if(f.isExternal||s.reloadDocument)window.location.href=f.absoluteURL||f.to;else{const d=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(f.to,{replace:s.replace}));throw Of.set(r,d),d}return C.createElement("meta",{httpEquiv:"refresh",content:`0;url=${f.absoluteURL||f.to}`})}}return a}function G8({routeContext:a,match:r,children:i}){let s=C.useContext(Kr);return s&&s.static&&s.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(s.staticContext._deepestRenderedBoundaryId=r.route.id),C.createElement(Jt.Provider,{value:a},i)}function Q8(a,r=[],i){let s=i?.state;if(a==null){if(!s)return null;if(s.errors)a=s.matches;else if(r.length===0&&!s.initialized&&s.matches.length>0)a=s.matches;else return null}let c=a,f=s?.errors;if(f!=null){let y=c.findIndex(b=>b.route.id&&f?.[b.route.id]!==void 0);Xe(y>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(f).join(",")}`),c=c.slice(0,Math.min(c.length,y+1))}let d=!1,m=-1;if(i&&s){d=s.renderFallback;for(let y=0;y=0?c=c.slice(0,m+1):c=[c[0]];break}}}}let p=i?.onError,g=s&&p?(y,b)=>{p(y,{location:s.location,params:s.matches?.[0]?.params??{},unstable_pattern:M8(s.matches),errorInfo:b})}:void 0;return c.reduceRight((y,b,z)=>{let D,T=!1,E=null,x=null;s&&(D=f&&b.route.id?f[b.route.id]:void 0,E=b.route.errorElement||U8,d&&(m<0&&z===0?($g("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),T=!0,x=null):m===z&&(T=!0,x=b.route.hydrateFallbackElement||null)));let j=r.concat(c.slice(0,z+1)),Z=()=>{let S;return D?S=E:T?S=x:b.route.Component?S=C.createElement(b.route.Component,null):b.route.element?S=b.route.element:S=y,C.createElement(G8,{match:b,routeContext:{outlet:y,matches:j,isDataRoute:s!=null},children:S})};return s&&(b.route.ErrorBoundary||b.route.errorElement||z===0)?C.createElement(_g,{location:s.location,revalidation:s.revalidation,component:E,error:D,children:Z(),routeContext:{outlet:null,matches:j,isDataRoute:!0},onError:g}):Z()},null)}function Cd(a){return`${a} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function K8(a){let r=C.useContext(Kr);return Xe(r,Cd(a)),r}function P8(a){let r=C.useContext(Hu);return Xe(r,Cd(a)),r}function I8(a){let r=C.useContext(Jt);return Xe(r,Cd(a)),r}function zd(a){let r=I8(a),i=r.matches[r.matches.length-1];return Xe(i.route.id,`${a} can only be used on routes that contain a unique "id"`),i.route.id}function W8(){return zd("useRouteId")}function J8(){let a=C.useContext(xd),r=P8("useRouteError"),i=zd("useRouteError");return a!==void 0?a:r.errors?.[i]}function _8(){let{router:a}=K8("useNavigate"),r=zd("useNavigate"),i=C.useRef(!1);return Wg(()=>{i.current=!0}),C.useCallback(async(c,f={})=>{sn(i.current,Ig),i.current&&(typeof c=="number"?await a.navigate(c):await a.navigate(c,{fromRouteId:r,...f}))},[a,r])}var Cp={};function $g(a,r,i){!r&&!Cp[a]&&(Cp[a]=!0,sn(!1,i))}C.memo($8);function $8({routes:a,future:r,state:i,isStatic:s,onError:c}){return Jg(a,void 0,{state:i,isStatic:s,onError:c})}function If({to:a,replace:r,state:i,relative:s}){Xe(Pr()," may be used only in the context of a component.");let{static:c}=C.useContext(Lt);sn(!c," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:f}=C.useContext(Jt),{pathname:d}=ft(),m=Un(),p=Zu(a,Ad(f),d,s==="path"),g=JSON.stringify(p);return C.useEffect(()=>{m(JSON.parse(g),{replace:r,state:i,relative:s})},[m,g,s,r,i]),null}function eb(a){return Y8(a.context)}function st(a){Xe(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function tb({basename:a="/",children:r=null,location:i,navigationType:s="POP",navigator:c,static:f=!1,unstable_useTransitions:d}){Xe(!Pr(),"You cannot render a inside another . You should never have more than one in your app.");let m=a.replace(/^\/*/,"/"),p=C.useMemo(()=>({basename:m,navigator:c,static:f,unstable_useTransitions:d,future:{}}),[m,c,f,d]);typeof i=="string"&&(i=Qr(i));let{pathname:g="/",search:y="",hash:b="",state:z=null,key:D="default",unstable_mask:T}=i,E=C.useMemo(()=>{let x=Xn(g,m);return x==null?null:{location:{pathname:x,search:y,hash:b,state:z,key:D,unstable_mask:T},navigationType:s}},[m,g,y,b,z,D,s,T]);return sn(E!=null,` is not able to match the URL "${g}${y}${b}" because it does not start with the basename, so the won't render anything.`),E==null?null:C.createElement(Lt.Provider,{value:p},C.createElement(mi.Provider,{children:r,value:E}))}function zp({children:a,location:r}){return B8(Wf(a),r)}function Wf(a,r=[]){let i=[];return C.Children.forEach(a,(s,c)=>{if(!C.isValidElement(s))return;let f=[...r,c];if(s.type===C.Fragment){i.push.apply(i,Wf(s.props.children,f));return}Xe(s.type===st,`[${typeof s.type=="string"?s.type:s.type.name}] is not a component. All component children of must be a or `),Xe(!s.props.index||!s.props.children,"An index route cannot have child routes.");let d={id:s.props.id||f.join("-"),caseSensitive:s.props.caseSensitive,element:s.props.element,Component:s.props.Component,index:s.props.index,path:s.props.path,middleware:s.props.middleware,loader:s.props.loader,action:s.props.action,hydrateFallbackElement:s.props.hydrateFallbackElement,HydrateFallback:s.props.HydrateFallback,errorElement:s.props.errorElement,ErrorBoundary:s.props.ErrorBoundary,hasErrorBoundary:s.props.hasErrorBoundary===!0||s.props.ErrorBoundary!=null||s.props.errorElement!=null,shouldRevalidate:s.props.shouldRevalidate,handle:s.props.handle,lazy:s.props.lazy};s.props.children&&(d.children=Wf(s.props.children,f)),i.push(d)}),i}var su="get",uu="application/x-www-form-urlencoded";function qu(a){return typeof HTMLElement<"u"&&a instanceof HTMLElement}function nb(a){return qu(a)&&a.tagName.toLowerCase()==="button"}function ab(a){return qu(a)&&a.tagName.toLowerCase()==="form"}function rb(a){return qu(a)&&a.tagName.toLowerCase()==="input"}function lb(a){return!!(a.metaKey||a.altKey||a.ctrlKey||a.shiftKey)}function ib(a,r){return a.button===0&&(!r||r==="_self")&&!lb(a)}var Vs=null;function sb(){if(Vs===null)try{new FormData(document.createElement("form"),0),Vs=!1}catch{Vs=!0}return Vs}var ub=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Tf(a){return a!=null&&!ub.has(a)?(sn(!1,`"${a}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${uu}"`),null):a}function cb(a,r){let i,s,c,f,d;if(ab(a)){let m=a.getAttribute("action");s=m?Xn(m,r):null,i=a.getAttribute("method")||su,c=Tf(a.getAttribute("enctype"))||uu,f=new FormData(a)}else if(nb(a)||rb(a)&&(a.type==="submit"||a.type==="image")){let m=a.form;if(m==null)throw new Error('Cannot submit a