From 60de4ef27ca7adc9d8751550af0f80118c841556 Mon Sep 17 00:00:00 2001 From: Yuriy Panov Date: Fri, 28 Aug 2026 13:21:48 +0600 Subject: [PATCH] Convert fitness landing to React + Tailwind v4 with amoCRM lead capture Port the single-file landing (2.6 MB of inlined CSS, JS and base64 images, kept as fitnes/legacy/index.html) to Vite + React 19 + TypeScript, with an Express API that files every form submission into amoCRM pipeline 10980758. - Extract the 14 embedded images to src/assets/images and public/ - Rebuild the design system as Tailwind v4 @theme tokens; the stock palette and breakpoints are cleared so only the EXO scale is reachable from utilities - Split the page into 15 components; all copy moves to src/data - Lead endpoint: find-or-create the contact (Russian phone spellings compared on the last 10 digits), create the lead in the pipeline's first stage, map the fields the account already has and put the rest in a note. If amoCRM is unreachable the payload is logged and kept in localStorage rather than lost. - Add a callback modal as a second entry point, tagged separately in the pipeline - Self-host Inter Variable so the layout's 760/850/900 weights render as real weights instead of snapping to bold Fidelity was checked by comparing section offsets and heights against the original at 375/480/640/900/1120/1440 px; every section and the total page height matched exactly. Loading Inter deliberately changes text metrics, so the byte-exact comparison holds against the pre-font build. Co-Authored-By: Claude Opus 5 --- .gitignore | 1 + fitnes/.claude/launch.json | 11 + fitnes/.env.example | 33 + fitnes/.gitignore | 6 + fitnes/README.md | 151 + fitnes/index.html | 44 + fitnes/legacy/index.html | 915 ++++ fitnes/package-lock.json | 3715 +++++++++++++++++ fitnes/package.json | 37 + fitnes/public/favicon.svg | 1 + fitnes/public/og-image.webp | Bin 0 -> 80148 bytes fitnes/scripts/amo-check.ts | 68 + fitnes/server/src/amocrm.ts | 247 ++ fitnes/server/src/config.ts | 58 + fitnes/server/src/index.ts | 112 + fitnes/server/src/lead-mapper.ts | 153 + fitnes/server/src/lead-service.ts | 124 + fitnes/server/src/rate-limit.ts | 33 + fitnes/shared/lead.ts | 44 + fitnes/src/App.tsx | 56 + fitnes/src/assets/images/config-five.webp | Bin 0 -> 116424 bytes fitnes/src/assets/images/config-three.webp | Bin 0 -> 75140 bytes fitnes/src/assets/images/device-hydrogen.webp | Bin 0 -> 17352 bytes fitnes/src/assets/images/device-magnet.webp | Bin 0 -> 40576 bytes fitnes/src/assets/images/device-press.webp | Bin 0 -> 66096 bytes fitnes/src/assets/images/device-tecar.webp | Bin 0 -> 35152 bytes fitnes/src/assets/images/device-therapy.webp | Bin 0 -> 52008 bytes fitnes/src/assets/images/exo-logo.png | Bin 0 -> 68575 bytes .../src/assets/images/gallery-flagship.webp | Bin 0 -> 133302 bytes .../src/assets/images/gallery-glass-zone.webp | Bin 0 -> 112178 bytes .../assets/images/gallery-premium-room.webp | Bin 0 -> 96066 bytes .../src/assets/images/gallery-pt-stretch.webp | Bin 0 -> 231950 bytes fitnes/src/assets/images/hero-bg.webp | Bin 0 -> 159548 bytes fitnes/src/components/BenefitsSection.tsx | 63 + fitnes/src/components/Button.tsx | 66 + fitnes/src/components/CallbackModal.tsx | 147 + fitnes/src/components/ConstructorSection.tsx | 236 ++ fitnes/src/components/EconomicsSection.tsx | 333 ++ fitnes/src/components/FormField.tsx | 102 + fitnes/src/components/GallerySection.tsx | 68 + fitnes/src/components/Hero.tsx | 102 + fitnes/src/components/Icons.tsx | 40 + fitnes/src/components/ImageModal.tsx | 38 + fitnes/src/components/Layout.tsx | 115 + fitnes/src/components/LeadForm.tsx | 172 + fitnes/src/components/MarketSection.tsx | 100 + fitnes/src/components/MobileCta.tsx | 27 + fitnes/src/components/ProgramsSection.tsx | 64 + fitnes/src/components/RequestSection.tsx | 55 + fitnes/src/components/SiteFooter.tsx | 24 + fitnes/src/components/SiteHeader.tsx | 63 + fitnes/src/components/WhyExoSection.tsx | 64 + fitnes/src/data/content.ts | 269 ++ fitnes/src/data/devices.ts | 89 + fitnes/src/hooks/useBodyLock.ts | 10 + fitnes/src/hooks/useConstructor.ts | 106 + fitnes/src/hooks/useEscapeKey.ts | 12 + fitnes/src/hooks/useReveal.ts | 32 + fitnes/src/hooks/useScrollState.ts | 26 + fitnes/src/index.css | 198 + fitnes/src/lib/cx.ts | 3 + fitnes/src/lib/format.ts | 9 + fitnes/src/lib/lead.ts | 81 + fitnes/src/main.tsx | 17 + fitnes/tsconfig.app.json | 22 + fitnes/tsconfig.json | 8 + fitnes/tsconfig.node.json | 14 + fitnes/tsconfig.server.json | 20 + fitnes/vite.config.ts | 21 + 69 files changed, 8625 insertions(+) create mode 100644 .gitignore create mode 100644 fitnes/.claude/launch.json create mode 100644 fitnes/.env.example create mode 100644 fitnes/.gitignore create mode 100644 fitnes/README.md create mode 100644 fitnes/index.html create mode 100644 fitnes/legacy/index.html create mode 100644 fitnes/package-lock.json create mode 100644 fitnes/package.json create mode 100644 fitnes/public/favicon.svg create mode 100644 fitnes/public/og-image.webp create mode 100644 fitnes/scripts/amo-check.ts create mode 100644 fitnes/server/src/amocrm.ts create mode 100644 fitnes/server/src/config.ts create mode 100644 fitnes/server/src/index.ts create mode 100644 fitnes/server/src/lead-mapper.ts create mode 100644 fitnes/server/src/lead-service.ts create mode 100644 fitnes/server/src/rate-limit.ts create mode 100644 fitnes/shared/lead.ts create mode 100644 fitnes/src/App.tsx create mode 100644 fitnes/src/assets/images/config-five.webp create mode 100644 fitnes/src/assets/images/config-three.webp create mode 100644 fitnes/src/assets/images/device-hydrogen.webp create mode 100644 fitnes/src/assets/images/device-magnet.webp create mode 100644 fitnes/src/assets/images/device-press.webp create mode 100644 fitnes/src/assets/images/device-tecar.webp create mode 100644 fitnes/src/assets/images/device-therapy.webp create mode 100644 fitnes/src/assets/images/exo-logo.png create mode 100644 fitnes/src/assets/images/gallery-flagship.webp create mode 100644 fitnes/src/assets/images/gallery-glass-zone.webp create mode 100644 fitnes/src/assets/images/gallery-premium-room.webp create mode 100644 fitnes/src/assets/images/gallery-pt-stretch.webp create mode 100644 fitnes/src/assets/images/hero-bg.webp create mode 100644 fitnes/src/components/BenefitsSection.tsx create mode 100644 fitnes/src/components/Button.tsx create mode 100644 fitnes/src/components/CallbackModal.tsx create mode 100644 fitnes/src/components/ConstructorSection.tsx create mode 100644 fitnes/src/components/EconomicsSection.tsx create mode 100644 fitnes/src/components/FormField.tsx create mode 100644 fitnes/src/components/GallerySection.tsx create mode 100644 fitnes/src/components/Hero.tsx create mode 100644 fitnes/src/components/Icons.tsx create mode 100644 fitnes/src/components/ImageModal.tsx create mode 100644 fitnes/src/components/Layout.tsx create mode 100644 fitnes/src/components/LeadForm.tsx create mode 100644 fitnes/src/components/MarketSection.tsx create mode 100644 fitnes/src/components/MobileCta.tsx create mode 100644 fitnes/src/components/ProgramsSection.tsx create mode 100644 fitnes/src/components/RequestSection.tsx create mode 100644 fitnes/src/components/SiteFooter.tsx create mode 100644 fitnes/src/components/SiteHeader.tsx create mode 100644 fitnes/src/components/WhyExoSection.tsx create mode 100644 fitnes/src/data/content.ts create mode 100644 fitnes/src/data/devices.ts create mode 100644 fitnes/src/hooks/useBodyLock.ts create mode 100644 fitnes/src/hooks/useConstructor.ts create mode 100644 fitnes/src/hooks/useEscapeKey.ts create mode 100644 fitnes/src/hooks/useReveal.ts create mode 100644 fitnes/src/hooks/useScrollState.ts create mode 100644 fitnes/src/index.css create mode 100644 fitnes/src/lib/cx.ts create mode 100644 fitnes/src/lib/format.ts create mode 100644 fitnes/src/lib/lead.ts create mode 100644 fitnes/src/main.tsx create mode 100644 fitnes/tsconfig.app.json create mode 100644 fitnes/tsconfig.json create mode 100644 fitnes/tsconfig.node.json create mode 100644 fitnes/tsconfig.server.json create mode 100644 fitnes/vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/fitnes/.claude/launch.json b/fitnes/.claude/launch.json new file mode 100644 index 0000000..3428eb2 --- /dev/null +++ b/fitnes/.claude/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "fitnes-dev", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev:client"], + "port": 5173 + } + ] +} diff --git a/fitnes/.env.example b/fitnes/.env.example new file mode 100644 index 0000000..1cc82d5 --- /dev/null +++ b/fitnes/.env.example @@ -0,0 +1,33 @@ +# --------------------------------------------------------------------------- +# Public (baked into the client bundle at build time — never put secrets here) +# --------------------------------------------------------------------------- +VITE_SITE_URL=https://exodevices.ru/fitness + +# Sub-path the site is served from, if any. Leave as "/" when it sits at the +# domain root; set to "/fitness/" if it is mounted under exodevices.ru/fitness. +VITE_BASE_PATH=/ + +# --------------------------------------------------------------------------- +# Server +# --------------------------------------------------------------------------- +PORT=3000 + +# --------------------------------------------------------------------------- +# amoCRM — server-side only, never exposed to the browser +# --------------------------------------------------------------------------- +# Your account subdomain: for https://exotherapy.amocrm.ru put "exotherapy" +AMO_SUBDOMAIN= + +# Long-lived access token. +# amoCRM → Настройки → Интеграции → Создать интеграцию → Внешняя интеграция → +# open it → tab "Ключи и скопы" → «Генерировать токен» (долгосрочный, ~1 год). +AMO_LONG_LIVED_TOKEN= + +# Pipeline (воронка) the leads land in. The lead is placed in its first stage. +AMO_PIPELINE_ID=10980758 + +# Optional: numeric id of the amoCRM user leads are assigned to. +AMO_RESPONSIBLE_USER_ID= + +# Optional: comma-separated tags added to every lead. +AMO_LEAD_TAGS=fitness-landing diff --git a/fitnes/.gitignore b/fitnes/.gitignore new file mode 100644 index 0000000..23fc33a --- /dev/null +++ b/fitnes/.gitignore @@ -0,0 +1,6 @@ +node_modules +dist +.env +.env.local +*.local +.DS_Store diff --git a/fitnes/README.md b/fitnes/README.md new file mode 100644 index 0000000..5a0e63e --- /dev/null +++ b/fitnes/README.md @@ -0,0 +1,151 @@ +# EXO Recovery Zone — лендинг для фитнес-клубов + +React-приложение лендинга «EXO Recovery Zone». Каждая форма создаёт сделку в +amoCRM (воронка `10980758`) и контакт, если его ещё нет. + +Стек: **Vite + React 19 + TypeScript + Tailwind CSS v4**, API — **Express 5**. + +--- + +## Быстрый старт + +```bash +npm install +cp .env.example .env # заполнить AMO_SUBDOMAIN и AMO_LONG_LIVED_TOKEN +npm run dev +``` + +`npm run dev` поднимает Vite на `http://localhost:5173` и API на `:3000`; +запросы `/api/*` проксируются с фронтенда на API. + +## Продакшен + +```bash +npm run build # сборка клиента в dist/client +npm start # Express отдаёт dist/client и обрабатывает /api/* +``` + +Один процесс Node на любом VPS. Порт — `PORT` (по умолчанию 3000). + +--- + +## amoCRM + +### 1. Получить долгосрочный токен + +1. amoCRM → **Настройки → Интеграции → Создать интеграцию → Внешняя интеграция**. +2. Название любое (например «Сайт fitness»), redirect URI — любой рабочий адрес + сайта: для долгосрочного токена он не используется. +3. Права доступа: достаточно **Сделки, Контакты** (чтение и запись). +4. Сохранить, открыть интеграцию → вкладка **«Ключи и скопы»** → + **«Генерировать токен»** (долгосрочный, действует ~1 год). +5. Скопировать токен в `.env` в `AMO_LONG_LIVED_TOKEN`, поддомен — в + `AMO_SUBDOMAIN` (для `https://exotherapy.amocrm.ru` это `exotherapy`). + +Токен читается только на сервере и никогда не попадает в браузерный бандл. +Пометьте в календаре дату истечения — токен нужно перевыпустить через год. + +### 2. Проверить подключение + +```bash +npm run amo:check +``` + +Скрипт выведет название аккаунта, первый этап воронки `10980758`, в который +попадут сделки, и то, в какие поля вашего аккаунта легли данные формы. + +### 3. Что происходит при отправке формы + +1. Поиск контакта по телефону (во всех написаниях: `+7…`, `8…`, только цифры) + и по email. Если контакт найден — используется он, недостающий телефон или + email дописывается в карточку. +2. Если контакта нет — создаётся новый с именем, телефоном и email. +3. Создаётся сделка в воронке `AMO_PIPELINE_ID`, в её **первом этапе**, + с тегами `AMO_LEAD_TAGS` + тег формы (`заявка с сайта` / `обратный звонок`). +4. Данные, для которых в аккаунте есть подходящее поле (город, формат клуба, + компания, `utm_*` и т.д.), пишутся в поля; всё остальное — в примечание к + сделке. Ничего настраивать в amoCRM заранее не нужно. + +Если amoCRM недоступна, заявка **не теряется**: она пишется в лог сервера +(`[lead] payload was: …`) и сохраняется в `localStorage` браузера, а посетитель +видит телефон для связи. + +### Переменные окружения + +| Переменная | Обязательна | Описание | +|---|---|---| +| `AMO_SUBDOMAIN` | да | Поддомен аккаунта, например `exotherapy` | +| `AMO_LONG_LIVED_TOKEN` | да | Долгосрочный токен интеграции | +| `AMO_PIPELINE_ID` | нет | Воронка для сделок (по умолчанию `10980758`) | +| `AMO_RESPONSIBLE_USER_ID` | нет | Ответственный за сделку пользователь | +| `AMO_LEAD_TAGS` | нет | Теги через запятую для всех сделок | +| `PORT` | нет | Порт API/продакшен-сервера (`3000`) | +| `VITE_SITE_URL` | нет | Канонический адрес, подставляется в `canonical` и `og:` | +| `VITE_BASE_PATH` | нет | Подпуть размещения, например `/fitness/` (по умолчанию `/`) | + +--- + +## Структура + +``` +index.html точка входа Vite (meta, Open Graph, JSON-LD) +src/ + components/ секции лендинга и UI-примитивы + data/ весь текстовый контент и данные конструктора + hooks/ useConstructor, useReveal, useScrollState, … + lib/ отправка заявки, форматирование чисел + assets/images/ 14 изображений, извлечённых из исходного HTML + index.css дизайн-токены Tailwind v4 (@theme) и базовые стили +shared/lead.ts схема заявки (zod), общая для клиента и сервера +server/src/ Express API + клиент amoCRM +scripts/amo-check.ts диагностика подключения к amoCRM +legacy/index.html исходный однофайловый лендинг (визуальный эталон) +``` + +### Дизайн-система + +Цвета, радиусы, тени, брейкпоинты и вертикальный ритм заданы токенами в +`@theme` внутри `src/index.css`. Палитра Tailwind по умолчанию отключена +(`--color-*: initial`), поэтому в разметке доступны только цвета EXO. +Брейкпоинты соответствуют исходной вёрстке: `sm` 640, `md` 900, `lg` 1120, плюс +`max-width`-варианты `narrow` (760), `phone` (520), `compact` (680), `tiny` (480). + +Вёрстка совпадает с `legacy/index.html` попиксельно: высоты всех секций и общая +высота страницы идентичны на 375 / 480 / 640 / 900 / 1120 / 1440 px. + +### Шрифты + +Inter подключён локально пакетом `@fontsource-variable/inter` — внешних запросов +(Google Fonts и т.п.) страница не делает. Это вариативный шрифт с диапазоном +100–900, поэтому нестандартные веса из макета (760, 850, 900) отрисовываются +по-настоящему, а не округляются до `bold`. + +Подсеты разделены по `unicode-range`, браузер скачивает только нужные: + +| подсет | размер | зачем | +|---|---|---| +| latin | 48 КБ | латиница | +| cyrillic | 19 КБ | кириллица | +| latin-ext | 85 КБ | **только ради знака `₽`** | + +Итого ~152 КБ. Если 85 КБ ради одного символа кажутся лишними — уберите +`latin-ext`, и `₽` будет отрисовываться системным шрифтом. + +Символы `→ ↗ ↘ ≈` не входят ни в один подсет Inter у Google Fonts / Fontsource, +поэтому для них всегда используется системный фолбэк. Это заметно только при +очень крупном кегле. + +`Manrope` и `Segoe UI` остались в стеке `--font-sans` как фолбэк, но отдельно не +загружаются: Manrope недостижим, пока Inter грузится успешно, а Segoe UI — +проприетарный шрифт Microsoft, который нельзя раздавать с сайта. + +### Калькулятор + +`оплаченные программы в день × средний чек × рабочие дни = выручка в месяц`. + +--- + +## Известные особенности + +* `og:image` отдаётся по абсолютному адресу `VITE_SITE_URL` + `/og-image.webp`; + при смене домена обновите `VITE_SITE_URL` перед сборкой. diff --git a/fitnes/index.html b/fitnes/index.html new file mode 100644 index 0000000..7c9169f --- /dev/null +++ b/fitnes/index.html @@ -0,0 +1,44 @@ + + + + + + EXO Recovery Zone для фитнес-клубов | Экзо Групп + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/fitnes/legacy/index.html b/fitnes/legacy/index.html new file mode 100644 index 0000000..e2021d3 --- /dev/null +++ b/fitnes/legacy/index.html @@ -0,0 +1,915 @@ + + + + + + +EXO Recovery Zone для фитнес-клубов | Экзо Групп + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ EXO Performance / Recovery Zone +

