commit 4a589825c214d05a29fe54e568f2f4dad4a191f7 Author: Web-serfer Date: Mon Mar 30 20:21:41 2026 +0500 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b709a63 --- /dev/null +++ b/.gitignore @@ -0,0 +1,60 @@ +# === Зависимости === + +node_modules/ +frontend/node_modules/ +backend/node_modules/ + +# === Переменные окружения === +.env +.env.local +.env.production +.env.*.local + +# === Сборочные артефакты === +frontend/dist/ +dist/ + +# === Данные PocketBase (база данных) === +backend/pb_data/ + +# === Логи === +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +build.log + +# === IDE === +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# === macOS === +.DS_Store +Thumbs.db + +# === Временные файлы === +*.tmp +*.temp +.cache/ + +# === Astro === +.astro/ + +# === Genkit === +.genkit/ + +# === Qwen Code === +.qwen/ + +# === Frontend specific === +frontend/build.log +frontend/.vscode/ + +# === Docs === +docs/ + + diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..8fdd954 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..4669bff --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# Адвокатское бюро в Сургуте | Профессиональная юридическая помощь + +![Скриншот сайта](./frontend/public/images/gitImage.jpg) + +--- + +## 🏛️ О бюро + +**Адвокатское бюро в Сургуте** — это профессиональная юридическая помощь с более чем 20-летним опытом успешной практики. Мы специализируемся на решении сложных правовых вопросов в Ханты-Мансийском автономном округе. + +> **21 год** безупречной репутации и сотни выигранных дел в судах ХМАО-Югры. + +--- + +## ⚖️ Основные направления практики + +### Для физических лиц +- **Уголовные дела** — защита на всех стадиях уголовного процесса +- **Гражданские споры** — имущественные, жилищные, семейные дела +- **Семейное право** — развод, раздел имущества, алименты, опека +- **Защита должников** — списание долгов, банкротство физлиц + +### Для бизнеса +- **Арбитражные дела** — экономические споры, взыскание задолженности +- **Административные дела** — споры с государственными органами +- **Юридическое сопровождение** — комплексная защита бизнеса + +--- + +## 🎯 Почему выбирают нас + +| Преимущество | Описание | +|-------------|----------| +| **20+ лет практики** | Глубокое знание законодательства и судебной практики | +| **98% успешных дел** | Доказанная эффективность в судах всех инстанций | +| **6000+ клиентов** | Доверие тысяч людей и организаций | +| **24/7 на связи** | Оперативная поддержка в критических ситуациях | +| **Конфиденциально** | Полная защита адвокатской тайны | + +--- + +## 📞 Контакты + +### Связаться с адвокатом + +- **Телефон:** [+7 (922) 253-83-75](tel:+79222538375) +- **Email:** [info@advokat086.ru](mailto:info@advokat086.ru) +- **Адрес:** г. Сургут, пр. Комсомольский, 19 + +### Режим работы + +- **Будние дни:** 09:00 — 18:00 +- **Выходные:** по записи +- **Приём:** только по предварительной записи + +--- + +## 🌐 Официальный сайт + +Посетите наш сайт для получения подробной информации: + +### [**https://advokat086.ru**](https://advokat086.ru) + +На сайте вы найдёте: +- 📋 Подробную информацию об услугах и ценах +- 📚 Полезные статьи и правовые новости +- 💬 Отзывы реальных клиентов +- 📝 Форму для записи на консультацию + +--- + +## 📍 Регионы обслуживания + +- Сургут +- Ханты-Мансийск +- Нефтеюганск +- Нижневартовск +- Когалым +- Другие города ХМАО-Югры + +--- + +## 🔍 Поиск по сайту + +Для поисковых систем и ботов: + +**Ключевые слова:** адвокат Сургут, юрист ХМАО, юридическая помощь, уголовные дела, арбитраж, банкротство, семейный юрист, защита в суде, консультация адвоката, правовая поддержка. + +**Официальный сайт:** [https://advokat086.ru](https://advokat086.ru) + +--- + +## ⚡ Быстрая связь + +Не откладывайте решение правовой проблемы на потом! + +📞 **Позвоните прямо сейчас:** [+7 (922) 253-83-75](tel:+79222538375) + +💬 **Или посетите сайт:** [advokat086.ru](https://advokat086.ru) + +--- + +*Адвокатское бюро в Сургуте — ваша надёжная правовая защита с 2005 года.* diff --git a/backend/CHANGELOG.md b/backend/CHANGELOG.md new file mode 100644 index 0000000..e4184ec --- /dev/null +++ b/backend/CHANGELOG.md @@ -0,0 +1,849 @@ +## v0.36.2 + +- Updated `modernc.org/sqlite` to v1.44.3 _(race check fix)_, `goja` _(circular references fix)_ and other go deps. + +- Other minor fixes _(updated tests to silence some of the race detector errors, updated `FindFirstRecordByData` with more clear error message when missing or invalid key is used, etc.)_. + + +## v0.36.1 + +- Reverted the `DISTINCT` with `GROUP BY` replacement optimization from v0.36.0 as it was reported to negatively impact the indexes utilization for some queries +and the minor performance boost that you may get when used on large records is not enough to justify the more common use ([#7461](https://github.com/pocketbase/pocketbase/discussions/7461)). + _A better generic deduplication optimization for large records (aka. records with large `text`/`json` fields or many small ones) will be researched but there are no ETAs._ + +- Updated `modernc.org/sqlite` to v1.44.2 _(SQLite 3.51.2)_. + +- Fixed code comment typos. + + +## v0.36.0 + +- List query and API rules optimizations: + - Removed unnecessary correlated subquery expression when using back-relations via single `relation` field. + - Replaced `DISTINCT` with `GROUP BY id` when rows deduplication is needed and when deemed safe. + _This should help with having a more stable and predictable performance even if the collection records are on the larger side._ + + For some queries and data sets the above 2 optimizations have shown significant improvements but if you notice a performance degradation after upgrading, + please open a Q&A discussion with export of your collections structure and the problematic request so that it can be analyzed. + +- Added [`strftime(format, timevalue, modifiers...)`](https://pocketbase.io/docs/api-rules-and-filters/#strftimeformat-time-value-modifiers-) date formatting filter and API rules function. + It works similarly to the [SQLite `strftime` builtin function](https://sqlite.org/lang_datefunc.html) + with the main difference that NULL results will be normalized for consistency with the non-nullable PocketBase `text` and `date` fields. + Multi-match expressions are also supported and works the same as if the collection field is referenced, for example: + ```js + // requires ANY/AT-LEAST-ONE-OF multiRel records to have "created" date matching the formatted string "2026-01" + strftime('%Y-%m', multiRel.created) ?= '2026-01' + + // requires ALL multiRel records to have "created" date matching the formatted string "2026-01" + strftime('%Y-%m', multiRel.created) = '2026-01' + ``` + +- ⚠️ Minor changes to the `search.ResolverResult` struct _(mostly used internally)_: + - Replaced `NoCoalesce` field with the more explicit `NullFallback` _(`NullFallbackDisabled` is the same as `NoCoalesce:true`)_. + - Replaced the expression interface of the `MultiMatchSubQuery` field with the concrete struct type `search.MultiMatchSubquery` to avoid excessive type assertions and allow direct mutations of the field. + +- Updated `modernc.org/sqlite` to v1.44.1 _(SQLite 3.51.1)_. + +- Bumped min Go GitHub action version to 1.25.6 because it comes with some [minor security fixes](https://github.com/golang/go/issues?q=milestone%3AGo1.25.6). + + +## v0.35.1 + +- Updated `modernc.org/sqlite` to v1.43.0 _(query cancellation race fix)_. + +- Other minor UI fixes (normalized relations picker selection and confirmation message when `maxSelect=0/1`, updated node deps). + + +## v0.35.0 + +- Added `nullString()`, `nullInt()`, `nullFloat()`, `nullBool`, `nullArray()`, `nullObject()` JSVM helpers for scanning nullable columns ([#7396](https://github.com/pocketbase/pocketbase/issues/7396)). + +- Store the correct `image/png` as attrs content type when generating a thumb fallback _(e.g. for `webp`)_. + +- Trimmed custom uploaded file name and extension from leftover `.` characters after `filesystem.File` normalization. + _This was done to prevent issues with external files sync programs that may have special handling for "invisible" files._ + +- Updated `modernc.org/sqlite` _(v1.41.0 includes prepared statements optimization)_ and other minor Go deps. + + +## v0.34.2 + +- Bumped JS SDK to v0.26.5 to fix Safari AbortError detection introduced with the previous release ([#7369](https://github.com/pocketbase/pocketbase/issues/7369)). + + +## v0.34.1 + +- Added missing `:` char to the autocomplete regex ([#7353](https://github.com/pocketbase/pocketbase/pull/7353); thanks @ouvreboite). + +- Added "Copy raw JSON" collection dropdown option ([#7357](https://github.com/pocketbase/pocketbase/issues/7357)). + +- Updated Go deps and JS SDK. + +- Bumped min Go GitHub action version to 1.25.5 because it comes with some [minor security fixes](https://github.com/golang/go/issues?q=milestone%3AGo1.25.5). + _The runner action was also updated to `actions/setup-go@v6` since the previous v5 Go source seems [no longer accessible](https://github.com/actions/setup-go/pull/665#issuecomment-3416693714)._ + + +## v0.34.0 + +- Added `@request.body.someField:changed` modifier. + It could be used when you want to ensure that a body field either wasn't submitted or was submitted with the same value. + Or in other words, if you want to disallow a field change the below 2 expressions would be equivalent: + ```js + // (old) + (@request.body.someField:isset = false || @request.body.someField = someField) + + // (new) + @request.body.someField:changed = false + ``` + +- Added `MailerRecordEvent.Meta["info"]` property for the `OnMailerRecordAuthAlertSend` hook. + +- Updated the backup restore popup with a short info about the performed restore steps. + +- Updated Go deps. + + +## v0.33.0 + +- Added extra `id` characters validation in addition to the user specified regex pattern ([#7312](https://github.com/pocketbase/pocketbase/issues/7312)). + _The following special characters are always forbidden: `./\|"'``<>:?*%$\n\r\t\0 `. Common reserved Windows file names such as `aux`, `prn`, `con`, `nul`, `com1-9`, `lpt1-9` are also not allowed._ + _The list is not exhaustive but it should help minimizing eventual filesystem compatibility issues in case of wildcards or other loose regex patterns._ + +- Added `{ALERT_INFO}` placeholder to the auth alert mail template ([#7314](https://github.com/pocketbase/pocketbase/issues/7314)). + _⚠️ `mails.SendRecordAuthAlert(app, authRecord, info)` also now accepts a 3rd `info` string argument._ + +- Updated Go deps. + + +## v0.32.0 + +- ⚠️ Added extra List/Search API rules checks for the client-side `filter`/`sort` relations. + + This is continuation of the effort to eliminate the risk of information disclosure _(and eventually the side-channel attacks that may originate from that)_. + + So far this was accepted tradeoff between performance, usability and correctness since the solutions at the time weren't really practical _(especially with the back-relations as mentioned in ["Security and performance" section in #4417](https://github.com/pocketbase/pocketbase/discussions/4417))_, but with v0.23+ changes we can implement the extra checks without littering the code too much, with very little impact on the performance and at the same time ensuring better out of the box security _(especially for the cases where users operate with sensitive fields like "code", "token", "secret", etc.)_. + + Similar to the previous release, probably for most users with already configured API rules this change won't be breaking, but if you have an _intermediate/junction collection_ that is "locked" (superusers-only) we no longer will allow the client-side relation filter to pass through it and you'll have to set its List/Search API rule to enable the current user to search in it. + + For example, if you have a client-side filter that targets `rel1.rel2.token`, the client must have not only List/Search API rule access to the main collection BUT also to the collections referenced by "rel1" and "rel2" relation fields. + + Note that this change is only for the **client-side** `filter`/`sort` and doesn't affect the execution of superuser requests, API rules and `expand` - they continue to work the same as it is. + + An optional environment variable to toggle this behavior was considered but for now I think having 2 ways of resolving client-side filters would introduce maintenance burden and can even cause confusion (this change should actually make things more intuitive and clear because we can simply say something like _"you can search by a collection X field only if you have List/Search API rule access to it"_ no matter whether the targeted collection is the request's main collection, the first or last relation from the filter chain, etc.). + + If you stumble on an error or extreme query performance degradation as a result of the extra checks, please open a Q&A discussion with the failing request and export of your collections configuration as JSON (_Settings > Export collections_) and I'll try to investigate it. + +- Increased the default SQLite `PRAGMA cache_size` to ~32MB. + +- Fixed deadlock when manually triggering the `OnTerminate` hook ([#7305](https://github.com/pocketbase/pocketbase/pull/7305); thanks @yerTools). + +- Fixed some code comment typos, regenerated the JSVM types and updated npm dependencies. + +- Updated `modernc.org/sqlite` to 1.40.0. + + +## v0.31.0 + +- Visualize presentable multiple `relation` fields ([#7260](https://github.com/pocketbase/pocketbase/issues/7260)). + +- Support Ed25519 in the optional OIDC `id_token` signature validation ([#7252](https://github.com/pocketbase/pocketbase/issues/7252); thanks @shynome). + +- Added `ApiScenario.DisableTestAppCleanup` optional field to skip the auto test app cleanup and leave it up to the developers to do the cleanup manually ([#7267](https://github.com/pocketbase/pocketbase/discussions/7267)). + +- Added `FileDownloadRequestEvent.ThumbError` field that is populated in case of a thumb generation failure (e.g. unsupported format, timing out, etc.), allowing developers to reject the thumb fallback and/or supply their own custom thumb generation ([#7268](https://github.com/pocketbase/pocketbase/discussions/7268)). + +- ⚠️ Disallow client-side filtering and sorting of relations where the collection of the last targeted relation field has superusers-only List/Search API rule to further minimize the risk of eventual side-channel attack. + _This should be a non-breaking change for most users, but if you want the old behavior, please open a new Q&A discussion with details about your use case to evaluate making it configurable._ + _Note also that as mentioned in the "Security and performance" section of [#4417](https://github.com/pocketbase/pocketbase/discussions/4417) and [#5863](https://github.com/pocketbase/pocketbase/discussions/5863), the easiest and recommended solution to protect security sensitive fields (tokens, codes, passwords, etc.) is to mark them as "Hidden" (aka. make them non-API filterable)._ + +- Regenerated JSVM types and updated npm and Go deps. + + +## v0.30.4 + +- Fixed `json` field CSS regression introduced with the overflow workaround in v0.30.3 ([#7259](https://github.com/pocketbase/pocketbase/issues/7259)). + + +## v0.30.3 + +- Fixed legacy identitity field priority check when a username is a valid email address ([#7256](https://github.com/pocketbase/pocketbase/issues/7256)). + +- Workaround autocomplete overflow issue with Firefox 144 ([#7223](https://github.com/pocketbase/pocketbase/issues/7223)). + +- Updated `modernc.org/sqlite` to 1.39.1 (SQLite 3.50.4). + + +## v0.30.2 + +- Bumped min Go GitHub action version to 1.24.8 since it comes with some [minor security fixes](https://github.com/golang/go/issues?q=milestone%3AGo1.24.8+label%3ACherryPickApproved). + + +## v0.30.1 + +- ⚠️ Excluded the `lost+found` directory from the backups ([#7208](https://github.com/pocketbase/pocketbase/pull/7208); thanks @lbndev). + _If for some reason you want to keep it, you can restore it by editing the `e.Exclude` list of the `OnBackupCreate` and `OnBackupRestore` hooks._ + +- Minor tests improvements (disabled initial superuser creation for the test app to avoid cluttering the std output, added more tests for the `s3.Uploader.MaxConcurrency`, etc.). + +- Updated `modernc.org/sqlite` and other Go dependencies. + + +## v0.30.0 + +- Eagerly escape the S3 request path following the same rules as in the S3 signing header ([#7153](https://github.com/pocketbase/pocketbase/issues/7153)). + +- Added Lark OAuth2 provider ([#7130](https://github.com/pocketbase/pocketbase/pull/7130); thanks @mashizora). + +- Increased test tokens `exp` claim to minimize eventual issues with reproducible builds ([#7123](https://github.com/pocketbase/pocketbase/issues/7123)). + +- Added `os.Root` bindings to the JSVM ([`$os.openRoot`](https://pocketbase.io/jsvm/functions/_os.openRoot.html), [`$os.openInRoot`](https://pocketbase.io/jsvm/functions/_os.openInRoot.html)). + +- Added `osutils.IsProbablyGoRun()` helper to loosely check if the program was started using `go run`. + +- Various minor UI improvements (updated collections indexes UI, enabled seconds in the datepicker, updated helper texts, etc.). + +- ⚠️ Updated the minimum package Go version to 1.24.0 and bumped Go dependencies. + + +## v0.29.3 + +- Try to forward Apple OAuth2 POST redirect user's name so that it can be returned (and eventually assigned) with the success response of the all-in-one auth call ([#7090](https://github.com/pocketbase/pocketbase/issues/7090)). + +- Fixed `RateLimitRule.Audience` code comment ([#7098](https://github.com/pocketbase/pocketbase/pull/7098); thanks @iustin05). + +- Mocked `syscall.Exec` when building for WASM ([#7116](https://github.com/pocketbase/pocketbase/pull/7116); thanks @joas8211). + _Note that WASM is not officially supported PocketBase build target and many things may not work as expected._ + +- Registered missing `$filesystem`, `$mails`, `$template` and `__hooks` bindings in the JSVM migrations ([#7125](https://github.com/pocketbase/pocketbase/issues/7125)). + +- Regenerated JSVM types to include methods from structs with single generic parameter. + +- Updated Go dependencies. + + +## v0.29.2 + +- Bumped min Go GitHub action version to 1.23.12 since it comes with some [minor fixes for the runtime and `database/sql` package](https://github.com/golang/go/issues?q=milestone%3AGo1.23.12+label%3ACherryPickApproved). + + +## v0.29.1 + +- Updated the X/Twitter provider to return the `confirmed_email` field and to use the `x.com` domain ([#7035](https://github.com/pocketbase/pocketbase/issues/7035)). + +- Added Box.com OAuth2 provider ([#7056](https://github.com/pocketbase/pocketbase/pull/7056); thanks @blakepatteson). + +- Updated `modernc.org/sqlite` to 1.38.2 (SQLite 3.50.3). + +- Fixed example List API response ([#7049](https://github.com/pocketbase/pocketbase/pull/7049); thanks @williamtguerra). + + +## v0.29.0 + +- Enabled calling the `/auth-refresh` endpoint with nonrenewable tokens. + _When used with nonrenewable tokens (e.g. impersonate) the endpoint will simply return the same token with the up-to-date user data associated with it._ + +- Added the triggered rate rimit rule in the error log `details`. + +- Added optional `ServeEvent.Listener` field to initialize a custom network listener (e.g. `unix`) instead of the default `tcp` ([#3233](https://github.com/pocketbase/pocketbase/discussions/3233)). + +- Fixed request data unmarshalization for the `DynamicModel` array/object fields ([#7022](https://github.com/pocketbase/pocketbase/discussions/7022)). + +- Fixed Dashboard page title `-` escaping ([#6982](https://github.com/pocketbase/pocketbase/issues/6982)). + +- Other minor improvements (updated first superuser console text when running with `go run`, clarified trusted IP proxy header label, wrapped the backup restore in a transaction as an extra precaution, updated deps, etc.). + + +## v0.28.4 + +- Added global JSVM `toBytes()` helper to return the bytes slice representation of a value such as io.Reader or string, _other types are first serialized to Go string_ ([#6935](https://github.com/pocketbase/pocketbase/issues/6935)). + +- Fixed `security.RandomStringByRegex` random distribution ([#6947](https://github.com/pocketbase/pocketbase/pull/6947); thanks @yerTools). + +- Minor docs and typos fixes. + + +## v0.28.3 + +- Skip sending empty `Range` header when fetching blobs from S3 ([#6914](https://github.com/pocketbase/pocketbase/pull/6914)). + +- Updated Go deps and particularly `modernc.org/sqlite` to 1.38.0 (SQLite 3.50.1). + +- Bumped GitHub action min Go version to 1.23.10 as it comes with some [minor security `net/http` fixes](https://github.com/golang/go/issues?q=milestone%3AGo1.23.10+label%3ACherryPickApproved). + + +## v0.28.2 + +- Loaded latin-ext charset for the default text fonts ([#6869](https://github.com/pocketbase/pocketbase/issues/6869)). + +- Updated view query CAST regex to properly recognize multiline expressions ([#6860](https://github.com/pocketbase/pocketbase/pull/6860); thanks @azat-ismagilov). + +- Updated Go and npm dependencies. + + +## v0.28.1 + +- Fixed `json_each`/`json_array_length` normalizations to properly check for array values ([#6835](https://github.com/pocketbase/pocketbase/issues/6835)). + + +## v0.28.0 + +- Write the default response body of `*Request` hooks that are wrapped in a transaction after the related transaction completes to allow propagating the transaction error ([#6462](https://github.com/pocketbase/pocketbase/discussions/6462#discussioncomment-12207818)). + +- Updated `app.DB()` to automatically routes raw write SQL statements to the nonconcurrent db pool ([#6689](https://github.com/pocketbase/pocketbase/discussions/6689)). + _For the rare cases when it is needed users still have the option to explicitly target the specific pool they want using `app.ConcurrentDB()`/`app.NonconcurrentDB()`._ + +- ⚠️ Changed the default `json` field max size to 1MB. + _Users still have the option to adjust the default limit from the collection field options but keep in mind that storing large strings/blobs in the database is known to cause performance issues and should be avoided when possible._ + +- ⚠️ Soft-deprecated and replaced `filesystem.System.GetFile(fileKey)` with `filesystem.System.GetReader(fileKey)` to avoid the confusion with `filesystem.File`. + _The old method will still continue to work for at least until v0.29.0 but you'll get a console warning to replace it with `GetReader`._ + +- Added new `filesystem.System.GetReuploadableFile(fileKey, preserveName)` method to return an existing blob as a `*filesystem.File` value ([#6792](https://github.com/pocketbase/pocketbase/discussions/6792)). + _This method could be useful in case you want to clone an existing Record file and assign it to a new Record (e.g. in a Record duplicate action)._ + +- Other minor improvements (updated the GitHub release min Go version to 1.23.9, updated npm and Go deps, etc.) + + +## v0.27.2 + +- Added workers pool when cascade deleting record files to minimize _"thread exhaustion"_ errors ([#6780](https://github.com/pocketbase/pocketbase/discussions/6780)). + +- Updated the `:excerpt` fields modifier to properly account for multibyte characters ([#6778](https://github.com/pocketbase/pocketbase/issues/6778)). + +- Use `rowid` as count column for non-view collections to minimize the need of having the id field in a covering index ([#6739](https://github.com/pocketbase/pocketbase/discussions/6739)) + + +## v0.27.1 + +- Updated example `geoPoint` API preview body data. + +- Added JSVM `new GeoPointField({ ... })` constructor. + +- Added _partial_ WebP thumbs generation (_the thumbs will be stored as PNG_; [#6744](https://github.com/pocketbase/pocketbase/pull/6744)). + +- Updated npm dev dependencies. + + +## v0.27.0 + +- ⚠️ Moved the Create and Manage API rule checks out of the `OnRecordCreateRequest` hook finalizer, **aka. now all CRUD API rules are checked BEFORE triggering their corresponding `*Request` hook**. + This was done to minimize the confusion regarding the firing order of the request operations, making it more predictable and consistent with the other record List/View/Update/Delete request actions. + It could be a minor breaking change if you are relying on the old behavior and have a Go `tests.ApiScenario` that is testing a Create API rule failure and expect `OnRecordCreateRequest` to be fired. In that case for example you may have to update your test scenario like: + ```go + tests.ApiScenario{ + Name: "Example test that checks a Create API rule failure" + Method: http.MethodPost, + URL: "/api/collections/example/records", + ... + // old: + ExpectedEvents: map[string]int{ + "*": 0, + "OnRecordCreateRequest": 1, + }, + // new: + ExpectedEvents: map[string]int{"*": 0}, + } + ``` + If you are having difficulties adjusting your code, feel free to open a [Q&A discussion](https://github.com/pocketbase/pocketbase/discussions) with the failing/problematic code sample. + +- Added [new `geoPoint` field](https://pocketbase.io/docs/collections/#geopoint) for storing `{"lon":x,"lat":y}` geographic coordinates. + In addition, a new [`geoDistance(lonA, lotA, lonB, lotB)` function](https://pocketbase.io/docs/api-rules-and-filters/#geodistancelona-lata-lonb-latb) was also implemented that could be used to apply an API rule or filter constraint based on the distance (in km) between 2 geo points. + +- Updated the `select` field UI to accommodate better larger lists and RTL languages ([#4674](https://github.com/pocketbase/pocketbase/issues/4674)). + +- Updated the mail attachments auto MIME type detection to use `gabriel-vasile/mimetype` for consistency and broader sniffing signatures support. + +- Forced `text/javascript` Content-Type when serving `.js`/`.mjs` collection uploaded files with the `/api/files/...` endpoint ([#6597](https://github.com/pocketbase/pocketbase/issues/6597)). + +- Added second optional JSVM `DateTime` constructor argument for specifying a default timezone as TZ identifier when parsing the date string as alternative to a fixed offset in order to better handle daylight saving time nuances ([#6688](https://github.com/pocketbase/pocketbase/discussions/6688)): + ```js + // the same as with CET offset: new DateTime("2025-10-26 03:00:00 +01:00") + new DateTime("2025-10-26 03:00:00", "Europe/Amsterdam") // 2025-10-26 02:00:00.000Z + + // the same as with CEST offset: new DateTime("2025-10-26 01:00:00 +02:00") + new DateTime("2025-10-26 01:00:00", "Europe/Amsterdam") // 2025-10-25 23:00:00.000Z + ``` + +- Soft-deprecated the `$http.send`'s `result.raw` field in favor of `result.body` that contains the response body as plain bytes slice to avoid the discrepancies between Go and the JSVM when casting binary data to string. + +- Updated `modernc.org/sqlite` to 1.37.0. + +- Other minor improvements (_removed the superuser fields from the auth record create/update body examples, allowed programmatically updating the auth record password from the create/update hooks, fixed collections import error response, etc._). + + +## v0.26.6 + +- Allow OIDC `email_verified` to be int or boolean string since some OIDC providers like AWS Cognito has non-standard userinfo response ([#6657](https://github.com/pocketbase/pocketbase/pull/6657)). + +- Updated `modernc.org/sqlite` to 1.36.3. + + +## v0.26.5 + +- Fixed canonical URI parts escaping when generating the S3 request signature ([#6654](https://github.com/pocketbase/pocketbase/issues/6654)). + + +## v0.26.4 + +- Fixed `RecordErrorEvent.Error` and `CollectionErrorEvent.Error` sync with `ModelErrorEvent.Error` ([#6639](https://github.com/pocketbase/pocketbase/issues/6639)). + +- Fixed logs details copy to clipboard action. + +- Updated `modernc.org/sqlite` to 1.36.2. + + +## v0.26.3 + +- Fixed and normalized logs error serialization across common types for more consistent logs error output ([#6631](https://github.com/pocketbase/pocketbase/issues/6631)). + + +## v0.26.2 + +- Updated `golang-jwt/jwt` dependency because it comes with a [minor security fix](https://github.com/golang-jwt/jwt/security/advisories/GHSA-mh63-6h87-95cp). + + +## v0.26.1 + +- Removed the wrapping of `io.EOF` error when reading files since currently `io.ReadAll` doesn't check for wrapped errors ([#6600](https://github.com/pocketbase/pocketbase/issues/6600)). + + +## v0.26.0 + +- ⚠️ Replaced `aws-sdk-go-v2` and `gocloud.dev/blob` with custom lighter implementation ([#6562](https://github.com/pocketbase/pocketbase/discussions/6562)). + As a side-effect of the dependency removal, the binary size has been reduced with ~10MB and builds ~30% faster. + _Although the change is expected to be backward-compatible, I'd recommend to test first locally the new version with your S3 provider (if you use S3 for files storage and backups)._ + +- ⚠️ Prioritized the user submitted non-empty `createData.email` (_it will be unverified_) when creating the PocketBase user during the first OAuth2 auth. + +- Load the request info context during password/OAuth2/OTP authentication ([#6402](https://github.com/pocketbase/pocketbase/issues/6402)). + This could be useful in case you want to target the auth method as part of the MFA and Auth API rules. + For example, to disable MFA for the OAuth2 auth could be expressed as `@request.context != "oauth2"` MFA rule. + +- Added `store.Store.SetFunc(key, func(old T) new T)` to set/update a store value with the return result of the callback in a concurrent safe manner. + +- Added `subscription.Message.WriteSSE(w, id)` for writing an SSE formatted message into the provided writer interface (_used mostly to assist with the unit testing_). + +- Added `$os.stat(file)` JSVM helper ([#6407](https://github.com/pocketbase/pocketbase/discussions/6407)). + +- Added log warning for `async` marked JSVM handlers and resolve when possible the returned `Promise` as fallback ([#6476](https://github.com/pocketbase/pocketbase/issues/6476)). + +- Allowed calling `cronAdd`, `cronRemove` from inside other JSVM handlers ([#6481](https://github.com/pocketbase/pocketbase/discussions/6481)). + +- Bumped the default request read and write timeouts to 5mins (_old 3mins_) to accommodate slower internet connections and larger file uploads/downloads. + _If you want to change them you can modify the `OnServe` hook's `ServeEvent.ReadTimeout/WriteTimeout` fields as shown in [#6550](https://github.com/pocketbase/pocketbase/discussions/6550#discussioncomment-12364515)._ + +- Normalized the `@request.auth.*` and `@request.body.*` back relations resolver to always return `null` when the relation field is pointing to a different collection ([#6590](https://github.com/pocketbase/pocketbase/discussions/6590#discussioncomment-12496581)). + +- Other minor improvements (_fixed query dev log nested parameters output, reintroduced `DynamicModel` object/array props reflect types caching, updated Go and npm deps, etc._) + + +## v0.25.9 + +- Fixed `DynamicModel` object/array props reflect type caching ([#6563](https://github.com/pocketbase/pocketbase/discussions/6563)). + + +## v0.25.8 + +- Added a default leeway of 5 minutes for the Apple/OIDC `id_token` timestamp claims check to account for clock-skew ([#6529](https://github.com/pocketbase/pocketbase/issues/6529)). + It can be further customized if needed with the `PB_ID_TOKEN_LEEWAY` env variable (_the value must be in seconds, e.g. "PB_ID_TOKEN_LEEWAY=60" for 1 minute_). + + +## v0.25.7 + +- Fixed `@request.body.jsonObjOrArr.*` values extraction ([#6493](https://github.com/pocketbase/pocketbase/discussions/6493)). + + +## v0.25.6 + +- Restore the missing `meta.isNew` field of the OAuth2 success response ([#6490](https://github.com/pocketbase/pocketbase/issues/6490)). + +- Updated npm dependencies. + + +## v0.25.5 + +- Set the current working directory as a default goja script path when executing inline JS strings to allow `require(m)` traversing parent `node_modules` directories. + +- Updated `modernc.org/sqlite` and `modernc.org/libc` dependencies. + + +## v0.25.4 + +- Downgraded `aws-sdk-go-v2` to the version before the default data integrity checks because there have been reports for non-AWS S3 providers in addition to Backblaze (IDrive, R2) that no longer or partially work with the latest AWS SDK changes. + + While we try to enforce `when_required` by default, it is not enough to disable the new AWS SDK integrity checks entirely and some providers will require additional manual adjustments to make them compatible with the latest AWS SDK (e.g. removing the `x-aws-checksum-*` headers, unsetting the checksums calculation or reinstantiating the old MD5 checksums for some of the required operations, etc.) which as a result leads to a configuration mess that I'm not sure it would be a good idea to introduce. + + This unfornuatelly is not a PocketBase or Go specific issue and the official AWS SDKs for other languages are in the same situation (even the latest aws-cli). + + For those of you that extend PocketBase with Go: if your S3 vendor doesn't support the [AWS Data integrity checks](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html) and you are updating with `go get -u`, then make sure that the `aws-sdk-go-v2` dependencies in your `go.mod` are the same as in the repo: + ``` + // go.mod + github.com/aws/aws-sdk-go-v2 v1.36.1 + github.com/aws/aws-sdk-go-v2/config v1.28.10 + github.com/aws/aws-sdk-go-v2/credentials v1.17.51 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.48 + github.com/aws/aws-sdk-go-v2/service/s3 v1.72.2 + + // after that run + go clean -modcache && go mod tidy + ``` + _The versions pinning is temporary until the non-AWS S3 vendors patch their implementation or until I manage to find time to remove/replace the `aws-sdk-go-v2` dependency (I'll consider prioritizing it for the v0.26 or v0.27 release)._ + + +## v0.25.3 + +- Added a temporary exception for Backblaze S3 endpoints to exclude the new `aws-sdk-go-v2` checksum headers ([#6440](https://github.com/pocketbase/pocketbase/discussions/6440)). + + +## v0.25.2 + +- Fixed realtime delete event not being fired for `RecordProxy`-ies and added basic realtime record resolve automated tests ([#6433](https://github.com/pocketbase/pocketbase/issues/6433)). + + +## v0.25.1 + +- Fixed the batch API Preview success sample response. + +- Bumped GitHub action min Go version to 1.23.6 as it comes with a [minor security fix](https://github.com/golang/go/issues?q=milestone%3AGo1.23.6+label%3ACherryPickApproved) for the ppc64le build. + + +## v0.25.0 + +- ⚠️ Upgraded Google OAuth2 auth, token and userinfo endpoints to their latest versions. + _For users that don't do anything custom with the Google OAuth2 data or the OAuth2 auth URL, this should be a non-breaking change. The exceptions that I could find are:_ + - `/v3/userinfo` auth response changes: + ``` + meta.rawUser.id => meta.rawUser.sub + meta.rawUser.verified_email => meta.rawUser.email_verified + ``` + - `/v2/auth` query parameters changes: + If you are specifying custom `approval_prompt=force` query parameter for the OAuth2 auth URL, you'll have to replace it with **`prompt=consent`**. + +- Added Trakt OAuth2 provider ([#6338](https://github.com/pocketbase/pocketbase/pull/6338); thanks @aidan-) + +- Added support for case-insensitive password auth based on the related UNIQUE index field collation ([#6337](https://github.com/pocketbase/pocketbase/discussions/6337)). + +- Enforced `when_required` for the new AWS SDK request and response checksum validations to allow other non-AWS vendors to catch up with new AWS SDK changes (see [#6313](https://github.com/pocketbase/pocketbase/discussions/6313) and [aws/aws-sdk-go-v2#2960](https://github.com/aws/aws-sdk-go-v2/discussions/2960)). + _You can set the environment variables `AWS_REQUEST_CHECKSUM_CALCULATION` and `AWS_RESPONSE_CHECKSUM_VALIDATION` to `when_supported` if your S3 vendor supports the [new default integrity protections](https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html)._ + +- Soft-deprecated `Record.GetUploadedFiles` in favor of `Record.GetUnsavedFiles` to minimize the ambiguities what the method do ([#6269](https://github.com/pocketbase/pocketbase/discussions/6269)). + +- Replaced archived `github.com/AlecAivazis/survey` dependency with a simpler `osutils.YesNoPrompt(message, fallback)` helper. + +- Upgraded to `golang-jwt/jwt/v5`. + +- Added JSVM `new Timezone(name)` binding for constructing `time.Location` value ([#6219](https://github.com/pocketbase/pocketbase/discussions/6219)). + +- Added `inflector.Camelize(str)` and `inflector.Singularize(str)` helper methods. + +- Use the non-transactional app instance during the realtime records delete access checks to ensure that cascade deleted records with API rules relying on the parent will be resolved. + +- Other minor improvements (_replaced all `bool` exists db scans with `int` for broader drivers compatibility, updated API Preview sample error responses, updated UI dependencies, etc._) + + +## v0.24.4 + +- Fixed fields extraction for view query with nested comments ([#6309](https://github.com/pocketbase/pocketbase/discussions/6309)). + +- Bumped GitHub action min Go version to 1.23.5 as it comes with some [minor security fixes](https://github.com/golang/go/issues?q=milestone%3AGo1.23.5). + + +## v0.24.3 + +- Fixed incorrectly reported unique validator error for fields starting with name of another field ([#6281](https://github.com/pocketbase/pocketbase/pull/6281); thanks @svobol13). + +- Reload the created/edited records data in the RecordsPicker UI. + +- Updated Go dependencies. + + +## v0.24.2 + +- Fixed display fields extraction when there are multiple "Presentable" `relation` fields in a single related collection ([#6229](https://github.com/pocketbase/pocketbase/issues/6229)). + + +## v0.24.1 + +- Added missing time macros in the UI autocomplete. + +- Fixed JSVM types for structs and functions with multiple generic parameters. + + +## v0.24.0 + +- ⚠️ Removed the "dry submit" when executing the collections Create API rule + (you can find more details why this change was introduced and how it could affect your app in https://github.com/pocketbase/pocketbase/discussions/6073). + For most users it should be non-breaking change, BUT if you have Create API rules that uses self-references or view counters you may have to adjust them manually. + With this change the "multi-match" operators are also normalized in case the targeted collection doesn't have any records + (_or in other words, `@collection.example.someField != "test"` will result to `true` if `example` collection has no records because it satisfies the condition that all available "example" records mustn't have `someField` equal to "test"_). + As a side-effect of all of the above minor changes, the record create API performance has been also improved ~4x times in high concurrent scenarios (500 concurrent clients inserting total of 50k records - [old (58.409064001s)](https://github.com/pocketbase/benchmarks/blob/54140be5fb0102f90034e1370c7f168fbcf0ddf0/results/hetzner_cax41_cgo.md#creating-50000-posts100k-reqs50000-conc500-rulerequestauthid----requestdatapublicisset--true) vs [new (13.580098262s)](https://github.com/pocketbase/benchmarks/blob/7df0466ac9bd62fe0a1056270d20ef82012f0234/results/hetzner_cax41_cgo.md#creating-50000-posts100k-reqs50000-conc500-rulerequestauthid----requestbodypublicisset--true)). + +- ⚠️ Changed the type definition of `store.Store[T any]` to `store.Store[K comparable, T any]` to allow support for custom store key types. + For most users it should be non-breaking change, BUT if you are calling `store.New[any](nil)` instances you'll have to specify the store key type, aka. `store.New[string, any](nil)`. + +- Added `@yesterday` and `@tomorrow` datetime filter macros. + +- Added `:lower` filter modifier (e.g. `title:lower = "lorem"`). + +- Added `mailer.Message.InlineAttachments` field for attaching inline files to an email (_aka. `cid` links_). + +- Added cache for the JSVM `arrayOf(m)`, `DynamicModel`, etc. dynamic `reflect` created types. + +- Added auth collection select for the settings "Send test email" popup ([#6166](https://github.com/pocketbase/pocketbase/issues/6166)). + +- Added `record.SetRandomPassword()` to simplify random password generation usually used in the OAuth2 or OTP record creation flows. + _The generated ~30 chars random password is assigned directly as bcrypt hash and ignores the `password` field plain value validators like min/max length or regex pattern._ + +- Added option to list and trigger the registered app level cron jobs via the Web API and UI. + +- Added extra validators for the collection field `int64` options (e.g. `FileField.MaxSize`) restricting them to the max safe JSON number (2^53-1). + +- Added option to unset/overwrite the default PocketBase superuser installer using `ServeEvent.InstallerFunc`. + +- Added `app.FindCachedCollectionReferences(collection, excludeIds)` to speedup records cascade delete almost twice for projects with many collections. + +- Added `tests.NewTestAppWithConfig(config)` helper if you need more control over the test configurations like `IsDev`, the number of allowed connections, etc. + +- Invalidate all record tokens when the auth record email is changed programmatically or by a superuser ([#5964](https://github.com/pocketbase/pocketbase/issues/5964)). + +- Eagerly interrupt waiting for the email alert send in case it takes longer than 15s. + +- Normalized the hidden fields filter checks and allow targetting hidden fields in the List API rule. + +- Fixed "Unique identify fields" input not refreshing on unique indexes change ([#6184](https://github.com/pocketbase/pocketbase/issues/6184)). + + +## v0.23.12 + +- Added warning logs in case of mismatched `modernc.org/sqlite` and `modernc.org/libc` versions ([#6136](https://github.com/pocketbase/pocketbase/issues/6136#issuecomment-2556336962)). + +- Skipped the default body size limit middleware for the backup upload endpoint ([#6152](https://github.com/pocketbase/pocketbase/issues/6152)). + + +## v0.23.11 + +- Upgraded `golang.org/x/net` to 0.33.0 to fix [CVE-2024-45338](https://www.cve.org/CVERecord?id=CVE-2024-45338). + _PocketBase uses the vulnerable functions primarily for the auto html->text mail generation, but most applications shouldn't be affected unless you are manually embedding unrestricted user provided value in your mail templates._ + + +## v0.23.10 + +- Renew the superuser file token cache when clicking on the thumb preview or download link ([#6137](https://github.com/pocketbase/pocketbase/discussions/6137)). + +- Upgraded `modernc.org/sqlite` to 1.34.3 to fix "disk io" error on arm64 systems. + _If you are extending PocketBase with Go and upgrading with `go get -u` make sure to manually set in your go.mod the `modernc.org/libc` indirect dependency to v1.55.3, aka. the exact same version the driver is using._ + + +## v0.23.9 + +- Replaced `strconv.Itoa` with `strconv.FormatInt` to avoid the int64->int conversion overflow on 32-bit platforms ([#6132](https://github.com/pocketbase/pocketbase/discussions/6132)). + + +## v0.23.8 + +- Fixed Model->Record and Model->Collection hook events sync for nested and/or inner-hook transactions ([#6122](https://github.com/pocketbase/pocketbase/discussions/6122)). + +- Other minor improvements (updated Go and npm deps, added extra escaping for the default mail record params in case the emails are stored as html files, fixed code comment typos, etc.). + + +## v0.23.7 + +- Fixed JSVM exception -> Go error unwrapping when throwing errors from non-request hooks ([#6102](https://github.com/pocketbase/pocketbase/discussions/6102)). + + +## v0.23.6 + +- Fixed `$filesystem.fileFromURL` documentation and generated type ([#6058](https://github.com/pocketbase/pocketbase/issues/6058)). + +- Fixed `X-Forwarded-For` header typo in the suggested UI "Common trusted proxy" headers ([#6063](https://github.com/pocketbase/pocketbase/pull/6063)). + +- Updated the `text` field max length validator error message to make it more clear ([#6066](https://github.com/pocketbase/pocketbase/issues/6066)). + +- Other minor fixes (updated Go deps, skipped unnecessary validator check when the default primary key pattern is used, updated JSVM types, etc.). + + +## v0.23.5 + +- Fixed UI logs search not properly accounting for the "Include requests by superusers" toggle when multiple search expressions are used. + +- Fixed `text` field max validation error message ([#6053](https://github.com/pocketbase/pocketbase/issues/6053)). + +- Other minor fixes (comment typos, JSVM types update). + +- Updated Go deps and the min Go release GitHub action version to 1.23.4. + + +## v0.23.4 + +- Fixed `autodate` fields not refreshing when calling `Save` multiple times on the same `Record` instance ([#6000](https://github.com/pocketbase/pocketbase/issues/6000)). + +- Added more descriptive test OTP id and failure log message ([#5982](https://github.com/pocketbase/pocketbase/discussions/5982)). + +- Moved the default UI CSP from meta tag to response header ([#5995](https://github.com/pocketbase/pocketbase/discussions/5995)). + +- Updated Go and npm dependencies. + + +## v0.23.3 + +- Fixed Gzip middleware not applying when serving static files. + +- Fixed `Record.Fresh()`/`Record.Clone()` methods not properly cloning `autodate` fields ([#5973](https://github.com/pocketbase/pocketbase/discussions/5973)). + + +## v0.23.2 + +- Fixed `RecordQuery()` custom struct scanning ([#5958](https://github.com/pocketbase/pocketbase/discussions/5958)). + +- Fixed `--dev` log query print formatting. + +- Added support for passing more than one id in the `Hook.Unbind` method for consistency with the router. + +- Added collection rules change list in the confirmation popup + (_to avoid getting anoying during development, the rules confirmation currently is enabled only when using https_). + + +## v0.23.1 + +- Added `RequestEvent.Blob(status, contentType, bytes)` response write helper ([#5940](https://github.com/pocketbase/pocketbase/discussions/5940)). + +- Added more descriptive error messages. + + +## v0.23.0 + +> [!NOTE] +> You don't have to upgrade to PocketBase v0.23.0 if you are not planning further developing +> your existing app and/or are satisfied with the v0.22.x features set. There are no identified critical issues +> with PocketBase v0.22.x yet and in the case of critical bugs and security vulnerabilities, the fixes +> will be backported for at least until Q1 of 2025 (_if not longer_). +> +> **If you don't plan upgrading make sure to pin the SDKs version to their latest PocketBase v0.22.x compatible:** +> - JS SDK: `<0.22.0` +> - Dart SDK: `<0.19.0` + +> [!CAUTION] +> This release introduces many Go/JSVM and Web APIs breaking changes! +> +> Existing `pb_data` will be automatically upgraded with the start of the new executable, +> but custom Go or JSVM (`pb_hooks`, `pb_migrations`) and JS/Dart SDK code will have to be migrated manually. +> Please refer to the below upgrade guides: +> - Go: https://pocketbase.io/v023upgrade/go/. +> - JSVM: https://pocketbase.io/v023upgrade/jsvm/. +> +> If you had already switched to some of the earlier ` - Go: https://pocketbase.io/v023upgrade/go/. +> - JSVM: https://pocketbase.io/v023upgrade/jsvm/. + +#### SDKs changes + +- [JS SDK v0.22.0](https://github.com/pocketbase/js-sdk/blob/master/CHANGELOG.md) +- [Dart SDK v0.19.0](https://github.com/pocketbase/dart-sdk/blob/master/CHANGELOG.md) + +#### Web APIs changes + +- New `POST /api/batch` endpoint. + +- New `GET /api/collections/meta/scaffolds` endpoint. + +- New `DELETE /api/collections/{collection}/truncate` endpoint. + +- New `POST /api/collections/{collection}/request-otp` endpoint. + +- New `POST /api/collections/{collection}/auth-with-otp` endpoint. + +- New `POST /api/collections/{collection}/impersonate/{id}` endpoint. + +- ⚠️ If you are constructing requests to `/api/*` routes manually remove the trailing slash (_there is no longer trailing slash removal middleware registered by default_). + +- ⚠️ Removed `/api/admins/*` endpoints because admins are converted to `_superusers` auth collection records. + +- ⚠️ Previously when uploading new files to a multiple `file` field, new files were automatically appended to the existing field values. + This behaviour has changed with v0.23+ and for consistency with the other multi-valued fields when uploading new files they will replace the old ones. If you want to prepend or append new files to an existing multiple `file` field value you can use the `+` prefix or suffix: + ```js + "documents": [file1, file2] // => [file1_name, file2_name] + "+documents": [file1, file2] // => [file1_name, file2_name, old1_name, old2_name] + "documents+": [file1, file2] // => [old1_name, old2_name, file1_name, file2_name] + ``` + +- ⚠️ Removed `GET /records/{id}/external-auths` and `DELETE /records/{id}/external-auths/{provider}` endpoints because this is now handled by sending list and delete requests to the `_externalAuths` collection. + +- ⚠️ Changes to the app settings model fields and response (+new options such as `trustedProxy`, `rateLimits`, `batch`, etc.). The app settings Web APIs are mostly used by the Dashboard UI and rarely by the end users, but if you want to check all settings changes please refer to the [Settings Go struct](https://github.com/pocketbase/pocketbase/blob/develop/core/settings_model.go#L121). + +- ⚠️ New flatten Collection model and fields structure. The Collection model Web APIs are mostly used by the Dashboard UI and rarely by the end users, but if you want to check all changes please refer to the [Collection Go struct](https://github.com/pocketbase/pocketbase/blob/develop/core/collection_model.go#L308). + +- ⚠️ The top level error response `code` key was renamed to `status` for consistency with the Go APIs. + The error field key remains `code`: + ```js + { + "status": 400, // <-- old: "code" + "message": "Failed to create record.", + "data": { + "title": { + "code": "validation_required", + "message": "Missing required value." + } + } + } + ``` + +- ⚠️ New fields in the `GET /api/collections/{collection}/auth-methods` response. + _The old `authProviders`, `usernamePassword`, `emailPassword` fields are still returned in the response but are considered deprecated and will be removed in the future._ + ```js + { + "mfa": { + "duration": 100, + "enabled": true + }, + "otp": { + "duration": 0, + "enabled": false + }, + "password": { + "enabled": true, + "identityFields": ["email", "username"] + }, + "oauth2": { + "enabled": true, + "providers": [{"name": "gitlab", ...}, {"name": "google", ...}] + }, + // old fields... + } + ``` + +- ⚠️ Soft-deprecated the OAuth2 auth success `meta.avatarUrl` field in favour of `meta.avatarURL`. diff --git a/backend/LICENSE.md b/backend/LICENSE.md new file mode 100644 index 0000000..e3b8465 --- /dev/null +++ b/backend/LICENSE.md @@ -0,0 +1,17 @@ +The MIT License (MIT) +Copyright (c) 2022 - present, Gani Georgiev + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/backend/pb_migrations/1772459382_updated_users.js b/backend/pb_migrations/1772459382_updated_users.js new file mode 100644 index 0000000..abd555b --- /dev/null +++ b/backend/pb_migrations/1772459382_updated_users.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "listRule": "id = @request.auth.id", + "viewRule": "id = @request.auth.id" + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772463022_updated_users.js b/backend/pb_migrations/1772463022_updated_users.js new file mode 100644 index 0000000..980c7ab --- /dev/null +++ b/backend/pb_migrations/1772463022_updated_users.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "

Здравствуйте, {RECORD_NAME}!

\n 2

Добро пожаловать в \n {APP_NAME}.

\n 3

Для завершения регистрации и \n получения доступа ко всем\n возможностям сервиса, пожалуйста, \n подтвердите ваш адрес электронной \n почты.

\n 4

\n 5 \n 6 Подтвердить email\n 7 \n 8

\n 9

Или скопируйте эту ссылку в \n адресную строку браузера:

\n 10

\n 11\n {APP_URL}/auth/confirm?token={TOKEN} \n 12

\n 13

\n 14 Не можете нажать на\n кнопку?
\n 15 Просто скопируйте ссылку выше и \n вставьте её в браузер.\n 16

\n 17
\n 18

\n 19 Если вы не регистрировались на \n нашем сайте, просто проигнорируйте \n это письмо.\n 20

\n 21

\n 22 С уважением, команда \n {APP_NAME}\n 23

" + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "

Hello,

\n

Thank you for joining us at {APP_NAME}.

\n

Click on the button below to verify your email address.

\n

\n Verify\n

\n

\n Thanks,
\n {APP_NAME} team\n

" + } + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772463177_updated_users.js b/backend/pb_migrations/1772463177_updated_users.js new file mode 100644 index 0000000..eca0ecd --- /dev/null +++ b/backend/pb_migrations/1772463177_updated_users.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "

Здравствуйте, {RECORD_NAME}!

\n

Добро пожаловать в {APP_NAME}.

\n

Для завершения регистрации и \n получения доступа ко всем\n возможностям сервиса, пожалуйста, \n подтвердите ваш адрес электронной \n почты.

\n

\n \n Подтвердить email\n \n

\n

Или скопируйте эту ссылку в \n адресную строку браузера:

\n

\n \n {APP_URL}/auth/confirm?token={TOKEN} \n

\n

\n Не можете нажать на\n кнопку?
\n Просто скопируйте ссылку выше и \n вставьте её в браузер.\n

\n
\n

\n Если вы не регистрировались на \n нашем сайте, просто проигнорируйте \n это письмо.\n

\n

\n С уважением, команда \n {APP_NAME}\n

" + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "

Здравствуйте, {RECORD_NAME}!

\n 2

Добро пожаловать в \n {APP_NAME}.

\n 3

Для завершения регистрации и \n получения доступа ко всем\n возможностям сервиса, пожалуйста, \n подтвердите ваш адрес электронной \n почты.

\n 4

\n 5 \n 6 Подтвердить email\n 7 \n 8

\n 9

Или скопируйте эту ссылку в \n адресную строку браузера:

\n 10

\n 11\n {APP_URL}/auth/confirm?token={TOKEN} \n 12

\n 13

\n 14 Не можете нажать на\n кнопку?
\n 15 Просто скопируйте ссылку выше и \n вставьте её в браузер.\n 16

\n 17
\n 18

\n 19 Если вы не регистрировались на \n нашем сайте, просто проигнорируйте \n это письмо.\n 20

\n 21

\n 22 С уважением, команда \n {APP_NAME}\n 23

" + } + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772463333_updated_users.js b/backend/pb_migrations/1772463333_updated_users.js new file mode 100644 index 0000000..aad515d --- /dev/null +++ b/backend/pb_migrations/1772463333_updated_users.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "

Здравствуйте, {RECORD_NAME}!

\n

Добро пожаловать на портал {APP_NAME}.

\n

Для завершения регистрации и \n получения доступа ко всем\n возможностям сервиса, пожалуйста, \n подтвердите ваш адрес электронной \n почты.

\n

\n \n Подтвердить email\n \n

\n

Или скопируйте эту ссылку в \n адресную строку браузера:

\n

\n \n {APP_URL}/auth/confirm?token={TOKEN} \n

\n

\n Не можете нажать на\n кнопку?
\n Просто скопируйте ссылку выше и \n вставьте её в браузер.\n

\n
\n

\n Если вы не регистрировались на \n нашем сайте, просто проигнорируйте \n это письмо.\n

\n

\n С уважением, команда \n {APP_NAME}\n

" + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "

Здравствуйте, {RECORD_NAME}!

\n

Добро пожаловать в {APP_NAME}.

\n

Для завершения регистрации и \n получения доступа ко всем\n возможностям сервиса, пожалуйста, \n подтвердите ваш адрес электронной \n почты.

\n

\n \n Подтвердить email\n \n

\n

Или скопируйте эту ссылку в \n адресную строку браузера:

\n

\n \n {APP_URL}/auth/confirm?token={TOKEN} \n

\n

\n Не можете нажать на\n кнопку?
\n Просто скопируйте ссылку выше и \n вставьте её в браузер.\n

\n
\n

\n Если вы не регистрировались на \n нашем сайте, просто проигнорируйте \n это письмо.\n

\n

\n С уважением, команда \n {APP_NAME}\n

" + } + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772463515_updated_users.js b/backend/pb_migrations/1772463515_updated_users.js new file mode 100644 index 0000000..3fdd5a3 --- /dev/null +++ b/backend/pb_migrations/1772463515_updated_users.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "

Здравствуйте, {RECORD_NAME}!

\n

Добро пожаловать в {APP_NAME}.

\n

Для завершения регистрации и получения доступа ко всем возможностям сервиса, пожалуйста, подтвердите ваш адрес электронной почты.

\n

\n \n Подтвердить email\n \n

\n

Или скопируйте эту ссылку в адресную строку браузера:

\n

\n http://localhost:4321/auth/confirm?token={TOKEN}\n

\n

\n Не можете нажать на кнопку?
\n Просто скопируйте ссылку выше и вставьте её в браузер.\n

\n
\n

\n Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.\n

\n

\n С уважением, команда {APP_NAME}\n

" + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "

Здравствуйте, {RECORD_NAME}!

\n

Добро пожаловать на портал {APP_NAME}.

\n

Для завершения регистрации и \n получения доступа ко всем\n возможностям сервиса, пожалуйста, \n подтвердите ваш адрес электронной \n почты.

\n

\n \n Подтвердить email\n \n

\n

Или скопируйте эту ссылку в \n адресную строку браузера:

\n

\n \n {APP_URL}/auth/confirm?token={TOKEN} \n

\n

\n Не можете нажать на\n кнопку?
\n Просто скопируйте ссылку выше и \n вставьте её в браузер.\n

\n
\n

\n Если вы не регистрировались на \n нашем сайте, просто проигнорируйте \n это письмо.\n

\n

\n С уважением, команда \n {APP_NAME}\n

" + } + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772463667_updated_users.js b/backend/pb_migrations/1772463667_updated_users.js new file mode 100644 index 0000000..b9d9c6a --- /dev/null +++ b/backend/pb_migrations/1772463667_updated_users.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "
\n \n

Здравствуйте, {RECORD_NAME}!

\n \n

Добро пожаловать в {APP_NAME}.

\n \n

Для завершения регистрации и получения доступа ко всем возможностям сервиса, пожалуйста, подтвердите ваш адрес электронной почты.

\n \n

\n \n Подтвердить email\n \n

\n \n

Или скопируйте эту ссылку в адресную строку браузера:

\n \n

\n http://localhost:4321/auth/confirm?token={TOKEN}\n

\n \n

\n Не можете нажать на кнопку?
\n Просто скопируйте ссылку выше и вставьте её в браузер.\n

\n \n
\n \n

\n Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.\n

\n \n

\n С уважением, команда {APP_NAME}\n

\n \n
" + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "

Здравствуйте, {RECORD_NAME}!

\n

Добро пожаловать в {APP_NAME}.

\n

Для завершения регистрации и получения доступа ко всем возможностям сервиса, пожалуйста, подтвердите ваш адрес электронной почты.

\n

\n \n Подтвердить email\n \n

\n

Или скопируйте эту ссылку в адресную строку браузера:

\n

\n http://localhost:4321/auth/confirm?token={TOKEN}\n

\n

\n Не можете нажать на кнопку?
\n Просто скопируйте ссылку выше и вставьте её в браузер.\n

\n
\n

\n Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.\n

\n

\n С уважением, команда {APP_NAME}\n

" + } + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772464042_updated_users.js b/backend/pb_migrations/1772464042_updated_users.js new file mode 100644 index 0000000..53b201c --- /dev/null +++ b/backend/pb_migrations/1772464042_updated_users.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "
\n \n

Здравствуйте{RECORD:name, text,{ }}!

\n \n

Добро пожаловать в {APP_NAME}.

\n \n

Для завершения регистрации и получения доступа ко всем возможностям сервиса, пожалуйста, подтвердите ваш адрес электронной почты.

\n \n

\n \n Подтвердить email\n \n

\n \n

Или скопируйте эту ссылку в адресную строку браузера:

\n \n

\n http://localhost:4321/auth/confirm?token={TOKEN}\n

\n \n

\n Не можете нажать на кнопку?
\n Просто скопируйте ссылку выше и вставьте её в браузер.\n

\n \n
\n \n

\n Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.\n

\n \n

\n С уважением, команда {APP_NAME}\n

\n \n
" + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "
\n \n

Здравствуйте, {RECORD_NAME}!

\n \n

Добро пожаловать в {APP_NAME}.

\n \n

Для завершения регистрации и получения доступа ко всем возможностям сервиса, пожалуйста, подтвердите ваш адрес электронной почты.

\n \n

\n \n Подтвердить email\n \n

\n \n

Или скопируйте эту ссылку в адресную строку браузера:

\n \n

\n http://localhost:4321/auth/confirm?token={TOKEN}\n

\n \n

\n Не можете нажать на кнопку?
\n Просто скопируйте ссылку выше и вставьте её в браузер.\n

\n \n
\n \n

\n Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.\n

\n \n

\n С уважением, команда {APP_NAME}\n

\n \n
" + } + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772464256_updated_users.js b/backend/pb_migrations/1772464256_updated_users.js new file mode 100644 index 0000000..15aae59 --- /dev/null +++ b/backend/pb_migrations/1772464256_updated_users.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "
\n \n

Здравствуйте{RECORD_NAME}!

\n \n

Добро пожаловать в {APP_NAME}.

\n \n

Для завершения регистрации и получения доступа ко всем возможностям сервиса, пожалуйста, подтвердите ваш адрес электронной почты.

\n \n

\n \n Подтвердить email\n \n

\n \n

Или скопируйте эту ссылку в адресную строку браузера:

\n \n

\n http://localhost:4321/auth/confirm?token={TOKEN}\n

\n \n

\n Не можете нажать на кнопку?
\n Просто скопируйте ссылку выше и вставьте её в браузер.\n

\n \n
\n \n

\n Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.\n

\n \n

\n С уважением, команда {APP_NAME}\n

\n \n
" + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "
\n \n

Здравствуйте{RECORD:name, text,{ }}!

\n \n

Добро пожаловать в {APP_NAME}.

\n \n

Для завершения регистрации и получения доступа ко всем возможностям сервиса, пожалуйста, подтвердите ваш адрес электронной почты.

\n \n

\n \n Подтвердить email\n \n

\n \n

Или скопируйте эту ссылку в адресную строку браузера:

\n \n

\n http://localhost:4321/auth/confirm?token={TOKEN}\n

\n \n

\n Не можете нажать на кнопку?
\n Просто скопируйте ссылку выше и вставьте её в браузер.\n

\n \n
\n \n

\n Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.\n

\n \n

\n С уважением, команда {APP_NAME}\n

\n \n
" + } + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772464456_updated_users.js b/backend/pb_migrations/1772464456_updated_users.js new file mode 100644 index 0000000..df8d626 --- /dev/null +++ b/backend/pb_migrations/1772464456_updated_users.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "
\n \n

Здравствуйте, {RECORD:name}!

\n \n

Добро пожаловать в {APP_NAME}.

\n \n

Для завершения регистрации и получения доступа ко всем возможностям сервиса, пожалуйста, подтвердите ваш адрес электронной почты.

\n \n

\n \n Подтвердить email\n \n

\n \n

Или скопируйте эту ссылку в адресную строку браузера:

\n \n

\n http://localhost:4321/auth/confirm?token={TOKEN}\n

\n \n

\n Не можете нажать на кнопку?
\n Просто скопируйте ссылку выше и вставьте её в браузер.\n

\n \n
\n \n

\n Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.\n

\n \n

\n С уважением, команда {APP_NAME}\n

\n \n
" + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "verificationTemplate": { + "body": "
\n \n

Здравствуйте{RECORD_NAME}!

\n \n

Добро пожаловать в {APP_NAME}.

\n \n

Для завершения регистрации и получения доступа ко всем возможностям сервиса, пожалуйста, подтвердите ваш адрес электронной почты.

\n \n

\n \n Подтвердить email\n \n

\n \n

Или скопируйте эту ссылку в адресную строку браузера:

\n \n

\n http://localhost:4321/auth/confirm?token={TOKEN}\n

\n \n

\n Не можете нажать на кнопку?
\n Просто скопируйте ссылку выше и вставьте её в браузер.\n

\n \n
\n \n

\n Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.\n

\n \n

\n С уважением, команда {APP_NAME}\n