Восстановление, которое удерживает клиента в клубе

+

Готовая зона внутри фитнес-центра: клиент проходит путь «тренировка → восстановление → контроль → следующий визит», не уходя во внешние клиники и recovery-студии.

+ +
+
3 аппаратакомпактное ядро под задачи клуба
+
5 аппаратовполный маршрут recovery и спорта
+
Окупаемостьот 6 месяцев — быстрый возврат инвестиций без риска заморозить деньги в оборудовании
+
+ Почему это актуально сейчас +
+ +
+
+
+
+
+Динамика рынка +

Фитнес рынок растет, но удерживать выручку только за счет удорожания абонемента становится все сложнее.

+

Клубу нужен принципиально новый продукт внутри сетки услуг: высокомаржинальный сервис восстановления, который увеличивает ARPU, LTV и удерживает людей в клубе.

+
+
+
+
+
263 млрд ₽+23%2024
+
316,5 млрд ₽+20%2025
+
365 млрд ₽+15% прогноз2026П
+
+
Оборот фитнес-услуг в Россиитемп: 23% → 20% → 15%
+
+
+Что меняется для собственника +
+
>50%
Рост всё больше ценовой

В I полугодии 2025 года повышение цен обеспечило более половины прироста рынка.

+
12%
Подписка меняет модель