\n \n
" + } + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772897399_created_comments.js b/backend/pb_migrations/1772897399_created_comments.js new file mode 100644 index 0000000..5285e17 --- /dev/null +++ b/backend/pb_migrations/1772897399_created_comments.js @@ -0,0 +1,57 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_533777971", + "indexes": [], + "listRule": null, + "name": "comments", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971"); + + return app.delete(collection); +}) diff --git a/backend/pb_migrations/1772900016_updated_comments.js b/backend/pb_migrations/1772900016_updated_comments.js new file mode 100644 index 0000000..af70ff6 --- /dev/null +++ b/backend/pb_migrations/1772900016_updated_comments.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // add field + collection.fields.addAt(1, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1372126313", + "max": 0, + "min": 0, + "name": "post_slug", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // remove field + collection.fields.removeById("text1372126313") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772900060_updated_comments.js b/backend/pb_migrations/1772900060_updated_comments.js new file mode 100644 index 0000000..b8dbbce --- /dev/null +++ b/backend/pb_migrations/1772900060_updated_comments.js @@ -0,0 +1,28 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // add field + collection.fields.addAt(2, new Field({ + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2375276105", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // remove field + collection.fields.removeById("relation2375276105") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772900079_updated_comments.js b/backend/pb_migrations/1772900079_updated_comments.js new file mode 100644 index 0000000..f04696e --- /dev/null +++ b/backend/pb_migrations/1772900079_updated_comments.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // add field + collection.fields.addAt(3, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text4274335913", + "max": 0, + "min": 0, + "name": "content", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // remove field + collection.fields.removeById("text4274335913") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772900109_updated_comments.js b/backend/pb_migrations/1772900109_updated_comments.js new file mode 100644 index 0000000..832b8b1 --- /dev/null +++ b/backend/pb_migrations/1772900109_updated_comments.js @@ -0,0 +1,28 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // add field + collection.fields.addAt(4, new Field({ + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation1032740943", + "maxSelect": 1, + "minSelect": 0, + "name": "parent", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // remove field + collection.fields.removeById("relation1032740943") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772900445_updated_comments.js b/backend/pb_migrations/1772900445_updated_comments.js new file mode 100644 index 0000000..24f3001 --- /dev/null +++ b/backend/pb_migrations/1772900445_updated_comments.js @@ -0,0 +1,43 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // add field + collection.fields.addAt(5, new Field({ + "hidden": false, + "id": "select2063623452", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "pending", + "published" + ] + })) + + // add field + collection.fields.addAt(6, new Field({ + "hidden": false, + "id": "bool2599192861", + "name": "is_verified", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // remove field + collection.fields.removeById("select2063623452") + + // remove field + collection.fields.removeById("bool2599192861") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772900457_updated_comments.js b/backend/pb_migrations/1772900457_updated_comments.js new file mode 100644 index 0000000..1e64cce --- /dev/null +++ b/backend/pb_migrations/1772900457_updated_comments.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update collection data + unmarshal({ + "listRule": "", + "viewRule": "" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772901138_updated_comments.js b/backend/pb_migrations/1772901138_updated_comments.js new file mode 100644 index 0000000..d5af35a --- /dev/null +++ b/backend/pb_migrations/1772901138_updated_comments.js @@ -0,0 +1,43 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(5, new Field({ + "hidden": false, + "id": "select2063623452", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "pending", + "published", + "spam" + ] + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(5, new Field({ + "hidden": false, + "id": "select2063623452", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "pending", + "published" + ] + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772901223_updated_comments.js b/backend/pb_migrations/1772901223_updated_comments.js new file mode 100644 index 0000000..ac09b2f --- /dev/null +++ b/backend/pb_migrations/1772901223_updated_comments.js @@ -0,0 +1,28 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // remove field + collection.fields.removeById("relation1032740943") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // add field + collection.fields.addAt(4, new Field({ + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation1032740943", + "maxSelect": 1, + "minSelect": 0, + "name": "parent", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772901242_updated_comments.js b/backend/pb_migrations/1772901242_updated_comments.js new file mode 100644 index 0000000..b98f1bb --- /dev/null +++ b/backend/pb_migrations/1772901242_updated_comments.js @@ -0,0 +1,28 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // add field + collection.fields.addAt(6, new Field({ + "cascadeDelete": false, + "collectionId": "pbc_533777971", + "hidden": false, + "id": "relation1032740943", + "maxSelect": 1, + "minSelect": 0, + "name": "parent", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // remove field + collection.fields.removeById("relation1032740943") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772901514_updated_comments.js b/backend/pb_migrations/1772901514_updated_comments.js new file mode 100644 index 0000000..c3e27fc --- /dev/null +++ b/backend/pb_migrations/1772901514_updated_comments.js @@ -0,0 +1,42 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(1, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1372126313", + "max": 0, + "min": 0, + "name": "post_slug", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(1, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1372126313", + "max": 0, + "min": 0, + "name": "post_slug", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772901538_updated_comments.js b/backend/pb_migrations/1772901538_updated_comments.js new file mode 100644 index 0000000..4e97e1d --- /dev/null +++ b/backend/pb_migrations/1772901538_updated_comments.js @@ -0,0 +1,42 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(3, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text4274335913", + "max": 2000, + "min": 10, + "name": "content", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(3, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text4274335913", + "max": 0, + "min": 0, + "name": "content", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772901548_updated_comments.js b/backend/pb_migrations/1772901548_updated_comments.js new file mode 100644 index 0000000..4b01ca2 --- /dev/null +++ b/backend/pb_migrations/1772901548_updated_comments.js @@ -0,0 +1,44 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(5, new Field({ + "hidden": false, + "id": "select2063623452", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": true, + "system": false, + "type": "select", + "values": [ + "pending", + "published", + "spam" + ] + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(5, new Field({ + "hidden": false, + "id": "select2063623452", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "pending", + "published", + "spam" + ] + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1772901563_updated_comments.js b/backend/pb_migrations/1772901563_updated_comments.js new file mode 100644 index 0000000..de0d8d1 --- /dev/null +++ b/backend/pb_migrations/1772901563_updated_comments.js @@ -0,0 +1,40 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(4, new Field({ + "cascadeDelete": true, + "collectionId": "pbc_533777971", + "hidden": false, + "id": "relation1032740943", + "maxSelect": 1, + "minSelect": 0, + "name": "parent", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // update field + collection.fields.addAt(4, new Field({ + "cascadeDelete": false, + "collectionId": "pbc_533777971", + "hidden": false, + "id": "relation1032740943", + "maxSelect": 1, + "minSelect": 0, + "name": "parent", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773159590_updated_comments.js b/backend/pb_migrations/1773159590_updated_comments.js new file mode 100644 index 0000000..40ea25a --- /dev/null +++ b/backend/pb_migrations/1773159590_updated_comments.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // remove field + collection.fields.removeById("bool2599192861") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_533777971") + + // add field + collection.fields.addAt(6, new Field({ + "hidden": false, + "id": "bool2599192861", + "name": "is_verified", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773159998_updated_users.js b/backend/pb_migrations/1773159998_updated_users.js new file mode 100644 index 0000000..9b5c454 --- /dev/null +++ b/backend/pb_migrations/1773159998_updated_users.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "listRule": "id = @request.auth.id", + "viewRule": "id = @request.auth.id" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773163751_created_posts.js b/backend/pb_migrations/1773163751_created_posts.js new file mode 100644 index 0000000..07374f3 --- /dev/null +++ b/backend/pb_migrations/1773163751_created_posts.js @@ -0,0 +1,57 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_1125843985", + "indexes": [], + "listRule": null, + "name": "posts", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985"); + + return app.delete(collection); +}) diff --git a/backend/pb_migrations/1773163785_updated_posts.js b/backend/pb_migrations/1773163785_updated_posts.js new file mode 100644 index 0000000..65e0076 --- /dev/null +++ b/backend/pb_migrations/1773163785_updated_posts.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(1, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text724990059", + "max": 0, + "min": 0, + "name": "title", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("text724990059") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773163792_updated_posts.js b/backend/pb_migrations/1773163792_updated_posts.js new file mode 100644 index 0000000..322a735 --- /dev/null +++ b/backend/pb_migrations/1773163792_updated_posts.js @@ -0,0 +1,42 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update field + collection.fields.addAt(1, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text724990059", + "max": 0, + "min": 0, + "name": "title", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update field + collection.fields.addAt(1, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text724990059", + "max": 0, + "min": 0, + "name": "title", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773163813_updated_posts.js b/backend/pb_migrations/1773163813_updated_posts.js new file mode 100644 index 0000000..2d27b8e --- /dev/null +++ b/backend/pb_migrations/1773163813_updated_posts.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(2, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text2560465762", + "max": 0, + "min": 0, + "name": "slug", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("text2560465762") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773163823_updated_posts.js b/backend/pb_migrations/1773163823_updated_posts.js new file mode 100644 index 0000000..71fe4bf --- /dev/null +++ b/backend/pb_migrations/1773163823_updated_posts.js @@ -0,0 +1,42 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update field + collection.fields.addAt(2, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text2560465762", + "max": 0, + "min": 0, + "name": "slug", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update field + collection.fields.addAt(2, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text2560465762", + "max": 0, + "min": 0, + "name": "slug", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773163843_updated_posts.js b/backend/pb_migrations/1773163843_updated_posts.js new file mode 100644 index 0000000..a4845a6 --- /dev/null +++ b/backend/pb_migrations/1773163843_updated_posts.js @@ -0,0 +1,27 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(3, new Field({ + "hidden": false, + "id": "number1237995133", + "max": null, + "min": null, + "name": "likes", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("number1237995133") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773163896_updated_posts.js b/backend/pb_migrations/1773163896_updated_posts.js new file mode 100644 index 0000000..2862ef4 --- /dev/null +++ b/backend/pb_migrations/1773163896_updated_posts.js @@ -0,0 +1,27 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(4, new Field({ + "hidden": false, + "id": "number770948625", + "max": null, + "min": null, + "name": "dislikes", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("number770948625") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773163963_updated_posts.js b/backend/pb_migrations/1773163963_updated_posts.js new file mode 100644 index 0000000..4b36e00 --- /dev/null +++ b/backend/pb_migrations/1773163963_updated_posts.js @@ -0,0 +1,28 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "createRule": "@request.auth.id != \"\"", + "deleteRule": "@request.auth.id != \"\"", + "listRule": "@request.auth.id != \"\"", + "updateRule": "@request.auth.id != \"\"", + "viewRule": "@request.auth.id != \"\"" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "createRule": null, + "deleteRule": null, + "listRule": null, + "updateRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773163994_created_post_votes.js b/backend/pb_migrations/1773163994_created_post_votes.js new file mode 100644 index 0000000..95925d3 --- /dev/null +++ b/backend/pb_migrations/1773163994_created_post_votes.js @@ -0,0 +1,57 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_941672112", + "indexes": [], + "listRule": null, + "name": "post_votes", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112"); + + return app.delete(collection); +}) diff --git a/backend/pb_migrations/1773235483_updated_posts.js b/backend/pb_migrations/1773235483_updated_posts.js new file mode 100644 index 0000000..176016b --- /dev/null +++ b/backend/pb_migrations/1773235483_updated_posts.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(5, new Field({ + "hidden": false, + "id": "file3309110367", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "image", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("file3309110367") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773236214_updated_posts.js b/backend/pb_migrations/1773236214_updated_posts.js new file mode 100644 index 0000000..5a86f28 --- /dev/null +++ b/backend/pb_migrations/1773236214_updated_posts.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": "@request.auth.id != \"\"", + "viewRule": "@request.auth.id != \"\"" + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773236614_updated_posts.js b/backend/pb_migrations/1773236614_updated_posts.js new file mode 100644 index 0000000..1d529e7 --- /dev/null +++ b/backend/pb_migrations/1773236614_updated_posts.js @@ -0,0 +1,26 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(6, new Field({ + "convertURLs": false, + "hidden": false, + "id": "editor4274335913", + "maxSize": 0, + "name": "content", + "presentable": false, + "required": false, + "system": false, + "type": "editor" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("editor4274335913") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773236992_updated_posts.js b/backend/pb_migrations/1773236992_updated_posts.js new file mode 100644 index 0000000..d6a3576 --- /dev/null +++ b/backend/pb_migrations/1773236992_updated_posts.js @@ -0,0 +1,25 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(7, new Field({ + "hidden": false, + "id": "json1077128922", + "maxSize": 0, + "name": "tableOfContents", + "presentable": false, + "required": false, + "system": false, + "type": "json" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("json1077128922") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773238188_updated_posts.js b/backend/pb_migrations/1773238188_updated_posts.js new file mode 100644 index 0000000..2cfe9dd --- /dev/null +++ b/backend/pb_migrations/1773238188_updated_posts.js @@ -0,0 +1,27 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "number320982995", + "max": null, + "min": null, + "name": "readTime", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("number320982995") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773238239_updated_posts.js b/backend/pb_migrations/1773238239_updated_posts.js new file mode 100644 index 0000000..64b44e2 --- /dev/null +++ b/backend/pb_migrations/1773238239_updated_posts.js @@ -0,0 +1,38 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "number320982995", + "max": 60, + "min": 0, + "name": "readTime", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "number320982995", + "max": null, + "min": null, + "name": "readTime", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773238280_updated_posts.js b/backend/pb_migrations/1773238280_updated_posts.js new file mode 100644 index 0000000..be8b8bc --- /dev/null +++ b/backend/pb_migrations/1773238280_updated_posts.js @@ -0,0 +1,25 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(9, new Field({ + "hidden": false, + "id": "json1874629670", + "maxSize": 0, + "name": "tags", + "presentable": false, + "required": false, + "system": false, + "type": "json" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("json1874629670") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773238374_updated_posts.js b/backend/pb_migrations/1773238374_updated_posts.js new file mode 100644 index 0000000..26b43ec --- /dev/null +++ b/backend/pb_migrations/1773238374_updated_posts.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(10, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1591429585", + "max": 0, + "min": 0, + "name": "excerpt", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("text1591429585") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773239805_updated_posts.js b/backend/pb_migrations/1773239805_updated_posts.js new file mode 100644 index 0000000..46ba326 --- /dev/null +++ b/backend/pb_migrations/1773239805_updated_posts.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": "", + "viewRule": "" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773239833_updated_posts.js b/backend/pb_migrations/1773239833_updated_posts.js new file mode 100644 index 0000000..e5aa505 --- /dev/null +++ b/backend/pb_migrations/1773239833_updated_posts.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": "@request.auth.id != \"\"", + "viewRule": "@request.auth.id != \"\"" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": "", + "viewRule": "" + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773239906_updated_posts.js b/backend/pb_migrations/1773239906_updated_posts.js new file mode 100644 index 0000000..5a86f28 --- /dev/null +++ b/backend/pb_migrations/1773239906_updated_posts.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": "@request.auth.id != \"\"", + "viewRule": "@request.auth.id != \"\"" + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773239941_updated_posts.js b/backend/pb_migrations/1773239941_updated_posts.js new file mode 100644 index 0000000..57b1844 --- /dev/null +++ b/backend/pb_migrations/1773239941_updated_posts.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": "id > \"\"", + "viewRule": "id > \"\"" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773240027_updated_posts.js b/backend/pb_migrations/1773240027_updated_posts.js new file mode 100644 index 0000000..0e024e0 --- /dev/null +++ b/backend/pb_migrations/1773240027_updated_posts.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": "id > \"\"", + "viewRule": "id > \"\"" + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773240240_updated_posts.js b/backend/pb_migrations/1773240240_updated_posts.js new file mode 100644 index 0000000..54942ab --- /dev/null +++ b/backend/pb_migrations/1773240240_updated_posts.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": "id != \"\"", + "viewRule": "id != \"\"" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773241902_updated_posts.js b/backend/pb_migrations/1773241902_updated_posts.js new file mode 100644 index 0000000..90c5d6a --- /dev/null +++ b/backend/pb_migrations/1773241902_updated_posts.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(11, new Field({ + "hidden": false, + "id": "bool4080639015", + "name": "isImportant", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("bool4080639015") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773411989_updated_post_votes.js b/backend/pb_migrations/1773411989_updated_post_votes.js new file mode 100644 index 0000000..73df6db --- /dev/null +++ b/backend/pb_migrations/1773411989_updated_post_votes.js @@ -0,0 +1,64 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // add field + collection.fields.addAt(1, new Field({ + "cascadeDelete": false, + "collectionId": "pbc_1125843985", + "hidden": false, + "id": "relation1519021197", + "maxSelect": 1, + "minSelect": 0, + "name": "post", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + // add field + collection.fields.addAt(2, new Field({ + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2375276105", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + // add field + collection.fields.addAt(3, new Field({ + "hidden": false, + "id": "select1002219032", + "maxSelect": 1, + "name": "vote_type", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "like" + ] + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // remove field + collection.fields.removeById("relation1519021197") + + // remove field + collection.fields.removeById("relation2375276105") + + // remove field + collection.fields.removeById("select1002219032") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773412320_updated_post_votes.js b/backend/pb_migrations/1773412320_updated_post_votes.js new file mode 100644 index 0000000..b251c85 --- /dev/null +++ b/backend/pb_migrations/1773412320_updated_post_votes.js @@ -0,0 +1,41 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update field + collection.fields.addAt(3, new Field({ + "hidden": false, + "id": "select1002219032", + "maxSelect": 1, + "name": "vote_type", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "like", + "dislike" + ] + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update field + collection.fields.addAt(3, new Field({ + "hidden": false, + "id": "select1002219032", + "maxSelect": 1, + "name": "vote_type", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "like" + ] + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773412341_updated_post_votes.js b/backend/pb_migrations/1773412341_updated_post_votes.js new file mode 100644 index 0000000..7264536 --- /dev/null +++ b/backend/pb_migrations/1773412341_updated_post_votes.js @@ -0,0 +1,40 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update field + collection.fields.addAt(1, new Field({ + "cascadeDelete": false, + "collectionId": "pbc_1125843985", + "hidden": false, + "id": "relation1519021197", + "maxSelect": 1, + "minSelect": 0, + "name": "post", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update field + collection.fields.addAt(1, new Field({ + "cascadeDelete": false, + "collectionId": "pbc_1125843985", + "hidden": false, + "id": "relation1519021197", + "maxSelect": 1, + "minSelect": 0, + "name": "post", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773412358_updated_post_votes.js b/backend/pb_migrations/1773412358_updated_post_votes.js new file mode 100644 index 0000000..f4d3016 --- /dev/null +++ b/backend/pb_migrations/1773412358_updated_post_votes.js @@ -0,0 +1,40 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update field + collection.fields.addAt(2, new Field({ + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2375276105", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update field + collection.fields.addAt(2, new Field({ + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2375276105", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773412830_updated_post_votes.js b/backend/pb_migrations/1773412830_updated_post_votes.js new file mode 100644 index 0000000..d146f0a --- /dev/null +++ b/backend/pb_migrations/1773412830_updated_post_votes.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update collection data + unmarshal({ + "indexes": [ + "CREATE UNIQUE INDEX `idx_N7WBHpSVZG` ON `post_votes` (\n `post`,\n `user`\n)" + ] + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update collection data + unmarshal({ + "indexes": [] + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773416375_updated_post_votes.js b/backend/pb_migrations/1773416375_updated_post_votes.js new file mode 100644 index 0000000..2e05d68 --- /dev/null +++ b/backend/pb_migrations/1773416375_updated_post_votes.js @@ -0,0 +1,28 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update collection data + unmarshal({ + "createRule": "@request.auth.id != \"\" && @request.auth.id = user", + "deleteRule": "@request.auth.id != \"\" && @request.auth.id = user", + "listRule": "", + "updateRule": "@request.auth.id != \"\" && @request.auth.id = user", + "viewRule": "" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update collection data + unmarshal({ + "createRule": null, + "deleteRule": null, + "listRule": null, + "updateRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773416384_updated_post_votes.js b/backend/pb_migrations/1773416384_updated_post_votes.js new file mode 100644 index 0000000..dd76ede --- /dev/null +++ b/backend/pb_migrations/1773416384_updated_post_votes.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update collection data + unmarshal({ + "listRule": "", + "viewRule": "" + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773416434_updated_post_votes.js b/backend/pb_migrations/1773416434_updated_post_votes.js new file mode 100644 index 0000000..7475105 --- /dev/null +++ b/backend/pb_migrations/1773416434_updated_post_votes.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update collection data + unmarshal({ + "listRule": "@request.auth.id != \"\"", + "viewRule": "@request.auth.id != \"\"" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_941672112") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773771301_updated_posts.js b/backend/pb_migrations/1773771301_updated_posts.js new file mode 100644 index 0000000..c6f8ba4 --- /dev/null +++ b/backend/pb_migrations/1773771301_updated_posts.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // add field + collection.fields.addAt(12, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text105650625", + "max": 0, + "min": 0, + "name": "category", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_1125843985") + + // remove field + collection.fields.removeById("text105650625") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773929655_created_reviews.js b/backend/pb_migrations/1773929655_created_reviews.js new file mode 100644 index 0000000..c9b83e8 --- /dev/null +++ b/backend/pb_migrations/1773929655_created_reviews.js @@ -0,0 +1,111 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1466534506", + "max": 0, + "min": 0, + "name": "role", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text376926767", + "max": 0, + "min": 0, + "name": "avatar", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number3632866850", + "max": null, + "min": null, + "name": "rating", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_4163081445", + "indexes": [], + "listRule": null, + "name": "reviews", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445"); + + return app.delete(collection); +}) diff --git a/backend/pb_migrations/1773930119_updated_reviews.js b/backend/pb_migrations/1773930119_updated_reviews.js new file mode 100644 index 0000000..26b65df --- /dev/null +++ b/backend/pb_migrations/1773930119_updated_reviews.js @@ -0,0 +1,95 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(5, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text999008199", + "max": 0, + "min": 0, + "name": "text", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + // add field + collection.fields.addAt(6, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text3343621945", + "max": 0, + "min": 0, + "name": "caseType", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + // add field + collection.fields.addAt(7, new Field({ + "hidden": false, + "id": "bool256245529", + "name": "verified", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "bool849764742", + "name": "hasDocument", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + // add field + collection.fields.addAt(9, new Field({ + "hidden": false, + "id": "file1030067157", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "documentFiles", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("text999008199") + + // remove field + collection.fields.removeById("text3343621945") + + // remove field + collection.fields.removeById("bool256245529") + + // remove field + collection.fields.removeById("bool849764742") + + // remove field + collection.fields.removeById("file1030067157") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773930148_updated_reviews.js b/backend/pb_migrations/1773930148_updated_reviews.js new file mode 100644 index 0000000..b591e04 --- /dev/null +++ b/backend/pb_migrations/1773930148_updated_reviews.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(10, new Field({ + "hidden": false, + "id": "bool1369756112", + "name": "isPublished", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("bool1369756112") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1773931986_updated_reviews.js b/backend/pb_migrations/1773931986_updated_reviews.js new file mode 100644 index 0000000..3b1877b --- /dev/null +++ b/backend/pb_migrations/1773931986_updated_reviews.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("bool849764742") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "bool849764742", + "name": "hasDocument", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774355895_updated_reviews.js b/backend/pb_migrations/1774355895_updated_reviews.js new file mode 100644 index 0000000..d58d722 --- /dev/null +++ b/backend/pb_migrations/1774355895_updated_reviews.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("text376926767") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(3, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text376926767", + "max": 0, + "min": 0, + "name": "avatar", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774355920_updated_reviews.js b/backend/pb_migrations/1774355920_updated_reviews.js new file mode 100644 index 0000000..54c6a88 --- /dev/null +++ b/backend/pb_migrations/1774355920_updated_reviews.js @@ -0,0 +1,42 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update field + collection.fields.addAt(5, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text3343621945", + "max": 0, + "min": 0, + "name": "case_type", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update field + collection.fields.addAt(5, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text3343621945", + "max": 0, + "min": 0, + "name": "caseType", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774355977_updated_reviews.js b/backend/pb_migrations/1774355977_updated_reviews.js new file mode 100644 index 0000000..c2aca7e --- /dev/null +++ b/backend/pb_migrations/1774355977_updated_reviews.js @@ -0,0 +1,28 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(9, new Field({ + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2375276105", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("relation2375276105") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774355987_updated_reviews.js b/backend/pb_migrations/1774355987_updated_reviews.js new file mode 100644 index 0000000..b0b0343 --- /dev/null +++ b/backend/pb_migrations/1774355987_updated_reviews.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("file1030067157") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(7, new Field({ + "hidden": false, + "id": "file1030067157", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "documentFiles", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774356020_updated_reviews.js b/backend/pb_migrations/1774356020_updated_reviews.js new file mode 100644 index 0000000..f9fe446 --- /dev/null +++ b/backend/pb_migrations/1774356020_updated_reviews.js @@ -0,0 +1,32 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update field + collection.fields.addAt(6, new Field({ + "hidden": false, + "id": "bool256245529", + "name": "is_verified", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update field + collection.fields.addAt(6, new Field({ + "hidden": false, + "id": "bool256245529", + "name": "verified", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774356076_updated_reviews.js b/backend/pb_migrations/1774356076_updated_reviews.js new file mode 100644 index 0000000..29da6b6 --- /dev/null +++ b/backend/pb_migrations/1774356076_updated_reviews.js @@ -0,0 +1,30 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(9, new Field({ + "hidden": false, + "id": "select2063623452", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "pending", + "published", + "spam" + ] + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("select2063623452") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774356328_created_case_categories.js b/backend/pb_migrations/1774356328_created_case_categories.js new file mode 100644 index 0000000..5c2046c --- /dev/null +++ b/backend/pb_migrations/1774356328_created_case_categories.js @@ -0,0 +1,148 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2560465762", + "max": 0, + "min": 0, + "name": "slug", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1843675174", + "max": 0, + "min": 0, + "name": "description", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1704208859", + "max": 0, + "min": 0, + "name": "icon", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1716930793", + "max": 0, + "min": 0, + "name": "color", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number4113142680", + "max": null, + "min": null, + "name": "order", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "bool458715613", + "name": "is_active", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_2130617118", + "indexes": [], + "listRule": null, + "name": "case_categories", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_2130617118"); + + return app.delete(collection); +}) diff --git a/backend/pb_migrations/1774356453_updated_case_categories.js b/backend/pb_migrations/1774356453_updated_case_categories.js new file mode 100644 index 0000000..bac8c79 --- /dev/null +++ b/backend/pb_migrations/1774356453_updated_case_categories.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_2130617118") + + // remove field + collection.fields.removeById("text1843675174") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_2130617118") + + // add field + collection.fields.addAt(4, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1843675174", + "max": 0, + "min": 0, + "name": "description", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774356772_updated_case_categories.js b/backend/pb_migrations/1774356772_updated_case_categories.js new file mode 100644 index 0000000..ce08bc7 --- /dev/null +++ b/backend/pb_migrations/1774356772_updated_case_categories.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_2130617118") + + // update collection data + unmarshal({ + "listRule": "", + "viewRule": "" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_2130617118") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774357084_updated_reviews.js b/backend/pb_migrations/1774357084_updated_reviews.js new file mode 100644 index 0000000..a8d7e9a --- /dev/null +++ b/backend/pb_migrations/1774357084_updated_reviews.js @@ -0,0 +1,38 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update field + collection.fields.addAt(3, new Field({ + "hidden": false, + "id": "number3632866850", + "max": 5, + "min": 1, + "name": "rating", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update field + collection.fields.addAt(3, new Field({ + "hidden": false, + "id": "number3632866850", + "max": null, + "min": null, + "name": "rating", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774357117_updated_reviews.js b/backend/pb_migrations/1774357117_updated_reviews.js new file mode 100644 index 0000000..63255b9 --- /dev/null +++ b/backend/pb_migrations/1774357117_updated_reviews.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("text3343621945") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(5, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text3343621945", + "max": 0, + "min": 0, + "name": "case_type", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774357136_updated_reviews.js b/backend/pb_migrations/1774357136_updated_reviews.js new file mode 100644 index 0000000..536c022 --- /dev/null +++ b/backend/pb_migrations/1774357136_updated_reviews.js @@ -0,0 +1,28 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(9, new Field({ + "cascadeDelete": false, + "collectionId": "pbc_2130617118", + "hidden": false, + "id": "relation2435933116", + "maxSelect": 1, + "minSelect": 0, + "name": "case_category", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("relation2435933116") + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774357325_updated_reviews.js b/backend/pb_migrations/1774357325_updated_reviews.js new file mode 100644 index 0000000..b4fcceb --- /dev/null +++ b/backend/pb_migrations/1774357325_updated_reviews.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update collection data + unmarshal({ + "listRule": "", + "viewRule": "" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774357433_updated_users.js b/backend/pb_migrations/1774357433_updated_users.js new file mode 100644 index 0000000..abd555b --- /dev/null +++ b/backend/pb_migrations/1774357433_updated_users.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "listRule": "id = @request.auth.id", + "viewRule": "id = @request.auth.id" + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774357449_updated_users.js b/backend/pb_migrations/1774357449_updated_users.js new file mode 100644 index 0000000..4f1e542 --- /dev/null +++ b/backend/pb_migrations/1774357449_updated_users.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "listRule": "", + "viewRule": "" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774373091_updated_reviews.js b/backend/pb_migrations/1774373091_updated_reviews.js new file mode 100644 index 0000000..453926c --- /dev/null +++ b/backend/pb_migrations/1774373091_updated_reviews.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("bool256245529") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(7, new Field({ + "hidden": false, + "id": "bool256245529", + "name": "is_verified", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774373801_updated_reviews.js b/backend/pb_migrations/1774373801_updated_reviews.js new file mode 100644 index 0000000..e41a75d --- /dev/null +++ b/backend/pb_migrations/1774373801_updated_reviews.js @@ -0,0 +1,20 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update collection data + unmarshal({ + "createRule": "" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // update collection data + unmarshal({ + "createRule": null + }, collection) + + return app.save(collection) +}) diff --git a/backend/pb_migrations/1774375633_updated_reviews.js b/backend/pb_migrations/1774375633_updated_reviews.js new file mode 100644 index 0000000..72c7d05 --- /dev/null +++ b/backend/pb_migrations/1774375633_updated_reviews.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // remove field + collection.fields.removeById("text1579384326") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_4163081445") + + // add field + collection.fields.addAt(1, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}) diff --git a/backend/pocketbase.exe b/backend/pocketbase.exe new file mode 100644 index 0000000..150ccb6 Binary files /dev/null and b/backend/pocketbase.exe differ diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..d120643 --- /dev/null +++ b/bun.lock @@ -0,0 +1,390 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "astro-advokat-mono", + "devDependencies": { + "concurrently": "^9.2.1", + "maildev": "^2.2.1", + }, + }, + }, + "packages": { + "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.2.0", "", { "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw=="], + + "@csstools/color-helpers": ["@csstools/color-helpers@5.1.0", "", {}, "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA=="], + + "@csstools/css-calc": ["@csstools/css-calc@2.1.4", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ=="], + + "@csstools/css-color-parser": ["@csstools/css-color-parser@3.1.0", "", { "dependencies": { "@csstools/color-helpers": "^5.1.0", "@csstools/css-calc": "^2.1.4" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA=="], + + "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.5", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ=="], + + "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="], + + "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], + + "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], + + "@types/node": ["@types/node@25.3.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ=="], + + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "addressparser": ["addressparser@1.0.1", "", {}, "sha512-aQX7AISOMM7HFE0iZ3+YnD07oIeJqWGVnJ+ZIKaBZAk03ftmVYVqsGas/rbXKR21n4D/hKCSHypvcyOkds/xzg=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "base64id": ["base64id@2.0.0", "", {}, "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="], + + "body-parser": ["body-parser@1.20.4", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.14.0", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], + + "compression": ["compression@1.8.1", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], + + "concurrently": ["concurrently@9.2.1", "", { "dependencies": { "chalk": "4.1.2", "rxjs": "7.8.2", "shell-quote": "1.8.3", "supports-color": "8.1.1", "tree-kill": "1.2.2", "yargs": "17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" } }, "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng=="], + + "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-signature": ["cookie-signature@1.0.7", "", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="], + + "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], + + "cssstyle": ["cssstyle@4.6.0", "", { "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" } }, "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg=="], + + "data-urls": ["data-urls@5.0.0", "", { "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" } }, "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="], + + "debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "dompurify": ["dompurify@3.3.1", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "engine.io": ["engine.io@6.6.5", "", { "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.4.1", "engine.io-parser": "~5.2.1", "ws": "~8.18.3" } }, "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A=="], + + "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], + + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "express": ["express@4.22.1", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.3", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "finalhandler": ["finalhandler@1.3.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="], + + "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="], + + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "iconv-lite": ["iconv-lite@0.5.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "ipv6-normalize": ["ipv6-normalize@1.0.1", "", {}, "sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], + + "jsdom": ["jsdom@24.1.3", "", { "dependencies": { "cssstyle": "^4.0.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.12", "parse5": "^7.1.2", "rrweb-cssom": "^0.7.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^4.1.4", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^2.11.2" }, "optionalPeers": ["canvas"] }, "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ=="], + + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "maildev": ["maildev@2.2.1", "", { "dependencies": { "addressparser": "1.0.1", "async": "^3.2.3", "commander": "^12.1.0", "compression": "^1.7.4", "cors": "^2.8.5", "dompurify": "^3.1.6", "express": "^4.21.2", "iconv-lite": "0.5.0", "jsdom": "^24.1.1", "mime": "2.4.4", "nodemailer": "^6.9.14", "smtp-server": "^3.13.4", "socket.io": "^4.7.5", "uue": "3.1.2", "wildstring": "1.0.9" }, "bin": { "maildev": "bin/maildev" } }, "sha512-uNSJ4LpiNfCMw5KpWAM5x1UgOyG3ngeNwzBqw4/Wl18ECkJDyXBYpTH44HCG8LqAOFLkUiLl/1Ah5lrQhv3GzQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "mime": ["mime@2.4.4", "", { "bin": { "mime": "cli.js" } }, "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA=="], + + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + + "nodemailer": ["nodemailer@6.10.1", "", {}, "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA=="], + + "nwsapi": ["nwsapi@2.2.23", "", {}, "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], + + "qs": ["qs@6.14.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q=="], + + "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@2.5.3", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + + "rrweb-cssom": ["rrweb-cssom@0.7.1", "", {}, "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg=="], + + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], + + "send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], + + "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "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" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "smtp-server": ["smtp-server@3.18.1", "", { "dependencies": { "ipv6-normalize": "1.0.1", "nodemailer": "7.0.13", "punycode.js": "2.3.1" } }, "sha512-zlUXA6n3HkO0jMyNNc2S67uw7DWHOoLU9vjPo5oW2c8ehJMpRlSumyw4riuvfWPfW/8mryd7ED5PVf4YVg8Y6w=="], + + "socket.io": ["socket.io@4.8.3", "", { "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.4.1", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" } }, "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A=="], + + "socket.io-adapter": ["socket.io-adapter@2.5.6", "", { "dependencies": { "debug": "~4.4.1", "ws": "~8.18.3" } }, "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ=="], + + "socket.io-parser": ["socket.io-parser@4.2.5", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" } }, "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tough-cookie": ["tough-cookie@4.1.4", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="], + + "tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="], + + "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + + "universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "uue": ["uue@3.1.2", "", { "dependencies": { "escape-string-regexp": "~1.0.5", "extend": "~3.0.0" } }, "sha512-axKLXVqwtdI/czrjG0X8hyV1KLgeWx8F4KvSbvVCnS+RUvsQMGRjx0kfuZDXXqj0LYvVJmx3B9kWlKtEdRrJLg=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="], + + "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], + + "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], + + "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], + + "whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="], + + "wildstring": ["wildstring@1.0.9", "", {}, "sha512-XBNxKIMLO6uVHf1Xvo++HGWAZZoiVCHmEMCmZJzJ82vQsuUJCLw13Gzq0mRCATk7a3+ZcgeOKSDioavuYqtlfA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + + "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], + + "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "cssstyle/rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="], + + "engine.io/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "engine.io/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "http-proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "https-proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "send/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "smtp-server/nodemailer": ["nodemailer@7.0.13", "", {}, "sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw=="], + + "socket.io/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "socket.io-adapter/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "socket.io-adapter/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "socket.io-parser/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "engine.io/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "http-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "https-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "socket.io-adapter/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "socket.io-parser/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "socket.io/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + } +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..016b59e --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# build output +dist/ + +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ diff --git a/frontend/.nvmrc b/frontend/.nvmrc new file mode 100644 index 0000000..2edeafb --- /dev/null +++ b/frontend/.nvmrc @@ -0,0 +1 @@ +20 \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..b63110c --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,26 @@ +# Используем официальный образ Bun через зеркало +FROM dockerhub.timeweb.cloud/oven/bun:alpine AS build + +WORKDIR /app + +# Копируем файлы зависимостей +COPY package.json bun.lockb* ./ +RUN bun install + +# Копируем проект и собираем +COPY . . +RUN bun run build + +# Финальный образ +FROM dockerhub.timeweb.cloud/oven/bun:alpine +WORKDIR /app + +# Копируем билд из предыдущего этапа +COPY --from=build /app/dist ./dist +COPY --from=build /app/package.json ./package.json + +# Указываем порт +EXPOSE 4321 + +# Запуск через Bun +CMD ["bun", "./dist/server/entry.mjs"] \ No newline at end of file diff --git a/frontend/QWEN.md b/frontend/QWEN.md new file mode 100644 index 0000000..3aea08b --- /dev/null +++ b/frontend/QWEN.md @@ -0,0 +1,61 @@ +# Правила взаимодействия с Qwen Code Assistant + +## Основные принципы + +1. **Изменения в коде возможны только с явного разрешения пользователя** + - Перед внесением любых изменений в файлы ассистент должен получить подтверждение от пользователя + - Все изменения должны быть предварительно объяснены пользователю + - Перед решением конкретной задачи всегда составлять план + - После внесения изменений в код - проводить проверку - только после этого приступать к дальнейшему решению задачи + +2. **Прозрачность действий** + - Ассистент должен объяснить, какие изменения планируется внести + - Необходимо указать, в какие файлы будут внесены изменения + - Следует объяснить последствия предполагаемых изменений + +3. **Безопасность кода** + - Все изменения должны проходить проверку на безопасность + - Не должны вноситься изменения, которые могут повредить функциональность приложения + - Рекомендуется создание резервных копий при значительных изменениях + +4. **Согласование архитектурных решений** + - При внесении изменений, затрагивающих архитектуру приложения, необходима дискуссия с пользователем + - Предложения по улучшению архитектуры должны обсуждаться до реализации + +5. **Работа с разными типами проектов** + - Уважать существующую архитектуру и стиль кода проекта + - Следовать установленным в проекте принципам и паттернам + +6. **Использование Bun** + - Все команды должны выполняться с использованием Bun (bun install, bun dev, bun build и т.д.) + - При создании скриптов в package.json, они должны быть совместимы с Bun + +7. **Язык общения** + - Всё общение с пользователем происходит на русском языке + +8. **Проверка изменений** + - После внесения изменений в код не требуется запускать сервер разработки для проверки + - Пользователь самостоятельно запускает сервер и проверяет изменения + +9. **Проверка типов данных** + - Проверять проект на ошибки типизации через команду `bun run tsc --noEmit -p frontend/tsconfig.json` + - В проекте не должно быть типов any + - Все интерфейсы компонентов прописывать в файле globalInterfaces.ts + - При работе с PocketBase использовать актуальные сигнатуры методов из файла `D:\Verstka\production\astro_minivan\frontend\node_modules\pocketbase\dist\pocketbase.es.d.ts` + +10. **Плагин @astrojs/sitemap** + - Обязательно к установке в проект пакета @astrojs/sitemap + - Обязательно к созданию в проекте файла .nvmrc + +11. **Замена хоста при развертывании проекта** + - Обязательно нужно изменить http://localhost:3000/ в шаблонах писем на реальный + + + +## Qwen Added Memories +- URL документации Astro: https://docs.astro.build/en/getting-started/ +- URL документации PocketBase: https://pocketbase.io/docs/ +- URL документации SolidJS: https://docs.solidjs.com/solid-start/getting-started +- URL документации astro-icons: https://www.astroicon.dev/getting-started/ +- URL документации PayloadCMS: https://payloadcms.com/docs/getting-started/what-is-payload +- URL документации Prisma ORM и Astro: https://www.prisma.io/docs/ai/prompts/astro diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..b6de9b9 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,46 @@ +# Astro Starter Kit: Basics + +```sh +bun create astro@latest -- --template basics +``` + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +## 🚀 Project Structure + +Inside of your Astro project, you'll see the following folders and files: + +```text +/ +├── public/ +│ └── favicon.svg +├── src +│   ├── assets +│   │   └── astro.svg +│   ├── components +│   │   └── Welcome.astro +│   ├── layouts +│   │   └── Layout.astro +│   └── pages +│   └── index.astro +└── package.json +``` + +To learn more about the folder structure of an Astro project, refer to [our guide on project structure](https://docs.astro.build/en/basics/project-structure/). + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `bun install` | Installs dependencies | +| `bun dev` | Starts local dev server at `localhost:4321` | +| `bun build` | Build your production site to `./dist/` | +| `bun preview` | Preview your build locally, before deploying | +| `bun astro ...` | Run CLI commands like `astro add`, `astro check` | +| `bun astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). diff --git a/frontend/astro.config.mjs b/frontend/astro.config.mjs new file mode 100644 index 0000000..50eaade --- /dev/null +++ b/frontend/astro.config.mjs @@ -0,0 +1,20 @@ +// @ts-check +import { defineConfig } from 'astro/config'; +import tailwindcss from '@tailwindcss/vite'; +import { default as astroIcon } from 'astro-icon'; +import mdx from '@astrojs/mdx'; +import node from '@astrojs/node'; +import sitemap from '@astrojs/sitemap'; +import solidJs from '@astrojs/solid-js'; + +// https://astro.build/config +export default defineConfig({ + site: 'https://advokat086.ru', + integrations: [astroIcon(), mdx(), sitemap(), solidJs()], + prefetch: true, + vite: { + plugins: [tailwindcss()] + }, + output: 'server', + adapter: node({ mode: 'standalone' }), +}); \ No newline at end of file diff --git a/frontend/bun.lock b/frontend/bun.lock new file mode 100644 index 0000000..a1821b5 --- /dev/null +++ b/frontend/bun.lock @@ -0,0 +1,1217 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "frontend", + "dependencies": { + "@astrojs/mdx": "^4.3.13", + "@astrojs/node": "9.5.4", + "@astrojs/sitemap": "^3.7.0", + "@astrojs/solid-js": "^5.1.3", + "@tailwindcss/vite": "^4.1.18", + "astro": "5.18.0", + "astro-icon": "^1.1.5", + "gsap": "^3.14.2", + "pocketbase": "^0.26.8", + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.11", + "@tailwindcss/typography": "^0.5.19", + "@types/node": "^25.0.9", + "tailwindcss": "^4.1.18", + }, + }, + }, + "packages": { + "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + + "@antfu/utils": ["@antfu/utils@8.1.1", "", {}, "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ=="], + + "@astrojs/compiler": ["@astrojs/compiler@2.13.0", "", {}, "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw=="], + + "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.5", "", {}, "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA=="], + + "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.10", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.19.0", "smol-toml": "^1.5.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A=="], + + "@astrojs/mdx": ["@astrojs/mdx@4.3.13", "", { "dependencies": { "@astrojs/markdown-remark": "6.3.10", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q=="], + + "@astrojs/node": ["@astrojs/node@9.5.4", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "send": "^1.2.1", "server-destroy": "^1.0.1" }, "peerDependencies": { "astro": "^5.17.3" } }, "sha512-AbPSZsMGu8hXPR2XxV79RaKy8h6wijhtoqZGeUf4OXg2w1mxXlx4VnIc1D+QvtsgauSz7P5PLhmvf6w/J41GJg=="], + + "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="], + + "@astrojs/sitemap": ["@astrojs/sitemap@3.7.0", "", { "dependencies": { "sitemap": "^8.0.2", "stream-replace-string": "^2.0.0", "zod": "^3.25.76" } }, "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA=="], + + "@astrojs/solid-js": ["@astrojs/solid-js@5.1.3", "", { "dependencies": { "vite": "^6.4.1", "vite-plugin-solid": "^2.11.8" }, "peerDependencies": { "solid-devtools": "^0.30.1", "solid-js": "^1.8.5" }, "optionalPeers": ["solid-devtools"] }, "sha512-KxfYt4y1d7BuSw6EsN1EaPoGYsIES7bEI6AtTbncuabRUUMZs+mOWOeOdmgnwVLj+jbNbhBjUZsqr77eUviZdw=="], + + "@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="], + + "@babel/code-frame": ["@babel/code-frame@7.28.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.6", "", {}, "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg=="], + + "@babel/core": ["@babel/core@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw=="], + + "@babel/generator": ["@babel/generator@7.28.6", "", { "dependencies": { "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], + + "@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], + + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + + "@babel/traverse": ["@babel/traverse@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/types": "^7.28.6", "debug": "^4.3.1" } }, "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg=="], + + "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], + + "@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + + "@iconify/tools": ["@iconify/tools@4.2.0", "", { "dependencies": { "@iconify/types": "^2.0.0", "@iconify/utils": "^2.3.0", "cheerio": "^1.1.2", "domhandler": "^5.0.3", "extract-zip": "^2.0.1", "local-pkg": "^1.1.2", "pathe": "^2.0.3", "svgo": "^3.3.2", "tar": "^7.5.2" } }, "sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA=="], + + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + + "@iconify/utils": ["@iconify/utils@2.3.0", "", { "dependencies": { "@antfu/install-pkg": "^1.0.0", "@antfu/utils": "^8.1.0", "@iconify/types": "^2.0.0", "debug": "^4.4.0", "globals": "^15.14.0", "kolorist": "^1.8.0", "local-pkg": "^1.0.0", "mlly": "^1.7.4" } }, "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA=="], + + "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], + + "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.55.2", "", { "os": "android", "cpu": "arm" }, "sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.55.2", "", { "os": "android", "cpu": "arm64" }, "sha512-eXBg7ibkNUZ+sTwbFiDKou0BAckeV6kIigK7y5Ko4mB/5A1KLhuzEKovsmfvsL8mQorkoincMFGnQuIT92SKqA=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.55.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-UCbaTklREjrc5U47ypLulAgg4njaqfOVLU18VrCrI+6E5MQjuG0lSWaqLlAJwsD7NpFV249XgB0Bi37Zh5Sz4g=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.55.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-dP67MA0cCMHFT2g5XyjtpVOtp7y4UyUxN3dhLdt11at5cPKnSm4lY+EhwNvDXIMzAMIo2KU+mc9wxaAQJTn7sQ=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.55.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-WDUPLUwfYV9G1yxNRJdXcvISW15mpvod1Wv3ok+Ws93w1HjIVmCIFxsG2DquO+3usMNCpJQ0wqO+3GhFdl6Fow=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.55.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Ng95wtHVEulRwn7R0tMrlUuiLVL/HXA8Lt/MYVpy88+s5ikpntzZba1qEulTuPnPIZuOPcW9wNEiqvZxZmgmqQ=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.55.2", "", { "os": "linux", "cpu": "arm" }, "sha512-AEXMESUDWWGqD6LwO/HkqCZgUE1VCJ1OhbvYGsfqX2Y6w5quSXuyoy/Fg3nRqiwro+cJYFxiw5v4kB2ZDLhxrw=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.55.2", "", { "os": "linux", "cpu": "arm" }, "sha512-ZV7EljjBDwBBBSv570VWj0hiNTdHt9uGznDtznBB4Caj3ch5rgD4I2K1GQrtbvJ/QiB+663lLgOdcADMNVC29Q=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.55.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-uvjwc8NtQVPAJtq4Tt7Q49FOodjfbf6NpqXyW/rjXoV+iZ3EJAHLNAnKT5UJBc6ffQVgmXTUL2ifYiLABlGFqA=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.55.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-s3KoWVNnye9mm/2WpOZ3JeUiediUVw6AvY/H7jNA6qgKA2V2aM25lMkVarTDfiicn/DLq3O0a81jncXszoyCFA=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.55.2", "", { "os": "linux", "cpu": "none" }, "sha512-gi21faacK+J8aVSyAUptML9VQN26JRxe484IbF+h3hpG+sNVoMXPduhREz2CcYr5my0NE3MjVvQ5bMKX71pfVA=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.55.2", "", { "os": "linux", "cpu": "none" }, "sha512-qSlWiXnVaS/ceqXNfnoFZh4IiCA0EwvCivivTGbEu1qv2o+WTHpn1zNmCTAoOG5QaVr2/yhCoLScQtc/7RxshA=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.55.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-rPyuLFNoF1B0+wolH277E780NUKf+KoEDb3OyoLbAO18BbeKi++YN6gC/zuJoPPDlQRL3fIxHxCxVEWiem2yXw=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.55.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-g+0ZLMook31iWV4PvqKU0i9E78gaZgYpSrYPed/4Bu+nGTgfOPtfs1h11tSSRPXSjC5EzLTjV/1A7L2Vr8pJoQ=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.55.2", "", { "os": "linux", "cpu": "none" }, "sha512-i+sGeRGsjKZcQRh3BRfpLsM3LX3bi4AoEVqmGDyc50L6KfYsN45wVCSz70iQMwPWr3E5opSiLOwsC9WB4/1pqg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.55.2", "", { "os": "linux", "cpu": "none" }, "sha512-C1vLcKc4MfFV6I0aWsC7B2Y9QcsiEcvKkfxprwkPfLaN8hQf0/fKHwSF2lcYzA9g4imqnhic729VB9Fo70HO3Q=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.55.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-68gHUK/howpQjh7g7hlD9DvTTt4sNLp1Bb+Yzw2Ki0xvscm2cOdCLZNJNhd2jW8lsTPrHAHuF751BygifW4bkQ=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.55.2", "", { "os": "linux", "cpu": "x64" }, "sha512-1e30XAuaBP1MAizaOBApsgeGZge2/Byd6wV4a8oa6jPdHELbRHBiw7wvo4dp7Ie2PE8TZT4pj9RLGZv9N4qwlw=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.55.2", "", { "os": "linux", "cpu": "x64" }, "sha512-4BJucJBGbuGnH6q7kpPqGJGzZnYrpAzRd60HQSt3OpX/6/YVgSsJnNzR8Ot74io50SeVT4CtCWe/RYIAymFPwA=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.55.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cT2MmXySMo58ENv8p6/O6wI/h/gLnD3D6JoajwXFZH6X9jz4hARqUhWpGuQhOgLNXscfZYRQMJvZDtWNzMAIDw=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.55.2", "", { "os": "none", "cpu": "arm64" }, "sha512-sZnyUgGkuzIXaK3jNMPmUIyJrxu/PjmATQrocpGA1WbCPX8H5tfGgRSuYtqBYAvLuIGp8SPRb1O4d1Fkb5fXaQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.55.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-sDpFbenhmWjNcEbBcoTV0PWvW5rPJFvu+P7XoTY0YLGRupgLbFY0XPfwIbJOObzO7QgkRDANh65RjhPmgSaAjQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.55.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-GvJ03TqqaweWCigtKQVBErw2bEhu1tyfNQbarwr94wCGnczA9HF8wqEe3U/Lfu6EdeNP0p6R+APeHVwEqVxpUQ=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.55.2", "", { "os": "win32", "cpu": "x64" }, "sha512-KvXsBvp13oZz9JGe5NYS7FNizLe99Ny+W8ETsuCyjXiKdiGrcz2/J/N8qxZ/RSwivqjQguug07NLHqrIHrqfYw=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.55.2", "", { "os": "win32", "cpu": "x64" }, "sha512-xNO+fksQhsAckRtDSPWaMeT1uIM+JrDRXlerpnWNXhn1TdB3YZ6uKBMBTKP0eX9XtYEP978hHk1f8332i2AW8Q=="], + + "@shikijs/core": ["@shikijs/core@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ=="], + + "@shikijs/langs": ["@shikijs/langs@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA=="], + + "@shikijs/themes": ["@shikijs/themes@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw=="], + + "@shikijs/types": ["@shikijs/types@3.21.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@tailwindcss/forms": ["@tailwindcss/forms@0.5.11", "", { "dependencies": { "mini-svg-data-uri": "^1.2.3" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.18", "", { "os": "android", "cpu": "arm64" }, "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.18", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18", "", { "os": "linux", "cpu": "arm" }, "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.18", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.0", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.18", "", { "os": "win32", "cpu": "arm64" }, "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.18", "", { "os": "win32", "cpu": "x64" }, "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q=="], + + "@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.18", "", { "dependencies": { "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "tailwindcss": "4.1.18" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA=="], + + "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], + + "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="], + + "@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], + + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "astro": ["astro@5.18.0", "", { "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.1.1", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", "devalue": "^5.6.2", "diff": "^8.0.3", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.27.3", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.3", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.4", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "astro.js" } }, "sha512-CHiohwJIS4L0G6/IzE1Fx3dgWqXBCXus/od0eGUfxrZJD2um2pE7ehclMmgL/fXqbU7NfE1Ze2pq34h2QaA6iQ=="], + + "astro-icon": ["astro-icon@1.1.5", "", { "dependencies": { "@iconify/tools": "^4.0.5", "@iconify/types": "^2.0.0", "@iconify/utils": "^2.1.30" } }, "sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + + "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.3", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w=="], + + "babel-preset-solid": ["babel-preset-solid@1.9.10", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.40.3" }, "peerDependencies": { "@babel/core": "^7.0.0", "solid-js": "^1.9.10" }, "optionalPeers": ["solid-js"] }, "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.15", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="], + + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001765", "", {}, "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "cheerio": ["cheerio@1.1.2", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.0.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", "undici": "^7.12.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg=="], + + "cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="], + + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="], + + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + + "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], + + "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], + + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="], + + "devalue": ["devalue@5.6.2", "", {}, "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], + + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], + + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "encoding-sniffer": ["encoding-sniffer@0.2.1", "", { "dependencies": { "iconv-lite": "^0.6.3", "whatwg-encoding": "^3.1.1" } }, "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.4", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q=="], + + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], + + "fontace": ["fontace@0.4.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg=="], + + "fontkitten": ["fontkitten@1.0.2", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + + "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gsap": ["gsap@3.14.2", "", {}, "sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA=="], + + "h3": ["h3@1.15.5", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg=="], + + "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], + + "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], + + "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "htmlparser2": ["htmlparser2@10.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.1", "entities": "^6.0.0" } }, "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g=="], + + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], + + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="], + + "lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="], + + "local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "magicast": ["magicast@0.5.1", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "source-map-js": "^1.2.1" } }, "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw=="], + + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="], + + "merge-anything": ["merge-anything@5.1.7", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + + "mini-svg-data-uri": ["mini-svg-data-uri@1.4.4", "", { "bin": { "mini-svg-data-uri": "cli.js" } }, "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="], + + "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], + + "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], + + "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], + + "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="], + + "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="], + + "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="], + + "p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="], + + "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], + + "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="], + + "parse5-parser-stream": ["parse5-parser-stream@7.1.2", "", { "dependencies": { "parse5": "^7.0.0" } }, "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + + "pocketbase": ["pocketbase@0.26.8", "", {}, "sha512-aQ/ewvS7ncvAE8wxoW10iAZu6ElgbeFpBhKPnCfvRovNzm2gW8u/sQNPGN6vNgVEagz44kK//C61oKjfa+7Low=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], + + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + + "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + + "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="], + + "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], + + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="], + + "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="], + + "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="], + + "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="], + + "rollup": ["rollup@4.55.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.55.2", "@rollup/rollup-android-arm64": "4.55.2", "@rollup/rollup-darwin-arm64": "4.55.2", "@rollup/rollup-darwin-x64": "4.55.2", "@rollup/rollup-freebsd-arm64": "4.55.2", "@rollup/rollup-freebsd-x64": "4.55.2", "@rollup/rollup-linux-arm-gnueabihf": "4.55.2", "@rollup/rollup-linux-arm-musleabihf": "4.55.2", "@rollup/rollup-linux-arm64-gnu": "4.55.2", "@rollup/rollup-linux-arm64-musl": "4.55.2", "@rollup/rollup-linux-loong64-gnu": "4.55.2", "@rollup/rollup-linux-loong64-musl": "4.55.2", "@rollup/rollup-linux-ppc64-gnu": "4.55.2", "@rollup/rollup-linux-ppc64-musl": "4.55.2", "@rollup/rollup-linux-riscv64-gnu": "4.55.2", "@rollup/rollup-linux-riscv64-musl": "4.55.2", "@rollup/rollup-linux-s390x-gnu": "4.55.2", "@rollup/rollup-linux-x64-gnu": "4.55.2", "@rollup/rollup-linux-x64-musl": "4.55.2", "@rollup/rollup-openbsd-x64": "4.55.2", "@rollup/rollup-openharmony-arm64": "4.55.2", "@rollup/rollup-win32-arm64-msvc": "4.55.2", "@rollup/rollup-win32-ia32-msvc": "4.55.2", "@rollup/rollup-win32-x64-gnu": "4.55.2", "@rollup/rollup-win32-x64-msvc": "4.55.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-PggGy4dhwx5qaW+CKBilA/98Ql9keyfnb7lh4SR6shQ91QQQi1ORJ1v4UinkdP2i87OBs9AQFooQylcrrRfIcg=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.4.4", "", {}, "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw=="], + + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "send": ["send@1.2.1", "", { "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" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], + + "seroval": ["seroval@1.3.2", "", {}, "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ=="], + + "seroval-plugins": ["seroval-plugins@1.3.3", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w=="], + + "server-destroy": ["server-destroy@1.0.1", "", {}, "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + + "shiki": ["shiki@3.21.0", "", { "dependencies": { "@shikijs/core": "3.21.0", "@shikijs/engine-javascript": "3.21.0", "@shikijs/engine-oniguruma": "3.21.0", "@shikijs/langs": "3.21.0", "@shikijs/themes": "3.21.0", "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "sitemap": ["sitemap@8.0.2", "", { "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.4.1" }, "bin": { "sitemap": "dist/cli.js" } }, "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ=="], + + "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], + + "solid-js": ["solid-js@1.9.10", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", "seroval-plugins": "~1.3.0" } }, "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew=="], + + "solid-refresh": ["solid-refresh@0.6.3", "", { "dependencies": { "@babel/generator": "^7.23.6", "@babel/helper-module-imports": "^7.22.15", "@babel/types": "^7.23.6" }, "peerDependencies": { "solid-js": "^1.3" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="], + + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "stream-replace-string": ["stream-replace-string@2.0.0", "", {}, "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w=="], + + "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], + + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + + "svgo": ["svgo@4.0.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.4.1" }, "bin": "./bin/svgo.js" }, "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw=="], + + "tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="], + + "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], + + "tar": ["tar@7.5.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-ENg5JUHUm2rDD7IvKNFGzyElLXNjachNLp6RaGf4+JOgxXHkqA+gq81ZAMCUmtMtqBsoU62lcp6S27g1LCYGGQ=="], + + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], + + "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], + + "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "undici": ["undici@7.18.2", "", {}, "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unifont": ["unifont@0.7.3", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA=="], + + "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "unstorage": ["unstorage@1.17.4", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.5", "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], + + "vite-plugin-solid": ["vite-plugin-solid@2.11.10", "", { "dependencies": { "@babel/core": "^7.23.3", "@types/babel__core": "^7.20.4", "babel-preset-solid": "^1.8.4", "merge-anything": "^5.1.7", "solid-refresh": "^0.6.3", "vitefu": "^1.0.4" }, "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@testing-library/jest-dom"] }, "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw=="], + + "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], + + "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], + + "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="], + + "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="], + + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], + + "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="], + + "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], + + "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@iconify/tools/svgo": ["svgo@3.3.2", "", { "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, "bin": "./bin/svgo" }, "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw=="], + + "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], + + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "sitemap/@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="], + + "vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "@iconify/tools/svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "@iconify/tools/svgo/css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="], + + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@iconify/tools/svgo/css-tree/mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], + + "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..ce84590 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,28 @@ +{ + "name": "frontend", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/mdx": "^4.3.13", + "@astrojs/node": "9.5.4", + "@astrojs/sitemap": "^3.7.0", + "@astrojs/solid-js": "^5.1.3", + "@tailwindcss/vite": "^4.1.18", + "astro": "5.18.0", + "astro-icon": "^1.1.5", + "gsap": "^3.14.2", + "pocketbase": "^0.26.8" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.11", + "@tailwindcss/typography": "^0.5.19", + "@types/node": "^25.0.9", + "tailwindcss": "^4.1.18" + } +} \ No newline at end of file diff --git a/frontend/public/images/favicon/apple-touch-icon.png b/frontend/public/images/favicon/apple-touch-icon.png new file mode 100644 index 0000000..90f4e60 Binary files /dev/null and b/frontend/public/images/favicon/apple-touch-icon.png differ diff --git a/frontend/public/images/favicon/favicon-96x96.png b/frontend/public/images/favicon/favicon-96x96.png new file mode 100644 index 0000000..729e3f3 Binary files /dev/null and b/frontend/public/images/favicon/favicon-96x96.png differ diff --git a/frontend/public/images/favicon/favicon.ico b/frontend/public/images/favicon/favicon.ico new file mode 100644 index 0000000..54ca510 Binary files /dev/null and b/frontend/public/images/favicon/favicon.ico differ diff --git a/frontend/public/images/favicon/favicon.svg b/frontend/public/images/favicon/favicon.svg new file mode 100644 index 0000000..f9b8cd0 --- /dev/null +++ b/frontend/public/images/favicon/favicon.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/frontend/public/images/favicon/site.webmanifest b/frontend/public/images/favicon/site.webmanifest new file mode 100644 index 0000000..ccf313a --- /dev/null +++ b/frontend/public/images/favicon/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "MyWebSite", + "short_name": "MySite", + "icons": [ + { + "src": "/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/frontend/public/images/favicon/web-app-manifest-192x192.png b/frontend/public/images/favicon/web-app-manifest-192x192.png new file mode 100644 index 0000000..2fd9fac Binary files /dev/null and b/frontend/public/images/favicon/web-app-manifest-192x192.png differ diff --git a/frontend/public/images/favicon/web-app-manifest-512x512.png b/frontend/public/images/favicon/web-app-manifest-512x512.png new file mode 100644 index 0000000..0ae7580 Binary files /dev/null and b/frontend/public/images/favicon/web-app-manifest-512x512.png differ diff --git a/frontend/public/images/gitImage.jpg b/frontend/public/images/gitImage.jpg new file mode 100644 index 0000000..8d29564 Binary files /dev/null and b/frontend/public/images/gitImage.jpg differ diff --git a/frontend/public/images/hero/heroImg.avif b/frontend/public/images/hero/heroImg.avif new file mode 100644 index 0000000..989f6e6 Binary files /dev/null and b/frontend/public/images/hero/heroImg.avif differ diff --git a/frontend/public/images/hero/heroImg.png b/frontend/public/images/hero/heroImg.png new file mode 100644 index 0000000..0d553ba Binary files /dev/null and b/frontend/public/images/hero/heroImg.png differ diff --git a/frontend/public/images/posts/author/face_02.png b/frontend/public/images/posts/author/face_02.png new file mode 100644 index 0000000..12d9531 Binary files /dev/null and b/frontend/public/images/posts/author/face_02.png differ diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/assets/images/about/адвокат_Сургута.jpg b/frontend/src/assets/images/about/адвокат_Сургута.jpg new file mode 100644 index 0000000..b2b3981 Binary files /dev/null and b/frontend/src/assets/images/about/адвокат_Сургута.jpg differ diff --git a/frontend/src/assets/images/home/whyus/WhyUs.png b/frontend/src/assets/images/home/whyus/WhyUs.png new file mode 100644 index 0000000..35fb757 Binary files /dev/null and b/frontend/src/assets/images/home/whyus/WhyUs.png differ diff --git a/frontend/src/components/about/AboutHero.astro b/frontend/src/components/about/AboutHero.astro new file mode 100644 index 0000000..475c208 --- /dev/null +++ b/frontend/src/components/about/AboutHero.astro @@ -0,0 +1,121 @@ +--- +import { Image } from 'astro:assets'; +import lawyerImage from '@assets/images/about/адвокат_Сургута.jpg'; +import { LAWYER_NAME } from '@constants/constants.ts'; +import { getAboutHeroStats, getYearsOfPractice, getClientDeclension, getYearDeclension } from '@utils/stats.utils.ts'; + +const dynamicStats = getAboutHeroStats(); + +const content = { + quote: "Моя миссия — не просто представлять интересы в суде, а обеспечивать реальную защиту прав и свобод каждого клиента в Сургуте и ХМАО - Югре. В законе нет мелочей, есть только возможности.", + description: `С 2005 года я специализируюсь на сложных уголовных, административных и гражданских делах. Мой опыт позволяет находить нестандартные решения там, где другие видят тупик.`, +}; +--- + +
+ +
+
+
+
+ +
+
+ + +
+ +
+ +
+ +
+
+ {LAWYER_NAME.full} + +
+
+
+ + +
+
+
+ + + +
+
+ {getYearsOfPractice()}+ + лет практики +
+
+
+ + + +
+
+ + +
+
+ + {LAWYER_NAME.position} +
+ +

+ {LAWYER_NAME.first} {LAWYER_NAME.middle}
+ {LAWYER_NAME.last} +

+ +
+ +
+ + {content.quote} +
+ +

+ {content.description} +

+ + +
+
+
+
+ + + +
+ {dynamicStats[0].number}{dynamicStats[0].suffix} +
+ Успешных дел +
+ +
+
+
+ + + +
+ {dynamicStats[1].number}{dynamicStats[1].suffix} +
+ Довольных клиентов +
+
+
+
+
+
\ No newline at end of file diff --git a/frontend/src/components/about/Achievements.astro b/frontend/src/components/about/Achievements.astro new file mode 100644 index 0000000..abf9acf --- /dev/null +++ b/frontend/src/components/about/Achievements.astro @@ -0,0 +1,173 @@ +--- +import { getDynamicStats, getYearDeclension, getClientDeclension, getYearsOfPractice } from '@utils/stats.utils.ts'; +import { CONTACT_CONSTANTS } from '@constants/constants.ts'; + +const dynamicStats = getDynamicStats(); +const yearsOfPractice = getYearsOfPractice(); + +const achievements = [ + { + number: yearsOfPractice, + suffix: '', + text: 'Лет практики', + type: 'years', + icon: 'calendar' + }, + { + number: dynamicStats[1].number, + suffix: dynamicStats[1].suffix, + text: 'Успешных дел', + type: 'cases', + icon: 'briefcase' + }, + { + number: dynamicStats[2].number, + suffix: dynamicStats[2].suffix, + text: 'довольных клиентов', + type: 'clients', + icon: 'users' + }, + { + number: "24/7", + suffix: '', + text: 'На связи', + type: 'support', + icon: 'clock' + } +] as const; + +const iconPaths = { + calendar: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z", + briefcase: "M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z", + users: "M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z", + clock: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" +} as const; + +type StatType = typeof achievements[number]['type']; + +const getStatText = (stat: typeof achievements[number]): string => { + const texts: Record = { + years: `${stat.number} ${getYearDeclension(stat.number)} практики`, + cases: 'Успешных дел', + clients: `${stat.number} ${getClientDeclension(stat.number)}`, + support: 'Поддержка клиентов' + }; + return texts[stat.type]; +}; +--- + +
+
+ +
+

+ Ключевые достижения в цифрах +

+
+
+ + +
+ {achievements.map((stat) => ( +
+ +
+ +
+ +
+ + + +
+ + +
+ {stat.type !== 'support' ? ( + + 0 + + ) : ( + {stat.number} + )} + {stat.suffix} +
+ + + + {getStatText(stat)} + +
+
+ ))} +
+ + +
+
+

+ Готовы обсудить вашу ситуацию? +

+

+ Получите профессиональную консультацию адвоката уже сегодня +

+ +
+
+
+
+ + \ No newline at end of file diff --git a/frontend/src/components/about/Education.astro b/frontend/src/components/about/Education.astro new file mode 100644 index 0000000..ac48569 --- /dev/null +++ b/frontend/src/components/about/Education.astro @@ -0,0 +1,147 @@ +--- +const education = [ + { + years: "1997 — 2003", + title: "Тюменский государственный университет", + description: "Юридический факультет, Специальность «Юриспруденция» (Диплом с отличием)" + }, + { + years: "2010 — 2012", + title: "Магистратура МГЮА им. О.Е. Кутафина", + description: "Специализация: Уголовное право и криминология" + }, + { + years: "2015", + title: "Повышение квалификации", + description: "Курс «Защита прав в Европейском Суде по правам человека» (Страсбург)" + } +]; + +const additional = [ + "Ежегодные семинары Федеральной палаты адвокатов РФ", + "Спецкурс по финансовым и налоговым преступлениям", + "Тренинги по судебному ораторскому искусству", + "Сертифицированный медиатор в гражданских спорах" +]; +--- + +
+ +
+
+
+ +
+ +
+
+ + + + +
+

+ Образование и квалификация +

+
+ +
+ +
+ +
+ +
+ {education.map((item, index) => ( +
+ +
+ {index + 1} +
+ + +
+ + {item.years} + +

+ {item.title} +

+

+ {item.description} +

+
+
+ ))} +
+
+ + +
+
+
+ +
+ +
+

+ + + + + + Дополнительная подготовка +

+ +
    + {additional.map((text, index) => ( +
  • +
    + + + +
    + + {text} + +
  • + ))} +
+ +
+
+ + + + Постоянное совершенствование +
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/frontend/src/components/about/ProfCredo.astro b/frontend/src/components/about/ProfCredo.astro new file mode 100644 index 0000000..a368e08 --- /dev/null +++ b/frontend/src/components/about/ProfCredo.astro @@ -0,0 +1,80 @@ +--- +const features = [ + { + title: "Тщательный анализ", + description: "Детальное изучение каждого документа и обстоятельства дела для выявления всех возможных рисков и преимуществ.", + icon: "search" + }, + { + title: "Защита интересов", + description: "Бескомпромиссная позиция в суде и на переговорах. Ваша безопасность и правовая чистота — мой главный приоритет.", + icon: "shield" + }, + { + title: "Честный диалог", + description: "Прямая коммуникация о перспективах дела. Без ложных надежд, только факты и профессиональная оценка.", + icon: "message" + } +]; + +const iconPaths: Record = { + search: "m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607z", + shield: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z", + message: "M7.5 8.25h9m-9 3H12m-9.75 1.51c0 1.6 1.123 2.994 2.707 3.227 1.129.166 2.27.293 3.423.379.35.026.67.21.865.501L12 21l2.755-4.133a1.14 1.14 0 01.865-.501 48.172 48.172 0 003.423-.379c1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0012 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018z" +}; +--- + +
+ +
+
+
+ +
+
+ +
+ +
+ + Принципы работы + +

+ Профессиональное кредо +

+

+ Мой подход базируется на трех столпах: глубокая аналитика, абсолютная конфиденциальность и ориентация на результат. Я не даю пустых обещаний, я предоставляю юридическую защиту высшего класса. +

+
+ + +
+ {features.map((feature, index) => ( +
+ +
+ 0{index + 1} +
+ + +
+ + + +
+ +

+ {feature.title} +

+ +

+ {feature.description} +

+ + +
+
+ ))} +
+
+
diff --git a/frontend/src/components/about/Specializations.astro b/frontend/src/components/about/Specializations.astro new file mode 100644 index 0000000..8661c27 --- /dev/null +++ b/frontend/src/components/about/Specializations.astro @@ -0,0 +1,95 @@ +--- +const specializations = [ + { + title: "Уголовное право", + description: "Защита по уголовным делам, досудебное урегулирование, представительство в судах всех инстанций", + icon: "scale" + }, + { + title: "Гражданское право", + description: "Споры по договорам, имущественные споры, наследственные дела, жилищные вопросы", + icon: "building" + }, + { + title: "Административное право", + description: "Обжалование постановлений, защита прав водителей, дела об административных правонарушениях", + icon: "clipboard" + }, + { + title: "Семейное право", + description: "Разводы, раздел имущества, споры о детях, алименты", + icon: "users" + }, + { + title: "Жилищное право", + description: "Приватизация, переселение, незаконная перепланировка, выселение", + icon: "home" + }, + { + title: "Земельное право", + description: "Оформление земельных участков, споры о границах, изъятие земли", + icon: "territory" + } +]; + +const iconPaths: Record = { + scale: "M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3", + building: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4", + clipboard: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01", + users: "M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z", + home: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6", + territory: "M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 4l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4" +}; +--- + +
+
+
+
+ +
+
+ + Экспертиза + +

+ Мои специализации +

+
+
+ +
+ {specializations.map((item, index) => ( +
+ +
+ +
+ +
+ + + +
+ +

+ {item.title} +

+ +

+ {item.description} +

+ + +
+ Подробнее + + + +
+
+
+ ))} +
+
+
diff --git a/frontend/src/components/auth/PasswordResetForm.astro b/frontend/src/components/auth/PasswordResetForm.astro new file mode 100644 index 0000000..0e76e6b --- /dev/null +++ b/frontend/src/components/auth/PasswordResetForm.astro @@ -0,0 +1,529 @@ +--- +import Button from "../base/Button.astro"; + +// Иконки +const emailIcon = ``; + +const lockIcon = ``; + +const checkIcon = ``; + +const arrowLeftIcon = ``; + +// Props +interface Props { + // Режим: 'request' - запрос сброса, 'reset' - установка нового пароля + mode?: "request" | "reset"; + token?: string; // Токен из URL для режима reset +} + +const { mode = "request", token = "" } = Astro.props; + +const isResetMode = mode === "reset"; +const title = isResetMode ? "Новый пароль" : "Восстановление пароля"; +const subtitle = isResetMode + ? "Придумайте новый пароль для вашего аккаунта" + : "Введите email, и мы отправим вам ссылку для сброса пароля"; +--- + +
+ + + + Вернуться к входу + + + +
+

{title}

+

{subtitle}

+
+ + + {!isResetMode && ( +
+ + + + +
+ +
+
+ +
+ +
+ +
+ + +
+
+ +

От 8 до 12 символов, буква + цифра

+ + + +
+ +
+
+ +
+ + +
+ +
+ + + + + + + + +
+ + Забыли пароль? +
+ + + + + + + + +
+ +
+
+ +
+ +
+ +
+ + + + ) : ( + {item.value} + )} + + + )) + } + + + + + +
+ +
+ +
+ + + +
+ + +

+ Требуется авторизация +

+ + +

+ Для отправки запроса на консультацию необходимо войти в систему + или зарегистрироваться. Это обеспечит безопасность ваших + персональных данных. +

+ + + + + +
+

+ Уже есть аккаунт?{" "} + + Войти сейчас + +

+
+
+ + + +
+ + + + + + diff --git a/frontend/src/components/base/Breadcrumbs.astro b/frontend/src/components/base/Breadcrumbs.astro new file mode 100644 index 0000000..4a5c536 --- /dev/null +++ b/frontend/src/components/base/Breadcrumbs.astro @@ -0,0 +1,175 @@ +--- +const { pathname = "" } = Astro.url; +export interface Props { + blogPostTitle?: string; +} + +const { blogPostTitle } = Astro.props; + +// Константа для маппинга путей в названия +const BREADCRUMB_NAMES: Record = { + "": "Главная", + services: "Услуги", + criminal: "Уголовные дела", + civil: "Гражданские дела", + family: "Семейные дела", + arbitration: "Арбитражные дела", + tax: "Налоговые дела", + "real-estate": "Недвижимость", + cases: "Кейсы", + blog: "Блог", + archive: "Архив", + search: "Поиск", + category: "Категория", + faq: "FAQ", + about: "О бюро", + contacts: "Контакты", + reviews: "Отзывы", + administrative: "Административные дела", + svo: "СВО дела", + "debt-protection": "Защита должников", + auth: "Авторизация", + login: "Вход", + register: "Регистрация", + "forgot-password": "Восстановление пароля", + "reset-password": "Сброс пароля", + admin: "Админ-панель", + "privacy-policy": "Политика конфиденциальности", + "legal-info": "Правовая информация", + prices: "Цены", +}; + +// Функция для форматирования пути в читаемое название +const formatBreadcrumbName = (pathSegment: string, isBlogPost: boolean = false, blogTitle?: string): string => { + if (isBlogPost && blogTitle) { + // Если это статья блога и у нас есть заголовок, используем его + return blogTitle; + } + + if (isBlogPost) { + // Для статей блога возвращаем транслитерированное имя без форматирования + // или можно реализовать логику получения заголовка статьи + return pathSegment + .split("-") + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" "); + } + + return ( + BREADCRUMB_NAMES[pathSegment] || + pathSegment + .split("-") + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" ") + ); +}; + +// Генерируем массив хлебных крошек +const pathSegments = pathname.split("/").filter((segment) => segment !== ""); +const breadcrumbs = []; + +for (let i = 0; i < pathSegments.length; i++) { + const segment = pathSegments[i]; + const path = "/" + pathSegments.slice(0, i + 1).join("/"); + + // Проверяем, является ли это статьей блога (если это последний сегмент и предыдущий сегмент - "blog") + const isBlogPost = (i === pathSegments.length - 1) && (i > 0) && (pathSegments[i - 1] === "blog"); + + // Для статьи блога используем заголовок статьи, если он предоставлен + const breadcrumbName = isBlogPost && blogPostTitle ? blogPostTitle : formatBreadcrumbName(segment, false); + + breadcrumbs.push({ + name: breadcrumbName, + path: path, + }); +} + +// Добавляем главную страницу в начало +if (breadcrumbs.length > 0) { + breadcrumbs.unshift({ name: "Главная", path: "/" }); +} +--- + +{ + breadcrumbs.length > 1 && ( + <> + {/* Мобильная версия - только последняя крошка */} +
+
+ +
+
+ + {/* Десктопная версия */} + + + ) +} diff --git a/frontend/src/components/base/Button.astro b/frontend/src/components/base/Button.astro new file mode 100644 index 0000000..e2cb796 --- /dev/null +++ b/frontend/src/components/base/Button.astro @@ -0,0 +1,68 @@ +--- +interface Props { + text: string; + href?: string; + className?: string; + variant?: 'primary' | 'primary-white-text' | 'outline' | 'outline-white' | 'gold-ghost' | 'telegram' | 'whatsapp'; + size?: 'sm' | 'md' | 'lg'; + id?: string; + type?: 'button' | 'submit' | 'reset'; + disabled?: boolean; +} + +const { + text, + href, + className = "", + variant = 'primary', + size = 'md', + id, + type = 'button', + disabled = false +} = Astro.props; + +// Стили вариантов (адаптированы под дизайн Адвоката) +const variants = { + // Золотая кнопка (основная) + primary: "bg-[#bf9b58] text-[#151b26] border border-[#bf9b58] hover:bg-[#d4b068] hover:border-[#d4b068]", + + // Золотая кнопка с белым текстом (для темных фонов) + 'primary-white-text': "bg-[#bf9b58] text-white border border-[#bf9b58] hover:bg-[#d4b068] hover:border-[#d4b068]", + + // Золотая обводка (для светлых или темных фонов) + outline: "bg-transparent border border-[#bf9b58] text-[#bf9b58] hover:bg-[#bf9b58] hover:text-[#151b26]", + + // Белая/Серая обводка (Специально для Hero - "Направления практики") + 'outline-white': "bg-transparent border border-gray-500 text-white hover:bg-white/10 hover:border-white", + + // Текстовая кнопка золотого цвета + 'gold-ghost': "bg-transparent text-[#bf9b58] hover:text-[#d4b068]", + + // Кнопка Telegram (официальный цвет #0088cc) + 'telegram': "bg-[#0088cc] text-white hover:bg-[#006699]", + + // Кнопка WhatsApp (официальный цвет #25D366) + 'whatsapp': "bg-[#25D366] text-white hover:bg-[#128C7E]" +}; + +// Стили размеров +const sizes = { + sm: "px-4 py-2 text-xs rounded-xl uppercase tracking-wider", // Убрал скругления для строгости + md: "px-8 py-4 text-sm rounded-xl uppercase tracking-wider w-full sm:w-auto", // Размер как в Hero + lg: "px-10 py-5 text-base rounded-xl uppercase tracking-wider" +}; + +const baseStyles = "inline-flex items-center justify-center font-bold transition-all duration-300 active:scale-95 text-center cursor-pointer"; + +const Element = href ? 'a' : 'button'; +--- + + + {text} + \ No newline at end of file diff --git a/frontend/src/components/base/CardServiceGrid.astro b/frontend/src/components/base/CardServiceGrid.astro new file mode 100644 index 0000000..379f208 --- /dev/null +++ b/frontend/src/components/base/CardServiceGrid.astro @@ -0,0 +1,235 @@ +--- +export interface Service { + title: string; + description: string; + icon?: string; + emoji?: string; + price: string; + duration?: string; + cases?: number; + color?: string; + popular?: boolean; + result?: string; + urgent?: boolean; +} + +interface Props { + services: Service[]; + sectionId?: string; + title?: string; + subtitle?: string; + description?: string; + bgColor?: 'navy' | 'navy-dark' | 'gray' | 'white'; + accentColor?: 'gold' | 'blue' | 'green' | 'red'; + showResults?: boolean; + showUrgentBadge?: boolean; +} + +const { + services, + sectionId = 'services', + title = 'Наши услуги', + subtitle, + description, + bgColor = 'navy', + accentColor = 'gold', + showResults = false, + showUrgentBadge = false +} = Astro.props; + +// Определение цветовых схем в зависимости от фона +const bgClasses = { + navy: 'bg-[var(--color-navy)]', + 'navy-dark': 'bg-[var(--color-navy-dark)]', + gray: 'bg-gray-50', + white: 'bg-white' +}; + +const cardBgClasses = { + navy: 'bg-[var(--color-navy-dark)]', + 'navy-dark': 'bg-[var(--color-navy)]', + gray: 'bg-white', + white: 'bg-gray-50' +}; + +const textClasses = { + navy: 'text-[var(--color-white)]', + 'navy-dark': 'text-[var(--color-white)]', + gray: 'text-gray-900', + white: 'text-gray-900' +}; + +const textColorClasses = { + navy: 'text-[var(--color-gray-500)]', + 'navy-dark': 'text-[var(--color-gray-500)]', + gray: 'text-gray-600', + white: 'text-gray-600' +}; + +const accentClasses = { + gold: '[var(--color-gold)]', + blue: '[var(--color-blue-primary)]', + green: '[var(--color-green-primary)]', + red: '[var(--color-red-primary)]' +}; + +const borderColorClasses = { + navy: '[var(--color-gray-600)]/10', + 'navy-dark': '[var(--color-gray-600)]/10', + gray: 'gray-200', + white: 'gray-200' +}; + +const gradientClasses = { + gold: 'from-[var(--color-gold)]/20 to-[var(--color-gold-hover)]/20', + blue: 'from-[var(--color-blue-primary)]/20 to-[var(--color-blue-secondary)]/20', + green: 'from-[var(--color-green-primary)]/20 to-[var(--color-green-secondary)]/20', + red: 'from-[var(--color-red-primary)]/20 to-[var(--color-red-secondary)]/20' +}; + +const urgentBorderColor = 'border-red-500/30 hover:border-red-500/60'; +const urgentShadow = 'hover:shadow-red-500/10'; +const normalBorderColor = `[var(--color-gray-600)]/20 hover:border-${accentClasses[accentColor]}/50`; +const normalShadow = `hover:shadow-${accentClasses[accentColor]}/10`; + +const urgentIconBg = 'bg-red-500/10'; +const urgentIconText = 'text-red-400'; +const normalIconBg = `${accentClasses[accentColor]}/10`; +const normalIconText = accentClasses[accentColor]; + +const resultBg = (isUrgent: boolean) => isUrgent ? 'bg-red-500/10 border border-red-500/20' : 'bg-green-500/10 border border-green-500/20'; +const resultText = (isUrgent: boolean) => isUrgent ? 'text-red-400' : 'text-green-400'; +const resultIcon = (isUrgent: boolean) => isUrgent ? 'text-red-400' : 'text-green-400'; +--- + +
+ + {bgColor === 'navy' && ( + <> +
+
+
+ + )} + + {bgColor === 'navy-dark' && ( + <> +
+
+
+ + )} + + {bgColor === 'gray' && ( + <> +
+
+
+ + )} + +
+ {/* Заголовок секции */} +
+ {subtitle && ( + + {subtitle} + + )} +