Доля рекуррентных продаж карт достигла 12% в I квартале 2025 года, в Москве приблизилась к 20%.

+
66%
Удержание — ключевой резерв

Международный benchmark HFA: средняя годовая удерживаемость участников — около двух третей.

+
+

Источники: FitnessData, итоги 2025 и прогноз 2026; FitnessData, I полугодие 2025; HFA Benchmarking Report 2025.

+
+
+
+
+ +
+
+
+ Экономика действующей клиентской базы +

Клуб теряет деньги не на тренировке — а между посещениями

+

Более половины прироста рынка уже обеспечивается повышением цен, а средняя годовая удерживаемость составляет около 66%. Recovery Zone создаёт новую выручку без продажи ещё одной клубной карты.

+
+
+
>50%роста рынка — ценовойдальше повышать карту всё сложнее
+
34 из 100клиентов не удерживаютсярасчёт из benchmark 66%
+
≈88%продаж карт не рекуррентныерекуррентная доля — 12%
+
23→15%замедление темпа рынка2024 → прогноз 2026
+
+
+
+

Где клуб недополучает выручку

+
+
01
День без тренировки не монетизируетсяПри усталости, перегрузке или паузе клиент не приходит в клуб и не покупает дополнительный сервис.
+
02
Запрос уходит во внешние студииМассаж, восстановление и return-to-sport покупаются за пределами клуба.
+
03
ARPU растёт только вместе с ценой картыНовый доход появляется через подорожание, а не через новый продукт для действующей базы.
+
+
+
+

На чём зарабатывает клуб с Экзо

+
+
01
Разовые recovery-сессииОтдельная причина прийти в клуб после нагрузки или даже в день без тренировки.
+
02
Короткие курсы и пакетыВосстановление ног, подвижность, перезагрузка и возврат к нагрузке повышают ARPU.
+
03
Premium и рекомендации тренераRecovery усиливает membership, помогает удержанию и возвращает клиента к регулярной нагрузке.
+
+
+
+
+ Экономика строится на текущей базе, а не на дополнительном маркетинговом трафике +
+
3 аппаратакомпактное recovery-ядро
+
5 аппаратовполная платформа клуба
+
от 6 мес.заявленный ориентир окупаемости
+
4 каналасессии, пакеты, premium, PT
+
+

Итоговая конфигурация и экономика зависят от базы клуба, формата тренировок, выбранной модели работы, тарифов и загрузки зоны.

+
+
+
+ Простой расчёт +

Сколько зона восстановления может приносить клубу

+

Без процентов и сложных метрик: укажите продажи в день, средний чек и количество рабочих дней.

+
+
+
1Оплаченных программ
в день
+ × +
2Средний чек
программы
+ × +
3Рабочих дней
в месяц
+ = +
Дополнительная
выручка в месяц
+
+
+
+
+ + + Разовая сессия, пакет или короткий курс — одна продажа. +
+
+ + + Фактическая средняя сумма оплаты +
+
+ + + Сколько дней зона принимает клиентов +
+
+
+
Дополнительная выручка / месяцВведите программы в день и средний чек
+
Дополнительная выручка / годдо вычета расходов
+
+
+

Расчёт показывает сценарную выручку, а не финансовую гарантию. Итоговая модель уточняется по конфигурации аппаратов, тарифам, ФОТ, загрузке и формату работы Recovery Zone.

+
+
+
+ +
+
+
+Бизнес-эффект +

Следующий рост клуба — не ещё один тренажёр. Это восстановление

+

Зона встраивается в существующий клиентский поток и превращает паузу после нагрузки в понятный продукт клуба.

+
+
+
01 / LTV

Удержание

Появляется причина прийти даже в день без тренировки и не выпадать из привычного плана из-за перегрузки или дискомфорта.

+
02 / ARPU

Новая выручка

Процедуры, короткие курсы и recovery-пакеты монетизируют действующую базу без продажи ещё одной клубной карты.

+
03 / SALES

Роль тренера

Тренер замечает запрос, рекомендует маршрут восстановления и получает инструмент для возвращения клиента к нагрузке.

+
04 / BRAND

Новая аудитория

Premium-клиенты, спортсмены-любители, взрослые и корпоративные клиенты получают дополнительный аргумент выбрать клуб.

+
LTVLifetime Value — совокупная ценность клиента за весь период отношений с клубом.
ARPUAverage Revenue Per User — средняя выручка на одного клиента.
SALESSales — продажи и коммерческая конверсия.
BRANDBrand — бренд, его ценность и восприятие аудиторией.
+
+
+
+
+
+Конструктор EXO +