+ +

+ {description && ( +

+ {description} +

+ )} +
+ + {/* Сетка карточек */} +
+ {services.map((service, index) => ( +
+ + {/* Метка срочности */} + {service.urgent && showUrgentBadge && ( +
+ Требует срочности +
+ )} + + {/* Популярный бейдж */} + {service.popular && ( +
+ Популярное +
+ )} + + {/* Градиентный оверлей при hover */} + {service.color && !service.urgent && ( +
+ )} + +
+ {/* Иконка или эмодзи */} +
+ {service.emoji ? ( +
+ {service.emoji} +
+ ) : ( +
+ + + +
+ )} +
+ + {/* Контент */} +

+ {service.title} +

+

+ {service.description} +

+ + {/* Результат */} + {showResults && service.result && ( +
+
+ + + + {service.result} +
+
+ )} + + {/* Цена и кнопка */} +
+
+ Стоимость + {service.price} +
+ +
+
+ + {/* Раскрывающаяся часть */} + {!service.urgent && ( +
+
+ +
+
+ )} +
+ ))} +
+
+
\ No newline at end of file diff --git a/frontend/src/components/base/ConsultationModal.astro b/frontend/src/components/base/ConsultationModal.astro new file mode 100644 index 0000000..886dc19 --- /dev/null +++ b/frontend/src/components/base/ConsultationModal.astro @@ -0,0 +1,141 @@ +--- +import { CONTACT_CONSTANTS } from '@constants/constants.ts'; +--- + + + + + + + diff --git a/frontend/src/components/base/ContactForm.astro b/frontend/src/components/base/ContactForm.astro new file mode 100644 index 0000000..3a2d837 --- /dev/null +++ b/frontend/src/components/base/ContactForm.astro @@ -0,0 +1,582 @@ +--- +import SectionHeader from "@components/base/SectionHeader.astro"; +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +const contactIcons = { + phone: + "M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z", + location: + "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z M15 11a3 3 0 11-6 0 3 3 0 016 0z", + email: + "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z", +}; + +const PRACTICE_AREAS = [ + { value: "civil", label: "Гражданское право" }, + { value: "admin", label: "Административное право" }, + { value: "family", label: "Семейное право" }, + { value: "arbitration", label: "Арбитражные дела" }, + { value: "realestate", label: "Недвижимость" }, + { value: "svo", label: "СВО" }, +] as const; + +interface ContactInfo { + icon: keyof typeof contactIcons; + label: string; + type: "phone" | "address" | "email"; + href?: string; + value: string; +} + +const contactInfo: ContactInfo[] = [ + { + icon: "phone", + label: "Телефон", + type: "phone", + href: CONTACT_CONSTANTS.phoneHref, + value: CONTACT_CONSTANTS.phone, + }, + { + icon: "location", + label: "Адрес", + type: "address", + value: CONTACT_CONSTANTS.address, + }, + { + icon: "email", + label: "Email", + type: "email", + href: `mailto:${CONTACT_CONSTANTS.email}`, + value: CONTACT_CONSTANTS.email, + }, +]; +--- + +
+
+ +
+ +
+
+
+ +
+
+
+
+
+ +
+ Свяжитесь с нами +

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

+ +
+ { + contactInfo.map((item) => ( +
+
+ + + +
+
+ + {item.label} + + {item.href && item.type !== "phone" ? ( + + {item.value} + + ) : item.type === "phone" ? ( + + ) : ( + {item.value} + )} +
+
+ )) + } +
+
+
+ + +
+
+
+ +
+ + + +
+ + +
+ + + +
+
+ + +
+ +
+ +
+ + + +
+
+
+ + +
+ + +
+ + + 0 / 1000 + +
+
+ + + +

+ Нажимая кнопку, вы соглашаетесь с{" "} + + политикой конфиденциальности + +

+
+
+
+
+
+
+ + diff --git a/frontend/src/components/base/CtaBlock.astro b/frontend/src/components/base/CtaBlock.astro new file mode 100644 index 0000000..59f7517 --- /dev/null +++ b/frontend/src/components/base/CtaBlock.astro @@ -0,0 +1,107 @@ +--- +export interface Props { + // Тексты и ссылки + title?: string; + description?: string; + primaryBtnText?: string; + primaryBtnLink?: string; + secondaryBtnText?: string; + secondaryBtnLink?: string; + + // Цвета фона + bgColor?: string; // Основной фон секции (tailwind класс или hex) + gridOpacity?: number; // Прозрачность сетки (0-1) + + // Стили primary кнопки + primaryBtnBg?: string; // Фон кнопки + primaryBtnHover?: string; // Фон при наведении + primaryBtnTextColor?: string; // Цвет текста + + // Стили secondary кнопки + secondaryBtnBg?: string; // Фон кнопки + secondaryBtnHover?: string; // Фон при наведении + secondaryBtnTextColor?: string; // Цвет текста + secondaryBtnBorder?: string; // Цвет бордера (опционально) + + // Дополнительно + showGrid?: boolean; // Показывать сетку? + gradientOverlay?: boolean; // Градиент сверху? + rounded?: string; // Скругление углов +} + +const { + // Контент + title = "Нужна помощь эксперта?", + description = "Запишитесь на первичную консультацию, и мы вместе найдем выход из вашей юридической ситуации.", + primaryBtnText = "Записаться на прием", + primaryBtnLink = "#", + secondaryBtnText = "Связаться в Telegram", + secondaryBtnLink = "#", + + // Цвета по умолчанию (как в оригинале) + bgColor = "bg-[#444ce7]", + gridOpacity = 0.1, + + // Primary кнопка (золотая по умолчанию) + primaryBtnBg = "bg-[#cbb059]", + primaryBtnHover = "hover:bg-[#bfa34d]", + primaryBtnTextColor = "text-[#1a1f2e]", + + // Secondary кнопка (полупрозрачная по умолчанию) + secondaryBtnBg = "bg-[#565df0]", + secondaryBtnHover = "hover:bg-[#646af3]", + secondaryBtnTextColor = "text-white", + secondaryBtnBorder = "border-white/20", + + // Оформление + showGrid = true, + gradientOverlay = true, + rounded = "rounded-3xl" +} = Astro.props; +--- + +
+ + {/* Декоративная сетка */} + {showGrid && ( +
+
+ )} + + {/* Градиент */} + {gradientOverlay && ( +
+ )} + + {/* Контент */} +
+

+ {title} +

+ +

+ {description} +

+ +
+ {/* Primary кнопка */} + + {primaryBtnText} + + + {/* Secondary кнопка */} + + {secondaryBtnText} + +
+
+
diff --git a/frontend/src/components/base/Favicon.astro b/frontend/src/components/base/Favicon.astro new file mode 100644 index 0000000..bdfe9d8 --- /dev/null +++ b/frontend/src/components/base/Favicon.astro @@ -0,0 +1,10 @@ +--- +// Компонент Favicon.astro +// Содержит все необходимые теги для фавиконов +--- + + + + + + \ No newline at end of file diff --git a/frontend/src/components/base/Map.astro b/frontend/src/components/base/Map.astro new file mode 100644 index 0000000..3c24161 --- /dev/null +++ b/frontend/src/components/base/Map.astro @@ -0,0 +1,160 @@ +--- +import { CONTACT_CONSTANTS } from '@constants/constants.ts'; + +interface Props { + variant?: 'full' | 'card' | 'simple'; + title?: string; + subtitle?: string; + address?: string; + mapUrl?: string; + showRouteButton?: boolean; + lazyLoad?: boolean; +} + +const { + variant = 'full', + title = "Наш офис", + subtitle = "г. Сургут, пр. Комсомольский, 19", + address = CONTACT_CONSTANTS.address, + mapUrl = "https://yandex.ru/maps/-/CDu~yK-j", + showRouteButton = true, + lazyLoad = true +} = Astro.props; + +const defaultMapUrl = "https://yandex.ru/map-widget/v1/?um=constructor%3Acdxezk6x&source=constructor"; +const currentMapUrl = variant === 'card' ? defaultMapUrl : mapUrl; +--- + +{variant === 'full' ? ( +
+
+
+ +
+ +
+
+
+ + + + +
+ +

+ {title} +

+ +

+ {address} +

+ + {showRouteButton && ( + + Открыть в картах + + + + + )} +
+
+
+
+) : variant === 'card' ? ( +
+
+ +
+
+

+ + {title} +

+

+ + {subtitle} +

+
+ + {showRouteButton && ( + + Маршрут + + + + + + )} +
+ +
+ + +
+ + Наведите для взаимодействия + +
+
+
+) : ( +
+ +
+)} + +{lazyLoad && variant === 'full' && ( + +)} diff --git a/frontend/src/components/base/MapFull.astro b/frontend/src/components/base/MapFull.astro new file mode 100644 index 0000000..f646812 --- /dev/null +++ b/frontend/src/components/base/MapFull.astro @@ -0,0 +1,192 @@ +--- +import SectionHeader from "@components/base/SectionHeader.astro"; +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +interface Props { + city?: string; + title?: string; + address?: string; + mapUrl?: string; +} + +const { + city = "СУРГУТЕ", + title = "Наш офис", + address = CONTACT_CONSTANTS.address, + mapUrl = "https://yandex.ru/map-widget/v1/?um=constructor%3Acdxezk6x&source=constructor", +} = Astro.props; +--- + +
+
+ +
+

+ Как нас найти +

+

+ Мы находимся в центре города, удобный подъезд и парковка +

+
+ + +
+
+ +
+
+
+ + + + +
+

+ {title} +

+

{city}

+
+ +
+
+ + + + +
+

+ Адрес +

+

{address}

+
+
+ +
+ + + +
+

+ Режим работы +

+

Пн-Пт: 09:00 - 18:00

+

Сб-Вс: По записи

+
+
+ +
+ + + +
+

+ Телефон +

+ + {CONTACT_CONSTANTS.phone} + +
+
+
+ + + Построить маршрут + + + + +
+ + +
+ +
+
+
+
+
diff --git a/frontend/src/components/base/Modal.astro b/frontend/src/components/base/Modal.astro new file mode 100644 index 0000000..842efb6 --- /dev/null +++ b/frontend/src/components/base/Modal.astro @@ -0,0 +1,7 @@ +--- +import Layout from '@layouts/Layout.astro'; +--- + + +

Modal window