Не один комплект для всех. Собираем зону под ваш клуб

+

Выберите компактное ядро из трёх аппаратов или полную платформу из пяти. Финальная конфигурация определяется после аудита площади, потока, аудитории, формата тренировок.

+
+
+
+
Интерактивный подбор

Нажмите на аппараты — справа изменится состав и логика зоны.

+
+ + +
+
+
+
+

Состав зоны

Выберите ровно 3 аппарата

3 / 3
+
+ + + + + +
+
+ + + +
+
+
+
Пример зоны восстановления с тремя аппаратами в фитнес-клубеКомпактный форматПример визуализации. Итоговый рендер создаётся под выбранный состав и интерьер клуба.
+

Recovery Start — 3 аппарата

Компактный вход в recovery с флагманской, потоковой и автономной процедурой.

03
+
+
+ +
+
+
+
+
+
+
+
+Продукт для клиента +

Продаётся не аппарат. Продаётся понятный маршрут

+

Состав программы зависит от цели клиента, этапа тренировок и допуска специалиста. Клуб получает продукт, который проще объяснять, измерять и продавать курсом.

+
+
СИЛА И МЫШЦЫ

Готовность к тяжелым весам (Пауэрлифтинг / Бодибилдинг)

Комплексная подготовка опорно-двигательного аппарата к предельным нагрузкам. Устранение мышечной зажатости, проработка триггерных точек, фасциальный релиз и увеличение эластичности мягких тканей для безопасного приседа, жима и тяги.

Процедуры и связки: ЭкзоТекар + ЭкзоТерапия
Глубокий прогрев соединительной ткани, снятие блоков, подготовка нервной системы к взрывной работе.
БЕГ / КАРДИО

Восстановление ног и выносливости (Легкая атлетика / Сайклинг)

Мощный лимфодренаж и выведение продуктов распада (молочной кислоты) после длительного бега, функционального тренинга или «дня ног». Снятие ощущения «гудящих» мышц, устранение застойных явлений и запуск быстрой регенерации.

Процедуры и связки: ЭкзоПресс + ЭкзоВодород
Прессотерапия для вытеснения венозной крови и межтканевой жидкости + мощное антиоксидантное насыщение против клеточного стресса.
ПОДВИЖНОСТЬ И ГИБКОСТЬ

Локальный комфорт и амплитуда (Йога / Растяжка / Пилатес)

Увеличение подвижности заблокированных суставов (особенно тазобедренных и плечевых) и снятие жесткости фасций. Идеально для тех, кто хочет улучшить шпагат, разгрузить позвоночник и убрать скованность движений после сидячей работы.

Процедуры и связки: ЭкзоТекар + ЭкзоТерапия
Фасциальный массаж с глубоким прогревом для стимуляции выработки коллагена и эластичности.
ПОСЛЕ НАГРУЗКИ

Перезагрузка после активного дня (Кроссфит / Единоборства)

Быстрый перевод организма из режима максимального стресса (симпатическая нервная система) в режим глубокого отдыха (парасимпатика). Снижение общего воспалительного тонуса мышц, нормализация пульса и подготовка к комфортному ночному сну.

Процедуры и связки: ЭкзоТерапия + ЭкзоПресс
Стимуляция нервных окончаний для снятия осевой нагрузки с позвоночника + лимфодренажный массаж всего тела.
ВОЗВРАТ В СПОРТ

Безопасный возврат к тренировкам (После травм и пауз)

Мягкая и безопасная реабилитация внутри фитнес-клуба. Ускорение заживления растяжений, точечное снятие хронических воспалений в сухожилиях, восстановление мышечного тонуса и координации движений в пространстве (проприоцепции).

Процедуры и связки: Комбинация по протоколу: ЭкзоЛазер B + ЭкзоИмпульс
Локальная фотобиомодуляция для регенерации связок + глубокая электромагнитная стимуляция для пробуждения атрофированных мышц.
СТРЕСС И ПЕРЕЗАГРУЗКА

День восстановления (Фитнес без тренировки)

Сценарий посещения клуба без физических нагрузок. Полная релаксация, ликвидация умственного выгорания, синдрома хронической усталости и головных болей напряжения. Возвращение телесного комфорта и легкости за один сеанс.

Процедуры и связки: ЭкзоВодород + ЭкзоПресс
Ингаляции чистым водородом для снижения уровня стресса на клеточном уровне + мягкий релакс-массаж ног и тела.
+
Корректная коммуникация: не обещаем «сжигание жира», рост мышц от аппарата, лечение травмы без специалиста или гарантированный спортивный результат. В медицинском формате используются допуск, назначение, протокол и проверка противопоказаний.
+
+
+
+
+
+Визуальная концепция +

Recovery должен выглядеть частью фитнеса, а не «медицинским углом»

+

Используем готовые рендеры как отправную точку и создаём визуализацию под интерьер, площадь и выбранный конструктор вашего клуба.

+
+ + +
+
+ +
+
+
+Почему Экзо Групп +

Вы входите в готовую экосистему, где каждый бизнес-процесс уже автоматизирован.

+

Собственное производство, планировка пространства, меню готовых программ, обучение команды. Все это работает на окупаемость вашего клуба с первого дня.

+
+
4собственные клиники
+
70+клиник-партнёров
+
60+медицинских учреждений
+
2 млн+проведённых процедур
+
+
+
Оборудованиеподбор и поставка
+
Пространствопланировка и дизайн
+
Программыметодики и курсы
+
Обучениеоператоры и продажи
+
АналитикаKPI и повторные визиты
+
Масштабтиповой формат для сети
+
+
+ +
+
+
+
+
+
+
+ Персональная конфигурация +

Подберем индивидуальный комплект оборудования точно под формат вашего клуба.

+

Оставьте контакты — проведём первичный аудит потока и площади, предложим состав оборудования, формат размещения и визуальную концепцию.

+
+
состав аппаратов и роли каждого в зоне
+
вариант планировки и внешний вид в интерьере клуба
+
меню программ, обучение и сценарии рекомендаций
+
план запуска и контрольные показатели пилота
+
+
+
+

Получить конфигурацию

+

Выбранный в конструкторе состав автоматически добавится в заявку.

+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/fitnes/package-lock.json b/fitnes/package-lock.json new file mode 100644 index 0000000..ea323f7 --- /dev/null +++ b/fitnes/package-lock.json @@ -0,0 +1,3715 @@ +{ + "name": "exo-fitness-landing", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "exo-fitness-landing", + "version": "1.0.0", + "dependencies": { + "@fontsource-variable/inter": "^5.3.0", + "dotenv": "^17.4.2", + "express": "^5.2.1", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "tsx": "^4.23.12", + "zod": "^4.4.3" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.3.3", + "@types/express": "^5.0.6", + "@types/node": "^26.4.0", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.5", + "@vitejs/plugin-react": "^6.1.1", + "concurrently": "^10.0.5", + "tailwindcss": "^4.3.3", + "typescript": "^7.0.2", + "vite": "^8.2.2" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fontsource-variable/inter": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", + "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.147.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", + "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", + "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", + "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", + "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", + "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", + "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", + "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", + "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", + "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", + "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", + "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", + "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", + "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", + "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", + "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", + "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.3.tgz", + "integrity": "sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", + "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", + "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/concurrently": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.5.tgz", + "integrity": "sha512-JaP/CoftUrCcAFW/g//RbgEGwlelnEae6cfBLgH6ZdO6s8jPkn6p9SB9u6pdVxYXoiSnFqseOlHfrEfF82TVOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "5.6.2", + "rxjs": "7.8.2", + "shell-quote": "1.9.0", + "supports-color": "10.2.2", + "tree-kill": "1.2.2", + "yargs": "18.0.0" + }, + "bin": { + "conc": "dist/bin/index.js", + "concurrently": "dist/bin/index.js" + }, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", + "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/negotiator/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/rolldown": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", + "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.147.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.6", + "@rolldown/binding-android-arm64": "1.2.6", + "@rolldown/binding-darwin-arm64": "1.2.6", + "@rolldown/binding-darwin-x64": "1.2.6", + "@rolldown/binding-freebsd-x64": "1.2.6", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", + "@rolldown/binding-linux-arm64-gnu": "1.2.6", + "@rolldown/binding-linux-arm64-musl": "1.2.6", + "@rolldown/binding-linux-ppc64-gnu": "1.2.6", + "@rolldown/binding-linux-s390x-gnu": "1.2.6", + "@rolldown/binding-linux-x64-gnu": "1.2.6", + "@rolldown/binding-linux-x64-musl": "1.2.6", + "@rolldown/binding-openharmony-arm64": "1.2.6", + "@rolldown/binding-win32-arm64-msvc": "1.2.6", + "@rolldown/binding-win32-x64-msvc": "1.2.6" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shell-quote": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.23.12", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.12.tgz", + "integrity": "sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/fitnes/package.json b/fitnes/package.json new file mode 100644 index 0000000..52a7217 --- /dev/null +++ b/fitnes/package.json @@ -0,0 +1,37 @@ +{ + "name": "exo-fitness-landing", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "concurrently -n client,server -c cyan,magenta \"vite\" \"tsx watch server/src/index.ts\"", + "dev:client": "vite", + "dev:server": "tsx watch server/src/index.ts", + "build": "tsc -b && vite build", + "preview": "vite preview", + "start": "NODE_ENV=production tsx server/src/index.ts", + "typecheck": "tsc -b --force", + "amo:check": "tsx scripts/amo-check.ts" + }, + "dependencies": { + "@fontsource-variable/inter": "^5.3.0", + "dotenv": "^17.4.2", + "express": "^5.2.1", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "tsx": "^4.23.12", + "zod": "^4.4.3" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.3.3", + "@types/express": "^5.0.6", + "@types/node": "^26.4.0", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.5", + "@vitejs/plugin-react": "^6.1.1", + "concurrently": "^10.0.5", + "tailwindcss": "^4.3.3", + "typescript": "^7.0.2", + "vite": "^8.2.2" + } +} diff --git a/fitnes/public/favicon.svg b/fitnes/public/favicon.svg new file mode 100644 index 0000000..39ed792 --- /dev/null +++ b/fitnes/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fitnes/public/og-image.webp b/fitnes/public/og-image.webp new file mode 100644 index 0000000000000000000000000000000000000000..e948af5d1117869714744afaf9ca1b513d137f04 GIT binary patch literal 80148 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

A_8n<4gZvE^}UApZ; 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 a.sort - b.sort) +console.info(`✓ Pipeline ${pipeline.id}: «${pipeline.name}»`) +console.info(` Leads will be created in the first stage: «${stages[0]?.name ?? 'unknown'}»`) +console.info(` All stages: ${stages.map((s) => s.name).join(' → ')}\n`) + +const leadFields = await amo.getLeadFields() +const map = resolveLeadFieldMap(leadFields) + +console.info(`Lead data → amoCRM field mapping (${leadFields.length} custom fields in the account):`) +const keys = [ + 'company', + 'city', + 'club_format', + 'configuration', + 'comment', + 'page', + 'referrer', + 'form', + 'utm_source', + 'utm_medium', + 'utm_campaign', + 'utm_content', + 'utm_term', +] +for (const key of keys) { + const field = map.get(key) + console.info( + field + ? ` ✓ ${key.padEnd(14)} → «${field.name}» (id ${field.id}, ${field.type})` + : ` · ${key.padEnd(14)} → note on the lead`, + ) +} + +const contactFields = await amo.getContactFields() +const hasPhone = contactFields.some((f) => f.code === 'PHONE') +const hasEmail = contactFields.some((f) => f.code === 'EMAIL') +console.info(`\nContact fields: PHONE ${hasPhone ? '✓' : '✗ missing'}, EMAIL ${hasEmail ? '✓' : '✗ missing'}`) +console.info('\nAll good — the form is ready to create leads.') diff --git a/fitnes/server/src/amocrm.ts b/fitnes/server/src/amocrm.ts new file mode 100644 index 0000000..26f9edb --- /dev/null +++ b/fitnes/server/src/amocrm.ts @@ -0,0 +1,247 @@ +import type { AmoConfig } from './config.ts' + +/* -------------------------------------------------------------------------- */ +/* amoCRM REST types (only the parts this integration touches) */ +/* -------------------------------------------------------------------------- */ + +export interface AmoEnum { + id: number + value: string + enum_code?: string | null +} + +export interface AmoCustomField { + id: number + name: string + code: string | null + type: string + enums?: AmoEnum[] | null +} + +interface AmoFieldValue { + value: string | number | boolean | null + enum_id?: number + enum_code?: string +} + +export interface AmoFieldEntry { + field_id?: number + field_code?: string + values: AmoFieldValue[] +} + +export interface AmoContact { + id: number + name?: string + custom_fields_values?: AmoFieldEntry[] | null +} + +export interface AmoLead { + id: number +} + +export class AmoError extends Error { + constructor( + message: string, + readonly status?: number, + readonly detail?: unknown, + ) { + super(message) + this.name = 'AmoError' + } +} + +/* -------------------------------------------------------------------------- */ +/* Client */ +/* -------------------------------------------------------------------------- */ + +const RETRYABLE = new Set([429, 500, 502, 503, 504]) + +export class AmoClient { + private leadFields?: Promise + private contactFields?: Promise + + constructor(private readonly config: AmoConfig) {} + + get baseUrl(): string { + return this.config.baseUrl + } + + /** + * A single amoCRM call. Returns `null` for 204 responses, which amoCRM uses + * for "found nothing" on every collection endpoint. + */ + private async request( + path: string, + init: { method?: string; body?: unknown; query?: Record } = {}, + attempt = 1, + ): Promise { + const url = new URL(path, this.config.baseUrl) + for (const [key, value] of Object.entries(init.query ?? {})) { + if (value !== undefined) url.searchParams.set(key, String(value)) + } + + let response: Response + try { + response = await fetch(url, { + method: init.method ?? 'GET', + headers: { + Authorization: `Bearer ${this.config.token}`, + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + body: init.body === undefined ? undefined : JSON.stringify(init.body), + signal: AbortSignal.timeout(15_000), + }) + } catch (cause) { + if (attempt < 3) { + await sleep(attempt * 400) + return this.request(path, init, attempt + 1) + } + throw new AmoError(`amoCRM unreachable: ${(cause as Error).message}`) + } + + if (response.status === 204) return null + + if (!response.ok) { + const detail = await response.text().catch(() => '') + if (RETRYABLE.has(response.status) && attempt < 3) { + await sleep(attempt * 700) + return this.request(path, init, attempt + 1) + } + if (response.status === 401) { + throw new AmoError('amoCRM rejected the token (401). Regenerate the long-lived token.', 401, detail) + } + throw new AmoError(`amoCRM ${init.method ?? 'GET'} ${path} failed: ${response.status}`, response.status, detail) + } + + return (await response.json()) as T + } + + /* ---------------------------------------------------------------------- */ + /* Field metadata — fetched once per process, then reused */ + /* ---------------------------------------------------------------------- */ + + private async fetchFields(entity: 'leads' | 'contacts'): Promise { + const collected: AmoCustomField[] = [] + for (let page = 1; page <= 10; page++) { + const res = await this.request<{ _embedded?: { custom_fields?: AmoCustomField[] } }>( + `/api/v4/${entity}/custom_fields`, + { query: { page, limit: 250 } }, + ) + const batch = res?._embedded?.custom_fields ?? [] + collected.push(...batch) + if (batch.length < 250) break + } + return collected + } + + getLeadFields(): Promise { + this.leadFields ??= this.fetchFields('leads') + return this.leadFields + } + + getContactFields(): Promise { + this.contactFields ??= this.fetchFields('contacts') + return this.contactFields + } + + /* ---------------------------------------------------------------------- */ + /* Contacts */ + /* ---------------------------------------------------------------------- */ + + /** Full-text search. amoCRM matches phones and emails regardless of format. */ + async findContact(queries: string[]): Promise { + for (const query of queries) { + if (!query) continue + const res = await this.request<{ _embedded?: { contacts?: AmoContact[] } }>('/api/v4/contacts', { + query: { query, limit: 1, with: 'leads' }, + }) + const contact = res?._embedded?.contacts?.[0] + if (contact) return contact + } + return null + } + + async createContact(input: { name: string; fields: AmoFieldEntry[] }): Promise { + const res = await this.request<{ _embedded?: { contacts?: AmoContact[] } }>('/api/v4/contacts', { + method: 'POST', + body: [ + { + name: input.name, + responsible_user_id: this.config.responsibleUserId, + custom_fields_values: input.fields.length ? input.fields : undefined, + }, + ], + }) + const contact = res?._embedded?.contacts?.[0] + if (!contact) throw new AmoError('amoCRM did not return the created contact') + return contact + } + + /** Adds phone/email to an existing contact without dropping what is there. */ + async appendContactFields(contactId: number, fields: AmoFieldEntry[]): Promise { + if (!fields.length) return + await this.request(`/api/v4/contacts/${contactId}`, { + method: 'PATCH', + body: { custom_fields_values: fields }, + }) + } + + /* ---------------------------------------------------------------------- */ + /* Leads */ + /* ---------------------------------------------------------------------- */ + + /** + * Creates the lead in the configured pipeline. Omitting `status_id` makes + * amoCRM drop it into that pipeline's first stage, which is what we want. + */ + async createLead(input: { name: string; contactId: number; fields: AmoFieldEntry[]; tags: string[] }): Promise { + const embedded: Record = { contacts: [{ id: input.contactId }] } + const tags = [...new Set([...this.config.tags, ...input.tags])] + if (tags.length) embedded.tags = tags.map((name) => ({ name })) + + const res = await this.request<{ _embedded?: { leads?: AmoLead[] } }>('/api/v4/leads', { + method: 'POST', + body: [ + { + name: input.name, + pipeline_id: this.config.pipelineId, + responsible_user_id: this.config.responsibleUserId, + custom_fields_values: input.fields.length ? input.fields : undefined, + _embedded: embedded, + }, + ], + }) + const lead = res?._embedded?.leads?.[0] + if (!lead) throw new AmoError('amoCRM did not return the created lead') + return lead + } + + async addLeadNote(leadId: number, text: string): Promise { + await this.request(`/api/v4/leads/${leadId}/notes`, { + method: 'POST', + body: [{ note_type: 'common', params: { text } }], + }) + } + + /* ---------------------------------------------------------------------- */ + /* Diagnostics */ + /* ---------------------------------------------------------------------- */ + + async getAccount(): Promise<{ id: number; name: string; subdomain: string } | null> { + return this.request('/api/v4/account') + } + + async getPipeline(id: number): Promise<{ + id: number + name: string + _embedded?: { statuses?: { id: number; name: string; sort: number }[] } + } | null> { + return this.request(`/api/v4/leads/pipelines/${id}`) + } +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)) +} diff --git a/fitnes/server/src/config.ts b/fitnes/server/src/config.ts new file mode 100644 index 0000000..0bc47cc --- /dev/null +++ b/fitnes/server/src/config.ts @@ -0,0 +1,58 @@ +import { config as loadEnv } from 'dotenv' + +loadEnv() + +function optional(name: string): string | undefined { + const value = process.env[name]?.trim() + return value ? value : undefined +} + +function optionalNumber(name: string): number | undefined { + const raw = optional(name) + if (raw === undefined) return undefined + const value = Number(raw) + if (!Number.isFinite(value)) throw new Error(`${name} must be a number, got "${raw}"`) + return value +} + +/** + * amoCRM settings. Deliberately not throwing when they are missing: the site + * must still boot and serve pages without a CRM connection — only the lead + * endpoint degrades, and it says so explicitly. + */ +export interface AmoConfig { + baseUrl: string + token: string + pipelineId: number + responsibleUserId?: number + tags: string[] +} + +export function readAmoConfig(): AmoConfig | null { + const subdomain = optional('AMO_SUBDOMAIN') + const token = optional('AMO_LONG_LIVED_TOKEN') + if (!subdomain || !token) return null + + // Accepts "exotherapy", "exotherapy.amocrm.ru", or a full URL (an explicit + // scheme is kept as-is, which is what local mocks and self-hosted setups need). + const host = subdomain.replace(/\/+$/, '') + const baseUrl = /^https?:\/\//.test(host) + ? host + : `https://${host.includes('.') ? host : `${host}.${optional('AMO_DOMAIN') ?? 'amocrm.ru'}`}` + + return { + baseUrl, + token, + pipelineId: optionalNumber('AMO_PIPELINE_ID') ?? 10980758, + responsibleUserId: optionalNumber('AMO_RESPONSIBLE_USER_ID'), + tags: (optional('AMO_LEAD_TAGS') ?? '') + .split(',') + .map((t) => t.trim()) + .filter(Boolean), + } +} + +export const serverConfig = { + port: optionalNumber('PORT') ?? 3000, + isProduction: process.env.NODE_ENV === 'production', +} diff --git a/fitnes/server/src/index.ts b/fitnes/server/src/index.ts new file mode 100644 index 0000000..208e5d5 --- /dev/null +++ b/fitnes/server/src/index.ts @@ -0,0 +1,112 @@ +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import express from 'express' +import { leadSchema, type LeadResponse } from '../../shared/lead.ts' +import { AmoClient, AmoError } from './amocrm.ts' +import { readAmoConfig, serverConfig } from './config.ts' +import { LeadService } from './lead-service.ts' +import { createRateLimiter } from './rate-limit.ts' + +const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..') +const clientDir = path.join(rootDir, 'dist/client') + +const amoConfig = readAmoConfig() +const leadService = amoConfig ? new LeadService(new AmoClient(amoConfig)) : null + +if (!leadService) { + console.warn( + '[amo] AMO_SUBDOMAIN / AMO_LONG_LIVED_TOKEN are not set — the site runs, but /api/leads/* will return 503.', + ) +} + +const app = express() +app.set('trust proxy', true) +app.use(express.json({ limit: '64kb' })) + +const limiter = createRateLimiter({ limit: 8, windowMs: 10 * 60 * 1000 }) + +app.get('/api/health', (_req, res) => { + res.json({ ok: true, amo: Boolean(leadService), pipelineId: amoConfig?.pipelineId ?? null }) +}) + +app.post('/api/leads/fitness-centers', async (req, res) => { + const send = (status: number, body: LeadResponse) => res.status(status).json(body) + + const parsed = leadSchema.safeParse(req.body) + if (!parsed.success) { + const fields: Record = {} + for (const issue of parsed.error.issues) { + const key = issue.path.join('.') + if (key && !fields[key]) fields[key] = issue.message + } + return send(400, { ok: false, error: 'Проверьте заполненные поля.', fields }) + } + + const payload = parsed.data + + // Honeypot: answer exactly like a success so bots learn nothing. + if (payload.website) { + console.info('[lead] honeypot triggered from %s', req.ip) + return send(200, { ok: true, leadId: 0, contactId: 0 }) + } + + const { allowed, retryAfterSeconds } = limiter(req.ip ?? 'unknown') + if (!allowed) { + res.setHeader('Retry-After', String(retryAfterSeconds)) + return send(429, { ok: false, error: 'Слишком много заявок с этого адреса. Попробуйте позже.' }) + } + + if (!leadService) { + // Never drop a real lead silently — it must be findable in the logs. + console.error('[lead] amoCRM is not configured. Lead payload:', JSON.stringify(payload)) + return send(503, { ok: false, error: 'Форма временно недоступна. Позвоните нам: +7 939 717-80-80.' }) + } + + try { + const result = await leadService.submit(payload) + console.info( + '[lead] amoCRM lead %d (contact %d, %s)', + result.leadId, + result.contactId, + result.contactCreated ? 'new contact' : 'existing contact', + ) + return send(200, { ok: true, leadId: result.leadId, contactId: result.contactId }) + } catch (error) { + console.error('[lead] amoCRM submission failed:', error) + console.error('[lead] payload was:', JSON.stringify(payload)) + const message = + error instanceof AmoError && error.status === 401 + ? 'CRM отклонила запрос. Мы уже разбираемся — позвоните нам: +7 939 717-80-80.' + : 'Не удалось отправить заявку. Позвоните нам: +7 939 717-80-80.' + return send(502, { ok: false, error: message }) + } +}) + +if (serverConfig.isProduction) { + app.use( + express.static(clientDir, { + index: false, + setHeaders(res, filePath) { + // Vite fingerprints everything under /assets, so it can be cached hard. + if (filePath.includes(`${path.sep}assets${path.sep}`)) { + res.setHeader('Cache-Control', 'public, max-age=31536000, immutable') + } + }, + }), + ) + + // SPA fallback. Written as middleware because Express 5 no longer accepts a + // bare '*' route pattern. + app.use((req, res, next) => { + if (req.method !== 'GET' || req.path.startsWith('/api/')) return next() + res.sendFile(path.join(clientDir, 'index.html')) + }) +} + +app.listen(serverConfig.port, () => { + console.info( + '[server] listening on http://localhost:%d%s', + serverConfig.port, + serverConfig.isProduction ? ` (serving ${path.relative(rootDir, clientDir)})` : ' (API only — run vite for the UI)', + ) +}) diff --git a/fitnes/server/src/lead-mapper.ts b/fitnes/server/src/lead-mapper.ts new file mode 100644 index 0000000..62f20c7 --- /dev/null +++ b/fitnes/server/src/lead-mapper.ts @@ -0,0 +1,153 @@ +import type { LeadPayload } from '../../shared/lead.ts' +import type { AmoCustomField, AmoFieldEntry } from './amocrm.ts' + +/** Human labels used in the fallback note. */ +const LABELS: Record = { + company: 'Фитнес-клуб / сеть', + email: 'Email', + phone: 'Телефон', + city: 'Город', + club_format: 'Формат', + comment: 'Комментарий', + configuration: 'Конфигурация из конструктора', + page: 'Страница', + referrer: 'Источник перехода', + form: 'Форма', + utm_source: 'utm_source', + utm_medium: 'utm_medium', + utm_campaign: 'utm_campaign', + utm_content: 'utm_content', + utm_term: 'utm_term', +} + +/** + * Candidate amoCRM field codes / name fragments for each piece of data we + * collect. The first field in the account that matches wins; anything without + * a match falls through to the lead note instead. + */ +const CANDIDATES: Record = { + company: { codes: ['COMPANY', 'COMPANY_NAME'], names: ['компания', 'организация', 'название клуба', 'клуб', 'сеть'] }, + city: { codes: ['CITY'], names: ['город'] }, + club_format: { codes: ['CLUB_FORMAT', 'FORMAT'], names: ['формат клуба', 'формат', 'тип клуба'] }, + configuration: { + codes: ['CONFIGURATION', 'EQUIPMENT'], + names: ['конфигурация', 'комплектация', 'состав оборудования', 'оборудование'], + }, + comment: { codes: ['COMMENT', 'MESSAGE', 'DESCRIPTION'], names: ['комментарий', 'сообщение', 'описание заявки'] }, + page: { codes: ['REFERRER', 'PAGE'], names: ['страница', 'посадочная страница', 'url страницы'] }, + referrer: { codes: ['REFERER_URL'], names: ['источник перехода', 'referrer', 'реферер'] }, + form: { codes: ['FORMNAME', 'FORM_NAME'], names: ['название формы', 'форма'] }, + utm_source: { codes: ['UTM_SOURCE'], names: ['utm_source'] }, + utm_medium: { codes: ['UTM_MEDIUM'], names: ['utm_medium'] }, + utm_campaign: { codes: ['UTM_CAMPAIGN'], names: ['utm_campaign'] }, + utm_content: { codes: ['UTM_CONTENT'], names: ['utm_content'] }, + utm_term: { codes: ['UTM_TERM'], names: ['utm_term'] }, +} + +/** Field types we know how to write a plain string into. */ +const TEXTUAL = new Set(['text', 'textarea', 'url', 'tracking_data', 'numeric', 'price', 'monetary']) +const ENUMERATED = new Set(['select', 'radiobutton', 'multiselect']) + +const normalise = (value: string) => + value + .toLowerCase() + .replace(/ё/g, 'е') + .replace(/[^a-zа-я0-9]+/gi, ' ') + .trim() + +export type LeadFieldMap = Map + +/** Picks one account field per payload key. A field is never used twice. */ +export function resolveLeadFieldMap(fields: AmoCustomField[]): LeadFieldMap { + const map: LeadFieldMap = new Map() + const taken = new Set() + + for (const [key, candidate] of Object.entries(CANDIDATES)) { + const byCode = fields.find( + (f) => f.code && candidate.codes.includes(f.code.toUpperCase()) && !taken.has(f.id), + ) + const match = + byCode ?? + fields.find((f) => { + if (taken.has(f.id)) return false + const name = normalise(f.name) + return candidate.names.some((n) => name === normalise(n)) + }) ?? + fields.find((f) => { + if (taken.has(f.id)) return false + const name = normalise(f.name) + return candidate.names.some((n) => name.includes(normalise(n))) + }) + + if (!match) continue + if (!TEXTUAL.has(match.type) && !ENUMERATED.has(match.type)) continue + map.set(key, match) + taken.add(match.id) + } + + return map +} + +/** Builds one amoCRM field entry, or null when the value cannot be represented. */ +function toFieldEntry(field: AmoCustomField, value: string): AmoFieldEntry | null { + if (ENUMERATED.has(field.type)) { + const target = normalise(value) + const option = field.enums?.find((e) => normalise(e.value) === target) + // An unmatched option would silently create garbage, so let it hit the note. + return option ? { field_id: field.id, values: [{ value: option.value, enum_id: option.id }] } : null + } + + if (field.type === 'numeric' || field.type === 'price' || field.type === 'monetary') { + const numeric = Number(value.replace(/[^\d.,-]/g, '').replace(',', '.')) + return Number.isFinite(numeric) ? { field_id: field.id, values: [{ value: numeric }] } : null + } + + return { field_id: field.id, values: [{ value }] } +} + +export interface MappedLead { + fields: AmoFieldEntry[] + /** Everything that had no matching field, ready to be written as a note. */ + note: string +} + +export function mapLead(payload: LeadPayload, fieldMap: LeadFieldMap): MappedLead { + const data: Record = { + company: payload.company, + city: payload.city, + club_format: payload.club_format, + configuration: payload.configuration, + comment: payload.comment, + page: payload.page, + referrer: payload.referrer, + form: payload.form === 'callback' ? 'Быстрый обратный звонок' : 'Заявка на конфигурацию', + ...payload.utm, + } + + const fields: AmoFieldEntry[] = [] + const leftovers: string[] = [] + + for (const [key, value] of Object.entries(data)) { + if (!value) continue + const field = fieldMap.get(key) + const entry = field ? toFieldEntry(field, value) : null + if (entry) fields.push(entry) + else leftovers.push(`${LABELS[key] ?? key}: ${value}`) + } + + // Contact details are always repeated in the note so a manager can read the + // whole request without opening the linked contact card. + const header = [ + `Заявка с лендинга «EXO Recovery Zone для фитнес-клубов»`, + `${LABELS.phone}: ${payload.phone}`, + payload.email ? `${LABELS.email}: ${payload.email}` : undefined, + ].filter(Boolean) as string[] + + return { fields, note: [...header, ...leftovers].join('\n') } +} + +/** Lead title shown in the pipeline. */ +export function buildLeadName(payload: LeadPayload): string { + const who = payload.company ?? payload.name + return payload.form === 'callback' ? `Обратный звонок — ${who}` : `Recovery Zone — ${who}` +} diff --git a/fitnes/server/src/lead-service.ts b/fitnes/server/src/lead-service.ts new file mode 100644 index 0000000..2ffa5a3 --- /dev/null +++ b/fitnes/server/src/lead-service.ts @@ -0,0 +1,124 @@ +import type { LeadPayload } from '../../shared/lead.ts' +import { AmoClient, type AmoContact, type AmoFieldEntry } from './amocrm.ts' +import { buildLeadName, mapLead, resolveLeadFieldMap, type LeadFieldMap } from './lead-mapper.ts' + +const digitsOnly = (value: string) => value.replace(/\D/g, '') + +/** + * Last ten digits — the part that is stable across "+7 (999) 123-45-67", + * "8 999 1234567" and "9991234567". Used to decide whether amoCRM already + * knows a phone number. + */ +const phoneKey = (value: string) => digitsOnly(value).slice(-10) + +/** + * amoCRM's full-text search matches digit substrings, but a contact stored as + * "+7 999…" is not found by a query starting with "8 999…". Try every spelling + * a Russian visitor might type. + */ +function phoneQueries(phone: string): string[] { + const digits = digitsOnly(phone) + const queries = new Set([phone.trim(), digits]) + if (digits.length >= 10) { + const national = digits.slice(-10) + queries.add(national) + queries.add(`7${national}`) + queries.add(`8${national}`) + } + return [...queries].filter(Boolean) +} + +/** Reads the values already stored in a contact's standard multitext field. */ +function existingValues(contact: AmoContact, code: 'PHONE' | 'EMAIL'): string[] { + const entry = contact.custom_fields_values?.find((f) => f.field_code === code) + return (entry?.values ?? []).map((v) => String(v.value ?? '')).filter(Boolean) +} + +function contactFieldEntries(payload: LeadPayload): AmoFieldEntry[] { + const entries: AmoFieldEntry[] = [ + { field_code: 'PHONE', values: [{ value: payload.phone, enum_code: 'WORK' }] }, + ] + if (payload.email) { + entries.push({ field_code: 'EMAIL', values: [{ value: payload.email, enum_code: 'WORK' }] }) + } + return entries +} + +export interface CreatedLead { + leadId: number + contactId: number + contactCreated: boolean +} + +export class LeadService { + private fieldMap?: Promise + + constructor(private readonly amo: AmoClient) {} + + private getFieldMap(): Promise { + this.fieldMap ??= this.amo.getLeadFields().then(resolveLeadFieldMap) + return this.fieldMap + } + + async submit(payload: LeadPayload): Promise { + const fieldMap = await this.getFieldMap() + + // 1. Reuse the existing contact when the phone or email is already known. + const existing = await this.amo.findContact([...phoneQueries(payload.phone), payload.email ?? '']) + + let contactId: number + let contactCreated = false + + if (existing) { + contactId = existing.id + // Add whichever channel amoCRM does not have on file yet. + const missing: AmoFieldEntry[] = [] + const knownPhones = existingValues(existing, 'PHONE').map(phoneKey) + if (!knownPhones.includes(phoneKey(payload.phone))) { + missing.push({ + field_code: 'PHONE', + values: [ + ...existingValues(existing, 'PHONE').map((value) => ({ value })), + { value: payload.phone, enum_code: 'WORK' }, + ], + }) + } + if (payload.email) { + const knownEmails = existingValues(existing, 'EMAIL').map((e) => e.toLowerCase()) + if (!knownEmails.includes(payload.email.toLowerCase())) { + missing.push({ + field_code: 'EMAIL', + values: [ + ...existingValues(existing, 'EMAIL').map((value) => ({ value })), + { value: payload.email, enum_code: 'WORK' }, + ], + }) + } + } + await this.amo.appendContactFields(contactId, missing) + } else { + const created = await this.amo.createContact({ name: payload.name, fields: contactFieldEntries(payload) }) + contactId = created.id + contactCreated = true + } + + // 2. Lead in the configured pipeline, first stage. + const { fields, note } = mapLead(payload, fieldMap) + const lead = await this.amo.createLead({ + name: buildLeadName(payload), + contactId, + fields, + tags: [payload.form === 'callback' ? 'обратный звонок' : 'заявка с сайта'], + }) + + // 3. Everything the account has no field for lands in a readable note. + // A failed note must not fail the lead — the lead is the valuable part. + if (note) { + await this.amo.addLeadNote(lead.id, note).catch((error: unknown) => { + console.warn('[amo] lead %d created but the note failed:', lead.id, error) + }) + } + + return { leadId: lead.id, contactId, contactCreated } + } +} diff --git a/fitnes/server/src/rate-limit.ts b/fitnes/server/src/rate-limit.ts new file mode 100644 index 0000000..9a01b13 --- /dev/null +++ b/fitnes/server/src/rate-limit.ts @@ -0,0 +1,33 @@ +interface Bucket { + count: number + resetAt: number +} + +/** + * Minimal fixed-window limiter for the public lead endpoint. In-memory on + * purpose: a single landing page behind one Node process does not warrant a + * shared store, and losing the counters on restart is harmless. + */ +export function createRateLimiter(options: { limit: number; windowMs: number }) { + const buckets = new Map() + + return function check(key: string): { allowed: boolean; retryAfterSeconds: number } { + const now = Date.now() + + if (buckets.size > 5000) { + for (const [k, bucket] of buckets) if (bucket.resetAt <= now) buckets.delete(k) + } + + const bucket = buckets.get(key) + if (!bucket || bucket.resetAt <= now) { + buckets.set(key, { count: 1, resetAt: now + options.windowMs }) + return { allowed: true, retryAfterSeconds: 0 } + } + + bucket.count += 1 + return { + allowed: bucket.count <= options.limit, + retryAfterSeconds: Math.ceil((bucket.resetAt - now) / 1000), + } + } +} diff --git a/fitnes/shared/lead.ts b/fitnes/shared/lead.ts new file mode 100644 index 0000000..0cf3ee4 --- /dev/null +++ b/fitnes/shared/lead.ts @@ -0,0 +1,44 @@ +import { z } from 'zod' + +/** Which form on the page produced the lead. Surfaces as an amoCRM tag. */ +export const leadFormIds = ['request', 'callback'] as const +export type LeadFormId = (typeof leadFormIds)[number] + +export const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'] as const + +const optionalText = (max: number) => + z + .string() + .trim() + .max(max) + .optional() + .transform((v) => (v ? v : undefined)) + +export const leadSchema = z.object({ + form: z.enum(leadFormIds), + name: z.string().trim().min(1, 'Укажите имя').max(200), + phone: z.string().trim().min(5, 'Укажите телефон').max(50), + email: z + .union([z.email().max(200), z.literal('')]) + .optional() + .transform((v) => (v ? v : undefined)), + company: optionalText(200), + city: optionalText(120), + club_format: optionalText(120), + comment: optionalText(4000), + configuration: optionalText(600), + page: optionalText(300), + referrer: optionalText(500), + // partialRecord, not record: z.record over an enum requires every key. + utm: z.partialRecord(z.enum(utmKeys), z.string().max(300)).optional(), + /** Honeypot. Bots fill it in; humans never see it. */ + website: z.string().max(200).optional(), +}) + +export type LeadPayload = z.infer +/** What the client sends — before zod's optional/empty-string normalisation. */ +export type LeadInput = z.input + +export type LeadResponse = + | { ok: true; leadId: number; contactId: number } + | { ok: false; error: string; fields?: Record } diff --git a/fitnes/src/App.tsx b/fitnes/src/App.tsx new file mode 100644 index 0000000..d19d311 --- /dev/null +++ b/fitnes/src/App.tsx @@ -0,0 +1,56 @@ +import { useCallback, useState } from 'react' +import { BenefitsSection } from './components/BenefitsSection' +import { CallbackModal } from './components/CallbackModal' +import { ConstructorSection } from './components/ConstructorSection' +import { EconomicsSection } from './components/EconomicsSection' +import { GallerySection, type GalleryImage } from './components/GallerySection' +import { Hero } from './components/Hero' +import { ImageModal } from './components/ImageModal' +import { MarketSection } from './components/MarketSection' +import { MobileCta } from './components/MobileCta' +import { ProgramsSection } from './components/ProgramsSection' +import { RequestSection } from './components/RequestSection' +import { SiteFooter } from './components/SiteFooter' +import { SiteHeader } from './components/SiteHeader' +import { WhyExoSection } from './components/WhyExoSection' +import { useConstructor } from './hooks/useConstructor' +import { useScrollState } from './hooks/useScrollState' + +export default function App() { + const { scrolled, showMobileCta } = useScrollState() + const constructor = useConstructor() + + const [lightbox, setLightbox] = useState(null) + const [callbackOpen, setCallbackOpen] = useState(false) + const [commentPrefill, setCommentPrefill] = useState('') + + const openCallback = useCallback(() => setCallbackOpen(true), []) + const closeCallback = useCallback(() => setCallbackOpen(false), []) + const closeLightbox = useCallback(() => setLightbox(null), []) + + return ( + <> + + +

+ + + + + setCommentPrefill(constructor.requestComment)} + /> + + + + +
+ + + + + + + ) +} diff --git a/fitnes/src/assets/images/config-five.webp b/fitnes/src/assets/images/config-five.webp new file mode 100644 index 0000000000000000000000000000000000000000..63032da1ed085059e8a53495582af1645f2eaf03 GIT binary patch literal 116424 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