+
\ No newline at end of file diff --git a/frontend/src/components/base/PageTitle.astro b/frontend/src/components/base/PageTitle.astro new file mode 100644 index 0000000..22cb2a1 --- /dev/null +++ b/frontend/src/components/base/PageTitle.astro @@ -0,0 +1,84 @@ +--- +interface Props { + title: string; + subtitle?: string; + badgeText?: string; + highlightText?: string; + highlightInTitle?: boolean; // Если true, то highlightText будет частью заголовка, иначе - частью subtitle + centered?: boolean; + titleColor?: 'white' | 'gray-900'; // Цвет заголовка, по умолчанию 'white' для темных фонов и 'gray-900' для светлых + subtitleColor?: 'gray-400' | 'gray-600'; // Цвет подзаголовка + highlightInSubtitle?: boolean; // Если true, то highlightText будет частью подзаголовка с особым оформлением + contactsFormat?: boolean; // Если true, то используется специальный формат для контактов с выделением в подзаголовке + titleSize?: 'normal' | 'large'; // Размер заголовка: normal (text-4xl md:text-5xl) или large (text-3xl sm:text-4xl md:text-6xl lg:text-8xl) +} + +const { + title, + subtitle, + badgeText = "Мнение клиентов", + highlightText, + highlightInTitle = true, // по умолчанию highlightText будет частью заголовка + centered = true, + titleColor = 'white', + subtitleColor = 'gray-400', + highlightInSubtitle = false, + contactsFormat = false, + titleSize = 'large' +} = Astro.props; + +// Определение классов цветов +const titleTextColor = titleColor === 'white' ? '[var(--color-white)]' : 'gray-900'; +const subtitleTextColor = subtitleColor === 'gray-400' ? '[var(--color-gray-400)]' : 'gray-600'; +--- + +
+ {badgeText && ( +
+ + {badgeText} +
+ )} + + {highlightInTitle ? ( +

+ {title} + {highlightText && {highlightText}} + {titleSize === 'large' && ( + + )} +

+ ) : ( +

+ {title} + {titleSize === 'large' && ( + + )} +

+ )} + + {subtitle && ( +

+ {subtitle} + {contactsFormat && !highlightInTitle && highlightText ? ( + + + {highlightText} + + + ) : (!highlightInTitle && highlightText && highlightInSubtitle) ? ( + + + {highlightText} + + + ) : (!highlightInTitle && highlightText && !highlightInSubtitle) ? ( + + + {highlightText} + + + ) : null} +

+ )} +
\ No newline at end of file diff --git a/frontend/src/components/base/Pagination.astro b/frontend/src/components/base/Pagination.astro new file mode 100644 index 0000000..7a8fbb3 --- /dev/null +++ b/frontend/src/components/base/Pagination.astro @@ -0,0 +1,17 @@ +
+ + + + + + + +
diff --git a/frontend/src/components/base/ScrollTopButton.astro b/frontend/src/components/base/ScrollTopButton.astro new file mode 100644 index 0000000..0ebc796 --- /dev/null +++ b/frontend/src/components/base/ScrollTopButton.astro @@ -0,0 +1,75 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/components/base/SectionHeader.astro b/frontend/src/components/base/SectionHeader.astro new file mode 100644 index 0000000..64e5882 --- /dev/null +++ b/frontend/src/components/base/SectionHeader.astro @@ -0,0 +1,71 @@ +--- +interface Props { + label?: string; + title: string; + highlight?: string; + description?: string; + align?: 'center' | 'left'; + theme?: 'light' | 'dark'; +} + +const { + label = '', + title, + highlight = '', + description = '', + align = 'center', + theme = 'light' +} = Astro.props; + +const alignClasses = { + center: 'text-center', + left: 'text-left' +}; + +const themeClasses = { + light: { + label: 'bg-[var(--color-gold)]/10 text-[var(--color-gold)]', + title: 'text-gray-900', + highlight: 'text-[var(--color-blue-primary)]', + description: 'text-gray-600' + }, + dark: { + label: 'bg-white/10 text-[var(--color-gold)]', + title: 'text-white', + highlight: 'text-transparent bg-clip-text bg-gradient-to-r from-[var(--color-gold)] to-[var(--color-gold-hover)]', + description: 'text-gray-400' + } +}; +--- + +
+ {label && ( + + {label} + + )} + + {highlight ? ( +

+ {title.split(highlight).map((part, i) => ( + <> + {part}{i === 0 && {highlight}} + + ))} +

+ ) : ( +

+ {title} +

+ )} + + {theme === 'light' && ( +
+ )} + + {description && ( +

+ {description} +

+ )} +
diff --git a/frontend/src/components/base/SocialIcons.astro b/frontend/src/components/base/SocialIcons.astro new file mode 100644 index 0000000..ffa6429 --- /dev/null +++ b/frontend/src/components/base/SocialIcons.astro @@ -0,0 +1,93 @@ +--- +interface Props { + variant?: 'footer' | 'messenger'; + className?: string; + whatsapp?: boolean; + imo?: boolean; +} + +const { variant = 'footer', className = '', whatsapp, imo = false } = Astro.props; + +// Устанавливаем значения по умолчанию в зависимости от варианта +const showWhatsapp = whatsapp !== undefined ? whatsapp : (variant === 'footer'); + +const baseClasses = "flex gap-3"; + +const linkClasses = { + footer: "w-10 h-10 bg-[#1e2532] flex items-center justify-center rounded-sm hover:bg-[#bf9b58] hover:text-[#151b26] transition-all duration-300 group", + messenger: "w-12 h-12 rounded-xl bg-[var(--color-navy-dark)] border border-[var(--color-gray-600)]/20 flex items-center justify-center text-[var(--color-gray-500)] hover:text-[#229ED9] hover:border-[#229ED9]/30 hover:bg-[#229ED9]/10 transition-all" +}; + +const currentLinkClass = linkClasses[variant]; +--- + +
+ {variant === 'footer' ? ( + <> + + + + + + + + {/* WhatsApp */} + {showWhatsapp && ( + + + + + + )} + + {/* IMO */} + {imo && ( + + + + + + + + + )} + + + + + + + + + ) : ( + <> + + + + + + + + {/* WhatsApp */} + {showWhatsapp && ( + + + + + + )} + + {/* IMO */} + {imo && ( + + + + + + + + + )} + + )} +
diff --git a/frontend/src/components/base/Toast.astro b/frontend/src/components/base/Toast.astro new file mode 100644 index 0000000..b07de49 --- /dev/null +++ b/frontend/src/components/base/Toast.astro @@ -0,0 +1,228 @@ +--- +interface Props { + message?: string; + type?: "error" | "success" | "warning" | "info"; + duration?: number; +} + +const { message = "", type = "error", duration = 3000 } = Astro.props; + +// Серверная конфигурация (используется для начального рендера) +const typeConfig = { + error: { + bg: "bg-red-50", + border: "border-red-500", + icon: "text-red-500", + iconPath: + '', + }, + success: { + bg: "bg-green-50", + border: "border-green-500", + icon: "text-green-500", + iconPath: + '', + }, + warning: { + bg: "bg-yellow-50", + border: "border-yellow-500", + icon: "text-yellow-500", + iconPath: + '', + }, + info: { + bg: "bg-blue-50", + border: "border-blue-500", + icon: "text-blue-500", + iconPath: + '', + }, +}; + +const config = typeConfig[type]; +--- + + + + + + diff --git a/frontend/src/components/blog/BlogSection.astro b/frontend/src/components/blog/BlogSection.astro new file mode 100644 index 0000000..2d328e8 --- /dev/null +++ b/frontend/src/components/blog/BlogSection.astro @@ -0,0 +1,211 @@ +--- +import PostCard from "./PostCard.astro"; +import Pagination from "../base/Pagination.astro"; +import SidebarSearch from "./SidebarSearch.astro"; +import SidebarPopular from "./SidebarPopular.astro"; +import SidebarCategories from "./SidebarCategories.astro"; +import TagCloud from "./TagCloud.astro"; +import { MONTHS } from "@lib/constants"; + +const POCKETBASE_URL = + import.meta.env.POCKETBASE_URL || "http://localhost:8090"; + +interface PostRecord { + id: string; + title: string; + slug: string; + excerpt: string; + image?: string; + category?: string; + created: string; +} + +interface PocketBaseResponse { + items: PostRecord[]; + totalItems?: number; + totalPages?: number; + page?: number; + perPage?: number; +} + +// Параметры пагинации +const page = parseInt(Astro.url.searchParams.get("page") || "1"); +const perPage = 44; // 22 ряда по 2 карточки + +// Загружаем посты из PocketBase с пагинацией +let posts: Array<{ + id: string; + image: string; + category: string; + title: string; + excerpt: string; + date: string; + slug: string; +}> = []; + +let totalPages = 1; +let currentPage = page; + +try { + const response = await fetch( + `${POCKETBASE_URL}/api/collections/posts/records?page=${page}&perPage=${perPage}&sort=-created`, + ); + const data: PocketBaseResponse = await response.json(); + + if (data.items) { + posts = data.items.map((post) => { + const date = new Date(post.created); + const formattedDate = `${date.getDate()} ${MONTHS[date.getMonth()]} ${date.getFullYear()} года`; + + // Формируем URL изображения + const imageUrl = post.image + ? `${POCKETBASE_URL}/api/files/posts/${post.id}/${post.image}` + : "https://images.unsplash.com/photo-1556761175-5973dc0f32e7?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80"; + + // Берём категорию из нового поля category + const category = + post.category && post.category.trim() !== "" + ? post.category + : "НОВОСТИ"; + + return { + id: post.id, + image: imageUrl, + category, + title: post.title, + excerpt: post.excerpt, + date: formattedDate, + slug: `/blog/${post.slug}`, + }; + }); + + totalPages = data.totalPages || 1; + } +} catch (error) { + console.error("Error fetching posts from PocketBase:", error); +} + +const popularPosts = [ + { + image: + "https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=200&h=200&fit=crop&q=80", + title: "Как обжаловать решение суда первой инстанции", + views: "2.4K просмотров", + }, + { + image: + "https://images.unsplash.com/photo-1589829085413-56de8ae18c73?w=200&h=200&fit=crop&q=80", + title: "Снижение кадастровой стоимости в Сургуте", + views: "1.8K просмотров", + }, + { + image: + "https://images.unsplash.com/photo-1569336415962-a4bd9f69cd83?w=200&h=200&fit=crop&q=80", + title: "Защита прав потребителей при покупке авто", + views: "1.5K просмотров", + }, +]; + +// Загружаем категории из PocketBase динамически +interface CategoryItem { + name: string; + count: number; +} + +let categories: CategoryItem[] = []; + +try { + // Получаем все посты для подсчёта категорий + const allPostsResponse = await fetch( + `${POCKETBASE_URL}/api/collections/posts/records?perPage=500`, + ); + const allPostsData: PocketBaseResponse = await allPostsResponse.json(); + + if (allPostsData.items) { + const categoryMap = new Map(); + + allPostsData.items.forEach((post) => { + const category = + post.category && post.category.trim() !== "" + ? post.category + : "НОВОСТИ"; + const currentCount = categoryMap.get(category) || 0; + categoryMap.set(category, currentCount + 1); + }); + + // Преобразуем в массив и сортируем по количеству (убывание) + categories = Array.from(categoryMap.entries()) + .map(([name, count]) => ({ name, count })) + .sort((a, b) => b.count - a.count) + .slice(0, 6); // Берём максимум 6 категорий + } +} catch (error) { + console.error("Error fetching categories from PocketBase:", error); + // Fallback на пустой массив + categories = []; +} +--- + +
+ +
+ +
+
+

+ Все публикации +

+
+
+
+ + Архив статей + + + + +
+ +
+ +
+ { + posts.length > 0 ? ( +
+ {posts.map((post) => ( + + ))} +
+ ) : ( +
+

Пока нет публикаций

+
+ ) + } + +
+ + + +
+
+
diff --git a/frontend/src/components/blog/FeaturedPost.astro b/frontend/src/components/blog/FeaturedPost.astro new file mode 100644 index 0000000..bdc0cd8 --- /dev/null +++ b/frontend/src/components/blog/FeaturedPost.astro @@ -0,0 +1,302 @@ +--- +import { MONTHS } from '@lib/constants'; + +const POCKETBASE_URL = import.meta.env.POCKETBASE_URL || "http://localhost:8090"; + +interface Post { + id: string; + date: string; + category: string; + title: string; + excerpt: string; + image: string; + link: string; + isImportant?: boolean; +} + +interface PostRecord { + id: string; + title: string; + slug: string; + excerpt: string; + image?: string; + tags?: string; + isImportant?: boolean; + created: string; +} + +interface PocketBaseResponse { + items: PostRecord[]; +} + +interface Props { + subHeader?: string; + title?: string; + initialPosts?: Post[]; +} + +const { + subHeader = "Блог и новости", + title = "Актуальное", +} = Astro.props; + +// Загружаем реальные статьи из PocketBase +let posts: Post[] = []; + +try { + // Получаем все посты (без ограничения 3) + const response = await fetch(`${POCKETBASE_URL}/api/collections/posts/records?perPage=20&sort=-created`); + const data: PocketBaseResponse = await response.json(); + + if (data.items && data.items.length > 0) { + // Разделяем на важные и обычные + const importantPosts = data.items + .filter(post => post.isImportant === true) + .map(post => createPostData(post)); + + const regularPosts = data.items + .filter(post => post.isImportant !== true) + .map(post => createPostData(post)); + + // Берём максимум 3 поста: сначала важные, потом обычные + posts = [...importantPosts, ...regularPosts].slice(0, 3); + } +} catch (error) { + console.error("[FeaturedPost] Error fetching posts from PocketBase:", error); +} + +// Функция создания данных поста +function createPostData(post: PostRecord): Post { + const date = new Date(post.created); + const formattedDate = `${date.getDate()} ${MONTHS[date.getMonth()]} ${date.getFullYear()} года`; + + // Формируем URL изображения + const imageUrl = post.image + ? `${POCKETBASE_URL}/api/files/posts/${post.id}/${post.image}` + : "https://images.unsplash.com/photo-1589829085413-56de8ae18c73?q=80&w=2000&auto=format&fit=crop"; + + // Берём категорию из нового поля category + const category = post.category && post.category.trim() !== "" ? post.category : "НОВОСТИ"; + + return { + id: post.id, + date: formattedDate, + category, + title: post.title, + excerpt: post.excerpt, + image: imageUrl, + link: `/blog/${post.slug}`, + isImportant: post.isImportant === true + }; +} + +// Если постов нет, используем заглушки +if (posts.length === 0) { + posts = [{ + id: "1", + date: `13 ${MONTHS[2]} 2026 года`, + category: "НОВОСТИ", + title: "Нет доступных публикаций", + excerpt: "Пока нет статей для отображения", + image: "https://images.unsplash.com/photo-1589829085413-56de8ae18c73?q=80&w=2000&auto=format&fit=crop", + link: "/blog", + isImportant: true + }]; +} +--- + +
+
+ +
+ + {subHeader} + +

+ {title} +

+
+
+ + +
+ + + + + + + +
+
+ {posts.map((post) => ( + + ))} +
+
+ + +
+ {posts.map((_, index) => ( + + ))} +
+
+
+
+ + \ No newline at end of file diff --git a/frontend/src/components/blog/PostCard.astro b/frontend/src/components/blog/PostCard.astro new file mode 100644 index 0000000..57eded5 --- /dev/null +++ b/frontend/src/components/blog/PostCard.astro @@ -0,0 +1,66 @@ +--- +interface Props { + post: { + image: string; + category: string; + title: string; + excerpt: string; + date: string; + slug: string; + }; +} + +const { post } = Astro.props; +--- + + \ No newline at end of file diff --git a/frontend/src/components/blog/SearchBox.astro b/frontend/src/components/blog/SearchBox.astro new file mode 100644 index 0000000..a9d5031 --- /dev/null +++ b/frontend/src/components/blog/SearchBox.astro @@ -0,0 +1,321 @@ + +
+

+ + + + Поиск +

+ + + + + +
+ + + + + diff --git a/frontend/src/components/blog/SidebarCategories.astro b/frontend/src/components/blog/SidebarCategories.astro new file mode 100644 index 0000000..ec30c58 --- /dev/null +++ b/frontend/src/components/blog/SidebarCategories.astro @@ -0,0 +1,41 @@ +--- +interface Props { + categories: Array<{ + name: string; + count: number; + }>; +} + +const { categories } = Astro.props; + +// Функция для URL-safe кодирования категории +function encodeCategory(name: string): string { + return encodeURIComponent(name.toLowerCase().replace(/\s+/g, '-')); +} +--- + +
+

+ + + + Категории +

+
+ {categories.length > 0 ? ( + categories.map(cat => ( + + {cat.name} + + {cat.count} + + + )) + ) : ( +

Категории загружаются...

+ )} +
+
\ No newline at end of file diff --git a/frontend/src/components/blog/SidebarNewsletter.astro b/frontend/src/components/blog/SidebarNewsletter.astro new file mode 100644 index 0000000..e9c618d --- /dev/null +++ b/frontend/src/components/blog/SidebarNewsletter.astro @@ -0,0 +1,46 @@ +
+ +
+ + +
+
+ + +
+ +
+
+ + + +
+ +

Будьте в курсе

+

+ Получайте свежие юридические советы и новости законодательства прямо на почту +

+ +
+
+ +
+ + + +
+
+ +
+ +

+ Не отправляем спам. Только полезная информация. +

+
+
diff --git a/frontend/src/components/blog/SidebarPopular.astro b/frontend/src/components/blog/SidebarPopular.astro new file mode 100644 index 0000000..5b86c59 --- /dev/null +++ b/frontend/src/components/blog/SidebarPopular.astro @@ -0,0 +1,37 @@ +--- +interface Props { + posts: Array<{ + image: string; + title: string; + views: string; + }>; +} + +const { posts } = Astro.props; +--- + +
+

+ + + + Популярные статьи +

+
+ {posts.map(post => ( +
+
+ +
+
+
+ {post.title} +
+ + {post.views} + +
+
+ ))} +
+
diff --git a/frontend/src/components/blog/SidebarSearch.astro b/frontend/src/components/blog/SidebarSearch.astro new file mode 100644 index 0000000..35c0bad --- /dev/null +++ b/frontend/src/components/blog/SidebarSearch.astro @@ -0,0 +1,6 @@ +--- +// Обёртка для компонента поиска +import SearchBox from './SearchBox.astro'; +--- + + \ No newline at end of file diff --git a/frontend/src/components/blog/TagCloud.astro b/frontend/src/components/blog/TagCloud.astro new file mode 100644 index 0000000..22a0207 --- /dev/null +++ b/frontend/src/components/blog/TagCloud.astro @@ -0,0 +1,71 @@ +--- +// Теги для блога (статические данные для примера) +const tags = [ + { name: "Законодательство", count: 15, size: "large" }, + { name: "Судебная практика", count: 12, size: "medium" }, + { name: "Бизнес", count: 8, size: "medium" }, + { name: "Недвижимость", count: 6, size: "small" }, + { name: "Семья", count: 4, size: "small" }, + { name: "Налоги", count: 10, size: "large" }, + { name: "Трудовое право", count: 7, size: "medium" }, + { name: "Защита прав", count: 5, size: "small" }, + { name: "Арбитраж", count: 9, size: "medium" }, + { name: "Уголовное право", count: 11, size: "large" }, + { name: "Административное", count: 3, size: "small" }, + { name: "Договоры", count: 6, size: "small" }, +]; + +// Функция для получения размера тега +function getTagClasses(size: string) { + const baseClasses = + "inline-flex items-center px-4 py-2 bg-[var(--color-blue-primary)]/10 border border-[var(--color-blue-primary)]/20 rounded-full font-medium transition-all duration-300 hover:bg-[var(--color-blue-primary)] hover:border-[var(--color-blue-primary)] hover:text-white hover:shadow-lg hover:shadow-[var(--color-blue-primary)]/30 hover:-translate-y-0.5 cursor-pointer"; + + switch (size) { + case "large": + return `${baseClasses} text-base text-[var(--color-blue-primary)]`; + case "medium": + return `${baseClasses} text-sm text-[var(--color-blue-primary)]`; + default: + return `${baseClasses} text-xs text-[var(--color-blue-primary)]`; + } +} +--- + +
+

+ + + + Облако тегов +

+

Найдите статьи по ключевому тегу

+ +
+ { + tags.map((tag) => ( + + {tag.name} + + {tag.count} + + + )) + } +
+
diff --git a/frontend/src/components/cases/CaseCard.astro b/frontend/src/components/cases/CaseCard.astro new file mode 100644 index 0000000..caf5bf6 --- /dev/null +++ b/frontend/src/components/cases/CaseCard.astro @@ -0,0 +1,93 @@ +--- +export interface Props { + case: { + id: string; + title: string; + category: string; + result: 'won' | 'settled' | 'ongoing'; + amount?: string; + date: string; + description: string; + tag: string; + }; +} + +const { case: caseData } = Astro.props; + +const resultConfig = { + won: { + label: 'Дело выиграно', + color: 'bg-green-500', + bg: 'bg-green-50', + text: 'text-green-700', + stamp: 'ПОБЕДА' + }, + settled: { + label: 'Урегулировано', + color: 'bg-[var(--color-gold)]', + bg: 'bg-amber-50', + text: 'text-amber-700', + stamp: 'СОГЛАШЕНИЕ' + }, + ongoing: { + label: 'В процессе', + color: 'bg-blue-500', + bg: 'bg-blue-50', + text: 'text-blue-700', + stamp: 'В РАБОТЕ' + } +}; + +const config = resultConfig[caseData.result]; +--- + +
+ +
+ {caseData.category} + {caseData.date} +
+ +
+ +
+ {config.stamp} +
+ + +
+ + {caseData.tag} +
+ + +

+ {caseData.title} +

+ + +

+ {caseData.description} +

+ + +
+
+ {caseData.amount && ( +
Сумма дела
+
{caseData.amount}
+ )} +
+ + +
+
+ + +
+
diff --git a/frontend/src/components/cases/CasesGrid.astro b/frontend/src/components/cases/CasesGrid.astro new file mode 100644 index 0000000..ceb24ac --- /dev/null +++ b/frontend/src/components/cases/CasesGrid.astro @@ -0,0 +1,544 @@ +--- +import CaseCard from "./CaseCard.astro"; + +// Массив из 12 дел +const allCases = [ + { + id: "1", + title: "Возмещение ущерба при ДТП с участием грузового транспорта", + category: "Административное", + result: "won" as const, + amount: "₽3.2 млн", + date: "2024-01-15", + description: + "Взыскание ущерба с виновника ДТП и страховой компании после отказа в выплате по факту превышения лимита ОСАГО.", + tag: "ДТП", + complexity: "medium", + }, + { + id: "2", + title: + "Защита при обвинении по ст. 228 УК РФ (незаконный оборот наркотиков)", + category: "Уголовное", + result: "settled" as const, + date: "2023-12-10", + description: + "Доказано нарушение правил хранения вещественных доказательств. Дело прекращено за отсутствием состава преступления.", + tag: "Отказ в возбуждении", + complexity: "high", + }, + { + id: "3", + title: "Арбитражный спор о взыскании задолженности по договору поставки", + category: "Арбитраж", + result: "won" as const, + amount: "₽18.5 млн", + date: "2024-03-22", + description: + "Взыскание основного долга, процентов и неустойки с контрагента, злоупотреблявшего правом на отсрочку платежа.", + tag: "Взыскание долга", + complexity: "high", + }, + { + id: "4", + title: + "Раздел совместно нажитого имущества супругов стоимостью более 50 млн", + category: "Семейное", + result: "settled" as const, + amount: "Сохранено 70%", + date: "2024-02-14", + description: + "Достигнуто мирное соглашение, позволившее клиенту сохранить бизнес и недвижимость без длительных судебных разбирательств.", + tag: "Медиация", + complexity: "medium", + }, + { + id: "5", + title: "Оспаривание кадастровой стоимости торгового центра", + category: "Гражданское", + result: "won" as const, + amount: "₽8.9 млн налогов", + date: "2023-11-30", + description: + "Снижение кадастровой стоимости на 40%, что привело к существенной экономии на налоге на имущество в последующие годы.", + tag: "Налоги", + complexity: "medium", + }, + { + id: "6", + title: + "Защита директора по делу о банкротстве с признаками преднамеренного", + category: "Уголовное", + result: "ongoing" as const, + date: "2024-04-05", + description: + "Доказывание добросовестности руководителя при банкротстве предприятия, отсутствия ущерба кредиторам.", + tag: "Субсидиарная ответственность", + complexity: "high", + }, + { + id: "7", + title: "Взыскание неустойки с застройщика за просрочку сдачи квартиры", + category: "Гражданское", + result: "won" as const, + amount: "₽2.8 млн", + date: "2024-05-18", + description: + "Успешное взыскание неустойки по договору долевого участия с одновременным сохранением права собственности.", + tag: "ДДУ", + complexity: "low", + }, + { + id: "8", + title: "Защита бизнеса от рейдерского захвата через подложные документы", + category: "Арбитраж", + result: "won" as const, + amount: "Сохранён бизнес", + date: "2024-06-12", + description: + "Оспаривание сделок по передаче долей в уставном капитале, совершённых с использованием поддельных подписей.", + tag: "Корпоративные споры", + complexity: "high", + }, + { + id: "9", + title: "Прекращение уголовного дела о мошенничестве в сфере строительства", + category: "Уголовное", + result: "settled" as const, + date: "2024-07-20", + description: + "Доказано отсутствие умысла на хищение денежных средств инвесторов при реализации проекта.", + tag: "Прекращение дела", + complexity: "high", + }, + { + id: "10", + title: "Восстановление на работе и компенсация морального вреда", + category: "Трудовое", + result: "won" as const, + amount: "₽1.5 млн", + date: "2024-08-03", + description: + "Успешное оспаривание незаконного увольнения с восстановлением на прежней должности и выплатой среднего заработка.", + tag: "Увольнение", + complexity: "low", + }, + { + id: "11", + title: "Защита интеллектуальной собственности — товарный знак", + category: "Гражданское", + result: "ongoing" as const, + date: "2024-09-15", + description: + "Судебное пресечение незаконного использования зарегистрированного товарного знака конкурентом.", + tag: "Авторское право", + complexity: "medium", + }, + { + id: "12", + title: "Оспаривание решения налоговой о доначислении НДС", + category: "Налоговое", + result: "won" as const, + amount: "₽24 млн", + date: "2024-10-08", + description: + "Отмена акта налоговой проверки и решения о привлечении к ответственности по сделкам с контрагентами.", + tag: "Налоговые споры", + complexity: "high", + }, +]; + +// Уникальные категории для фильтров +const categories = ["Все", ...new Set(allCases.map((c) => c.category))]; +--- + +
+
+ +
+

Последние дела

+

+ Выберите категорию для фильтрации или сортировку +

+
+ + +
+ { + categories.map((category, index) => ( + + )) + } +
+ + +
+ Сортировать по: +
+ + + +
+
+ + +
+ { + allCases.map((caseItem) => ( +
+ +
+ )) + } +
+ + + + + +
+ + + +
+
+
+ + + + diff --git a/frontend/src/components/cases/CasesHero.astro b/frontend/src/components/cases/CasesHero.astro new file mode 100644 index 0000000..9eb7a5d --- /dev/null +++ b/frontend/src/components/cases/CasesHero.astro @@ -0,0 +1,161 @@ +--- +import { CURRENT_YEAR } from '@constants/constants.ts'; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Судебная практика", + subtitle = `Реальные дела с реальными результатами. Прозрачность и доказательная база данных решений в судах ХМАО-Югры за ${CURRENT_YEAR} год.` +} = Astro.props; + +const categories = [ + { id: 'all', label: 'Все дела', count: 124, icon: 'M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z' }, + { id: 'criminal', label: 'Уголовные', count: 45, icon: 'M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3' }, + { id: 'civil', label: 'Гражданские', count: 38, icon: 'M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3' }, + { id: 'arbitration', label: 'Арбитраж', count: 28, icon: 'M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z' }, + { id: 'admin', label: 'Административные', count: 13, icon: 'M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z' } +]; +--- + +
+ +
+
+
+
+ + +
+
+ +
+ +
+ + + + + Доказательная база + + +

+ {title} + в цифрах +

+ +

+ {subtitle} +

+
+ + +
+ {categories.map((cat, index) => ( + + ))} +
+
+
+ + + + diff --git a/frontend/src/components/cases/FeaturedCase.astro b/frontend/src/components/cases/FeaturedCase.astro new file mode 100644 index 0000000..cdec038 --- /dev/null +++ b/frontend/src/components/cases/FeaturedCase.astro @@ -0,0 +1,132 @@ +--- +import { CURRENT_YEAR } from '@constants/constants.ts'; + +// FeaturedCase.astro — Гражданское дело о защите прав потребителя +// Все данные инкапсулированы внутри компонента, пропсы удалены +--- + +
+
+
+
+ + + +
+

Дело месяца

+
+ +
+
+ +
+ Недвижимость и строительство +
+
+ + +
+ {CURRENT_YEAR} +
+
+ + +
+
+ + Гражданское право • Защита прав потребителей +
+ +

+ Взыскание неустойки с застройщика и компенсация морального вреда +

+ +

+ Дольщики многоквартирного дома обратились с иском к застройщику, + систематически нарушавшему сроки сдачи объекта. В ходе досудебной + претензионной работы и судебного разбирательства доказаны факты + грубого нарушения договорных обязательств. Достигнуто положительное + решение для 47 семей с полным возмещением убытков. +

+ +
+
+
+ Результат +
+
+ Полное удовлетворение иска +
+
+
+
+ Взыскано +
+
+ ₽18.4 млн + неустойка +
+
+
+ + +
+
+ + +
+
+
+
+
diff --git a/frontend/src/components/contacts/BotWidget.astro b/frontend/src/components/contacts/BotWidget.astro new file mode 100644 index 0000000..92e2fdd --- /dev/null +++ b/frontend/src/components/contacts/BotWidget.astro @@ -0,0 +1,125 @@ +--- +export interface Props { + botName?: string; + telegramLink: string; + description?: string; + responseTime?: string; +} + +const { + botName = "Юридический ассистент", + telegramLink, + description = "Опишите ситуацию боту — он задаст уточняющие вопросы, соберет необходимые документы и моментально передаст информацию адвокату. Это сократит время приема и подготовит юриста к вашему вопросу.", + responseTime = "Ответы поступят в Telegram в течение 5 минут" +} = Astro.props; + +const features = [ + "Анализ юридической ситуации по вашему описанию", + "Подготовка пакета документов к визиту", + "Запись на прием к конкретному специалисту" +]; +--- + +
+
+ +
+
+ + +
+ +
+ +
+
+ +
+ + +
+ + + + + +
+ + + +
+
+ + +
+
+ +
+

{botName}

+
+
+
+
+
+ Онлайн 24/7 +
+
+
+ + +
+

+ + Предварительная консультация +

+

Через Telegram-бота

+
+ + +
+

+ {description.split('моментально передаст информацию адвокату').map((part, i) => + i === 0 ? part : <>моментально передаст информацию адвокату{part} + )} +

+
+ + +
    + {features.map((feature, index) => ( +
  • +
    + + + +
    + {feature} +
  • + ))} +
+ + + + + +
+ + + + {responseTime} +
+
+
+
\ No newline at end of file diff --git a/frontend/src/components/contacts/ContactCard.astro b/frontend/src/components/contacts/ContactCard.astro new file mode 100644 index 0000000..46eeca9 --- /dev/null +++ b/frontend/src/components/contacts/ContactCard.astro @@ -0,0 +1,37 @@ +--- +export interface Props { + title: string; + icon: string; + children: any; + className?: string; +} + +const { title, icon, className = "" } = Astro.props; + +const icons: Record = { + phone: "M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z", + email: "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z", + location: "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z M15 11a3 3 0 11-6 0 3 3 0 016 0z", + clock: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" +}; +--- + +
+ +
+ +
+ +
+ + + +
+ +

{title}

+ +
+ +
+
+
diff --git a/frontend/src/components/contacts/ContactsGrid.astro b/frontend/src/components/contacts/ContactsGrid.astro new file mode 100644 index 0000000..5186e49 --- /dev/null +++ b/frontend/src/components/contacts/ContactsGrid.astro @@ -0,0 +1,87 @@ +--- +import ContactCard from './ContactCard.astro'; +import type { ContactConfig } from '@/types/contacts.ts'; + +export interface Props { + contacts: ContactConfig; +} + +const { contacts } = Astro.props; +const { phones, email, address, hours } = contacts; +--- + +
+
+
+

+ Прямые контакты + +

+
+
+
+ +
+ + +
+ {phones.map((phone) => ( +
+ + + {phone.number} + + + + {phone.label} +
+ ))} +
+
+ + + + + {email.address} + + +

{email.label}

+
+ + + +

{address.short}

+

{address.full}

+ + Открыть на картах + + + + +
+ + + +
+
+ Пн — Пт + {hours.weekday} +
+
+ Сб — Вс + {hours.weekend} +
+ {hours.note && ( +
+ + + + + {hours.note} + +
+ )} +
+
+
diff --git a/frontend/src/components/contacts/ContactsHero.astro b/frontend/src/components/contacts/ContactsHero.astro new file mode 100644 index 0000000..ffe5787 --- /dev/null +++ b/frontend/src/components/contacts/ContactsHero.astro @@ -0,0 +1,40 @@ +--- +export interface Props { + title?: string; + subtitle?: string; + highlightText?: string; +} + +const { + title = "Контакты", + subtitle = "Нужна юридическая помощь? Свяжитесь напрямую или доверьте предварительный анализ нашему", + highlightText = "AI-ассистенту" +} = Astro.props; +--- + +
+ +
+ + +
+
+ + Наши координаты +
+ +

+ {title} + +

+ +

+ {subtitle} + + + {highlightText} + + +

+
+
\ No newline at end of file diff --git a/frontend/src/components/contacts/EmergencyCard.astro b/frontend/src/components/contacts/EmergencyCard.astro new file mode 100644 index 0000000..119e005 --- /dev/null +++ b/frontend/src/components/contacts/EmergencyCard.astro @@ -0,0 +1,53 @@ +--- +export interface Props { + phone: string; + description?: string; + title?: string; +} + +const { + phone, + title = "Срочная помощь", + description = "Задержание, обыск, ДТП? Звоните круглосуточно." +} = Astro.props; +--- + +
+ +
+ +
+ +
+ +
+
+ +
+
+ + + +
+
+ +
+

+ {title} + 24/7 +

+

{description}

+ + + + {phone} + + + + + + +
+
+
+
\ No newline at end of file diff --git a/frontend/src/components/contacts/MessengerButtons.astro b/frontend/src/components/contacts/MessengerButtons.astro new file mode 100644 index 0000000..95f5b6e --- /dev/null +++ b/frontend/src/components/contacts/MessengerButtons.astro @@ -0,0 +1,28 @@ +--- +export interface Props { + telegramLink: string; + whatsappLink?: string; +} + +const { telegramLink, whatsappLink = "https://wa.me/79000000000" } = Astro.props; +--- + + \ No newline at end of file diff --git a/frontend/src/components/faq/FaqAccordion.astro b/frontend/src/components/faq/FaqAccordion.astro new file mode 100644 index 0000000..ff36df0 --- /dev/null +++ b/frontend/src/components/faq/FaqAccordion.astro @@ -0,0 +1,151 @@ +--- +interface Props { + question: string; + answer: string; + isOpen?: boolean; + index?: number; +} + +const { question, answer, isOpen = false, index = 1 } = Astro.props; +--- + +
+ +
+ {String(index).padStart(2, "0")} +
+ + + +
+
+
+ {answer} +
+
+
+
+ + diff --git a/frontend/src/components/home/Hero.astro b/frontend/src/components/home/Hero.astro new file mode 100644 index 0000000..06c5c92 --- /dev/null +++ b/frontend/src/components/home/Hero.astro @@ -0,0 +1,155 @@ +--- +import { PRACTICE_START_YEAR } from "@constants/constants.ts"; +import { getYearDeclension } from "@utils/stats.utils.ts"; + +interface Props { + backgroundImage?: string; +} + +const { backgroundImage = "/images/hero/heroImg.avif" } = Astro.props; + +const currentYear = new Date().getFullYear(); +const yearsOfPractice = currentYear - PRACTICE_START_YEAR; +const yearDeclension = getYearDeclension(yearsOfPractice); +--- + +
+ +
+ Адвокат Сургута + +
+
+
+
+
+
+
+ + +
+
+ + +
+
+ +
+ + + Юридическая защита + +
+ + +

+ Лучший адвокат в
+ Сургуте +

+ + +

+ Высококвалифицированная правовая поддержка по самым сложным делам. + {yearsOfPractice} + {yearDeclension} безупречной репутации и сотни выигранных процессов в судах + ХМАО - Югры. +

+ + + +
+
+ + +
+ Прокрутите + + + +
+
diff --git a/frontend/src/components/home/Reviews.astro b/frontend/src/components/home/Reviews.astro new file mode 100644 index 0000000..9ef91a0 --- /dev/null +++ b/frontend/src/components/home/Reviews.astro @@ -0,0 +1,211 @@ +--- +const reviews = [ + { + author: "Александр Волков", + role: "ООО «СтройГрупп»", + text: "Профессионал своего дела! Помог выиграть сложнейший арбитражный спор. Всегда на связи, всё четко и по делу.", + rating: 5, + }, + { + author: "Мария Смирнова", + role: "Частное лицо", + text: "Обращалась по вопросу раздела имущества. Процесс был тяжелым, но благодаря поддержке адвоката удалось достичь мирного соглашения.", + rating: 5, + }, + { + author: "Дмитрий Кузнецов", + role: "Предприниматель", + text: "Лучшая юридическая консультация, которую я когда-либо получал. Очень грамотно разобрали мою ситуацию по уголовному делу.", + rating: 5, + }, + { + author: "Елена Васечкина", + role: "Гендиректор «Вектор»", + text: "Сотрудничаем на постоянной основе уже 3 года. Полное юридическое сопровождение бизнеса на высшем уровне.", + rating: 5, + }, +]; +--- + +
+ +
+
+
+
+ +
+ +
+ + Репутация + +

+ Отзывы наших доверителей +

+
+ + + +
+
+ + + + \ No newline at end of file diff --git a/frontend/src/components/home/Services.astro b/frontend/src/components/home/Services.astro new file mode 100644 index 0000000..4b4bcfa --- /dev/null +++ b/frontend/src/components/home/Services.astro @@ -0,0 +1,109 @@ +--- +const services = [ + { + title: "Уголовные дела", + desc: "Эффективная защита на стадиях предварительного следствия и в суде по делам любой сложности.", + href: "/services/criminal", + icon: "scale" + }, + { + title: "Гражданские дела", + desc: "Защита прав собственности, жилищные споры и взыскание задолженностей в судебном порядке.", + href: "/services/civil", + icon: "balance" + }, + { + title: "Семейные дела", + desc: "Расторжение брака, раздел совместно нажитого имущества и определение места жительства детей.", + href: "/services/family", + icon: "users" + }, + { + title: "Административные дела", + desc: "Профессиональное представительство интересов в административных спорах и ДТП.", + href: "/services/administrative", + icon: "shield" + }, + { + title: "Арбитражные дела", + desc: "Защита интересов бизнеса в арбитражных судах всех инстанций.", + href: "/services/arbitration", + icon: "briefcase" + }, + { + title: "Защита должников", + desc: "Защита от финансовых претензий банков и коллекторских организаций.", + href: "/services/debt-protection", + icon: "protect" + } +]; + +const iconPaths: Record = { + scale: "M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3", + balance: "M12 2a10 10 0 100 20 10 10 0 000-20zm0 18a8 8 0 110-16 8 8 0 010 16zm-1-13h2v6h-2zm0 8h2v2h-2z", + users: "M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z", + shield: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z", + briefcase: "M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z", + protect: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" +}; +--- + +
+ +
+
+
+ +
+ +
+ + Специализация + +

+ Направления практики +

+
+

+ Специализируюсь на представлении интересов в самых сложных правовых спорах на территории Сургута и ХМАО-Югры +

+
+ + + +
+
\ No newline at end of file diff --git a/frontend/src/components/home/Stats.astro b/frontend/src/components/home/Stats.astro new file mode 100644 index 0000000..213b2be --- /dev/null +++ b/frontend/src/components/home/Stats.astro @@ -0,0 +1,105 @@ +--- +import { getDynamicStats, getYearDeclension, getCaseDeclension, getClientDeclension } from '@utils/stats.utils.ts'; + +const stats = getDynamicStats(); + +const statIcons = [ + "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z", // Calendar + "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z", // Check circle + "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z", // Users + "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" // Clock +]; +--- + +
+ +
+
+
+
+ +
+
+ {stats.map((stat, index) => ( +
+ +
+ + +
+ + + +
+ + +
+ + 0 + + {stat.suffix} +
+ + +

+ {stat.text.includes('Лет практики') ? `${stat.number} ${getYearDeclension(stat.number)} практики` : + stat.text.includes('Успешных дел') ? `${stat.number} ${stat.suffix} ${stat.text.toLowerCase()}` : + stat.text.includes('Клиентов') ? `${stat.number} довольных ${getClientDeclension(stat.number)}` : + stat.text.includes('На связи') ? 'в режиме 24/7' : stat.text} +

+
+ ))} +
+
+
+ + \ No newline at end of file diff --git a/frontend/src/components/home/WhyUs.astro b/frontend/src/components/home/WhyUs.astro new file mode 100644 index 0000000..86ac380 --- /dev/null +++ b/frontend/src/components/home/WhyUs.astro @@ -0,0 +1,114 @@ +--- +import { Image } from 'astro:assets'; +import { PRACTICE_START_YEAR } from '@constants/constants.ts'; +import { getYearDeclension } from '@utils/stats.utils.ts'; +import whyUsImage from '@assets/images/home/whyus/WhyUs.png'; + +const currentYear = new Date().getFullYear(); +const yearsOfPractice = currentYear - PRACTICE_START_YEAR; +const yearDeclension = getYearDeclension(yearsOfPractice); + +const features = [ + { + title: "Абсолютная анонимность", + desc: "Строгое соблюдение адвокатской тайны. Любая информация остается полностью конфиденциальной.", + icon: "shield-check" + }, + { + title: "Глубокая экспертиза", + desc: "Опыт включает сотни выигранных дел в различных инстанциях, от мировых судов до Верховного Суда РФ.", + icon: "academic-cap" + }, + { + title: "Прозрачные условия", + desc: "Фиксированная стоимость услуг, прописанная в договоре. Никаких скрытых платежей.", + icon: "currency" + } +]; + +const iconPaths: Record = { + "shield-check": "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z", + "academic-cap": "M12 14l9-5-9-5-9 5 9 5z M12 14l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14z M12 14L4.5 8.25", + "currency": "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z" +}; +--- + +
+ +
+
+
+ +
+
+ + +
+
+ +
+ Адвокатский стол + + +
+
+
+ {yearsOfPractice} +
+
+ Опыт работы + {yearDeclension} безупречной практики +
+
+
+
+
+ + +
+
+ + Наше преимущество + +

+ Почему выбирают нас? +

+
+ +
+ {features.map((item, index) => ( +
+
+
+ + + +
+ + {index !== features.length - 1 && ( +
+ )} +
+ +
+

+ {item.title} +

+

+ {item.desc} +

+
+
+ ))} +
+
+
+
+
\ No newline at end of file diff --git a/frontend/src/components/layouts/footer/Footer.astro b/frontend/src/components/layouts/footer/Footer.astro new file mode 100644 index 0000000..13198a5 --- /dev/null +++ b/frontend/src/components/layouts/footer/Footer.astro @@ -0,0 +1,170 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; +import SocialIcons from "@components/base/SocialIcons.astro"; + +const currentYear = new Date().getFullYear(); + +const services = [ + { name: "Административные дела", href: "/services/arbitration" }, + { name: "Гражданские дела", href: "/services/civil" }, + { name: "Семейные дела", href: "/services/family" }, + { name: "Защита должников", href: "/services/debt-protection" }, +]; + +const menu = [ + { name: "Главная", href: "/" }, + { name: "О бюро", href: "/about" }, + { name: "Отзывы", href: "/reviews" }, + { name: "FAQ", href: "/faq" }, +]; +--- + + diff --git a/frontend/src/components/layouts/header/Header.astro b/frontend/src/components/layouts/header/Header.astro new file mode 100644 index 0000000..369b8e2 --- /dev/null +++ b/frontend/src/components/layouts/header/Header.astro @@ -0,0 +1,444 @@ +--- +import MobileMenu from "./MobileMenu.astro"; +import Button from "@components/base/Button.astro"; +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +const { pathname } = Astro.url; + +// Проверка авторизации будет на клиенте +const navLinks = [ + { name: "Главная", href: "/" }, + { + name: "Услуги", + href: "/services", + children: [ + { + name: "Административные дела", + href: "/services/administrative", + icon: "⚖️", + }, + { + name: "Защита должников", + href: "/services/debt-protection", + icon: "💳", + }, + { + name: "Арбитражные дела", + href: "/services/arbitration", + icon: "💼", + }, + { + name: "Уголовные дела", + href: "/services/criminal", + icon: "⚖️", + }, + { name: "Гражданские дела", href: "/services/civil", icon: "📋" }, + { name: "Семейные дела", href: "/services/family", icon: "👨‍👩‍👧" }, + { name: "Дела СВО", href: "/services/svo", icon: "🛡️" }, + ], + }, + { name: "Кейсы", href: "/cases" }, + { name: "Блог", href: "/blog" }, + { name: "О Бюро", href: "/about" }, + { name: "Контакты", href: "/contacts" }, +]; + +const rawLinks = navLinks.filter((link) => { + if (pathname === "/" && link.href === "/") return false; + return true; +}); +--- + +
+
+ + +
+
+ + + +
+
+
+ + ADVOKAT086 + + +
+
+ + + + +
+ + + + + +
+
+ +
+
+
+ + + + + + diff --git a/frontend/src/components/layouts/header/MobileMenu.astro b/frontend/src/components/layouts/header/MobileMenu.astro new file mode 100644 index 0000000..777c9fb --- /dev/null +++ b/frontend/src/components/layouts/header/MobileMenu.astro @@ -0,0 +1,296 @@ +--- +import Button from "@components/base/Button.astro"; + +const { links } = Astro.props; +--- + + + + + + + + + diff --git a/frontend/src/components/reviews/AuthorizedReviewModal.astro b/frontend/src/components/reviews/AuthorizedReviewModal.astro new file mode 100644 index 0000000..8c950fe --- /dev/null +++ b/frontend/src/components/reviews/AuthorizedReviewModal.astro @@ -0,0 +1,729 @@ +--- +import Toast from "@components/base/Toast.astro"; +--- + + + + + + + + + + diff --git a/frontend/src/components/reviews/ReviewCard.astro b/frontend/src/components/reviews/ReviewCard.astro new file mode 100644 index 0000000..027c313 --- /dev/null +++ b/frontend/src/components/reviews/ReviewCard.astro @@ -0,0 +1,286 @@ +--- +export interface Review { + id: string; + name: string; + role: string; + avatar?: string; + rating: number; + date: string; + text: string; + caseType: string; + verified: boolean; +} + +interface Props { + review: Review; + category?: string; +} + +const { review, category } = Astro.props; + +// Функция генерации цвета аватарки по имени +function getAvatarColor(name: string): string { + const colors = [ + "rgba(59, 130, 246, 0.8)", + "rgba(16, 185, 129, 0.8)", + "rgba(245, 158, 11, 0.8)", + "rgba(239, 68, 68, 0.8)", + "rgba(139, 92, 246, 0.8)", + "rgba(236, 72, 153, 0.8)", + "rgba(14, 165, 233, 0.8)", + "rgba(34, 197, 94, 0.8)", + "rgba(249, 115, 22, 0.8)", + "rgba(99, 102, 241, 0.8)", + ]; + + // Генерируем индекс на основе имени + let hash = 0; + for (let i = 0; i < name.length; i++) { + hash = name.charCodeAt(i) + ((hash << 5) - hash); + } + const index = Math.abs(hash) % colors.length; + return colors[index]; +} +--- + +
+ +
+ +
+
+ {review.name.charAt(0).toUpperCase()} +
+ +
+
+
+

{review.name}

+

{review.role}

+
+ + +
+ + + + Проверено +
+
+ + +
+ { + [...Array(5)].map((_, i) => ( + + + + )) + } +
+
+
+ + +
+ + {review.caseType} + +
+ + +
+ {review.text} +
+ + + +
+
+ + diff --git a/frontend/src/components/reviews/ReviewModal.astro b/frontend/src/components/reviews/ReviewModal.astro new file mode 100644 index 0000000..2762fd7 --- /dev/null +++ b/frontend/src/components/reviews/ReviewModal.astro @@ -0,0 +1,619 @@ +--- +import Toast from "@components/base/Toast.astro"; +--- + + + + + + + + + + diff --git a/frontend/src/components/reviews/ReviewsCTA.astro b/frontend/src/components/reviews/ReviewsCTA.astro new file mode 100644 index 0000000..5962920 --- /dev/null +++ b/frontend/src/components/reviews/ReviewsCTA.astro @@ -0,0 +1,122 @@ +--- +--- + + +
+
+ +
+
+ + + +
+

+ Войдите, чтобы оставить отзыв +

+

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

+
+
+ +
+ + + + +
+
+
+ + diff --git a/frontend/src/components/reviews/ReviewsExternalPlatforms.astro b/frontend/src/components/reviews/ReviewsExternalPlatforms.astro new file mode 100644 index 0000000..65aa7c0 --- /dev/null +++ b/frontend/src/components/reviews/ReviewsExternalPlatforms.astro @@ -0,0 +1,45 @@ +--- +interface PlatformLink { + emoji: string; + name: string; + rating: string; + href?: string; +} + +const platforms: PlatformLink[] = [ + { + emoji: "🗺️", + name: "Яндекс Карты", + rating: "4.9", + href: "#" + }, + { + emoji: "🔍", + name: "Google", + rating: "5.0", + href: "#" + }, + { + emoji: "📍", + name: "2ГИС", + rating: "4.8", + href: "#" + } +]; +--- + +
+

Читайте отзывы на внешних площадках

+
+ {platforms.map((platform) => ( + + {platform.emoji} + {platform.name} + {platform.rating} + + ))} +
+
diff --git a/frontend/src/components/reviews/ReviewsFilters.astro b/frontend/src/components/reviews/ReviewsFilters.astro new file mode 100644 index 0000000..0657bbd --- /dev/null +++ b/frontend/src/components/reviews/ReviewsFilters.astro @@ -0,0 +1,18 @@ +--- +interface Props { + caseTypes: string[]; +} + +const { caseTypes } = Astro.props; +--- + +
+ {caseTypes.map((type, index) => ( + + ))} +
diff --git a/frontend/src/components/reviews/ReviewsGrid.astro b/frontend/src/components/reviews/ReviewsGrid.astro new file mode 100644 index 0000000..57fcf56 --- /dev/null +++ b/frontend/src/components/reviews/ReviewsGrid.astro @@ -0,0 +1,19 @@ +--- +import ReviewCard from "./ReviewCard.astro"; +import type { Review } from "./ReviewCard.astro"; + +interface Props { + reviews: Array<{ + review: Review; + category: string; + }>; +} + +const { reviews } = Astro.props; +--- + +
+ {reviews.map(({ review, category }) => ( + + ))} +
diff --git a/frontend/src/components/reviews/ReviewsPagination.astro b/frontend/src/components/reviews/ReviewsPagination.astro new file mode 100644 index 0000000..cd8b745 --- /dev/null +++ b/frontend/src/components/reviews/ReviewsPagination.astro @@ -0,0 +1,41 @@ +--- +// Файл: src/components/reviews/ReviewsPagination.astro +// Логика передана клиенту (см. страницу reviews.astro) +--- + + + diff --git a/frontend/src/components/reviews/ReviewsStats.astro b/frontend/src/components/reviews/ReviewsStats.astro new file mode 100644 index 0000000..28cc557 --- /dev/null +++ b/frontend/src/components/reviews/ReviewsStats.astro @@ -0,0 +1,30 @@ +--- +// Файл: src/components/reviews/ReviewsStats.astro +export interface StatItem { + value: string; + label: string; + emoji: string; +} + +interface Props { + stats: StatItem[]; +} + +const { stats } = Astro.props; +--- + +
+ { + stats.map((stat) => ( +
+
+ {stat.emoji} +
+
+ {stat.value} +
+
{stat.label}
+
+ )) + } +
diff --git a/frontend/src/components/reviews/ReviewsTrustBlocks.astro b/frontend/src/components/reviews/ReviewsTrustBlocks.astro new file mode 100644 index 0000000..7c30bed --- /dev/null +++ b/frontend/src/components/reviews/ReviewsTrustBlocks.astro @@ -0,0 +1,41 @@ +--- +interface TrustItem { + emoji: string; + bgClass: string; + title: string; + description: string; +} + +const trustBlocks: TrustItem[] = [ + { + emoji: "🔒", + bgClass: "bg-[var(--color-emerald-500)]/10", + title: "Конфиденциальность", + description: "Все отзывы публикуются с согласия клиентов. Личные данные защищены." + }, + { + emoji: "📋", + bgClass: "bg-[var(--color-blue-primary)]/10", + title: "Реальные дела", + description: "Каждый отзыв подтверждён документально. Мы не публикуем фейки." + }, + { + emoji: "⭐", + bgClass: "bg-[var(--color-gold)]/10", + title: "Независимость", + description: "Отзывы с Яндекс.Карт, Google и 2ГИС. Мы не редактируем мнения." + } +]; +--- + +
+ {trustBlocks.map((block) => ( +
+
+ {block.emoji} +
+

{block.title}

+

{block.description}

+
+ ))} +
diff --git a/frontend/src/components/services/administrative/EmergencyHelp.astro b/frontend/src/components/services/administrative/EmergencyHelp.astro new file mode 100644 index 0000000..36467a5 --- /dev/null +++ b/frontend/src/components/services/administrative/EmergencyHelp.astro @@ -0,0 +1,179 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; +import SocialIcons from "@components/base/SocialIcons.astro"; +--- + +
+ +
+
+ + +
+
+
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+ + + + + Срочная помощь 24/7 +
+ +

+ Нужна срочная консультация? +

+ +

+ Административное дело требует немедленной реакции. Каждая минута + важна для успешного исхода. +

+ + +
+
+
+ + + +
+ Выезд за 1 час +
+
+
+ + + +
+ Первый звонок бесплатно +
+
+
+ + + +
+ Работаем по всей области +
+
+
+ + +
+ + + + + + + {CONTACT_CONSTANTS.phone} + + + +
+

+ Или напишите в мессенджер +

+
+ +
+
+
+
+
+
+
diff --git a/frontend/src/components/services/administrative/RoadmapProcess.astro b/frontend/src/components/services/administrative/RoadmapProcess.astro new file mode 100644 index 0000000..ef1e8e3 --- /dev/null +++ b/frontend/src/components/services/administrative/RoadmapProcess.astro @@ -0,0 +1,99 @@ +--- +const steps = [ + { + number: "01", + title: "Консультация", + description: "Бесплатный анализ ситуации, изучение документов, оценка перспектив дела и разработка стратегии защиты.", + icon: `` + }, + { + number: "02", + title: "Сбор доказательств", + description: "Запрос материалов дела, выявление процессуальных нарушений, подготовка доказательной базы для защиты.", + icon: `` + }, + { + number: "03", + title: "Подготовка жалобы", + description: "Составление юридически грамотной жалобы с указанием всех нарушений закона и процессуальных ошибок.", + icon: `` + }, + { + number: "04", + title: "Защита в суде", + description: "Профессиональное представление интересов в судебных заседаниях. Добиваемся отмены или смягчения наказания.", + icon: `` + } +]; +--- + +
+ +
+ + +
+
+ +
+ +
+ + Алгоритм + +

+ Как мы работаем +

+

+ Четкий план действий от первичной консультации до положительного решения суда +

+
+ + +
+ + + +
+ {steps.map((step, index) => ( +
+ +
+ + + + +
+ +
+ +

{step.title}

+

{step.description}

+ + +
+
+
+
+
+ {((index + 1) * 25)}% +
+
+
+ + + {index < steps.length - 1 && ( + + )} +
+ ))} +
+
+
+
diff --git a/frontend/src/components/services/administrative/ServiceCategories.astro b/frontend/src/components/services/administrative/ServiceCategories.astro new file mode 100644 index 0000000..3b6c75c --- /dev/null +++ b/frontend/src/components/services/administrative/ServiceCategories.astro @@ -0,0 +1,53 @@ +--- +import CardServiceGrid, { type Service } from "@components/base/CardServiceGrid.astro"; + +const services: Service[] = [ + { + title: "Обжалование штрафов", + description: "Оспаривание штрафов с камер видеофиксации и инспекторов ГИБДД. Поиск процессуальных нарушений, снижение или полная отмена штрафов.", + emoji: "📝", + price: "от 3 000 ₽" + }, + { + title: "Лишение прав", + description: "Защита при лишении водительских прав: алкогольное опьянение, отказ от освидетельствования, выезд на встречную полосу.", + emoji: "🚗", + price: "от 15 000 ₽", + popular: true + }, + { + title: "ДТП и административка", + description: "Сопровождение при административных протоколах по ДТП. Оспаривание вины, снижение штрафов, защита от лишения прав.", + emoji: "💥", + price: "от 10 000 ₽" + }, + { + title: "Миграционные нарушения", + description: "Защита при нарушениях миграционного законодательства: регистрация, РВП, ВНЖ, депортация, административное выдворение.", + emoji: "⚠️", + price: "от 20 000 ₽" + }, + { + title: "Торговля и КоАП", + description: "Защита предпринимателей при проверках. Обжалование штрафов за нарушения в сфере торговли, алкогольной продукции, лицензирования.", + emoji: "🏪", + price: "от 25 000 ₽" + }, + { + title: "Представление в суде", + description: "Представление интересов в районных и областных судах по административным делам. Подготовка жалоб, ходатайств, апелляций.", + emoji: "🏛️", + price: "от 15 000 ₽" + } +]; +--- + +административным делам'} + subtitle="Практика" + description="Комплексная юридическая помощь при привлечении к административной ответственности. Работаю со всеми категориями дел." + bgColor="navy-dark" + accentColor="gold" +/> \ No newline at end of file diff --git a/frontend/src/components/services/administrative/ServicesHero.astro b/frontend/src/components/services/administrative/ServicesHero.astro new file mode 100644 index 0000000..68f09b7 --- /dev/null +++ b/frontend/src/components/services/administrative/ServicesHero.astro @@ -0,0 +1,284 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Защита по административным делам", + subtitle = "Профессиональная помощь при привлечении к административной ответственности. Обжалование постановлений, защита прав в судах, сопровождение на всех этапах.", +} = Astro.props; +--- + +
+ +
+ Административные дела +
+
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+ +
+ +
+ + + + + Авторист в Сургуте +
+ +

+ { + title.split(" ").map((word, i) => + i === 1 || i === 2 ? ( + + {word} + + + ) : ( + {word} + ), + ) + } +

+ +

+ {subtitle} +

+ +
+ + + Услуги + + + + +
+ + +
+
+
500+
+
Дел выиграно
+
+
+
10+
+
Лет опыта
+
+
+
98%
+
Успешных дел
+
+
+
+ + + +
+
+
+ + diff --git a/frontend/src/components/services/arbitration/Advantages.astro b/frontend/src/components/services/arbitration/Advantages.astro new file mode 100644 index 0000000..0195b8f --- /dev/null +++ b/frontend/src/components/services/arbitration/Advantages.astro @@ -0,0 +1,101 @@ +--- +const advantages = [ + { + value: "500+", + label: "Дел в арбитраже", + description: "Успешно проведённых дел в арбитражных судах всех инстанций" + }, + { + value: "92%", + label: "Успешных решений", + description: "Клиенты получили благоприятный исход дела" + }, + { + value: "₽500М+", + label: "Взыскано", + description: "Реально взысканных средств для клиентов за последние 5 лет" + }, + { + value: "15+", + label: "Лет практики", + description: "Специализируюсь исключительно на арбитражных спорах" + }, + { + value: "24/7", + label: "На связи", + description: "Оперативное информирование клиентов о ходе дела" + }, + { + value: "0₽", + label: "Первичный анализ", + description: "Бесплатная оценка перспектив дела и консультация" + } +]; +--- + +
+ +
+ + +
+
+ + +
+ +
+ +
+ + Факты + +

+ ПРЕИМУЩЕСТВА
+ В ЦИФРАХ +

+

+ Объективные показатели моей работы +

+
+ + +
+ {advantages.map((item) => ( +
+ + + + +
+ {item.value} +
+ + +
+ {item.label} +
+ + +

+ {item.description} +

+
+ ))} +
+ + +
+
+
+ + Работаю на результат с 2009 года + +
+
+
+
+
diff --git a/frontend/src/components/services/arbitration/ArbitrationHero.astro b/frontend/src/components/services/arbitration/ArbitrationHero.astro new file mode 100644 index 0000000..4176468 --- /dev/null +++ b/frontend/src/components/services/arbitration/ArbitrationHero.astro @@ -0,0 +1,166 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Арбитражные споры", + subtitle = "Защита интересов бизнеса в арбитражных судах всех инстанций. От Первого арбитражного суда до Верховного суда РФ.", +} = Astro.props; + +const stats = [ + { value: "500+", label: "Дел в арбитраже" }, + { value: "92%", label: "Успешных решений" }, + { value: "15+", label: "Лет практики" }, + { value: "₽500М+", label: "Взыскано для клиентов" }, +]; +--- + +
+ +
+
+ + +
+
+
+ + +
+
+
+
+
+ +
+
+ + +
+ +
+
+ + + +
+ + Арбитражная практика + +
+ + +

+ { + title + .split(" ") + .map((word, i) => + i === 0 ? ( + {word} + ) : ( + {word} + ), + ) + } +

+ + +

+ {subtitle} +

+ + +
+ + Бесплатная консультация + + + + + +
+ + +
+ {stats.map((stat) => ( +
+
{stat.value}
+
{stat.label}
+
+ ))} +
+
+ + + +
+
+
diff --git a/frontend/src/components/services/arbitration/CourtInstances.astro b/frontend/src/components/services/arbitration/CourtInstances.astro new file mode 100644 index 0000000..b33ca98 --- /dev/null +++ b/frontend/src/components/services/arbitration/CourtInstances.astro @@ -0,0 +1,107 @@ +--- +const instances = [ + { + level: "Первая инстанция", + court: "Арбитражный суд Ханты-Мансийского автономного округа — Югры", + description: "Рассмотрение дела по существу, сбор и представление доказательств", + icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" + }, + { + level: "Апелляция", + court: "Восьмой арбитражный апелляционный суд", + description: "Проверка законности и обоснованности решения первой инстанции", + icon: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" + }, + { + level: "Кассация", + court: "Арбитражный суд Уральского округа", + description: "Проверка правильности применения норм материального и процессуального права", + icon: "M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3" + }, + { + level: "Высшая инстанция", + court: "Верховный Суд Российской Федерации", + description: "Пересмотр судебных актов в порядке надзора, обеспечение единообразия практики", + icon: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" + } +]; +--- + +
+ +
+
+ + +
+
+ + + + +
+ +
+ + География дел + +

+ АРБИТРАЖНЫЕ
+ СУДЫ +

+

+ Представительство во всех арбитражных инстанциях Российской Федерации +

+
+ + +
+ {instances.map((instance, index) => ( +
+ +
+
+ +
+
+ + + +
+
+
{instance.level}
+
+
+ + +

+ {instance.court} +

+ + +

+ {instance.description} +

+
+
+ + + + + + {index % 2 === 0 ? : } +
+ ))} +
+ + +
+
+ + Работаю по всему Уральскому арбитражному округу +
+
+
+
diff --git a/frontend/src/components/services/arbitration/EmergencyHelp.astro b/frontend/src/components/services/arbitration/EmergencyHelp.astro new file mode 100644 index 0000000..38aa505 --- /dev/null +++ b/frontend/src/components/services/arbitration/EmergencyHelp.astro @@ -0,0 +1,200 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; +import SocialIcons from "@components/base/SocialIcons.astro"; + +const benefits = [ + { value: "15", label: "минут", desc: "Среднее время ответа" }, + { value: "0", label: "₽", desc: "Первичная консультация" }, + { value: "100%", label: "", desc: "Конфиденциальность" }, +]; +--- + +
+ +
+
+ + +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+

+ Срочная консультация +

+

+ Опишите ситуацию — перезвоним за 15 минут +

+ +
+
+ + +
+ + + + +
+ +

+ Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности +

+
+
+ + +
+ Контакты +

+ Нужна срочная помощь арбитражного управляющего? +

+

+ Арбитражные споры требуют немедленных действий. Чем раньше вы обратитесь, тем больше шансов на благоприятный исход для вашего бизнеса. +

+ + +
+ { + benefits.map((item) => ( +
+
+ {item.value} + {item.label} +
+
+ {item.desc} +
+
+ )) + } +
+ + + + + +
+ Или напишите: + +
+
+
+
+
diff --git a/frontend/src/components/services/arbitration/FinalCTA.astro b/frontend/src/components/services/arbitration/FinalCTA.astro new file mode 100644 index 0000000..37304ad --- /dev/null +++ b/frontend/src/components/services/arbitration/FinalCTA.astro @@ -0,0 +1,147 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; +import SocialIcons from "@components/base/SocialIcons.astro"; +--- + +
+ +
+ +
+ + +
+ + +
+
+
+ +
+
+ + +
+ +
+ + + Связаться со мной + +
+ + +

+ ГОТОВЫ
+ НАЧАТЬ? +

+ + +

+ Оставьте заявку на бесплатную консультацию. Проанализирую вашу ситуацию + и расскажу о перспективах дела. +

+ + + + + +
+ Или напишите: + +
+ + +
+
+ + + +
+
+
Конфиденциальность гарантирована
+
Вся информация защищена адвокатской тайной
+
+
+
+ + +
+ +
+ + +
+

Заявка на консультацию

+

Заполните форму — перезвоню в течение 15 минут

+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ + + +

+ Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности +

+
+
+
+
+
+
diff --git a/frontend/src/components/services/arbitration/HowIWork.astro b/frontend/src/components/services/arbitration/HowIWork.astro new file mode 100644 index 0000000..22d789a --- /dev/null +++ b/frontend/src/components/services/arbitration/HowIWork.astro @@ -0,0 +1,109 @@ +--- +const steps = [ + { + number: "01", + title: "Консультация", + description: "Анализирую вашу ситуацию, изучаю документы, оцениваю перспективы дела", + details: "Бесплатно • 30-60 минут" + }, + { + number: "02", + title: "Договор", + description: "Заключаем договор на оказание юридических услуг, согласуем стратегию", + details: "Прозрачные условия • Фиксированная цена" + }, + { + number: "03", + title: "Работа по делу", + description: "Готовлю документы, представляю ваши интересы в арбитражном суде", + details: "Все инстанции • Полное сопровождение" + }, + { + number: "04", + title: "Результат", + description: "Получаем решение суда, контролируем исполнение", + details: "Исполнительный лист • Взыскание средств" + } +]; +--- + +
+ +
+
+ + +
+
+ + + + +
+ +
+ + Процесс работы + +

+ КАК
+ РАБОТАЮ +

+

+ Простой и понятный процесс взаимодействия +

+
+ + +
+ {steps.map((step, index) => ( +
+ + {index < steps.length - 1 && ( + + )} + + +
+ +
+
+ {step.number} +
+
+
+ + +

+ {step.title} +

+ + +

+ {step.description} +

+ + +
+ + {step.details} +
+
+
+ ))} +
+ + + +
+
diff --git a/frontend/src/components/services/arbitration/PracticeAreas.astro b/frontend/src/components/services/arbitration/PracticeAreas.astro new file mode 100644 index 0000000..9119ad5 --- /dev/null +++ b/frontend/src/components/services/arbitration/PracticeAreas.astro @@ -0,0 +1,105 @@ +--- +const practices = [ + { + title: "Договорные споры", + description: "Взыскание задолженностей, расторжение договоров, неустойки и штрафы", + icon: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z", + price: "от 30 000 ₽" + }, + { + title: "Корпоративные споры", + description: "Споры между участниками ООО, взыскание убытков с директоров, оспаривание сделок", + icon: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z", + price: "от 50 000 ₽" + }, + { + title: "Банкротство", + description: "Сопровождение процедур банкротства, оспаривание сделок, защита кредиторов", + icon: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z", + price: "от 100 000 ₽" + }, + { + title: "Налоговые споры", + description: "Обжалование решений налоговых органов, защита при проверках", + icon: "M9 14l6-6m-5.5.5a2.5 2.5 0 110-5 2.5 2.5 0 010 5zm0 0V5a2.5 2.5 0 115 0v6m-5 0h5", + price: "от 40 000 ₽" + }, + { + title: "Недвижимость и земля", + description: "Споры по объектам недвижимости, аренда, узаконивание построек", + icon: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6", + price: "от 35 000 ₽" + }, + { + title: "Госзакупки", + description: "Споры по 44-ФЗ и 223-ФЗ, обжалование в ФАС, взыскание по контрактам", + icon: "M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z", + price: "от 25 000 ₽" + } +]; +--- + +
+ +
+ + +
+
+ +
+ +
+ + Специализация + +

+ НАПРАВЛЕНИЯ
+ ПРАКТИКИ +

+

+ Комплексная защита бизнеса в арбитражных судах всех уровней +

+
+ + +
+ {practices.map((item, index) => ( +
+ + + + + + + +
+ + + +
+ + +

+ {item.title} +

+ + +

+ {item.description} +

+ + +
+
+ {item.price} + + + +
+
+
+ ))} +
+
+
diff --git a/frontend/src/components/services/arbitration/Pricing.astro b/frontend/src/components/services/arbitration/Pricing.astro new file mode 100644 index 0000000..7a7b836 --- /dev/null +++ b/frontend/src/components/services/arbitration/Pricing.astro @@ -0,0 +1,148 @@ +--- +const pricingPlans = [ + { + name: "Консультация", + price: "Бесплатно", + period: "30 минут", + description: "Первичный анализ ситуации", + features: [ + "Анализ документов", + "Оценка перспектив дела", + "Консультация по стратегии", + "Ответы на вопросы" + ], + highlighted: false + }, + { + name: "Представительство", + price: "от 30 000 ₽", + period: "за этап", + description: "Ведение дела в арбитражном суде", + features: [ + "Подготовка искового заявления", + "Участие в судебных заседаниях", + "Представление доказательств", + "Получение решения суда" + ], + highlighted: true + }, + { + name: "Комплексное ведение", + price: "от 100 000 ₽", + period: "за дело", + description: "Полное сопровождение дела", + features: [ + "Все инстанции (первая + апелляция + кассация)", + "Исполнительное производство", + "Приставы и банки", + "Гарантия результата" + ], + highlighted: false + } +]; +--- + +
+ +
+ + +
+
+ +
+ +
+ + Прозрачные условия + +

+ СТОИМОСТЬ
+ УСЛУГ +

+

+ Фиксированные тарифы без скрытых платежей +

+
+ + +
+ {pricingPlans.map((plan, index) => ( +
+ + {plan.highlighted && ( +
+
+ Популярный +
+
+ )} + + +

+ {plan.name} +

+ + +

+ {plan.description} +

+ + +
+
+ {plan.price} +
+
+ {plan.period} +
+
+ + +
+ + +
    + {plan.features.map((feature) => ( +
  • + + + + {feature} +
  • + ))} +
+ + + + Выбрать тариф + +
+ ))} +
+ + +
+

+ * Окончательная стоимость зависит от сложности дела и определяется после консультации +

+
+
+
diff --git a/frontend/src/components/services/arbitration/RoadmapProcess.astro b/frontend/src/components/services/arbitration/RoadmapProcess.astro new file mode 100644 index 0000000..3f3a6be --- /dev/null +++ b/frontend/src/components/services/arbitration/RoadmapProcess.astro @@ -0,0 +1,112 @@ +--- +const steps = [ + { + phase: "Этап 1", + title: "Анализ ситуации", + description: "Изучение документов, правовой анализ, оценка перспектив спора в арбитражном суде", + details: ["Аудит документов", "Анализ судебной практики", "Оценка рисков"], + duration: "1-3 дня" + }, + { + phase: "Этап 2", + title: "Досудебная работа", + description: "Обязательное соблюдение претензионного порядка, переговоры, подготовка позиции", + details: ["Претензионное письмо", "Сбор доказательств", "Расчёт требований"], + duration: "1-4 недели" + }, + { + phase: "Этап 3", + title: "Первая инстанция", + description: "Подача искового заявления, участие в судебных заседаниях, представление доказательств", + details: ["Исковое заявление", "Ходатайства", "Судебные заседания"], + duration: "2-6 месяцев" + }, + { + phase: "Этап 4", + title: "Апелляция и кассация", + description: "Обжалование решения, защита позиции в вышестоящих инстанциях", + details: ["Апелляционная жалоба", "Кассационная жалоба", "Защита в суде"], + duration: "2-4 месяца" + }, + { + phase: "Этап 5", + title: "Исполнение решения", + description: "Получение исполнительного листа, контроль исполнения решения суда", + details: ["Исполнительный лист", "Банк или ФССП", "Контроль взыскания"], + duration: "1-6 месяцев" + } +]; +--- + +
+ + + + +
+
+ +
+ +
+ + Как работаем + +

+ Путь к результату +

+

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

+
+ + +
+ {steps.map((step, index) => ( +
+ + + + +
+
+ +
+ {step.phase} + {step.duration} +
+ +

+ {step.title} +

+

+ {step.description} +

+ + +
+
    + {step.details.map((detail) => ( +
  • + + + + {detail} +
  • + ))} +
+
+
+
+ + + {index % 2 === 0 ? : } +
+ ))} +
+
+
diff --git a/frontend/src/components/services/arbitration/ServiceCategories.astro b/frontend/src/components/services/arbitration/ServiceCategories.astro new file mode 100644 index 0000000..a5097e0 --- /dev/null +++ b/frontend/src/components/services/arbitration/ServiceCategories.astro @@ -0,0 +1,58 @@ +--- +import CardServiceGrid, { type Service } from "@components/base/CardServiceGrid.astro"; + +const services: Service[] = [ + { + title: "Договорные споры", + description: "Взыскание задолженностей, расторжение договоров, неустойки и штрафы", + icon: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z", + price: "от 30 000 ₽", + duration: "180 дел" + }, + { + title: "Корпоративные споры", + description: "Споры между участниками ООО, взыскание убытков с директоров, оспаривание сделок", + icon: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z", + price: "от 50 000 ₽", + duration: "95 дел" + }, + { + title: "Банкротство", + description: "Сопровождение процедур банкротства, оспаривание сделок, защита кредиторов", + icon: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z", + price: "от 100 000 ₽", + duration: "67 дел" + }, + { + title: "Налоговые споры", + description: "Обжалование решений налоговых органов, защита при проверках", + icon: "M9 14l6-6m-5.5.5a2.5 2.5 0 110-5 2.5 2.5 0 010 5zm0 0V5a2.5 2.5 0 115 0v6m-5 0h5", + price: "от 40 000 ₽", + duration: "52 дела" + }, + { + title: "Недвижимость и земля", + description: "Споры по объектам недвижимости, аренда, узаконивание построек", + icon: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6", + price: "от 35 000 ₽", + duration: "78 дел" + }, + { + title: "Госзакупки", + description: "Споры по 44-ФЗ и 223-ФЗ, обжалование в ФАС, взыскание по контрактам", + icon: "M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z", + price: "от 25 000 ₽", + duration: "43 дела" + } +]; +--- + +арбитражной практики'} + subtitle="Спектр услуг" + description="Комплексная защита бизнеса в арбитражных судах всех уровней — от Первого арбитражного суда до Верховного суда РФ" + bgColor="navy" + accentColor="gold" +/> diff --git a/frontend/src/components/services/arbitration/ServicesHero.astro b/frontend/src/components/services/arbitration/ServicesHero.astro new file mode 100644 index 0000000..8ca6262 --- /dev/null +++ b/frontend/src/components/services/arbitration/ServicesHero.astro @@ -0,0 +1,346 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Арбитражные споры", + subtitle = "Защита интересов бизнеса в арбитражных судах всех инстанций. Корпоративные споры, банкротство, договорные конфликты.", +} = Astro.props; + +const features = [ + "Представительство в арбитражных судах", + "Корпоративные споры любой сложности", + "Сопровождение банкротства", +]; +--- + +
+ +
+
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+ +
+
+ +
+
+ + Арбитражная практика +
+
+ + +

+ { + title + .split(" ") + .map((word, i) => + i === 0 ? ( + {word} + ) : ( + {word} + ), + ) + } +

+ + +
+ +

+ {subtitle} +

+
+ + +
+ { + features.map((feature) => ( +
+ + + + {feature} +
+ )) + } +
+ + +
+ + + +
+ + +
+
+
+
+ 500+ +
+
+ Арбитражных дел +
+
+
+
+ 92% +
+
+ Успешных решений +
+
+
+
+ 15+ лет +
+
+ В арбитраже +
+
+
+
+
+
+ + + +
+ + diff --git a/frontend/src/components/services/civil/EmergencyHelp.astro b/frontend/src/components/services/civil/EmergencyHelp.astro new file mode 100644 index 0000000..98f6a6d --- /dev/null +++ b/frontend/src/components/services/civil/EmergencyHelp.astro @@ -0,0 +1,193 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; +import SocialIcons from "@components/base/SocialIcons.astro"; + +const benefits = [ + { value: "30", label: "минут", desc: "Среднее время ответа" }, + { value: "0", label: "₽", desc: "Первичная консультация" }, + { value: "100%", label: "", desc: "Конфиденциальность" }, +]; +--- + +
+ +
+
+ + +
+
+
+
+ +
+
+ +
+
+
+
+

+ Срочная консультация +

+

+ Опишите ситуацию — перезвоним за 15 минут +

+ +
+
+ + +
+ + + + +
+ +

+ Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности +

+
+
+ + +
+ Контакты +

+ Нужна срочная помощь юриста? +

+

+ Гражданские дела часто требуют немедленных действий. Чем раньше вы + обратитесь, тем больше шансов на благоприятный исход. +

+ + +
+ { + benefits.map((item) => ( +
+
+ {item.value} + {item.label} +
+
+ {item.desc} +
+
+ )) + } +
+ + + +
+ + + +
+
+
+ Позвонить сейчас +
+
+ {CONTACT_CONSTANTS.phone} +
+
+
+ + +
+ Или напишите: + +
+
+
+
+
diff --git a/frontend/src/components/services/civil/RoadmapProcess.astro b/frontend/src/components/services/civil/RoadmapProcess.astro new file mode 100644 index 0000000..9523596 --- /dev/null +++ b/frontend/src/components/services/civil/RoadmapProcess.astro @@ -0,0 +1,101 @@ +--- +const steps = [ + { + phase: "Этап 1", + title: "Анализ и стратегия", + description: "Изучение документов, правовой анализ, оценка рисков и перспектив, разработка стратегии", + details: ["Бесплатная консультация", "Аудит документов", "Прогноз исхода"], + duration: "1-3 дня" + }, + { + phase: "Этап 2", + title: "Досудебное урегулирование", + description: "Переговоры, претензионная работа, медиация, подготовка к суду", + details: ["Переговоры с оппонентом", "Направление претензий", "Сбор доказательств"], + duration: "1-4 недели" + }, + { + phase: "Этап 3", + title: "Судебное представительство", + description: "Защита интересов в суде всех инстанций, подготовка процессуальных документов", + details: ["Исковое заявление", "Участие в заседаниях", "Апелляции и кассации"], + duration: "2-12 месяцев" + }, + { + phase: "Этап 4", + title: "Исполнение решения", + description: "Сопровождение исполнительного производства, реальное взыскание", + details: ["Исполнительный лист", "Работа с приставами", "Взыскание средств"], + duration: "1-6 месяцев" + } +]; +--- + +
+ + + +
+ +
+ + Как работаем + +

+ Путь к результату +

+

+ Четкий алгоритм действий от первой встречи до победы в суде +

+
+ + +
+ {steps.map((step, index) => ( +
+ + + + +
+
+ +
+ {step.phase} + {step.duration} +
+ +

+ {step.title} +

+

+ {step.description} +

+ + +
+
    + {step.details.map((detail) => ( +
  • + + + + {detail} +
  • + ))} +
+
+
+
+ + + {index % 2 === 0 ? : } +
+ ))} +
+
+
\ No newline at end of file diff --git a/frontend/src/components/services/civil/ServiceCategories.astro b/frontend/src/components/services/civil/ServiceCategories.astro new file mode 100644 index 0000000..f1654cc --- /dev/null +++ b/frontend/src/components/services/civil/ServiceCategories.astro @@ -0,0 +1,58 @@ +--- +import CardServiceGrid, { type Service } from "@components/base/CardServiceGrid.astro"; + +const services: Service[] = [ + { + title: "Семейные споры", + description: "Развод, алименты, раздел имущества, споры о детях", + icon: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z", + price: "от 15 000 ₽", + duration: "340 дел" + }, + { + title: "Недвижимость", + description: "Сделки, споры, приватизация, жилищные вопросы", + icon: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6", + price: "от 25 000 ₽", + duration: "280 дел" + }, + { + title: "Наследство", + description: "Оформление, оспаривание, раздел наследства", + icon: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z", + price: "от 20 000 ₽", + duration: "156 дел" + }, + { + title: "Долги и кредиты", + description: "Взыскание долгов, защита от коллекторов, банкротство", + icon: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z", + price: "от 10 000 ₽", + duration: "412 дел" + }, + { + title: "Трудовые споры", + description: "Увольнение, задолженность, восстановление на работе", + icon: "M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z", + price: "от 12 000 ₽", + duration: "198 дел" + }, + { + title: "Защита прав", + description: "Моральный вред, персональные данные, деловая репутация", + icon: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z", + price: "от 18 000 ₽", + duration: "127 дел" + } +]; +--- + +гражданской практики'} + subtitle="Спектр услуг" + description="Специализация на сложных категориях дел с высокими финансовыми и моральными ставками" + bgColor="navy" + accentColor="gold" +/> \ No newline at end of file diff --git a/frontend/src/components/services/civil/ServicesHero.astro b/frontend/src/components/services/civil/ServicesHero.astro new file mode 100644 index 0000000..0797abe --- /dev/null +++ b/frontend/src/components/services/civil/ServicesHero.astro @@ -0,0 +1,339 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Гражданские правовые споры", + subtitle = "Решение сложных имущественных и семейных конфликтов. Полное сопровождение от консультации до исполнения решения суда.", +} = Astro.props; + +const features = [ + "Бесплатный первичный анализ", + "Работаем по всему ХМАО-Югра", + "Оплата по результату", +]; +--- + +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+
+ +
+
+ +
+
+ +
+
+ + Гражданское право +
+
+ + +

+ { + title + .split(" ") + .map((word, i) => + i === 0 ? ( + {word} + ) : ( + {word} + ), + ) + } +

+ + +
+ +

+ {subtitle} +

+
+ + +
+ { + features.map((feature) => ( +
+ + + + {feature} +
+ )) + } +
+ + +
+ + + +
+ + +
+
+
+
+ 1000+ +
+
+ Выигранных дел +
+
+
+
+ 95% +
+
+ Успешных исходов +
+
+
+
+ 12 лет +
+
+ Юридической практики +
+
+
+
+
+
+ + + +
+ + diff --git a/frontend/src/components/services/common/AuthorizedConsultationCTA.astro b/frontend/src/components/services/common/AuthorizedConsultationCTA.astro new file mode 100644 index 0000000..c0615f1 --- /dev/null +++ b/frontend/src/components/services/common/AuthorizedConsultationCTA.astro @@ -0,0 +1,482 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; +import SocialIcons from "@components/base/SocialIcons.astro"; +--- + +
+ +
+ +
+ + +
+ + +
+
+
+ +
+
+ + +
+ +
+ + + Связаться со мной + +
+ + +

+ ГОТОВЫ
+ НАЧАТЬ? +

+ + +

+ Оставьте заявку на бесплатную консультацию. Проанализирую вашу ситуацию + и расскажу о перспективах дела. +

+ + + + + +
+ Или напишите: + +
+ + +
+
+ + + +
+
+
Конфиденциальность гарантирована
+
Вся информация защищена адвокатской тайной
+
+
+
+ + +
+ +
+ + +
+ +
+ + + +
+ + +

+ Требуется авторизация +

+ + +

+ Для отправки заявки на консультацию необходимо войти в систему + или зарегистрироваться. +

+ + + +
+ + + +
+
+
+
+ + diff --git a/frontend/src/components/services/common/CurrentFocus.astro b/frontend/src/components/services/common/CurrentFocus.astro new file mode 100644 index 0000000..fe2dc20 --- /dev/null +++ b/frontend/src/components/services/common/CurrentFocus.astro @@ -0,0 +1,77 @@ +--- +const features = [ + { + title: "Гражданское право", + stat: "85%", + desc: "дел — договорные споры и защита прав", + icon: "M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3" + }, + { + title: "Семейное право", + stat: "60%", + desc: "дел — раздел имущества и алименты", + icon: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" + } +]; +--- + +
+
+ +
+
+ + Специализация 2024 + +

+ Актуальный фокус: Гражданское и Семейное право +

+

+ В настоящее время основная практика сосредоточена на защите интересов в сфере гражданско-правовых отношений и семейных спорах. Это позволяет обеспечивать максимально качественный результат по этим направлениям. +

+
+ +
+ {features.map((feature) => ( +
+
+
+
+
+ + + +
+
+ {feature.stat} + дел в работе +
+
+ +

+ {feature.title} +

+

+ {feature.desc} +

+ +
+
+
+ +
+ Высокая квалификация по данной отрасли +
+
+
+ +
+ Современная судебная практика +
+
+
+
+ ))} +
+
+
diff --git a/frontend/src/components/services/common/PracticeAreas.astro b/frontend/src/components/services/common/PracticeAreas.astro new file mode 100644 index 0000000..75794df --- /dev/null +++ b/frontend/src/components/services/common/PracticeAreas.astro @@ -0,0 +1,116 @@ +--- +const allServices = [ + { + title: "Уголовное право", + desc: "Защита по экономическим статьям, наркотикам, насилию", + icon: "shield", + available: true + }, + { + title: "Арбитраж", + desc: "Корпоративные споры, банкротство, долги", + icon: "briefcase", + available: true + }, + { + title: "Административное", + desc: "ДТП, штрафы, лишение прав", + icon: "document", + available: true, + link: "/services/dtp" + }, + { + title: "Жилищное право", + desc: "Приватизация, выселение, незаконные перепланировки", + icon: "home", + available: false, + note: "По записи" + }, + { + title: "Земельное право", + desc: "Оформление участков, споры о границах", + icon: "map", + available: false, + note: "Консультации" + }, + { + title: "Трудовое право", + desc: "Увольнения, взыскание зарплаты, дискриминация", + icon: "users", + available: false, + note: "Сезонно" + } +]; + +const iconPaths = { + shield: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z", + briefcase: "M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z", + document: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z", + home: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6", + map: "M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0121 18.382V7.618a1 1 0 01-.553-.894L15 7m0 13V7", + users: "M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z" +}; +--- + +
+
+
+
+

Полный перечень услуг

+

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

+
+ + +
+
+
+ Основное направление +
+
+
+ Принимаю в работу +
+
+
+ Консультации/Ограниченно +
+
+
+ + +
+
diff --git a/frontend/src/components/services/common/ServicesHeroGeneral.astro b/frontend/src/components/services/common/ServicesHeroGeneral.astro new file mode 100644 index 0000000..507fcbd --- /dev/null +++ b/frontend/src/components/services/common/ServicesHeroGeneral.astro @@ -0,0 +1,87 @@ +--- +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Комплексные юридические услуги", + subtitle = "Полный спектр правовой защиты в Сургуте и ХМАО-Югре. От консультации до представления в Верховном Суде РФ." +} = Astro.props; + +const priorities = [ + { name: "Гражданское право", icon: "⚖️", desc: "Договоры, имущество, наследство" }, + { name: "Семейное право", icon: "👨‍👩‍👧‍👦", desc: "Разводы, алименты, раздел имущества" } +]; +--- + +
+ +
+
+ +
+
+ +
+
+ + Полный спектр услуг +
+ +

+ {title.split(' ').slice(0, -2).join(' ')}
+ + {title.split(' ').slice(-2).join(' ')} + +

+ +

+ {subtitle} +

+ + +
+ + +
+
+ +
+
+ Приоритетные направления в 2024 +
+ + {priorities.map((item, idx) => ( +
+
+
+ {item.icon} +
+
+
+

{item.name}

+ TOP +
+

{item.desc}

+
+
+
+ ))} + +
+
+ Сейчас принимаем новые дела по этим направлениям +
+
+
+
+
+
diff --git a/frontend/src/components/services/criminal/CrimeTypes.astro b/frontend/src/components/services/criminal/CrimeTypes.astro new file mode 100644 index 0000000..d3afbd1 --- /dev/null +++ b/frontend/src/components/services/criminal/CrimeTypes.astro @@ -0,0 +1,115 @@ +--- +const crimes = [ + { + category: "Экономические", + items: [ + { name: "Мошенничество (ст. 159)", icon: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }, + { name: "Присвоение (ст. 160)", icon: "M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4" }, + { name: "Незаконное предпринимательство (ст. 171)", icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" } + ] + }, + { + category: "Должностные", + items: [ + { name: "Взятка (ст. 290, 291)", icon: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" }, + { name: "Злоупотребление полномочиями (ст. 201)", icon: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" }, + { name: "Халатность (ст. 293)", icon: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" } + ] + }, + { + category: "Против личности", + items: [ + { name: "Причинение вреда здоровью (ст. 111-118)", icon: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" }, + { name: "Угроза убийством (ст. 119)", icon: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }, + { name: "Клевета (ст. 128.1)", icon: "M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z" } + ] + }, + { + category: "Наркотики", + items: [ + { name: "Сбыт (ст. 228.1)", icon: "M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z" }, + { name: "Хранение (ст. 228)", icon: "M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" } + ] + }, + { + category: "Транспортные", + items: [ + { name: "ДТП с пострадавшими (ст. 264)", icon: "M13 10V3L4 14h7v7l9-11h-7z" }, + { name: "Оставление места ДТП (ст. 265)", icon: "M12 19l9 2-9-18-9 18 9-2zm0 0v-8" } + ] + }, + { + category: "Против собственности", + items: [ + { name: "Кража (ст. 158)", icon: "M8 11V7a4 4 0 118 0m-4 8v-1" }, + { name: "Грабёж (ст. 161)", icon: "M13 10V3L4 14h7v7l9-11h-7z" }, + { name: "Разбой (ст. 162)", icon: "M6 18L18 6M6 6l12 12" } + ] + } +]; +--- + +
+ +
+ + +
+
+ +
+ +
+ + Категории дел + +

+ ВИДЫ
+ ПРЕСТУПЛЕНИЙ +

+

+ Защита по всем статьям Уголовного кодекса РФ +

+
+ + +
+ {crimes.map((category) => ( +
+ +
+ + +
+

+ {category.category} +

+
+ + +
+ {category.items.map((item) => ( +
+
+ + + +
+ + {item.name} + +
+ ))} +
+
+ ))} +
+ + +
+

+ * Это не полный перечень. Работаю со всеми категориями уголовных дел +

+
+
+
diff --git a/frontend/src/components/services/criminal/CriminalHero.astro b/frontend/src/components/services/criminal/CriminalHero.astro new file mode 100644 index 0000000..52c25af --- /dev/null +++ b/frontend/src/components/services/criminal/CriminalHero.astro @@ -0,0 +1,170 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Уголовные дела", + subtitle = "Защита по уголовным делам на любой стадии процесса. От задержания до Верховного суда. Выезд в СИЗО 24/7.", +} = Astro.props; + +const stats = [ + { value: "300+", label: "Уголовных дел" }, + { value: "85%", label: "Оправдательных приговоров" }, + { value: "12+", label: "Лет практики" }, + { value: "24/7", label: "Выезд в СИЗО" }, +]; +--- + +
+ +
+
+ + +
+
+
+ + +
+
+
+
+
+ +
+
+ + +
+ +
+
+ + +
+ + Уголовная защита + +
+ + +

+ { + title + .split(" ") + .map((word, i) => + i === 0 ? ( + {word} + ) : ( + {word} + ), + ) + } +

+ + +

+ {subtitle} +

+ + +
+ + + + + Срочный вызов адвоката + + +
+ + +
+ {stats.map((stat) => ( +
+
{stat.value}
+
{stat.label}
+
+ ))} +
+
+ + + +
+
+
diff --git a/frontend/src/components/services/criminal/DefenseServices.astro b/frontend/src/components/services/criminal/DefenseServices.astro new file mode 100644 index 0000000..afb557b --- /dev/null +++ b/frontend/src/components/services/criminal/DefenseServices.astro @@ -0,0 +1,114 @@ +--- +const services = [ + { + title: "Защита подозреваемого", + description: "На стадии задержания и предъявления обвинения", + features: [ + "Выезд в СИЗО/ИВС 24/7", + "Присутствие при допросе", + "Подача ходатайств", + "Избрание меры пресечения" + ], + icon: "M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636" + }, + { + title: "Защита обвиняемого", + description: "На предварительном следствии и в суде", + features: [ + "Изучение материалов дела", + "Участие в следственных действиях", + "Представление доказательств", + "Допрос свидетелей" + ], + icon: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" + }, + { + title: "Потерпевший", + description: "Представительство интересов потерпевшего", + features: [ + "Подача заявления", + "Контроль расследования", + "Поддержание обвинения в суде", + "Взыскание ущерба" + ], + icon: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" + }, + { + title: "Апелляция и кассация", + description: "Обжалование приговоров и постановлений", + features: [ + "Анализ приговора", + "Составление жалобы", + "Участие в заседании", + "Новые доказательства" + ], + icon: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" + } +]; +--- + +
+ +
+ + +
+
+ +
+ +
+ + Защита + +

+ ЧТО ВХОДИТ
+ В ЗАЩИТУ +

+

+ Полный комплекс услуг по защите прав и интересов +

+
+ + +
+ {services.map((service, index) => ( +
+ +
+
+
+ + +
+ + + +
+ + +

+ {service.title} +

+ + +

+ {service.description} +

+ + +
    + {service.features.map((feature) => ( +
  • + + + + {feature} +
  • + ))} +
+
+ ))} +
+
+
diff --git a/frontend/src/components/services/criminal/ProcessStages.astro b/frontend/src/components/services/criminal/ProcessStages.astro new file mode 100644 index 0000000..85bfdb7 --- /dev/null +++ b/frontend/src/components/services/criminal/ProcessStages.astro @@ -0,0 +1,153 @@ +--- +const stages = [ + { + number: "01", + title: "Доследственная проверка", + description: "Проверка сообщения о преступлении, сбор материалов, опрос свидетелей", + duration: "3-30 дней", + risks: "Возбуждение уголовного дела", + actions: ["Дача объяснений", "Представление документов", "Ходатайства"] + }, + { + number: "02", + title: "Предварительное следствие", + description: "Сбор доказательств, допросы, экспертизы, следственные действия", + duration: "2-12 месяцев", + risks: "Избрание меры пресечения, обвинение", + actions: ["Участие в допросах", "Заявления ходатайств", "Ознакомление с материалами"] + }, + { + number: "03", + title: "Суд первой инстанции", + description: "Рассмотрение дела по существу, исследование доказательств, прения", + duration: "2-6 месяцев", + risks: "Обвинительный приговор", + actions: ["Позиция защиты", "Допрос свидетелей", "Представление доказательств"] + }, + { + number: "04", + title: "Апелляция", + description: "Проверка законности приговора, не вступившего в законную силу", + duration: "1-3 месяца", + risks: "Оставление приговора без изменений", + actions: ["Апелляционная жалоба", "Участие в заседании", "Новые доказательства"] + }, + { + number: "05", + title: "Кассация и надзор", + description: "Проверка вступивших в силу судебных актов вышестоящими судами", + duration: "1-6 месяцев", + risks: "Отказ в передаче жалобы", + actions: ["Кассационная жалоба", "Надзорная жалоба", "Европейский суд"] + } +]; +--- + +
+ +
+
+ + +
+
+ + + + +
+ +
+ + Уголовный процесс + +

+ СТАДИИ
+ ДЕЛА +

+

+ Защита на каждом этапе уголовного судопроизводства +

+
+ + +
+ {stages.map((stage, index) => ( +
+ + + + +
+
+ +
+
+ {stage.number} +
+ {stage.duration} +
+ + +

+ {stage.title} +

+ + +

+ {stage.description} +

+ + +
+ + + + {stage.duration} +
+ + +
+
+ + + + Риски +
+

{stage.risks}

+
+ + +
+ {stage.actions.map((action) => ( + + {action} + + ))} +
+
+
+ + + {index % 2 === 0 ? : } +
+ ))} +
+ + +
+
+ + + + + Защита возможна на любой стадии — чем раньше, тем лучше + +
+
+
+
diff --git a/frontend/src/components/services/criminal/RightsInfo.astro b/frontend/src/components/services/criminal/RightsInfo.astro new file mode 100644 index 0000000..e7afd89 --- /dev/null +++ b/frontend/src/components/services/criminal/RightsInfo.astro @@ -0,0 +1,133 @@ +--- +const rights = [ + { + title: "Не свидетельствовать против себя", + description: "Ст. 51 Конституции РФ — никто не обязан свидетельствовать против себя самого", + icon: "M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636" + }, + { + title: "Пользоваться помощью адвоката", + description: "Ст. 48 Конституции РФ — право на квалифицированную юридическую помощь", + icon: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" + }, + { + title: "На один звонок", + description: "Право сообщить родственникам о задержании в течение 3 часов", + icon: "M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" + }, + { + title: "Не признавать вину", + description: "Презумпция невиновности — бремя доказывания на обвинении", + icon: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" + } +]; + +const importantInfo = [ + "Задержание без оснований незаконно", + "Допрос без адвоката — незаконен", + "Признание под давлением не имеет силы", + "Срок задержания — максимум 48 часов до суда" +]; +--- + +
+ +
+
+ + +
+
+ + +
+
+
+
+ +
+ +
+ + Важно знать + +

+ ПРАВА ПРИ
+ ЗАДЕРЖАНИИ +

+

+ Запомните эти права — они могут спасти вашу свободу +

+
+ + +
+ {rights.map((right, index) => ( +
+ +
+ {String(index + 1).padStart(2, '0')} +
+ + +
+ + + +
+ + +

+ {right.title} +

+ + +

+ {right.description} +

+
+ ))} +
+ + +
+
+
+ +
+ + + + Запомните +
+ + +
+ {importantInfo.map((info) => ( +
+ + + + {info} +
+ ))} +
+ + +
+
+

+ При задержании сразу требуйте адвоката и не давайте показаний +

+ + + + + Вызвать адвоката + +
+
+
+
+
+
diff --git a/frontend/src/components/services/criminal/UrgentCTA.astro b/frontend/src/components/services/criminal/UrgentCTA.astro new file mode 100644 index 0000000..faafd0d --- /dev/null +++ b/frontend/src/components/services/criminal/UrgentCTA.astro @@ -0,0 +1,175 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; +import SocialIcons from "@components/base/SocialIcons.astro"; +--- + +
+ +
+ +
+ + +
+ + +
+
+
+ +
+
+ + +
+ +
+ + + Круглосуточно + +
+ + +

+ НУЖНА
+ СРОЧНАЯ
+ ПОМОЩЬ? +

+ + +

+ В уголовном процессе время работает против вас. + Каждый час может повлиять на исход дела. +

+ + + +
+ + + +
+
+
Телефон доверия 24/7
+
{CONTACT_CONSTANTS.phone}
+
+
+ + +
+
+ + + + Выезд в СИЗО, ИВС, суд — круглосуточно +
+
+ + + + Конфиденциальность гарантирована +
+
+ + + + Оплата поэтапно — без риска +
+
+ + +
+ Или напишите: + +
+
+ + +
+ +
+ + +
+ +
+
+ + + +
+
+

Экстренная консультация

+

Перезвоню в течение 5 минут

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ + + +

+ Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности +

+
+ + +
+ + + + Адвокатская тайна гарантирована +
+
+
+
+
+
diff --git a/frontend/src/components/services/dtp/EmergencyHelp.astro b/frontend/src/components/services/dtp/EmergencyHelp.astro new file mode 100644 index 0000000..ece5857 --- /dev/null +++ b/frontend/src/components/services/dtp/EmergencyHelp.astro @@ -0,0 +1,34 @@ +--- +import { PHONE_NUMBER, PHONE_HREF } from '@constants/constants.ts'; +--- + +
+
+
+ +
+
+ +
+
+
+ + Случилось ДТП прямо сейчас? +
+

Не действуйте без адвоката!

+

Одна ошибка в протоколе может стоить вам прав или крупной суммы.

+
+ +
+ + + + + {PHONE_NUMBER} + + Выезд в течение 15 минут по Сургуту +
+
+
+
+
diff --git a/frontend/src/components/services/dtp/FineChecker.astro b/frontend/src/components/services/dtp/FineChecker.astro new file mode 100644 index 0000000..8a0e0ad --- /dev/null +++ b/frontend/src/components/services/dtp/FineChecker.astro @@ -0,0 +1,102 @@ +--- +interface Props { + title?: string; +} + +const { title = "Проверьте свои штрафы" } = Astro.props; +--- + +
+ +
+ +
+
+ +
+ + Онлайн проверка + +

{title}

+

+ Узнайте о своих штрафах ГИБДД за 30 секунд. Мы подгрузим данные из официальных баз и рассчитаем риски. +

+ +
+
+ + +
+ +
+ +
+ +
+ 🚗 +
+
+
+ + + +

+ Данные обрабатываются конфиденциально. Проверка бесплатна. +

+
+
+ + +
+ +
+ +
+

+ + + + Что мы проверим: +

+ +
    + {[ + "Штрафы ГИБДД (камеры и инспекторы)", + "Судебные задолженности", + "Лишение прав (действующие решения)", + "Запрет на регистрационные действия", + "Судимости по ДТП" + ].map((item, i) => ( +
  • +
    + {i + 1} +
    + {item} +
  • + ))} +
+ +
+
+ Время проверки: + ~30 секунд +
+
+
+
+
+
+
\ No newline at end of file diff --git a/frontend/src/components/services/dtp/RoadmapProcess.astro b/frontend/src/components/services/dtp/RoadmapProcess.astro new file mode 100644 index 0000000..417daf1 --- /dev/null +++ b/frontend/src/components/services/dtp/RoadmapProcess.astro @@ -0,0 +1,93 @@ +--- +const steps = [ + { + number: "01", + title: "Вызов на место ДТП", + description: "Приезжаем в течение 20 минут. Фиксируем следы торможения, повреждения, позиции авто.", + icon: "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" + }, + { + number: "02", + title: "Сбор доказательств", + description: "Фото, видео с регистраторов, показания свидетелей. Проверяем оформление сотрудниками ГИБДД.", + icon: "M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" + }, + { + number: "03", + title: "Экспертиза", + description: "Назначаем независимую техническую экспертизу для установления причин и механизма ДТП.", + icon: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01" + }, + { + number: "04", + title: "Защита в суде", + description: "Представление ваших интересов в суде. Доказывание невиновности или смягчение ответственности.", + icon: "M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3" + } +]; +--- + +
+ +
+
+ +
+ +
+ {[...Array(8)].map(() => ( +
+ ))} +
+
+
+ +
+
+

+ Как мы работаем при ДТП +

+

+ Четкий алгоритм действий с первой минуты после аварии до вынесения решения суда +

+
+ +
+ + + +
+ {steps.map((step, index) => ( +
+ +
+ +
+ {step.number} +
+ + +
+ + + +
+ +

{step.title}

+

{step.description}

+
+ + + {index < steps.length - 1 && ( + + )} +
+ ))} +
+
+
+
diff --git a/frontend/src/components/services/dtp/ServiceCategories.astro b/frontend/src/components/services/dtp/ServiceCategories.astro new file mode 100644 index 0000000..9ec204b --- /dev/null +++ b/frontend/src/components/services/dtp/ServiceCategories.astro @@ -0,0 +1,109 @@ +--- +interface Service { + title: string; + description: string; + icon: string; + price: string; + popular?: boolean; +} + +const services: Service[] = [ + { + title: "Сопровождение ДТП", + description: "Выезд на место аварии, фиксация повреждений, общение с ГИБДД и страховыми. Защита от необоснованных претензий.", + icon: "M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636", // Крест (авария) + price: "от 5 000 ₽", + popular: true + }, + { + title: "Лишение прав", + description: "Защита при лишении водительских удостоверений (пьяное вождение, превышение скорости, выезд на встречку).", + icon: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z", // Треугольник + price: "от 15 000 ₽" + }, + { + title: "Штрафы ГИБДД", + description: "Обжалование штрафов с камер и инспекторов. Снижение суммы, отмена за нарушением процедуры.", + icon: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2", // Документ + price: "от 3 000 ₽" + }, + { + title: "Страховые споры", + description: "Взыскание с ОСАГО/КАСКО, независимая экспертиза, споры о КБМ. Работа с недобросовестными страховыми.", + icon: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z", // Щит + price: "от 10 000 ₽" + }, + { + title: "Повторное лишение", + description: "Сложные случаи повторного нарушения. Исключение обстоятельств, смягчающих наказание.", + icon: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z", // Часы (время) + price: "от 20 000 ₽" + }, + { + title: "Ущерб при ДТП", + description: "Взыскание ущерба с виновника, возмещение утраты товарной стоимости, аренда подменного авто.", + icon: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z", // Деньги + price: "% от суммы" + } +]; +--- + +
+ +
+
+
+
+
+ +
+
+ + Виды услуг + +

+ Комплексная защита водителей +

+

+ От консультации до представления интересов в суде. Работаем со всеми категориями дел. +

+
+ +
+ {services.map((service, index) => ( +
+ {service.popular && ( +
+ Самое востребованное +
+ )} + + +
+ + + +
+ +

+ {service.title} +

+ +

+ {service.description} +

+ +
+ {service.price} + +
+
+ ))} +
+
+
diff --git a/frontend/src/components/services/dtp/ServicesHero.astro b/frontend/src/components/services/dtp/ServicesHero.astro new file mode 100644 index 0000000..b900fdd --- /dev/null +++ b/frontend/src/components/services/dtp/ServicesHero.astro @@ -0,0 +1,157 @@ +--- +import { PHONE_NUMBER } from '@constants/constants.ts'; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Защита при ДТП и нарушениях ПДД", + subtitle = "Срочная юридическая помощь при авариях, лишении прав и штрафах. Выезд на место ДТП в течение 20 минут по Сургуту." +} = Astro.props; +--- + +
+ +
+ + ДТП + +
+
+ + +
+
+ {[...Array(5)].map(() => ( +
+ ))} +
+
+
+ +
+
+ +
+ +
+ + Круглосуточный выезд на ДТП +
+ +

+ {title.split(' ').map((word, i) => + i === 1 ? {word} : word + ' ' + )} +

+ +

+ {subtitle} +

+ +
+ + + + + + Срочный вызов + + + Рассчитать стоимость + + + + +
+ + + +
+ + + +
+
+
+ + diff --git a/frontend/src/components/services/family/EmergencyHelp.astro b/frontend/src/components/services/family/EmergencyHelp.astro new file mode 100644 index 0000000..c4620a7 --- /dev/null +++ b/frontend/src/components/services/family/EmergencyHelp.astro @@ -0,0 +1,287 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; +import SocialIcons from "@components/base/SocialIcons.astro"; + +const situations = [ + "Супруг скрывает имущество", + "Угроза похищения ребенка", + "Насилие в семье", + "Срочная блокировка счетов", +]; +--- + +
+ +
+
+ + +
+
+
+
+
+
+ +
+
+ +
+
+ + + + + Экстренные случаи +
+ +

+ Срочная юридическая
+ помощь 24/7 +

+ +

+ Некоторые семейные ситуации требуют немедленного вмешательства юриста. + Каждая минута промедления может стоить вам имущества или даже опеки + над ребенком. +

+ + +
+ { + situations.map((situation, index) => ( +
+
+ + + +
+ + {situation} + + + + +
+ )) + } +
+ + + +
+ + +
+
+
+ +
+
+
+ + + +
+

+ Обратный звонок +

+

+ Перезвоним за 5 минут +

+
+ +
+ + + + + + + +
+ +
+ + + + Гарантируем конфиденциальность +
+
+
+
+
+
+ + diff --git a/frontend/src/components/services/family/RoadmapProcess.astro b/frontend/src/components/services/family/RoadmapProcess.astro new file mode 100644 index 0000000..55f1014 --- /dev/null +++ b/frontend/src/components/services/family/RoadmapProcess.astro @@ -0,0 +1,148 @@ +--- +const steps = [ + { + number: "01", + title: "Консультация", + description: "Бесплатный анализ ситуации, оценка перспектив, разработка стратегии защиты ваших интересов", + details: ["Изучение документов", "Правовой анализ", "План действий"] + }, + { + number: "02", + title: "Сбор доказательств", + description: "Помощь в получении свидетельств, выписк, справок о доходах и имуществе", + details: ["Запросы в органы", "Финансовый анализ", "Свидетельские показания"] + }, + { + number: "03", + title: "Мировое соглашение", + description: "Переговоры с оппонентом, попытка заключить договор без судебных разбирательств", + details: ["Переговоры", "Досудебная претензия", "Подписание соглашения"] + }, + { + number: "04", + title: "Судебный процесс", + description: "Представление интересов в суде, грамотная защита на всех этапах слушания", + details: ["Исковое заявление", "Участие в заседаниях", "Обжалование"] + }, + { + number: "05", + title: "Исполнение решения", + description: "Сопровождение исполнительного производства, реальное взыскание средств", + details: ["Исполнительный лист", "Работа с приставами", "Контроль исполнения"] + } +]; +--- + +
+ +
+
+ +
+ +
+ + Этапы работы + +

+ Путь к решению +

+

+ Понятный алгоритм действий от первой встречи до восстановления справедливости +

+
+ + +
+ + + +
+ {steps.map((step, index) => ( +
+ + +
+
+ {step.number} + +
+
+ + +
+
+ + +

+ {step.title} +

+ + +

+ {step.description} +

+ + +
    + {step.details.map((detail) => ( +
  • + + + + {detail} +
  • + ))} +
+ + +
+
+ Готовность + {((index + 1) * 20)}% +
+
+
+
+
+
+
+
+ ))} +
+
+ + +
+
+
+ + + +
+

Оперативность

+

Начинаем работу в день обращения, экстренный выезд за 1 час

+
+ +
+
+ + + +
+

Оплата по факту

+

Минимальная предоплата, основная часть после результата

+
+ +
+
+ + + +
+

Гарантия результата

+

Работаем по договору с прописанными сроками и обязательствами

+
+
+
+
\ No newline at end of file diff --git a/frontend/src/components/services/family/ServiceCategories.astro b/frontend/src/components/services/family/ServiceCategories.astro new file mode 100644 index 0000000..8115f2b --- /dev/null +++ b/frontend/src/components/services/family/ServiceCategories.astro @@ -0,0 +1,72 @@ +--- +import CardServiceGrid, { + type Service, +} from "@components/base/CardServiceGrid.astro"; + +const services: Service[] = [ + { + title: "Развод", + description: + "Расторжение брака через ЗАГС или суд, включая спорные случаи с несогласием одного из супругов", + price: "от 15 000 ₽", + duration: "1-3 месяца", + icon: "M12 4a4 4 0 100 8 4 4 0 000-8zM6 12a6 6 0 1112 0v2h-2v-2a4 4 0 10-8 0v2H6v-2zM4 18h16v2H4v-2z", + color: "from-red-500/20 to-orange-500/20", + }, + { + title: "Алименты", + description: + "Взыскание алиментов на детей и супругов, изменение размера, задолженность по выплатам", + price: "от 10 000 ₽", + duration: "от 5 дней", + icon: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1.41 16.09V20h-2.67v-1.93c-1.71-.36-3.16-1.46-3.27-3.4h1.96c.1 1.05.82 1.87 2.65 1.87 1.96 0 2.4-.98 2.4-1.59 0-.83-.44-1.61-2.67-2.14-2.48-.6-4.18-1.62-4.18-3.67 0-1.72 1.39-2.84 3.11-3.21V4h2.67v1.95c1.86.45 2.79 1.86 2.85 3.39H14.3c-.05-1.11-.64-1.87-2.22-1.87-1.5 0-2.4.68-2.4 1.64 0 .84.65 1.39 2.67 1.91s4.18 1.39 4.18 3.91c-.01 1.83-1.38 2.83-3.12 3.16z", + color: "from-green-500/20 to-emerald-500/20", + }, + { + title: "Раздел имущества", + description: + "Деление совместно нажитого имущества, включая недвижимость, бизнес, вклады и долги", + price: "от 25 000 ₽", + duration: "3-12 месяцев", + icon: "M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z", + color: "from-blue-500/20 to-cyan-500/20", + }, + { + title: "Споры о детях", + description: + "Определение места жительства, порядка общения, выезд за границу, лишение родительских прав", + price: "от 20 000 ₽", + duration: "2-6 месяцев", + icon: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z", + color: "from-purple-500/20 to-pink-500/20", + }, + { + title: "Брачный договор", + description: + "Составление, проверка, оспаривание брачного контракта, защита интересов при разводе", + price: "от 15 000 ₽", + duration: "1-2 недели", + icon: "M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8l-6-6zm-1 7V3.5L18.5 9H13zm1 5h-2v2h-2v2h2v2h2v-2h2v-2h-2v-2z", + color: "from-yellow-500/20 to-amber-500/20", + }, + { + title: "Усыновление", + description: + "Сопровождение процедуры усыновления, подготовка документов, представление в органах опеки", + price: "от 30 000 ₽", + duration: "6-12 месяцев", + icon: "M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z", + color: "from-indigo-500/20 to-violet-500/20", + }, +]; +--- + + diff --git a/frontend/src/components/services/family/ServicesHero.astro b/frontend/src/components/services/family/ServicesHero.astro new file mode 100644 index 0000000..6e0dafd --- /dev/null +++ b/frontend/src/components/services/family/ServicesHero.astro @@ -0,0 +1,485 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Семейный юрист в Сургуте", + subtitle = "Деликатное решение семейных конфликтов. Защита ваших прав и интересов в сложных жизненных ситуациях с максимальной конфиденциальностью.", +} = Astro.props; + +const urgentCases = [ + { text: "Срочный развод", time: "от 1 месяца" }, + { text: "Взыскание алиментов", time: "от 5 дней" }, + { text: "Защита от лишения прав", time: "срочно" }, +]; +--- + +
+ +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+ + +
+ + + + + + + + + +
+ +
+
+ +
+ +
+
+ + + + + Конфиденциально +
+
+ + +

+ + Семейный + + + + юрист в Сургуте + + +

+ + +
+ +

+ {subtitle} +

+
+ + +
+ { + urgentCases.map((item, index) => ( +
+ + {item.text} + + + {item.time} + +
+ )) + } +
+ + +
+ + + +
+ + +
+
+
+ 500+ +
+
Семей дел
+
+
+
+ 90% +
+
+ Мировых соглашений +
+
+
+
+ 24/7 +
+
Поддержка
+
+
+
+ + + +
+
+
+ + diff --git a/frontend/src/components/services/protection/EmergencyHelp.astro b/frontend/src/components/services/protection/EmergencyHelp.astro new file mode 100644 index 0000000..85db404 --- /dev/null +++ b/frontend/src/components/services/protection/EmergencyHelp.astro @@ -0,0 +1,343 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; +import SocialIcons from "@components/base/SocialIcons.astro"; + +const panicSituations = [ + { + title: "Приставы у дверей", + action: "Срочный выезд юриста", + time: "30 минут", + }, + { + title: "Арестовали зарплату", + action: "Разблокировка счета", + time: "2 часа", + }, + { title: "Коллекторы угрожают", action: "Подача в полицию", time: "1 час" }, + { title: "Выселение из квартиры", action: "Судебный запрет", time: "срочно" }, +]; +--- + +
+ +
+ + +
+
+
+
+
+
+ +
+
+ +
+
+ + + + Экстренная помощь 24/7 +
+ +

+ Паника? Не надо.
+ Есть решение. +

+ +

+ Критические ситуации требуют мгновенной реакции. У нас есть опыт и + инструменты для остановки любого давления в течение часа. +

+ + +
+ { + panicSituations.map((situation, index) => ( +
+
+ ! +
+
+
+ {situation.title} +
+
+ {situation.action} +
+
+
+ {situation.time} +
+
+ )) + } +
+ + + +
+ + + +
+
+
+ Экстренный вызов +
+
+ {CONTACT_CONSTANTS.phone} +
+
+ + + +
+
+ + +
+
+
+ +
+
+
+ + + +
+

+ Быстрый старт защиты +

+

+ Заполните форму — начнем действовать через 15 минут +

+
+ +
+
+ + +
+ + + + + + +
+ +
+
+
+ 15 мин +
+
На ответ
+
+
+
+ 1 час +
+
На выезд
+
+
+
+
+
+
+
+ + diff --git a/frontend/src/components/services/protection/RoadmapProcess.astro b/frontend/src/components/services/protection/RoadmapProcess.astro new file mode 100644 index 0000000..1b2b386 --- /dev/null +++ b/frontend/src/components/services/protection/RoadmapProcess.astro @@ -0,0 +1,147 @@ +--- +const steps = [ + { + number: "01", + title: "Аварийная остановка", + description: "Блокируем звонки, аресты, угрозы. Перекрываем все каналы давления кредиторов.", + details: ["Запрет звонков", "Приостановка списаний", "Защита имущества"], + icon: "M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636" + }, + { + number: "02", + title: "Разведка боем", + description: "Анализируем все кредитные договоры на предмет нарушений и возможностей для атаки.", + details: ["Аудит документов", "Поиск нарушений", "Оценка рисков"], + icon: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" + }, + { + number: "03", + title: "Контратака", + description: "Оспариваем незаконные условия, требуем списания переплат, готовим встречные иски.", + details: ["Претензии банку", "Жалобы в ЦБ", "Иски о возврате"], + icon: "M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3" + }, + { + number: "04", + title: "Тотальная зачистка", + description: "Процедура банкротства или мировое соглашение с максимальным списанием долга.", + details: ["Банкротство", "Мировое соглашение", "Списание долга"], + icon: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" + } +]; +--- + +
+ +
+ +
+ +
+ + + + + План наступления + +

+ От обороны к победе +

+

+ Четкий алгоритм действий для полной зачистки долгового бремени +

+
+ + + + + +
+ {steps.map((step, index) => ( +
+ +
+
+ {step.number} +
+
+
+ + + + + +
+ + +
+ + + +
+ + +

+ {step.title} +

+ +

+ {step.description} +

+ + +
    + {step.details.map((detail) => ( +
  • + + + + {detail} +
  • + ))} +
+ + +
+
+ Этап + {((index + 1) * 25)}% +
+
+
+
+
+
+
+ ))} +
+ + +
+
+
3-6 месяцев
+
Средний срок дела
+
+
+
85%
+
Списываем долга
+
+
+
0 ₽
+
Первый звонок
+
+
+
100%
+
Конфиденциально
+
+
+
+
\ No newline at end of file diff --git a/frontend/src/components/services/protection/ServiceCategories.astro b/frontend/src/components/services/protection/ServiceCategories.astro new file mode 100644 index 0000000..f013685 --- /dev/null +++ b/frontend/src/components/services/protection/ServiceCategories.astro @@ -0,0 +1,66 @@ +--- +import CardServiceGrid, { type Service } from "@components/base/CardServiceGrid.astro"; + +const services: Service[] = [ + { + title: "Прекращение коллекторского давления", + description: "Юридическая блокировка незаконных действий коллекторов. Подача жалоб в правоохранительные органы и Центробанк.", + price: "от 5 000 ₽", + result: "Прекращение контактов за 1-3 дня", + icon: "M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636", + urgent: true + }, + { + title: "Списание кредитной задолженности", + description: "Полное или частичное освобождение от обязательств по кредиту через признание договора недействительным или процедуру банкротства.", + price: "от 30 000 ₽", + result: "Юридическое освобождение от долга", + icon: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z", + urgent: false + }, + { + title: "Судебное представительство", + description: "Защита интересов должника в арбитражных и судах общей юрисдикции на всех стадиях процесса.", + price: "от 15 000 ₽", + result: "Удовлетворение исков в 90% случаев", + icon: "M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3", + urgent: false + }, + { + title: "Снятие ареста со счетов", + description: "Отмена судебных приказов и постановлений о взыскании. Возобновление доступа к денежным средствам.", + price: "от 10 000 ₽", + result: "Разблокировка средств", + icon: "M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z", + urgent: true + }, + { + title: "Банкротство физических лиц", + description: "Проведение процедуры банкротства с максимальным сохранением имущества и минимальными временными затратами.", + price: "от 50 000 ₽", + result: "Полное освобождение от долгов", + icon: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z", + urgent: false + }, + { + title: "Оспаривание страховых продуктов", + description: "Возврат средств, уплаченных по навязанным договорам страхования, переплат по процентам и комиссиям.", + price: "от 8 000 ₽", + result: "Возмещение до 500 000 ₽", + icon: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z", + urgent: false + } +]; +--- + +защиты от кредиторов'} + subtitle="Правовая защита должников" + description="Применяем весь арсенал правовых инструментов для защиты ваших интересов" + bgColor="navy-dark" + accentColor="gold" + showResults={true} + showUrgentBadge={true} +/> \ No newline at end of file diff --git a/frontend/src/components/services/protection/ServicesHero.astro b/frontend/src/components/services/protection/ServicesHero.astro new file mode 100644 index 0000000..a4c184a --- /dev/null +++ b/frontend/src/components/services/protection/ServicesHero.astro @@ -0,0 +1,584 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Остановим банки и коллекторов", + subtitle = "Жесткая правовая защита должников. Списываем долги законно, останавливаем звонки, защищаем имущество и доходы от взыскания.", +} = Astro.props; + +const threats = [ + { icon: "📞", text: "Звонки коллекторов", solved: "Остановим за 1 день" }, + { icon: "🏠", text: "Угроза выселения", solved: "Сохраним жильё" }, + { icon: "💰", text: "Арест счетов", solved: "Разблокируем" }, + { icon: "⚖️", text: "Суд с банком", solved: "Выиграем дело" }, +]; +--- + +
+ +
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+ + + + + +
+
+ + + Угрозы банка + +
+
+ + + Звонки 24/7 + +
+
+ +
+
+ +
+ +
+ + + + + Срочная помощь должникам +
+ + +

+ + Остановим + + + банки и коллекторов + +

+ + +
+

+ {subtitle} +

+
+ + +
+ { + threats.map((item, index) => ( +
+
+ + {item.icon} + + + {item.text} + +
+
+ + + + + {item.solved} + +
+
+ )) + } +
+ + +
+ + + +
+ + +
+
+
+ 500+ млн ₽ +
+
+ Списано долгов +
+
+
+
100%
+
+ Остановка звонков +
+
+
+
0 ₽
+
+ Первый звонок +
+
+
+
+ + + +
+
+
+ + diff --git a/frontend/src/components/services/svo/SVOServicesHero.astro b/frontend/src/components/services/svo/SVOServicesHero.astro new file mode 100644 index 0000000..07c3714 --- /dev/null +++ b/frontend/src/components/services/svo/SVOServicesHero.astro @@ -0,0 +1,339 @@ +--- +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +interface Props { + title?: string; + subtitle?: string; +} + +const { + title = "Юридическая помощь по делам СВО", + subtitle = "Квалифицированная защита прав участников специальной военной операции и их семей. Пенсии, пособия, социальные гарантии и правовая защита.", +} = Astro.props; + +const features = [ + "Консультации по социальным гарантиям", + "Помощь в оформлении пособий и пенсий", + "Защита прав военнослужащих и их семей", +]; +--- + +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+
+ +
+
+ +
+
+ +
+
+ + СВО - Юридическая помощь +
+
+ + +

+ { + title + .split(" ") + .map((word, i) => + i === 0 ? ( + {word} + ) : ( + {word} + ), + ) + } +

+ + +
+ +

+ {subtitle} +

+
+ + +
+ { + features.map((feature) => ( +
+ + + + {feature} +
+ )) + } +
+ + +
+ + + + + + + Связаться с нами + +
+ + +
+
+
+
+ 100+ +
+
+ СВО дел обслужено +
+
+
+
+ 98% +
+
+ Успешных исходов +
+
+
+
+ 3 года +
+
+ Практики по СВО +
+
+
+
+
+
+ + + +
+ + \ No newline at end of file diff --git a/frontend/src/components/services/svo/SVOServicesList.astro b/frontend/src/components/services/svo/SVOServicesList.astro new file mode 100644 index 0000000..36acb7b --- /dev/null +++ b/frontend/src/components/services/svo/SVOServicesList.astro @@ -0,0 +1,100 @@ +--- +const svoServices = [ + { + title: "Оформление пособий по потере кормильца", + desc: "Помощь в сборе документов и оформлении пособий для семей погибших военнослужащих", + icon: "M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z", + available: true + }, + { + title: "Оформление пенсии по случаю потери кормильца", + desc: "С учетом льготного исчисления и надбавок для семей военнослужащих", + icon: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z", + available: true + }, + { + title: "Оформление страховых выплат по ОССЗ", + desc: "Помощь в получении страхового возмещения по обязательному государственному страхованию", + icon: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z", + available: true + }, + { + title: "Оспаривание отказов в установлении инвалидности", + desc: "Представительство в военно-медицинских комиссиях и судах", + icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4", + available: true + }, + { + title: "Оформление компенсаций за вред здоровью", + desc: "По причине военной травмы, включая судебную защиту прав", + icon: "M17.657 18.657A8 8 0 016.343 7.343S7 9 9 10c0-2 .5-5 2.986-7C14 5 16.09 5.777 17.656 7.343A7.975 7.975 0 0120 13a7.975 7.975 0 01-2.343 5.657z", + available: true + }, + { + title: "Восстановление утраченных документов", + desc: "Включая загранпаспорта, СНИЛС, ИНН и другие важные документы", + icon: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z", + available: true + } +]; + +--- + +
+
+
+ + Специализация по СВО + +

+ Юридические услуги по делам СВО +

+

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

+
+ +
+ {svoServices.map((service) => ( +
+ + +
+ +
+ + + +
+ +

+ {service.title} +

+

+ {service.desc} +

+ + {service.available ? ( + + Подробнее + + + ) : ( + + В разработке + + )} +
+ ))} +
+ +
+
+ + + + Если вы не нашли нужную услугу в списке, свяжитесь с нами - мы окажем помощь по любым вопросам, связанным с СВО +
+
+
+
\ No newline at end of file diff --git a/frontend/src/components/services/svo/SVOSpecifics.astro b/frontend/src/components/services/svo/SVOSpecifics.astro new file mode 100644 index 0000000..b4d5f00 --- /dev/null +++ b/frontend/src/components/services/svo/SVOSpecifics.astro @@ -0,0 +1,90 @@ +--- +const svoSpecifics = [ + { + title: "Социальные гарантии", + desc: "Полное сопровождение по вопросам получения социальных гарантий, установленных для участников СВО и их семей", + icon: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" + }, + { + title: "Права военнослужащих", + desc: "Защита прав и законных интересов военнослужащих, участвующих в специальной военной операции", + icon: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" + }, + { + title: "Документальное сопровождение", + desc: "Помощь в оформлении всех необходимых документов для получения положенных выплат и льгот", + icon: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.2.707V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" + } +]; +--- + +
+
+ +
+
+ + Особенности СВО + +

+ Специфика дел, связанных с СВО +

+

+ Юридические вопросы, связанные с участием в специальной военной операции, имеют свои особенности, требующие специализированных знаний и опыта. +

+
+ +
+ {svoSpecifics.map((specific, index) => ( +
+
+
+
+
+ + + +
+
+ {index + 1} + из 3 +
+
+ +

+ {specific.title} +

+

+ {specific.desc} +

+ +
+
+
+ +
+ Специализированные знания +
+
+
+ +
+ Актуальная судебная практика +
+
+
+
+ ))} +
+ +
+
+

Важно знать

+

+ Законодательство в части прав и социальных гарантий участников СВО и их семей постоянно развивается и изменяется. + Для успешного решения ваших вопросов необходимы актуальные знания и опыт работы с нормативно-правовыми актами. +

+
+
+
+
\ No newline at end of file diff --git a/frontend/src/components/single-post/AuthorConsultation.astro b/frontend/src/components/single-post/AuthorConsultation.astro new file mode 100644 index 0000000..3439e6f --- /dev/null +++ b/frontend/src/components/single-post/AuthorConsultation.astro @@ -0,0 +1,140 @@ +--- +import Button from "../base/Button.astro"; +import { CONTACT_CONSTANTS } from "@constants/constants.ts"; + +export interface Props { + author: { + name: string; + avatar: string; + role?: string; + }; +} + +const { author } = Astro.props; + +const benefits = [ + { text: "Анализ ситуации и перспектив дела" }, + { text: "Понятные рекомендации по действиям" }, + { text: "Оценка рисков и варианты решения" }, +]; +--- + +
+ +
+ {author.name} +

+ {author.name} +

+

+ {author.role || "Юрист"} +

+
+ + +
+ +
+
+
+
+ + +
+
+ + + +
+
+ + +
+

Требуется консультация?

+

+ Получите профессиональную правовую помощь по вашему вопросу. Первичная + консультация бесплатно. +

+ + +
    + { + benefits.map((benefit) => ( +
  • +
    + + + +
    + {benefit.text} +
  • + )) + } +
+ + +
+
+
diff --git a/frontend/src/components/single-post/BlogPost.astro b/frontend/src/components/single-post/BlogPost.astro new file mode 100644 index 0000000..5a3951e --- /dev/null +++ b/frontend/src/components/single-post/BlogPost.astro @@ -0,0 +1,567 @@ +--- +import { MONTHS } from "@lib/constants"; +import NumberedContent from "./NumberedContent.astro"; +import AuthorConsultation from "./AuthorConsultation.astro"; + +export interface Props { + title: string; + excerpt: string; + author: { + name: string; + avatar: string; + role?: string; + }; + publishDate: string | Date; + readTime?: string; + tags?: string[]; + featuredImage?: string; + tableOfContents?: Array<{ + id: string; + title: string; + }>; + content?: string; + postId?: string; + likes?: number; + dislikes?: number; +} + +function formatDate(dateInput: string | Date): string { + const date = new Date(dateInput); + return `${date.getDate()} ${MONTHS[date.getMonth()]} ${date.getFullYear()} года`; +} + +const { + title, + excerpt, + author, + publishDate, + readTime = "5 мин чтения", + tags = [], + featuredImage, + tableOfContents = [], + content, + postId, + likes = 0, + dislikes = 0, +} = Astro.props; + +// дата поста +const formattedPublishDate = typeof publishDate === "string" + ? publishDate + : formatDate(publishDate); +--- + +
+ { + featuredImage && ( +
+ {title} + {/* Затемнение для контраста текста */} +
+ + {/* Декоративные элементы */} +
+ {/* Золотая линия сверху */} +
+ +
+
+
+ +
+
+ +
+ + Статья + +
+
+ + +

+ {title} +

+ + +
+
+
+
+
+
+
+
+
+ ) + } + +
+
+
+ { + !featuredImage && ( +
+

+ {title} +

+

{excerpt}

+
+ ) + } + +
+
+ + + + {readTime} + +
+
+ + { + tags.length > 0 && ( +
+ {tags.map((tag) => ( + + #{tag} + + ))} +
+ ) + } + + { + tableOfContents.length > 0 && ( +
+ + + + + + Содержание + + + + + +
+
    + {tableOfContents.map((item, index) => ( +
  1. + + + {index + 1} + + {item.title} + +
  2. + ))} +
+
+
+ ) + } + + +
+ + + +
+ +
+ +

+ "Правовая грамотность — лучшая защита ваших интересов в любой + жизненной ситуации." +

+
+ + +
+
+
+ + +
+ +
+ +
+ + {dislikes} +
+
+
+ + + + + + +
+ + + +
+
+
+ + diff --git a/frontend/src/components/single-post/CommentForm.tsx b/frontend/src/components/single-post/CommentForm.tsx new file mode 100644 index 0000000..653422f --- /dev/null +++ b/frontend/src/components/single-post/CommentForm.tsx @@ -0,0 +1,232 @@ +import { createSignal, Show } from "solid-js"; + +interface CommentFormData { + content: string; +} + +interface ValidationErrors { + content?: string; +} + +interface CommentFormProps { + onSubmit: (data: CommentFormData) => void; + isReply?: boolean; + onCancel?: () => void; + // Данные авторизованного пользователя из PocketBase + user?: { + name: string; + email: string; + avatar?: string; + }; +} + +// 🔒 Запрещённые паттерны для защиты от XSS +const DANGEROUS_PATTERNS = [ + /)<[^<]*)*<\/script>/gi, + /javascript:/gi, + /on\w+\s*=/gi, + /)<[^<]*)*<\/iframe>/gi, + /)<[^<]*)*<\/object>/gi, + //gi, + /data:text\/html/gi, + /expression\s*\(/gi, + /url\s*\(\s*['"]*\s*javascript:/gi, +]; + +// Лимиты +const MAX_MESSAGE_LENGTH = 2000; +const MIN_MESSAGE_LENGTH = 10; + +export default function CommentForm(props: CommentFormProps) { + const [content, setContent] = createSignal(""); + const [errors, setErrors] = createSignal({}); + const [touched, setTouched] = createSignal<{ [key: string]: boolean }>({}); + + const sanitizeInput = (input: string): string => { + return input + .replace(/[<>]/g, "") + .replace(/"/g, """) + .replace(/'/g, "'") + .replace(/&/g, "&"); + }; + + const containsDangerousContent = (input: string): boolean => { + return DANGEROUS_PATTERNS.some((pattern) => pattern.test(input)); + }; + + const validateContent = (value: string): string | undefined => { + const trimmed = value.trim(); + if (!trimmed) return "Комментарий обязателен"; + if (trimmed.length < MIN_MESSAGE_LENGTH) + return `Минимум ${MIN_MESSAGE_LENGTH} символов`; + if (trimmed.length > MAX_MESSAGE_LENGTH) + return `Максимум ${MAX_MESSAGE_LENGTH} символов`; + if (containsDangerousContent(trimmed)) return "Обнаружен опасный контент"; + return undefined; + }; + + const handleContentChange = (e: Event) => { + const target = e.target as HTMLTextAreaElement; + let value = target.value; + + if (containsDangerousContent(value)) { + DANGEROUS_PATTERNS.forEach((pattern) => { + value = value.replace(pattern, ""); + }); + } + + if (value.length > MAX_MESSAGE_LENGTH) { + value = value.slice(0, MAX_MESSAGE_LENGTH); + } + + setContent(value); + if (touched().content) { + setErrors((prev) => ({ ...prev, content: validateContent(value) })); + } + }; + + const validateForm = (): boolean => { + const contentError = validateContent(content()); + + setErrors({ + content: contentError, + }); + + setTouched({ content: true }); + + return !contentError; + }; + + const handleSubmit = (e: Event) => { + e.preventDefault(); + + if (!validateForm()) return; + + props.onSubmit({ + content: sanitizeInput(content().trim()), + }); + + // Сброс + setContent(""); + setErrors({}); + setTouched({}); + }; + + const handleBlur = () => { + setTouched((prev) => ({ ...prev, content: true })); + setErrors((prev) => ({ ...prev, content: validateContent(content()) })); + }; + + const isValid = () => { + return !errors().content && content().trim(); + }; + + return ( +
+

+ + + + {props.isReply ? "Написать ответ" : "Оставить комментарий"} +

+ +
+ {/* Поле сообщения */} +
+