From 500b658dbf22662c3aa216bd3c24034e0171b163 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 14:49:03 +0400 Subject: [PATCH 01/55] add project --- .gitignore | 24 + .postcssrc.json | 5 + README.md | 89 +- package-lock.json | 2878 +++++++++++++++++ package.json | 20 + src/assets/avatars/1.jpeg | Bin 0 -> 9728 bytes src/assets/avatars/2.jpg | Bin 0 -> 37154 bytes src/assets/avatars/3.jpg | Bin 0 -> 48747 bytes src/assets/icons/arrow-left.svg | 4 + src/assets/icons/arrow-right.svg | 1 + src/assets/icons/dots.svg | 1 + src/assets/icons/double-check.svg | 1 + src/assets/icons/image.svg | 6 + src/assets/icons/paperclip.svg | 9 + src/assets/icons/search.svg | 1 + src/assets/icons/send.svg | 1 + src/components/avatar/avatar.hbs | 10 + src/components/avatar/avatar.pcss | 58 + src/components/avatar/index.ts | 2 + src/components/badge/badge.hbs | 1 + src/components/badge/badge.pcss | 31 + src/components/badge/index.ts | 2 + src/components/button/button.hbs | 1 + src/components/button/button.pcss | 71 + src/components/button/index.ts | 2 + src/components/chat-item/chat-item.hbs | 21 + src/components/chat-item/chat-item.pcss | 48 + src/components/chat-item/index.ts | 2 + src/components/chat-list/chat-list.hbs | 13 + src/components/chat-list/chat-list.pcss | 23 + src/components/chat-list/index.ts | 2 + src/components/error/error.hbs | 10 + src/components/error/error.pcss | 19 + src/components/error/index.ts | 2 + src/components/form-auth/form-auth.hbs | 12 + src/components/form-auth/form-auth.pcss | 25 + src/components/form-auth/index.ts | 2 + src/components/form-profile/form-profile.hbs | 25 + src/components/form-profile/form-profile.pcss | 48 + src/components/form-profile/index.ts | 2 + src/components/index.ts | 16 + src/components/input-search/index.ts | 2 + src/components/input-search/input-search.hbs | 9 + src/components/input-search/input-search.pcss | 56 + src/components/input-wide/index.ts | 2 + src/components/input-wide/input-wide.hbs | 18 + src/components/input-wide/input-wide.pcss | 54 + src/components/input/index.ts | 2 + src/components/input/input.hbs | 17 + src/components/input/input.pcss | 62 + src/components/link/index.ts | 2 + src/components/link/link.hbs | 6 + src/components/link/link.pcss | 37 + src/components/loader/index.ts | 2 + src/components/loader/loader.css | 33 + src/components/loader/loader.hbs | 1 + src/components/message-list/index.ts | 2 + src/components/message-list/message-list.hbs | 28 + src/components/message-list/message-list.pcss | 62 + src/components/message/index.ts | 2 + src/components/message/message.hbs | 19 + src/components/message/message.pcss | 61 + src/components/modal/index.ts | 2 + src/components/modal/modal.hbs | 15 + src/components/modal/modal.pcss | 40 + src/index.html | 15 + src/main.ts | 41 + src/mocks/chat-message.mocks.ts | 42 + src/mocks/chat.mocks.ts | 63 + src/mocks/user-profile.mocks.ts | 12 + src/models/chat-message.ts | 12 + src/models/chat.ts | 19 + src/models/file.ts | 9 + src/models/user.ts | 10 + src/pages/404/404.hbs | 3 + src/pages/404/index.ts | 1 + src/pages/500/500.hbs | 3 + src/pages/500/index.ts | 1 + src/pages/all-components/all-components.css | 9 + src/pages/all-components/all-components.hbs | 31 + src/pages/all-components/index.ts | 2 + src/pages/chat-page/chat-page.css | 23 + src/pages/chat-page/chat-page.hbs | 9 + src/pages/chat-page/index.ts | 3 + src/pages/index.ts | 9 + src/pages/login/index.ts | 1 + src/pages/login/login.hbs | 8 + src/pages/password-edit/index.ts | 1 + src/pages/password-edit/password-edit.hbs | 7 + src/pages/profile-edit/index.ts | 1 + src/pages/profile-edit/profile-edit.hbs | 10 + src/pages/profile/index.ts | 1 + src/pages/profile/profile.hbs | 10 + src/pages/registration/index.ts | 1 + src/pages/registration/registration.hbs | 11 + src/styles/fonts.css | 8 + src/styles/main.css | 3 + src/styles/reset.css | 29 + src/styles/variables.css | 14 + src/vite-env.d.ts | 1 + tsconfig.json | 23 + vite.config.ts | 18 + 102 files changed, 4407 insertions(+), 79 deletions(-) create mode 100644 .gitignore create mode 100644 .postcssrc.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/assets/avatars/1.jpeg create mode 100644 src/assets/avatars/2.jpg create mode 100644 src/assets/avatars/3.jpg create mode 100644 src/assets/icons/arrow-left.svg create mode 100644 src/assets/icons/arrow-right.svg create mode 100644 src/assets/icons/dots.svg create mode 100644 src/assets/icons/double-check.svg create mode 100644 src/assets/icons/image.svg create mode 100644 src/assets/icons/paperclip.svg create mode 100644 src/assets/icons/search.svg create mode 100644 src/assets/icons/send.svg create mode 100644 src/components/avatar/avatar.hbs create mode 100644 src/components/avatar/avatar.pcss create mode 100644 src/components/avatar/index.ts create mode 100644 src/components/badge/badge.hbs create mode 100644 src/components/badge/badge.pcss create mode 100644 src/components/badge/index.ts create mode 100644 src/components/button/button.hbs create mode 100644 src/components/button/button.pcss create mode 100644 src/components/button/index.ts create mode 100644 src/components/chat-item/chat-item.hbs create mode 100644 src/components/chat-item/chat-item.pcss create mode 100644 src/components/chat-item/index.ts create mode 100644 src/components/chat-list/chat-list.hbs create mode 100644 src/components/chat-list/chat-list.pcss create mode 100644 src/components/chat-list/index.ts create mode 100644 src/components/error/error.hbs create mode 100644 src/components/error/error.pcss create mode 100644 src/components/error/index.ts create mode 100644 src/components/form-auth/form-auth.hbs create mode 100644 src/components/form-auth/form-auth.pcss create mode 100644 src/components/form-auth/index.ts create mode 100644 src/components/form-profile/form-profile.hbs create mode 100644 src/components/form-profile/form-profile.pcss create mode 100644 src/components/form-profile/index.ts create mode 100644 src/components/index.ts create mode 100644 src/components/input-search/index.ts create mode 100644 src/components/input-search/input-search.hbs create mode 100644 src/components/input-search/input-search.pcss create mode 100644 src/components/input-wide/index.ts create mode 100644 src/components/input-wide/input-wide.hbs create mode 100644 src/components/input-wide/input-wide.pcss create mode 100644 src/components/input/index.ts create mode 100644 src/components/input/input.hbs create mode 100644 src/components/input/input.pcss create mode 100644 src/components/link/index.ts create mode 100644 src/components/link/link.hbs create mode 100644 src/components/link/link.pcss create mode 100644 src/components/loader/index.ts create mode 100644 src/components/loader/loader.css create mode 100644 src/components/loader/loader.hbs create mode 100644 src/components/message-list/index.ts create mode 100644 src/components/message-list/message-list.hbs create mode 100644 src/components/message-list/message-list.pcss create mode 100644 src/components/message/index.ts create mode 100644 src/components/message/message.hbs create mode 100644 src/components/message/message.pcss create mode 100644 src/components/modal/index.ts create mode 100644 src/components/modal/modal.hbs create mode 100644 src/components/modal/modal.pcss create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/mocks/chat-message.mocks.ts create mode 100644 src/mocks/chat.mocks.ts create mode 100644 src/mocks/user-profile.mocks.ts create mode 100644 src/models/chat-message.ts create mode 100644 src/models/chat.ts create mode 100644 src/models/file.ts create mode 100644 src/models/user.ts create mode 100644 src/pages/404/404.hbs create mode 100644 src/pages/404/index.ts create mode 100644 src/pages/500/500.hbs create mode 100644 src/pages/500/index.ts create mode 100644 src/pages/all-components/all-components.css create mode 100644 src/pages/all-components/all-components.hbs create mode 100644 src/pages/all-components/index.ts create mode 100644 src/pages/chat-page/chat-page.css create mode 100644 src/pages/chat-page/chat-page.hbs create mode 100644 src/pages/chat-page/index.ts create mode 100644 src/pages/index.ts create mode 100644 src/pages/login/index.ts create mode 100644 src/pages/login/login.hbs create mode 100644 src/pages/password-edit/index.ts create mode 100644 src/pages/password-edit/password-edit.hbs create mode 100644 src/pages/profile-edit/index.ts create mode 100644 src/pages/profile-edit/profile-edit.hbs create mode 100644 src/pages/profile/index.ts create mode 100644 src/pages/profile/profile.hbs create mode 100644 src/pages/registration/index.ts create mode 100644 src/pages/registration/registration.hbs create mode 100644 src/styles/fonts.css create mode 100644 src/styles/main.css create mode 100644 src/styles/reset.css create mode 100644 src/styles/variables.css create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.postcssrc.json b/.postcssrc.json new file mode 100644 index 000000000..a3f4f1837 --- /dev/null +++ b/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "postcss-preset-env": {} + } +} \ No newline at end of file diff --git a/README.md b/README.md index bcd1a1367..029cf16a6 100644 --- a/README.md +++ b/README.md @@ -1,83 +1,14 @@ -### Ветка, в которой делаете задания спринта, должна называться sprint_i, где i - номер спринта. Не переименовывайте её. +# Messenger +### Project 1 for course Middle Yandex. -### Откройте pull request в ветку main из ветки, где вы разрабатывали проект, и добавьте ссылку на этот pr в README.md в ветке main. -### ВАЖНО: pull request должен называться “Sprint i” (i — номер спринта). +### Design -### Например, задания для проектной работы во втором спринте вы делаете в ветке sprint_2. Открываете из неё pull request в ветку main. Ссылку на этот pr добавляете в README.md в ветке main. После этого на платформе Практикума нажимаете «Проверить задание». +[Figma](https://www.figma.com/file/FfgnMjuShWBBLmFMls5Ryy/Chat_my_design?type=design&node-id=0-1&mode=design&t=14mgPG10l7FRQJOL-0 "Link on Figma") -### Также не забудьте проверить, что репозиторий публичный. ---- - -Даже законченный проект остаётся только заготовкой, пока им не начнут пользоваться. Но сначала пользователь должен понять, зачем ему пользоваться вашим кодом. В этом помогает файл README. - -README — первое, что прочитает пользователь, когда попадёт в репозиторий на «Гитхабе». Хороший REAMDE отвечает на четыре вопроса: - -- Готов ли проект к использованию? -- В чём его польза? -- Как установить? -- Как применять? - -## Бейджи - -Быстро понять статус проекта помогают бейджи на «Гитхабе». Иногда разработчики ограничиваются парой бейджев, которые сообщат о статусе тестов кода: - -![Бэйджи](https://github.com/yandex-praktikum/mf.messenger.praktikum.yandex.images/blob/master/mf/b.png) - -Если пользователь увидит ошибку в работе тестов, то поймёт: использовать текущую версию в важном проекте — не лучшая идея. - -Бейджи помогают похвастаться достижениями: насколько популярен проект, как много разработчиков создавало этот код. Через бейджи можно даже пригласить пользователя в чат: - -![Версии](https://github.com/yandex-praktikum/mf.messenger.praktikum.yandex.images/blob/master/mf/vers.png) - -В README **Webpack** строка бейджев подробно рассказывает о покрытии кода тестами. Когда проект протестирован, это вызывает доверие пользователя. Последний бейдж приглашает присоединиться к разработке. - -Другая строка убедит пользователя в стабильности инфраструктуры и популярности проекта. Последний бейдж зовёт в чат проекта. - -## Описание - -Краткое опишите, какую задачу решает проект. Пользователь не верит обещаниям и не готов читать «полотна» текста. Поэтому в описании достаточно нескольких строк: - -![Описание](https://github.com/yandex-praktikum/mf.messenger.praktikum.yandex.images/blob/master/mf/desc.png) - -Авторы **React** дробят описание на абзацы и списки — так проще пробежаться глазами по тексту и найти ключевую информацию. - -Если у проекта есть сайт, добавьте ссылку в заголовок. - -## Установка - -Лучше всего пользователя убеждает собственный опыт. Чем быстрее он начнёт пользоваться проектом, тем раньше почувствует пользу. Для этого помогите ему установить приложение: напишите краткую пошаговую инструкцию. - -Если проект предназначен для разработчиков, добавьте информацию об установке тестовых версий. Например: - -- `npm install` — установка стабильной версии, -- `npm start` — запуск версии для разработчика, -- `npm run build:prod` — сборка стабильной версии. - -## **Примеры использования** - -Хорошо, если сразу после установки пользователь сможет решить свои задачи без изучения проекта. Это особенно верно, если ваш пользователь — не профессиональный разработчик. Но даже профессионал поймёт вас лучше, если показать примеры использования: - -![Ссылки](https://github.com/yandex-praktikum/mf.messenger.praktikum.yandex.images/blob/master/mf/link.png) - -Для более подробных инструкции добавьте новые разделы или ссылки: - -- на документацию, -- вики проекта, -- описание API. - -В учебном проекте будут полезен раздел с описанием стиля кода и правилами разработки: как работать с ветками, пул-реквестами и релизами. - -### **Команда** - -Если вы работаете в команде, укажите основных участников: им будет приятно, а новые разработчики охотнее присоединятся к проекту. «Гитхаб» — не просто инструмент, это социальная сеть разработчиков. - -![Команда](https://github.com/yandex-praktikum/mf.messenger.praktikum.yandex.images/blob/master/mf/team.png) - -### **Примеры README** - -- «[Реакт](https://github.com/facebook/react)», -- «[Эхо](https://github.com/labstack/echo)», -- «[Вебпак](https://github.com/webpack/webpack)», -- «[ТДенгине](https://github.com/taosdata/TDengine)», -- «[Соул-хантинг](https://github.com/vladpereskokov/soul-hunting/)». +### Tech stack: +- Vite 4.4.9 +- Node.js 18.17.1 +- Handlebars (vite-plugin-handlebars) +- Typescript 5.2.2 +- Postcss(plugin postcss-preset-env) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..62ab4d411 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2878 @@ +{ + "name": "middle.messenger.praktikum.yandex", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "middle.messenger.praktikum.yandex", + "version": "0.0.0", + "dependencies": { + "@types/node": "^20.5.7" + }, + "devDependencies": { + "postcss-preset-env": "^9.1.2", + "typescript": "^5.2.2", + "vite": "^4.4.9", + "vite-plugin-handlebars": "^1.6.0" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.4.tgz", + "integrity": "sha512-zXMGsJetbLoXe+gjEES07MEGjL0Uy3hMxmnGtVBrRpVKr5KV9OgCB09zr/vLrsEtoVQTgJFewxaU8IYSAE4tjg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-3.0.1.tgz", + "integrity": "sha512-Tsp6FcSPaPN/+4T7iBPxBVopJUs7bimnNx4yuWeGXkH084Vro/y8fmrGg1LGSWH8SU6YuH20fP5Rtqtb979jyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.1.3.tgz", + "integrity": "sha512-7mJZ8gGRtSQfQKBQFi5N0Z+jzNC0q8bIkwojP1W0w+APzEqHu5wJoGVsvKxVnVklu9F8tW1PikbBRseYnAdv+g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.3.0.tgz", + "integrity": "sha512-jgudbE+TXZLssSTGFRCkJF9gAM8ABZ2c9/gbLupwA8Y1SpcddxK2z74/MOSdWuboUHbshei8uSQNbp9Wu1Bx+Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^3.0.1", + "@csstools/css-calc": "^1.1.3" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz", + "integrity": "sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.2.0" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz", + "integrity": "sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.4.tgz", + "integrity": "sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.0.tgz", + "integrity": "sha512-dVPVVqQG0FixjM9CG/+8eHTsCAxRKqmNh6H69IpruolPlnEF1611f2AoLK8TijTSAsqBSclKd4WHs1KUb/LdJw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^3.0.0", + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.2.tgz", + "integrity": "sha512-sfEBBWVMNPE3mHllI+FR43W2qy7eIjqCySAoivPFV068yKbUy6mH8Sra5Gjar54M3p2qvH8S/6KPlvEDBTvrmg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/postcss-progressive-custom-properties": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.2.tgz", + "integrity": "sha512-121MUtL/fv+lO9FQJKP05UAKC6xYl4hZYyWl+pGbfXIa3KkgCbcMfhkIc0zV2JpwsB5uhls81bwl+XJKhKwECw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/postcss-progressive-custom-properties": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.0.tgz", + "integrity": "sha512-FPndJ/7oGlML7/4EhLi902wGOukO0Nn37PjwOQGc0BhhjQPy3np3By4d3M8s9Cfmp9EHEKgUHRN2DQ5HLT/hTw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^1.1.3", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-3.0.0.tgz", + "integrity": "sha512-ntkGj+1uDa/u6lpjPxnkPcjJn7ChO/Kcy08YxctOZI7vwtrdYvFhmE476dq8bj1yna306+jQ9gzXIG/SWfOaRg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.2.tgz", + "integrity": "sha512-ogriVRZFMgV/oS4pwuXTdFJ7I+saq0oSHzev/XsvXOoRHXOK9jB2q6zEfl3o1Edl0X2wHmacwtfRk8RBmopnYw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/postcss-progressive-custom-properties": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.2.tgz", + "integrity": "sha512-K4W97KaMnCLUS7/hfdxsM10ghPtIwfYP+VGUwpMgNYa7LVwE+9vkL/N/hzwqSShICtWD6doX1yAT0qcKUbgs0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.0.tgz", + "integrity": "sha512-FH3+zfOfsgtX332IIkRDxiYLmgwyNk49tfltpC6dsZaO4RV2zWY6x9VMIC5cjvmjlDO7DIThpzqaqw2icT8RbQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^3.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.0.tgz", + "integrity": "sha512-0I6siRcDymG3RrkNTSvHDMxTQ6mDyYE8awkcaHNgtYacd43msl+4ZWDfQ1yZQ/viczVWjqJkLmPiRHSgxn5nZA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^3.0.0", + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-2.0.0.tgz", + "integrity": "sha512-Wki4vxsF6icRvRz8eF9bPpAvwaAt0RHwhVOyzfoFg52XiIMjb6jcbHkGxwpJXP4DVrnFEwpwmrz5aTRqOW82kg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-2.0.0.tgz", + "integrity": "sha512-lCQ1aX8c5+WI4t5EoYf3alTzJNNocMqTb+u1J9CINdDhFh1fjovqK+0aHalUHsNstZmzFPNzIkU4Mb3eM9U8SA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.1.tgz", + "integrity": "sha512-R5s19SscS7CHoxvdYNMu2Y3WDwG4JjdhsejqjunDB1GqfzhtHSvL7b5XxCkUWqm2KRl35hI6kJ4HEaCDd/3BXg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-tokenizer": "^2.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.0.7.tgz", + "integrity": "sha512-5LGLdu8cJgRPmvkjUNqOPKIKeHbyQmoGKooB5Rh0mp5mLaNI9bl+IjFZ2keY0cztZYsriJsGf6Lu8R5XetuwoQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^1.1.3", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.2.tgz", + "integrity": "sha512-kQJR6NvTRidsaRjCdHGjra2+fLoFiDQOm5B2aZrhmXqng/hweXjruboKzB326rxQO2L0m0T+gCKbZgyuncyhLg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-3.0.0.tgz", + "integrity": "sha512-HsB66aDWAouOwD/GcfDTS0a7wCuVWaTpXcjl5VKP0XvFxDiU+r0T8FG7xgb6ovZNZ+qzvGIwRM+CLHhDgXrYgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-3.0.0.tgz", + "integrity": "sha512-6Nw55PRXEKEVqn3bzA8gRRPYxr5tf5PssvcE5DRA/nAxKgKtgNZMCHCSd1uxTCWeyLnkf6h5tYRSB0P1Vh/K/A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.2.tgz", + "integrity": "sha512-tr7HjHDaDvRcnzK559l3VcpfhiAd0ga1jhThGR/tONfVzOVssG9x0QLg0LpLrlx7+niGgHL1SdfgHmFiTJjGIw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/postcss-progressive-custom-properties": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.0.0.tgz", + "integrity": "sha512-2/D3CCL9DN2xhuUTP8OKvKnaqJ1j4yZUxuGLsCUOQ16wnDAuMLKLkflOmZF5tsPh/02VPeXRmqIN+U595WAulw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.2.tgz", + "integrity": "sha512-sn2zqcM8QPj4wN2okdNbK0JdwhZU506EEmIeSybh2UOJgTorbyQS7ak2sJ+2Y4LDYr4rPGBs/hBFmyYgoostdg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/postcss-progressive-custom-properties": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-3.0.0.tgz", + "integrity": "sha512-GFNVsD97OuEcfHmcT0/DAZWAvTM/FFBDQndIOLawNc1Wq8YqpZwBdHa063Lq+Irk7azygTT+Iinyg3Lt76p7rg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.1.tgz", + "integrity": "sha512-y1sykToXorFE+5cjtp//xAMWEAEple0kcZn2QhzEFIZDDNvGOCp5JvvmmPGsC3eDlj6yQp70l9uXZNLnimEYfA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^1.1.3", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-3.0.1.tgz", + "integrity": "sha512-a5Ojrf31XfdsmFhbLR41JG8HD9d7mWeOqROUJpTi9MTJDAHeJstvhrmpHS39C11luwSHanLou4v3PI9xLbWolQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^3.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.1.tgz", + "integrity": "sha512-hW+JPv0MPQfWC1KARgvJI6bisEUFAZWSvUNq/khGCupYV/h6Z9R2ZFz0Xc633LXBst0ezbXpy7NpnPurSx5Klw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^1.1.3", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-3.0.0.tgz", + "integrity": "sha512-P0JD1WHh3avVyKKRKjd0dZIjCEeaBer8t1BbwGMUDtSZaLhXlLNBqZ8KkqHzYWXOJgHleXAny2/sx8LYl6qhEA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", + "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/node": { + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001525", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", + "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/css-blank-pseudo": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-6.0.0.tgz", + "integrity": "sha512-VbfLlOWO7sBHBTn6pwDQzc07Z0SDydgDBfNfCE0nvrehdBNv9RKsuupIRa/qal0+fBZhAALyQDPMKz5lnvcchw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-6.0.0.tgz", + "integrity": "sha512-X+r+JBuoO37FBOWVNhVJhxtSBUFHgHbrcc0CjFT28JEdOw1qaDwABv/uunyodUuSy2hMPe9j/HjssxSlvUmKjg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^3.0.0", + "postcss-selector-parser": "^6.0.13", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-9.0.0.tgz", + "integrity": "sha512-03QGAk/FXIRseDdLb7XAiu6gidQ0Nd8945xuM7VFVPpc6goJsG9uIO8xQjTxwbPdPIIV4o4AJoOJyt8gwDl67g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/cssdb": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.7.1.tgz", + "integrity": "sha512-kM+Fs0BFyhJNeE6wbOrlnRsugRdL6vn7QcON0aBDZ7XRd7RI2pMlk+nxoHuTb4Et+aBobXgK0I+6NGLA0LLgTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.508", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", + "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-6.0.2.tgz", + "integrity": "sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.0.tgz", + "integrity": "sha512-kaWTgnhRKFtfMF8H0+NQBFxgr5CGg05WGe07Mc1ld6XHwwRWlqSbHOW0zwf+BtkBQpsdVUu7+gl9dtdvhWMedw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^3.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-9.0.2.tgz", + "integrity": "sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-9.0.0.tgz", + "integrity": "sha512-RmUFL+foS05AKglkEoqfx+KFdKRVmqUAxlHNz4jLqIi7046drIPyerdl4B6j/RA2BSP8FI8gJcHmLRrwJOMnHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-media": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.0.tgz", + "integrity": "sha512-NxDn7C6GJ7X8TsWOa8MbCdq9rLERRLcPfQSp856k1jzMreL8X9M6iWk35JjPRIb9IfRnVohmxAylDRx7n4Rv4g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/cascade-layer-name-parser": "^1.0.3", + "@csstools/css-parser-algorithms": "^2.3.0", + "@csstools/css-tokenizer": "^2.1.1", + "@csstools/media-query-list-parser": "^2.1.2" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.0.tgz", + "integrity": "sha512-q4VgtIKSy5+KcUvQ0WxTjDy9DZjQ5VCXAZ9+tT9+aPMbA0z6s2t1nMw0QHszru1ib5ElkXl9JUpYYU37VVUs7g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/cascade-layer-name-parser": "^1.0.4", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.4.tgz", + "integrity": "sha512-TU2xyUUBTlpiLnwyE2ZYMUIYB41MKMkBZ8X8ntkqRDQ8sdBLhFFsPgNcOliBd5+/zcK51C9hRnSE7hKUJMxQSw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/cascade-layer-name-parser": "^1.0.3", + "@csstools/css-parser-algorithms": "^2.3.0", + "@csstools/css-tokenizer": "^2.1.1", + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-8.0.0.tgz", + "integrity": "sha512-Oy5BBi0dWPwij/IA+yDYj+/OBMQ9EPqAzTHeSNUYrUWdll/PRJmcbiUj0MNcsBi681I1gcSTLvMERPaXzdbvJg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.0.tgz", + "integrity": "sha512-wR8npIkrIVUTicUpCWSSo1f/g7gAEIH70FMqCugY4m4j6TX4E0T2Q5rhfO0gqv00biBZdLyb+HkW8x6as+iJNQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^3.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-9.0.0.tgz", + "integrity": "sha512-zA4TbVaIaT8npZBEROhZmlc+GBKE8AELPHXE7i4TmIUEQhw/P/mSJfY9t6tBzpQ1rABeGtEOHYrW4SboQeONMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.0.tgz", + "integrity": "sha512-E7+J9nuQzZaA37D/MUZMX1K817RZGDab8qw6pFwzAkDd/QtlWJ9/WTKmzewNiuxzeq6WWY7ATiRePVoDKp+DnA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-5.0.0.tgz", + "integrity": "sha512-YjsEEL6890P7MCv6fch6Am1yq0EhQCJMXyT4LBohiu87+4/WqR7y5W3RIv53WdA901hhytgRvjlrAhibhW4qsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-6.0.0.tgz", + "integrity": "sha512-bg58QnJexFpPBU4IGPAugAPKV0FuFtX5rHYNSKVaV91TpHN7iwyEzz1bkIPCiSU5+BUN00e+3fV5KFrwIgRocw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-lab-function": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.2.tgz", + "integrity": "sha512-OfjeI/1rQWtj38Quy3+D9+mpOReOX3vOXfQNCfsmFIl6xK1AAJ1ta1uGjAswYwsN8uJ9Y52K8U53Jk8QJWfJLg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/postcss-progressive-custom-properties": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-logical": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-7.0.0.tgz", + "integrity": "sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-2.0.0.tgz", + "integrity": "sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==", + "dev": true, + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-5.0.0.tgz", + "integrity": "sha512-2rlxDyeSics/hC2FuMdPnWiP9WUPZ5x7FTuArXLFVpaSQ2woPSfZS4RD59HuEokbZhs/wPUQJ1E3MT6zVv94MQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-9.0.0.tgz", + "integrity": "sha512-qLEPD9VPH5opDVemwmRaujODF9nExn24VOC3ghgVLEvfYN7VZLwJHes0q/C9YR5hI2UC3VgBE8Wkdp1TxCXhtg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.1.2.tgz", + "integrity": "sha512-+v7BbUNLgUD1j+dBQw3YRExLnIhroBradExkhDLpkLwZowzhgUQgSYW4PJul2SlST2qyistlEIPaHTJK9tZlEw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-cascade-layers": "^4.0.0", + "@csstools/postcss-color-function": "^3.0.2", + "@csstools/postcss-color-mix-function": "^2.0.2", + "@csstools/postcss-exponential-functions": "^1.0.0", + "@csstools/postcss-font-format-keywords": "^3.0.0", + "@csstools/postcss-gradients-interpolation-method": "^4.0.2", + "@csstools/postcss-hwb-function": "^3.0.2", + "@csstools/postcss-ic-unit": "^3.0.0", + "@csstools/postcss-is-pseudo-class": "^4.0.0", + "@csstools/postcss-logical-float-and-clear": "^2.0.0", + "@csstools/postcss-logical-resize": "^2.0.0", + "@csstools/postcss-logical-viewport-units": "^2.0.1", + "@csstools/postcss-media-minmax": "^1.0.7", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.2", + "@csstools/postcss-nested-calc": "^3.0.0", + "@csstools/postcss-normalize-display-values": "^3.0.0", + "@csstools/postcss-oklab-function": "^3.0.2", + "@csstools/postcss-progressive-custom-properties": "^3.0.0", + "@csstools/postcss-relative-color-syntax": "^2.0.2", + "@csstools/postcss-scope-pseudo-class": "^3.0.0", + "@csstools/postcss-stepped-value-functions": "^3.0.1", + "@csstools/postcss-text-decoration-shorthand": "^3.0.1", + "@csstools/postcss-trigonometric-functions": "^3.0.1", + "@csstools/postcss-unset-value": "^3.0.0", + "autoprefixer": "^10.4.15", + "browserslist": "^4.21.10", + "css-blank-pseudo": "^6.0.0", + "css-has-pseudo": "^6.0.0", + "css-prefers-color-scheme": "^9.0.0", + "cssdb": "^7.7.1", + "postcss-attribute-case-insensitive": "^6.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^6.0.0", + "postcss-color-hex-alpha": "^9.0.2", + "postcss-color-rebeccapurple": "^9.0.0", + "postcss-custom-media": "^10.0.0", + "postcss-custom-properties": "^13.3.0", + "postcss-custom-selectors": "^7.1.4", + "postcss-dir-pseudo-class": "^8.0.0", + "postcss-double-position-gradients": "^5.0.0", + "postcss-focus-visible": "^9.0.0", + "postcss-focus-within": "^8.0.0", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^5.0.0", + "postcss-image-set-function": "^6.0.0", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^6.0.2", + "postcss-logical": "^7.0.0", + "postcss-nesting": "^12.0.1", + "postcss-opacity-percentage": "^2.0.0", + "postcss-overflow-shorthand": "^5.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^9.0.0", + "postcss-pseudo-class-any-link": "^9.0.0", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^7.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env/node_modules/postcss-nesting": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.1.tgz", + "integrity": "sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^3.0.0", + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-9.0.0.tgz", + "integrity": "sha512-QNCYIL98VKFKY6HGDEJpF6+K/sg9bxcUYnOmNHJxZS5wsFDFaVoPeG68WAuhsqwbIBSo/b9fjEnTwY2mTSD+uA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-7.0.1.tgz", + "integrity": "sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-handlebars": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-handlebars/-/vite-plugin-handlebars-1.6.0.tgz", + "integrity": "sha512-/TZ2FadScvJW6fmQ+3m3stm6ns+tDZ3VAgzEkSQYQurAnaQ/3MJfidhmTXzD1Hu1iwgkI3lNuEqybzjjKemCTg==", + "dev": true, + "dependencies": { + "handlebars": "^4.7.6", + "vite": "^2.0.0" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/rollup": { + "version": "2.77.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", + "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-plugin-handlebars/node_modules/vite": { + "version": "2.9.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.16.tgz", + "integrity": "sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.27", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": ">=2.59.0 <2.78.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..c422ca798 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "middle.messenger.praktikum.yandex", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "postcss-preset-env": "^9.1.2", + "typescript": "^5.2.2", + "vite": "^4.4.9", + "vite-plugin-handlebars": "^1.6.0" + }, + "dependencies": { + "@types/node": "^20.5.7" + } +} diff --git a/src/assets/avatars/1.jpeg b/src/assets/avatars/1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..d5f67d4f4180e8988b4a08fe0da6cf5b5f96759b GIT binary patch literal 9728 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 literal 0 HcmV?d00001 diff --git a/src/assets/avatars/2.jpg b/src/assets/avatars/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ff2ca5f5e37ff87bd04dccebd3c45489c0a61c3 GIT binary patch literal 37154 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
~98a1HBKl}c~eXcDK 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 CG$L~V literal 0 HcmV?d00001 diff --git a/src/assets/avatars/3.jpg b/src/assets/avatars/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..06ec0b2c1d40464a2f889b6b4baead3373e3a118 GIT binary patch literal 48747 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%0A50oUkDZZG{5`2Kr)FwL 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�Bo|$B+MpR!c=WM0D4uF2g#)#$wz=4ZVKW7Tj)Y|Lws zuSk3BgsVjr9oZe&zbF2We?{@Q)|ICv3v#v*>qP8ic^@p`VtRDlO@1;HCp8GR{S%Xv zn|}0WHTfcL?Z_+qaLGAP=wy~63H~kmsikPEgh|soU)+6UmN~5Oe-2VV6?2VGB@FLFRxNyfU znmU{d6mC2}6trd~_?aEL{dmSc*yZUFRl6G@^d$WpjSoxFHiY|-)jAqIXvBNcHr*qq z=~O={@+D$%^oEg0?LvZQWfMswtiuP7y((*3(IM{4YM@Em@LLyRX%^Usx_?4#J;x@7 z^s?57i)fO!WAH=difz(5UYTS3rO9KEnp_S{?i7(|OqSRwTG8ib92rG)0qi&a!>eNqW+? zj4YbnBxUBj;}-ZtdR(&fN1>OtKAJFAC0{e+MG3wU{4;);{4@PC_;P-j@y&9I(Gh!- zjqZdrnDNPaF?4guyV%Eu7*@k~z}SnSZMftnCRnJG-0ET5JN=vpMG;grb0>y#mBnl> zk1OW8_aV|*oxTENdBDh5j85OUdE4k5+6e74O6{Qr12)X`0m z-ANI93stKbK0bUO)LP%cdNH#!yQN>PQqi%!B7}=9w#1l_yc4ED+7r^WTC#6v^WgrX zFUs|?mNsOUY;>UrY;Qz_v{5Mvi!aLywL%d^cu2_he?AZDC!+9rSz~35jhQ9f=woC~ z2Q3m364r_+URYgDgv84)!c5He`S3r)UJSh%W$4)1IZ_zP7R04|6ex)Zvda;;ke7;9 zV#L$7BqUK?vtzXH3{v=B*y)3b^^lWTwZr+U)QYjRL5{f%c)KWMS@{C-aBOWyo zAukp-NtqqX=fd_PSeUf2vcy=}**SXfy(q5>8xkwZ5OO006-Y>0UxQ<0nI~_>d|00( zUfvCj>tkbNrCv4joA}bbjD0QdHbOCm$rf0c-nT`LnxG>)GQeov7t%F@wxBqXR~FHWWwtVx(B-2_ + + \ No newline at end of file diff --git a/src/assets/icons/arrow-right.svg b/src/assets/icons/arrow-right.svg new file mode 100644 index 000000000..8d2207939 --- /dev/null +++ b/src/assets/icons/arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dots.svg b/src/assets/icons/dots.svg new file mode 100644 index 000000000..1056d9a1b --- /dev/null +++ b/src/assets/icons/dots.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/double-check.svg b/src/assets/icons/double-check.svg new file mode 100644 index 000000000..42fc66e35 --- /dev/null +++ b/src/assets/icons/double-check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/image.svg b/src/assets/icons/image.svg new file mode 100644 index 000000000..3f124e92f --- /dev/null +++ b/src/assets/icons/image.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/icons/paperclip.svg b/src/assets/icons/paperclip.svg new file mode 100644 index 000000000..97b038ee2 --- /dev/null +++ b/src/assets/icons/paperclip.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/search.svg b/src/assets/icons/search.svg new file mode 100644 index 000000000..c9af4b15d --- /dev/null +++ b/src/assets/icons/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/send.svg b/src/assets/icons/send.svg new file mode 100644 index 000000000..194d31ca4 --- /dev/null +++ b/src/assets/icons/send.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/avatar/avatar.hbs b/src/components/avatar/avatar.hbs new file mode 100644 index 000000000..c05357942 --- /dev/null +++ b/src/components/avatar/avatar.hbs @@ -0,0 +1,10 @@ +
+ {{#if image}} + image avatar + {{/if}} + {{#if isLoadAvatar}} +
+
Load New Avatar
+
+ {{/if}} +
\ No newline at end of file diff --git a/src/components/avatar/avatar.pcss b/src/components/avatar/avatar.pcss new file mode 100644 index 000000000..65a32eab8 --- /dev/null +++ b/src/components/avatar/avatar.pcss @@ -0,0 +1,58 @@ +.avatar { + border-radius: 100px; + border:1px var(--red) solid; + cursor: pointer; + height: 130px; + width: 130px; + display: flex; + justify-content: center; + align-items: center; + background: url("../../assets/icons/image.svg") no-repeat center; + position: relative; + + &.sm{ + height: 50px; + width: 50px; + } + + &:hover .avatar__image{ + background-color: var(--red); + } + + &:hover .avatar__hover{ + background-color: var(--red); + opacity: 0.8; + } + .avatar__image{ + border-radius: 100%; + width: 100%; + height: 100%; + transition: .5s ease; + backface-visibility: hidden; + opacity: 1; + display: block; + } + + .avatar__hover{ + transition: .5s ease; + opacity: 0; + position: absolute; + top: 50%; + left: 50%; + height: 130px; + width: 130px; + border-radius: 100%; + transform: translate(-50%, -50%); + display: flex; + align-items: center; + justify-content: center; + .avatar__hover__text{ + color: white; + font-size: 16px; + width: 100px; + text-align: center; + } + } + + +} \ No newline at end of file diff --git a/src/components/avatar/index.ts b/src/components/avatar/index.ts new file mode 100644 index 000000000..3ef359235 --- /dev/null +++ b/src/components/avatar/index.ts @@ -0,0 +1,2 @@ +import './avatar.pcss'; +export { default as Avatar } from './avatar.hbs?raw'; diff --git a/src/components/badge/badge.hbs b/src/components/badge/badge.hbs new file mode 100644 index 000000000..2d8a596aa --- /dev/null +++ b/src/components/badge/badge.hbs @@ -0,0 +1 @@ +
{{text}}
\ No newline at end of file diff --git a/src/components/badge/badge.pcss b/src/components/badge/badge.pcss new file mode 100644 index 000000000..06407bdcc --- /dev/null +++ b/src/components/badge/badge.pcss @@ -0,0 +1,31 @@ +.badge { + border: none; + border-radius: 20px; + padding: 1px 6px; + cursor: pointer; + background:transparent; + width: auto; + max-width: 45px; + + span{ + text-align: center; + font-size: 12px; + color: var(--gray-light); + } + + &.badge-primary { + background: var(--gray-light); + + span{ + color: var(--white); + } + } + &.badge-ready{ + span{ + color: var(--red); + } + } + +} + + diff --git a/src/components/badge/index.ts b/src/components/badge/index.ts new file mode 100644 index 000000000..2382fb45d --- /dev/null +++ b/src/components/badge/index.ts @@ -0,0 +1,2 @@ +import './badge.pcss'; +export { default as Badge } from './badge.hbs?raw'; diff --git a/src/components/button/button.hbs b/src/components/button/button.hbs new file mode 100644 index 000000000..1a0fc7012 --- /dev/null +++ b/src/components/button/button.hbs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/button/button.pcss b/src/components/button/button.pcss new file mode 100644 index 000000000..05df5f5c0 --- /dev/null +++ b/src/components/button/button.pcss @@ -0,0 +1,71 @@ +.button { + background: var(--red); + color: var(--white); + font-weight: bold; + font-size: 14px; + text-transform: uppercase; + border: none; + border-radius: 20px; + padding: 10px 20px; + cursor: pointer; + max-width: 280px; + height: 38px; + width: 100%; + + &:hover { + opacity: 0.8; + } +} + +.button-arrow { + padding: 0; + background-image: url("../../assets/icons/send.svg"); + background-repeat: no-repeat; + background-position: center; + background-size: 60%; + width: 36px; + height: 36px; +} + +.button-dots { + padding: 0; + background-image: url("../../assets/icons/dots.svg"); + background-repeat: no-repeat; + background-position: center; + background-size: 60%; + background-color: transparent; + width: 36px; + height: 36px; +} + +.button-paperclip { + padding: 0; + background-image: url("../../assets/icons/paperclip.svg"); + background-repeat: no-repeat; + background-position: center; + background-size: 60%; + background-color: transparent; + width: 50px; + height: 50px; +} + +.button-cancel { + padding: 0; + background-image: url("../../assets/icons/arrow-left.svg"); + background-repeat: no-repeat; + background-position: center; + background-size: 60%; + width: 36px; + height: 36px; +} + +.button-number { + padding: 10px; + max-width: 36px; + display: flex; + align-items: center; + justify-content: center; + width: 25px; + height: 25px; +} + diff --git a/src/components/button/index.ts b/src/components/button/index.ts new file mode 100644 index 000000000..f3d2c354f --- /dev/null +++ b/src/components/button/index.ts @@ -0,0 +1,2 @@ +import './button.pcss'; +export { default as Button } from './button.hbs?raw'; diff --git a/src/components/chat-item/chat-item.hbs b/src/components/chat-item/chat-item.hbs new file mode 100644 index 000000000..f746634e7 --- /dev/null +++ b/src/components/chat-item/chat-item.hbs @@ -0,0 +1,21 @@ +
+ {{#with chat}} +
+ {{> Avatar image=avatar size='sm'}} +
+
+
+ {{title}} +
+
+ {{last_message.time}} +
+
+
+
+

{{last_message.content}}

+
+ {{> Button type="number" caption=unread_count}} +
+ {{/with}} +
diff --git a/src/components/chat-item/chat-item.pcss b/src/components/chat-item/chat-item.pcss new file mode 100644 index 000000000..912a5cb06 --- /dev/null +++ b/src/components/chat-item/chat-item.pcss @@ -0,0 +1,48 @@ +.chat-item { + display: grid; + grid-template: + "a b" 20px + "a c" 1fr / 47px 1fr; + gap: 4px 10px; + grid-auto-flow: column; + border-bottom: 1px solid var(--gray-light); + height: 80px; + width: 310px; + margin: 10px 0; + +} + +.chat-item__avatar { + grid-area: a; + display: flex; + align-items: center; +} + +.chat-item__caption { + grid-area: b; + display: flex; + justify-content: space-between; + width: 100%; + + .chat-item__caption__name { + font-weight: bold; + } +} + +.chat-item__message { + grid-area: c; + display: flex; + justify-content: space-between; + align-items: flex-start; + + .chat-item__message__content p { + color: var(--gray-light); + width: 200px; + margin: 0; + -webkit-line-clamp: 2; + display: -webkit-box; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + } +} \ No newline at end of file diff --git a/src/components/chat-item/index.ts b/src/components/chat-item/index.ts new file mode 100644 index 000000000..e3afa1a4e --- /dev/null +++ b/src/components/chat-item/index.ts @@ -0,0 +1,2 @@ +import './chat-item.pcss'; +export { default as ChatItem } from './chat-item.hbs?raw'; diff --git a/src/components/chat-list/chat-list.hbs b/src/components/chat-list/chat-list.hbs new file mode 100644 index 000000000..254367f6d --- /dev/null +++ b/src/components/chat-list/chat-list.hbs @@ -0,0 +1,13 @@ +
+
+ {{>Link caption="Profile" page="pageProfile" linkIcon=true }} +
+ +
+ {{#each list as |chat|}} + {{>ChatItem chat=chat}} + {{/each}} +
+
diff --git a/src/components/chat-list/chat-list.pcss b/src/components/chat-list/chat-list.pcss new file mode 100644 index 000000000..19aebc752 --- /dev/null +++ b/src/components/chat-list/chat-list.pcss @@ -0,0 +1,23 @@ +.chat-list { + display: flex; + flex-direction: column; + border-right: 1px solid var(--gray-light); + height: 100%; + //max-width: 340px; + padding: 10px; + + +.chat-list__header { + display: flex; + justify-content: flex-end; +} + +.chat-list__search { + padding: 10px 0; + margin-bottom: 10px; + border-bottom: 1px solid var(--gray-light); +} + .chat-list__chats{ + overflow-y:auto ; + } +} \ No newline at end of file diff --git a/src/components/chat-list/index.ts b/src/components/chat-list/index.ts new file mode 100644 index 000000000..aac275333 --- /dev/null +++ b/src/components/chat-list/index.ts @@ -0,0 +1,2 @@ +import './chat-list.pcss'; +export { default as ChatList } from './chat-list.hbs?raw'; diff --git a/src/components/error/error.hbs b/src/components/error/error.hbs new file mode 100644 index 000000000..8dc40e54e --- /dev/null +++ b/src/components/error/error.hbs @@ -0,0 +1,10 @@ +
+

{{errorNumber}}

+

+ Woops! +

+

+ {{errorText}} +

+ {{>Link caption="Go back" page=page }} +
\ No newline at end of file diff --git a/src/components/error/error.pcss b/src/components/error/error.pcss new file mode 100644 index 000000000..7e652b67f --- /dev/null +++ b/src/components/error/error.pcss @@ -0,0 +1,19 @@ +.error { + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + .error__number{ + color:var(--red); + font-weight:bold; + font-size:40px; + } + .error__text{ + color:var(--gray-dark); + font-weight:bold; + font-size:18px; + margin:20px + } +} + + diff --git a/src/components/error/index.ts b/src/components/error/index.ts new file mode 100644 index 000000000..7f46e5502 --- /dev/null +++ b/src/components/error/index.ts @@ -0,0 +1,2 @@ +import './error.pcss'; +export { default as Error } from './error.hbs?raw'; diff --git a/src/components/form-auth/form-auth.hbs b/src/components/form-auth/form-auth.hbs new file mode 100644 index 000000000..d722c33c4 --- /dev/null +++ b/src/components/form-auth/form-auth.hbs @@ -0,0 +1,12 @@ +
+

+ {{caption}} +

+
+ {{> @partial-block }} +
+
+ {{> Button caption=ok-text page=ok-page }} + {{>Link caption=cancel-text page=cancel-page }} +
+
\ No newline at end of file diff --git a/src/components/form-auth/form-auth.pcss b/src/components/form-auth/form-auth.pcss new file mode 100644 index 000000000..c0aface79 --- /dev/null +++ b/src/components/form-auth/form-auth.pcss @@ -0,0 +1,25 @@ +.container-form { + display: grid; + grid-template-rows: 0.1fr 0.9fr auto; + grid-template-columns: 1fr; + gap: 10px; + padding: 30px; + min-height: 460px; + width: 340px; + + .container-form__header { + text-align: center; + font-size: 1.5em; + } + + .container-form__buttons { + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + width: 100%; + min-height: 74px; + margin-top: 30px; + align-self: end; + } +} \ No newline at end of file diff --git a/src/components/form-auth/index.ts b/src/components/form-auth/index.ts new file mode 100644 index 000000000..ba7d00a1e --- /dev/null +++ b/src/components/form-auth/index.ts @@ -0,0 +1,2 @@ +import './form-auth.pcss'; +export { default as FormAuth } from './form-auth.hbs?raw'; diff --git a/src/components/form-profile/form-profile.hbs b/src/components/form-profile/form-profile.hbs new file mode 100644 index 000000000..e987f38d7 --- /dev/null +++ b/src/components/form-profile/form-profile.hbs @@ -0,0 +1,25 @@ +
+
+ {{> Avatar image=user.image}} +

{{user.firstName}} {{user.lastName}}

+
+ {{#with user}} +
+ {{> @partial-block }} +
+ {{/with}} + {{#if withButton}} +
+ {{> Button caption=button-text page=button-page }} +
+ {{else}} +
+ {{>Link caption="Change User Data" page="pageProfileEdit" type='success' linkLine=true }} + {{>Link caption="Change Password" page="pagePasswordEdit" type='success' linkLine=true }} + {{>Link caption="Cancel" page=button-page type='danger' }} +
+ {{/if}} +
+
+ {{> Button type="cancel" page=button-page }} +
\ No newline at end of file diff --git a/src/components/form-profile/form-profile.pcss b/src/components/form-profile/form-profile.pcss new file mode 100644 index 000000000..a9ce09571 --- /dev/null +++ b/src/components/form-profile/form-profile.pcss @@ -0,0 +1,48 @@ +.profile { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 60px; + + .profile__avatar { + text-align: center; + + .profile__avatar__name{ + font-size: 16px; + font-weight: bold; + color:var(--red); + margin-top:15px ; + } + } + + .profile__main{ + margin: 80px 0; + } + + .profile__buttons { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: space-between; + width: 100%; + margin-top: 30px; + align-self: end; + } +} + +.block-cancel{ + position: absolute; + top:0; + left:0; + height:100vh; + width: 64px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--gray-0); + border-right: 1px solid var(--gray-1); + &:hover{ + opacity: 0.8; + } +} \ No newline at end of file diff --git a/src/components/form-profile/index.ts b/src/components/form-profile/index.ts new file mode 100644 index 000000000..8422934a0 --- /dev/null +++ b/src/components/form-profile/index.ts @@ -0,0 +1,2 @@ +import './form-profile.pcss'; +export { default as FormProfile } from './form-profile.hbs?raw'; diff --git a/src/components/index.ts b/src/components/index.ts new file mode 100644 index 000000000..80d5156ab --- /dev/null +++ b/src/components/index.ts @@ -0,0 +1,16 @@ +export { Button } from './button'; +export { Input } from './input'; +export { Link } from './link'; +export { Loader } from './loader'; +export { Avatar } from './avatar'; +export { InputWide } from './input-wide'; +export { FormAuth } from './form-auth'; +export { FormProfile } from './form-profile'; +export { Modal } from './modal'; +export { ChatItem } from './chat-item'; +export { InputSearch } from './input-search'; +export { ChatList } from './chat-list'; +export { MessageList } from './message-list'; +export { Message } from './message'; +export { Badge } from './badge'; +export { Error } from './error'; \ No newline at end of file diff --git a/src/components/input-search/index.ts b/src/components/input-search/index.ts new file mode 100644 index 000000000..a98caeeb6 --- /dev/null +++ b/src/components/input-search/index.ts @@ -0,0 +1,2 @@ +import './input-search.pcss'; +export { default as InputSearch } from './input-search.hbs?raw'; diff --git a/src/components/input-search/input-search.hbs b/src/components/input-search/input-search.hbs new file mode 100644 index 000000000..f9646e8ba --- /dev/null +++ b/src/components/input-search/input-search.hbs @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/src/components/input-search/input-search.pcss b/src/components/input-search/input-search.pcss new file mode 100644 index 000000000..001602d65 --- /dev/null +++ b/src/components/input-search/input-search.pcss @@ -0,0 +1,56 @@ +.input-search { + position: relative; + padding: 5px; + border-radius: 12px; + background-color: var(--gray-0); + min-width: 290px; + display: block; + .input-search__label { + content: "Search..."; + color: var(--gray-light); + position: absolute; + top: 15px; + left: 40%; + } + + &::before { + content: ""; + background: url("../../assets/icons/search.svg") no-repeat; + position: absolute; + top: 17px; + left: 32%; + width: 20px; + height: 20px; + } + .input-search__value { + display: flex; + height: 38px; + flex-direction: column; + align-content: flex-end; + position: relative; + width: 100%; + border:none; + background-color: transparent; + transition-duration: 600ms; + cursor: pointer; + padding: 10px; + + &:focus { + background-color: var(--gray-0); + border:none; + transition-duration: 300ms; + } + &:focus-visible { + outline: none; + } + &:not(:placeholder-shown) { + background-color: var(--gray-0); + border:none; + transition-duration: 300ms; + } + } +} + + + + diff --git a/src/components/input-wide/index.ts b/src/components/input-wide/index.ts new file mode 100644 index 000000000..fff32995c --- /dev/null +++ b/src/components/input-wide/index.ts @@ -0,0 +1,2 @@ +import './input-wide.pcss'; +export { default as InputWide } from './input-wide.hbs?raw'; diff --git a/src/components/input-wide/input-wide.hbs b/src/components/input-wide/input-wide.hbs new file mode 100644 index 000000000..f4f5ec093 --- /dev/null +++ b/src/components/input-wide/input-wide.hbs @@ -0,0 +1,18 @@ +
+ + {{#if error}} +
+
{{errorText}}
+
+ {{/if}} +
\ No newline at end of file diff --git a/src/components/input-wide/input-wide.pcss b/src/components/input-wide/input-wide.pcss new file mode 100644 index 000000000..bba86c804 --- /dev/null +++ b/src/components/input-wide/input-wide.pcss @@ -0,0 +1,54 @@ +.input-wide { + .input-wide__container { + display: flex; + justify-content: space-between; + align-items: flex-end; + height: 38px; + width: 510px; + border-bottom: 1px solid var(--gray-light); + padding:5px 0; + } + .input-wide__container-noline{ + border-bottom:none; + } + .input-wide__label { + color: var(--gray-dark); + font-weight: 500; + user-select: none; + min-width: auto; + } + + .input-wide__value { + border: none; + color: var(--gray-light); + text-align: end; + max-width: 50%; + &:focus-visible { + outline: none; + } + + } + + .input-wide__text{ + color: var(--gray-light); + display: block; + } + + .input-wide__text-error { + color: var(--red); + font-size: 11px; + font-weight: 400; + text-align: end; + margin-top:5px; + } + .input__value-error { + color: var(--red); + } + .input__value-disabled{ + display: none; + } +} + + + + diff --git a/src/components/input/index.ts b/src/components/input/index.ts new file mode 100644 index 000000000..d02901614 --- /dev/null +++ b/src/components/input/index.ts @@ -0,0 +1,2 @@ +import './input.pcss'; +export { default as Input } from './input.hbs?raw'; diff --git a/src/components/input/input.hbs b/src/components/input/input.hbs new file mode 100644 index 000000000..638d08233 --- /dev/null +++ b/src/components/input/input.hbs @@ -0,0 +1,17 @@ +
+ +
\ No newline at end of file diff --git a/src/components/input/input.pcss b/src/components/input/input.pcss new file mode 100644 index 000000000..5100f32f5 --- /dev/null +++ b/src/components/input/input.pcss @@ -0,0 +1,62 @@ +.input { + padding: 10px; + + .input__container { + display: flex; + height: 38px; + flex-direction: column; + align-content: flex-end; + } + + .input__label { + transform: translateY(-21px); + color: var(--gray-light); + font-size: 13px; + font-weight: 500; + user-select: none; + transition: + font-size 0.5s, + transform 0.5s; + } + + .input__value { + border: none; + border-bottom: 1px solid var(--gray-light); + font-size: 13px; + font-weight: 500; + color: var(--gray-dark); + padding: 0 0 7px; + + &:focus-visible { + outline: none; + } + + &:not(:placeholder-shown) + .input__label, + &:focus + .input__label { + transform: translateY(-36px); + font-size: 9px; + } + } + + .input__text-error { + transform: translateY(-7px); + color: var(--red); + font-size: 8px; + font-weight: 400; + display: none; + + } + + + .input__error .input__text-error { + display: block; + } + + .input__value-error { + color: var(--red); + } +} + + + + diff --git a/src/components/link/index.ts b/src/components/link/index.ts new file mode 100644 index 000000000..a62ffdb09 --- /dev/null +++ b/src/components/link/index.ts @@ -0,0 +1,2 @@ +import './link.pcss'; +export { default as Link } from './link.hbs?raw'; diff --git a/src/components/link/link.hbs b/src/components/link/link.hbs new file mode 100644 index 000000000..784966727 --- /dev/null +++ b/src/components/link/link.hbs @@ -0,0 +1,6 @@ +
+ {{caption}} + {{#if linkIcon}} {{/if}} + \ No newline at end of file diff --git a/src/components/link/link.pcss b/src/components/link/link.pcss new file mode 100644 index 000000000..6ca3f647e --- /dev/null +++ b/src/components/link/link.pcss @@ -0,0 +1,37 @@ +.link { + color: var(--gray-light); + font-weight: bolder; + cursor: pointer; + text-decoration: none; + padding: 5px; + display: flex; + + + &:hover { + text-decoration: underline; + } + &.link-line{ + border-bottom: 1px solid var(--gray-light); + width: 510px; + } + + .link-icon{ + background: url("../../assets/icons/arrow-right.svg") no-repeat; + width: 12px; + height: 12px; + margin-left: 5px; + margin-top: 5px; + font-size: 16px; + } + &.link-primary{ + color: var(--gray-light); + } + &.link-success{ + color: var(--success); + } + &.link-danger{ + color: var(--red); + } +} + + diff --git a/src/components/loader/index.ts b/src/components/loader/index.ts new file mode 100644 index 000000000..768bc084d --- /dev/null +++ b/src/components/loader/index.ts @@ -0,0 +1,2 @@ +import './loader.css'; +export { default as Loader } from './loader.hbs?raw'; diff --git a/src/components/loader/loader.css b/src/components/loader/loader.css new file mode 100644 index 000000000..3b48860cc --- /dev/null +++ b/src/components/loader/loader.css @@ -0,0 +1,33 @@ +.loader { + width: 48px; + height: 48px; + display: inline-block; + position: relative; +} + +.loader::after, +.loader::before { + content: ''; + width: 48px; + height: 48px; + border: 2px solid #242424; + position: absolute; + left: 0; + top: 0; + box-sizing: border-box; + animation: rotation 2s ease-in-out infinite; +} + +.loader::after { + border-color: #FF3D00; + animation-delay: 1s; +} + +@keyframes rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/src/components/loader/loader.hbs b/src/components/loader/loader.hbs new file mode 100644 index 000000000..f23547956 --- /dev/null +++ b/src/components/loader/loader.hbs @@ -0,0 +1 @@ + diff --git a/src/components/message-list/index.ts b/src/components/message-list/index.ts new file mode 100644 index 000000000..4c21edd17 --- /dev/null +++ b/src/components/message-list/index.ts @@ -0,0 +1,2 @@ +import './message-list.pcss'; +export { default as MessageList } from './message-list.hbs?raw'; diff --git a/src/components/message-list/message-list.hbs b/src/components/message-list/message-list.hbs new file mode 100644 index 000000000..67591e553 --- /dev/null +++ b/src/components/message-list/message-list.hbs @@ -0,0 +1,28 @@ +
+
+ {{#with currentUser}} +
+ {{> Avatar image=avatar size='sm'}} + {{nameInChat}} +
+ {{> Button type="dots"}} + {{/with}} +
+
+ {{#each messageList as |message|}} +
+ {{>Message message=message myMessage=message.main}} +
+ {{/each}} +
+ +
diff --git a/src/components/message-list/message-list.pcss b/src/components/message-list/message-list.pcss new file mode 100644 index 000000000..d78421581 --- /dev/null +++ b/src/components/message-list/message-list.pcss @@ -0,0 +1,62 @@ +.message-list { + display: grid; + grid-template-rows: auto 1fr auto; + + height: 100vh; + width: 100%; + padding: 10px; + + + + .message-list__header { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid var(--gray-light); + padding: 10px; + + .message-list__header__avatar { + display: flex; + align-items: center; + + span { + padding-left: 20px; + font-size: 16px; + font-weight: bold; + } + } + + } + + .message-list__main { + display: flex; + flex-direction: column; + overflow-y: auto; + padding: 20px 0; + margin-bottom:20px; + height: 100%; + .message-list__main__message{ + margin:20px 10px; + } + } + + .message-list__footer { + width: 100%; + max-height: 200px; + padding: 10px; + border-top: 1px solid var(--gray-light); + display: grid; + grid-template-columns: auto 1fr auto; + column-gap: 10px; + align-items: center; + + .message-list__footer__input{ + padding: 15px 10px; + border-radius: 15px; + background-color: var(--gray-0); + border:none; + + } + } + +} \ No newline at end of file diff --git a/src/components/message/index.ts b/src/components/message/index.ts new file mode 100644 index 000000000..0e8f55e95 --- /dev/null +++ b/src/components/message/index.ts @@ -0,0 +1,2 @@ +import './message.pcss'; +export { default as Message } from './message.hbs?raw'; diff --git a/src/components/message/message.hbs b/src/components/message/message.hbs new file mode 100644 index 000000000..65737c600 --- /dev/null +++ b/src/components/message/message.hbs @@ -0,0 +1,19 @@ +
+ {{#with message}} + {{#if file}} +
+ included file +
+ {{>Badge text="01.20" type="primary"}} +
+
+ {{else}} +
+

{{content}}

+
+ {{>Badge text="01.20" }} +
+
+ {{/if}} + {{/with}} +
diff --git a/src/components/message/message.pcss b/src/components/message/message.pcss new file mode 100644 index 000000000..2debf00a7 --- /dev/null +++ b/src/components/message/message.pcss @@ -0,0 +1,61 @@ +.message { + border: 1px solid var(--gray-0); + border-radius: 15px; + height: auto; + width: auto; + box-shadow: 0 0 5px 0 rgb(0 0 0 / 10%); + float:left; + max-width: 50%; + min-width: 200px; + + &.message-my { + border-radius:15px 15px 0 15px; + background-color: var(--red-light); + border: 1px solid var(--red-light); + float:right; + max-width: 50%; + min-width: 200px; + + .badge { + background-color: transparent; + + span { + color: var(--red); + } + + position: relative; + + &::before { + content: ""; + background-image: url("../../assets/icons/double-check.svg"); + width: 16px; + height: 16px; + position: absolute; + top:3px; + left:-16px; + } + } + } + + .message__file { + padding: 11px; + width: auto; + height: 95%; + img { + object-fit: contain; + width: 100%; + + } + } + + .message__text { + padding: 11px; + background-color:transparent; + + } + + .message__time { + display: flex; + justify-content: flex-end; + } +} \ No newline at end of file diff --git a/src/components/modal/index.ts b/src/components/modal/index.ts new file mode 100644 index 000000000..c8f6321b0 --- /dev/null +++ b/src/components/modal/index.ts @@ -0,0 +1,2 @@ +import './modal.pcss'; +export { default as Modal } from './modal.hbs?raw'; diff --git a/src/components/modal/modal.hbs b/src/components/modal/modal.hbs new file mode 100644 index 000000000..ad19ba894 --- /dev/null +++ b/src/components/modal/modal.hbs @@ -0,0 +1,15 @@ + + diff --git a/src/components/modal/modal.pcss b/src/components/modal/modal.pcss new file mode 100644 index 000000000..d1ef33be1 --- /dev/null +++ b/src/components/modal/modal.pcss @@ -0,0 +1,40 @@ +.modal { + display: grid; + grid-template-rows: 0.1fr 0.9fr auto; + grid-template-columns: 1fr; + gap: 10px; + padding: 30px; + min-height: 300px; + width: 340px; + z-index: 100; + + .modal__header { + text-align: center; + font-size: 1.5em; + } + + .modal__footer { + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + width: 100%; + min-height: 74px; + margin-top: 30px; + align-self: end; + } +} + +.modal-background{ + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: rgb(0 0 0 / 20%); + backdrop-filter: blur(5px); + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; +} \ No newline at end of file diff --git a/src/index.html b/src/index.html new file mode 100644 index 000000000..0d631de7b --- /dev/null +++ b/src/index.html @@ -0,0 +1,15 @@ + + + + + + + Chat + + + +
+ + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 000000000..2aa5f53b2 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,41 @@ +import './styles/main.css'; +import Handlebars from 'handlebars'; +import * as Components from './components'; +import * as Pages from './pages'; +import {mockUser} from "./mocks/user-profile.mocks"; +import {chat1, mockListChats} from "./mocks/chat.mocks"; +import {message1, mockListMessages} from "./mocks/chat-message.mocks"; + +const pages = { + "allComponents": [Pages.AllComponentsPage,{chat1:chat1,chatList:mockListChats,message:message1,messageList:mockListMessages,currentUser:mockUser}], + "loginPage": [Pages.PageLogin], + "pageRegistration": [Pages.PageRegistration], + "pageProfile": [Pages.PageProfile,{user:mockUser}], + "pageProfileEdit": [Pages.PageProfileEdit,{user:mockUser}], + "pagePasswordEdit": [Pages.PagePasswordEdit,{user:mockUser}], + "pageChat": [Pages.PageChat,{chatList:mockListChats,messageList:mockListMessages,currentUser:mockUser}], + "page500": [Pages.Page500], + "page404": [Pages.Page404] +}; +Object.entries(Components).forEach(([name, component]) => { + Handlebars.registerPartial(name, component); +}); + +const navigate = (page: string) => { + //@ts-ignore + const [source, context] = pages[page]; + const container = document.getElementById('app')!; + container.innerHTML = Handlebars.compile(source)(context); +} + +document.addEventListener('DOMContentLoaded', () => navigate('allComponents')); + +document.addEventListener('click', e => { + //@ts-ignore + const page = e.target.getAttribute('page'); + if (page) { + navigate(page); + e.preventDefault(); + e.stopImmediatePropagation(); + } +}); \ No newline at end of file diff --git a/src/mocks/chat-message.mocks.ts b/src/mocks/chat-message.mocks.ts new file mode 100644 index 000000000..8ba86bbcc --- /dev/null +++ b/src/mocks/chat-message.mocks.ts @@ -0,0 +1,42 @@ +import {ChatMessage} from "../models/chat-message"; + +export const message1: ChatMessage = { + id: 123, + user_id: 231, + chat_id: 312, + time: "2020-01-02", + type: "file", + content: 132, + file: { + id: 132, + user_id: 231, + path: "../../assets/avatars/2.jpg", + filename: "file name", + content_type: "image/jpeg", + content_size: 543672, + upload_date: "2020-01-02T14:22:22.000Z" + } +} + +export const message2: ChatMessage = { + id: 123, + user_id: 231, + chat_id: 312, + time: "2020-01-02", + type: "text", + content: 'Привет! Смотри, тут всплыл интересный кусок лунной космической истории — НАСА в какой-то момент попросила Хассельблад адаптировать модель SWC для полетов на Луну. Сейчас мы все знаем что астронавты летали с моделью 500 EL — и к слову говоря, все тушки этих камер все еще находятся на поверхности Луны, так как астронавты с собой забрали только кассеты с пленкой.\n' + + '\n' + + 'Хассельблад в итоге адаптировал SWC для космоса, но что-то пошло не так и на ракету они так никогда и не попали. Всего их было произведено 25 штук, одну из них недавно продали на аукционе за 45000 евро.', +} + +export const message3: ChatMessage = { + id: 123, + user_id: 231, + chat_id: 312, + time: "2020-01-02", + type: "file", + content: 'Круто!!!', + main:true, +} + +export const mockListMessages=[message1,message2,message3] \ No newline at end of file diff --git a/src/mocks/chat.mocks.ts b/src/mocks/chat.mocks.ts new file mode 100644 index 000000000..25e210400 --- /dev/null +++ b/src/mocks/chat.mocks.ts @@ -0,0 +1,63 @@ +import {Chat} from "../models/chat"; + +export const chat1:Chat={ + id: 123, + title: "my-chat", + avatar: "../../assets/avatars/3.jpg", + unread_count: 15, + created_by: 12345, + last_message: { + user: { + first_name: "Petya", + second_name: "Pupkin", + avatar: "../../assets/avatars/3.jpg", + email: "my@email.com", + login: "userLogin", + phone: "8(911)-222-33-22", + }, + time: "01.20", + content: "this is message content this is message content this is message content this is message content" + } +} + +export const chat2:Chat={ + id: 124, + title: "my-chat1", + avatar: "../../assets/avatars/1.jpeg", + unread_count: 15, + created_by: 12345, + last_message: { + user: { + first_name: "Lena", + second_name: "Lukova", + avatar: "../../assets/avatars/1.jpeg", + email: "my@email.com", + login: "lenaLogin", + phone: "8(911)-222-33-22", + }, + time: "Fr", + content: "supper content" + } +} + +export const chat3:Chat={ + id: 125, + title: "my-chat3", + avatar: "../../assets/avatars/1.jpeg", + unread_count: 0, + created_by: 12345, + last_message: { + user: { + first_name: "Lena", + second_name: "Lukova", + avatar: "../../assets/avatars/1.jpeg", + email: "my@email.com", + login: "lenaLogin", + phone: "8(911)-222-33-22", + }, + time: "20 may 2023", + content: "supper content" + } +} + +export const mockListChats=[chat1,chat2,chat3] \ No newline at end of file diff --git a/src/mocks/user-profile.mocks.ts b/src/mocks/user-profile.mocks.ts new file mode 100644 index 000000000..3fb3174f2 --- /dev/null +++ b/src/mocks/user-profile.mocks.ts @@ -0,0 +1,12 @@ +import {User} from "../models/user"; + +export const mockUser:User={ + first_name: "Elena", + second_name: "Family", + login: "loginElena", + nameInChat: "ElenaChat", + password: "password123", + phone: "+7985632369", + email:"email@gmail.com", + avatar: "../../assets/avatars/1.jpeg", +} \ No newline at end of file diff --git a/src/models/chat-message.ts b/src/models/chat-message.ts new file mode 100644 index 000000000..9242ea58b --- /dev/null +++ b/src/models/chat-message.ts @@ -0,0 +1,12 @@ +import {File} from "./file"; + +export interface ChatMessage { + id: number; + user_id: number; + chat_id: number; + time: string; + type: string; + content: number|string; + file?: File; + main?:boolean; +} \ No newline at end of file diff --git a/src/models/chat.ts b/src/models/chat.ts new file mode 100644 index 000000000..a25d6a3c0 --- /dev/null +++ b/src/models/chat.ts @@ -0,0 +1,19 @@ +import {User} from "./user"; + +export interface Chat { + id: number; + title: string; + avatar: string; + unread_count: number; + created_by: number; + last_message: LastMessage; +} + +export interface LastMessage { + user: User; + time: string; + content: string; +} + + + diff --git a/src/models/file.ts b/src/models/file.ts new file mode 100644 index 000000000..919395ca2 --- /dev/null +++ b/src/models/file.ts @@ -0,0 +1,9 @@ +export interface File { + id: number; + user_id: number; + path: string; + filename: string; + content_type: string; + content_size: number; + upload_date: string; +} \ No newline at end of file diff --git a/src/models/user.ts b/src/models/user.ts new file mode 100644 index 000000000..272ffd920 --- /dev/null +++ b/src/models/user.ts @@ -0,0 +1,10 @@ +export interface User { + login?:string; + password?:string; + nameInChat?:string; + first_name:string; + second_name:string; + phone:string; + email:string; + avatar?:string; +} \ No newline at end of file diff --git a/src/pages/404/404.hbs b/src/pages/404/404.hbs new file mode 100644 index 000000000..e54f19bb7 --- /dev/null +++ b/src/pages/404/404.hbs @@ -0,0 +1,3 @@ +
+ {{>Error errorNumber="404" errorText="Page Not Found" page="pageChat"}} +
\ No newline at end of file diff --git a/src/pages/404/index.ts b/src/pages/404/index.ts new file mode 100644 index 000000000..d69c907ce --- /dev/null +++ b/src/pages/404/index.ts @@ -0,0 +1 @@ +export { default as Page404 } from './404.hbs?raw'; diff --git a/src/pages/500/500.hbs b/src/pages/500/500.hbs new file mode 100644 index 000000000..e0b9e8fc4 --- /dev/null +++ b/src/pages/500/500.hbs @@ -0,0 +1,3 @@ +
+ {{>Error errorNumber="500" errorText="Something went wrong :(" page="pageChat"}} +
\ No newline at end of file diff --git a/src/pages/500/index.ts b/src/pages/500/index.ts new file mode 100644 index 000000000..e31f83152 --- /dev/null +++ b/src/pages/500/index.ts @@ -0,0 +1 @@ +export { default as Page500 } from './500.hbs?raw'; diff --git a/src/pages/all-components/all-components.css b/src/pages/all-components/all-components.css new file mode 100644 index 000000000..0ec7c80ba --- /dev/null +++ b/src/pages/all-components/all-components.css @@ -0,0 +1,9 @@ +.container-all{ + display: grid; + grid-template-rows: repeat(10,auto); + gap:10px; + justify-items: center; + width: 100vw; + height: 100vh; + padding: 20px; +} \ No newline at end of file diff --git a/src/pages/all-components/all-components.hbs b/src/pages/all-components/all-components.hbs new file mode 100644 index 000000000..d6e89e271 --- /dev/null +++ b/src/pages/all-components/all-components.hbs @@ -0,0 +1,31 @@ +
+
+ {{#> AllComponents}} + + {{> Button caption="sign in"}} + {{> Button type="number" caption="330"}} + {{> Button type="arrow" page="pageChat"}} + {{> Loader}} + {{>Link caption="Login" page="loginPage" linkIcon=true }} + {{>Link caption="Profile" type='success' page="page404" }} + {{>Link caption="Edit Profile" page="pageProfileEdit" type='danger' linkLine=true }} + {{>Input label="Login" type="text" name="login" }} + {{>Input label="Error" type="text" name="error" error=true errorText='Error!!'}} + {{> Avatar isLoadAvatar=true}} + {{> Avatar image="../../assets/avatars/1.jpeg"isLoadAvatar=true}} + {{> Avatar image="../../assets/avatars/2.jpg"isLoadAvatar=true}} + {{> Avatar image="../../assets/avatars/3.jpg"isLoadAvatar=true}} + {{>InputWide label="Login" type="text" name="login" value='MyLogin' readOnly=false }} + {{>InputWide label="Login" type="text" name="login" value='MyLogin' readOnly=true noLine=true }} + {{>InputWide label="Error" type="text" name="error" error=true errorText='Error!!' readOnly=false}} + {{>ChatItem chat=chat1}} + {{>InputSearch }} + {{>Badge text="01.20" type="primary"}} {{>Badge text="01.20" }} + {{/AllComponents}} +
+ +
+ diff --git a/src/pages/all-components/index.ts b/src/pages/all-components/index.ts new file mode 100644 index 000000000..05ad87cbb --- /dev/null +++ b/src/pages/all-components/index.ts @@ -0,0 +1,2 @@ +import './all-components.css'; +export { default as AllComponentsPage } from './all-components.hbs?raw'; diff --git a/src/pages/chat-page/chat-page.css b/src/pages/chat-page/chat-page.css new file mode 100644 index 000000000..2ff35f4e1 --- /dev/null +++ b/src/pages/chat-page/chat-page.css @@ -0,0 +1,23 @@ +.chat-page { + width: 100vw; + height: 100vh; + + display: grid; + grid-template-columns: auto 1fr; + grid-template-rows: 1fr; + gap: 0 0; + grid-auto-flow: row; + grid-template-areas: + "chat-page__left chat-page__main"; + overflow-y: hidden; + overflow-x: hidden; +} + +.chat-page__left { + grid-area: chat-page__left; + max-width: 350px; +} + +.chat-page__main { + grid-area: chat-page__main; +} diff --git a/src/pages/chat-page/chat-page.hbs b/src/pages/chat-page/chat-page.hbs new file mode 100644 index 000000000..a13914bf8 --- /dev/null +++ b/src/pages/chat-page/chat-page.hbs @@ -0,0 +1,9 @@ + +
+
+ {{>ChatList list=chatList}} +
+
+ {{>MessageList messageList=messageList currentUser=currentUser}} +
+
diff --git a/src/pages/chat-page/index.ts b/src/pages/chat-page/index.ts new file mode 100644 index 000000000..07c56de4c --- /dev/null +++ b/src/pages/chat-page/index.ts @@ -0,0 +1,3 @@ +import "./chat-page.css"; + +export { default as PageChat } from './chat-page.hbs?raw'; diff --git a/src/pages/index.ts b/src/pages/index.ts new file mode 100644 index 000000000..742d908e1 --- /dev/null +++ b/src/pages/index.ts @@ -0,0 +1,9 @@ +export { AllComponentsPage } from './all-components'; +export { PageLogin } from './login'; +export { PageRegistration } from './registration'; +export { PageProfileEdit } from './profile-edit'; +export { PageProfile } from './profile'; +export { PagePasswordEdit } from './password-edit'; +export { PageChat } from './chat-page'; +export { Page500} from './500'; +export { Page404} from './404'; diff --git a/src/pages/login/index.ts b/src/pages/login/index.ts new file mode 100644 index 000000000..ebe40f0ed --- /dev/null +++ b/src/pages/login/index.ts @@ -0,0 +1 @@ +export { default as PageLogin } from './login.hbs?raw'; diff --git a/src/pages/login/login.hbs b/src/pages/login/login.hbs new file mode 100644 index 000000000..7cf4bf61c --- /dev/null +++ b/src/pages/login/login.hbs @@ -0,0 +1,8 @@ +
+ {{#> FormAuth caption='Login' ok-text='sign in' cancel-text='Register' ok-page='pageChat' cancel-page='pageRegistration'}} +
+ {{>Input label="Login" type="text" name="login" }} + {{>Input label="Password" type="password" name="password"}} +
+ {{/FormAuth}} +
\ No newline at end of file diff --git a/src/pages/password-edit/index.ts b/src/pages/password-edit/index.ts new file mode 100644 index 000000000..e884824a3 --- /dev/null +++ b/src/pages/password-edit/index.ts @@ -0,0 +1 @@ +export { default as PagePasswordEdit } from './password-edit.hbs?raw'; diff --git a/src/pages/password-edit/password-edit.hbs b/src/pages/password-edit/password-edit.hbs new file mode 100644 index 000000000..8afb8b2bf --- /dev/null +++ b/src/pages/password-edit/password-edit.hbs @@ -0,0 +1,7 @@ +
+ {{#> FormProfile withButton=true button-text="Save Password" button-page="pageProfile" user=user}} + {{>InputWide label="Old Password" type="password" name="old_password" value=password }} + {{>InputWide label="New Password" type="password" name="new_password" }} + {{>InputWide label="Repeat New Password" type="password" name="repeat_password" noLine=true }} + {{/FormProfile}} +
\ No newline at end of file diff --git a/src/pages/profile-edit/index.ts b/src/pages/profile-edit/index.ts new file mode 100644 index 000000000..60dbf6faa --- /dev/null +++ b/src/pages/profile-edit/index.ts @@ -0,0 +1 @@ +export { default as PageProfileEdit } from './profile-edit.hbs?raw'; diff --git a/src/pages/profile-edit/profile-edit.hbs b/src/pages/profile-edit/profile-edit.hbs new file mode 100644 index 000000000..bd7dbc5d1 --- /dev/null +++ b/src/pages/profile-edit/profile-edit.hbs @@ -0,0 +1,10 @@ +
+ {{#> FormProfile withButton=true button-text="Save User Profile" button-page="pageProfile" user=user}} + {{>InputWide label="Email" type="text" name="email" value=email }} + {{>InputWide label="Login" type="text" name="login" value=login }} + {{>InputWide label="First Name" type="text" name="first_name" value=firstName }} + {{>InputWide label="Last Name" type="text" name="last_name" value=lastName }} + {{>InputWide label="Name in Chat" type="text" name="name_in_chat" value=nameInChat }} + {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true }} + {{/FormProfile}} +
\ No newline at end of file diff --git a/src/pages/profile/index.ts b/src/pages/profile/index.ts new file mode 100644 index 000000000..79060e5fc --- /dev/null +++ b/src/pages/profile/index.ts @@ -0,0 +1 @@ +export { default as PageProfile } from './profile.hbs?raw'; diff --git a/src/pages/profile/profile.hbs b/src/pages/profile/profile.hbs new file mode 100644 index 000000000..026e5e312 --- /dev/null +++ b/src/pages/profile/profile.hbs @@ -0,0 +1,10 @@ +
+ {{#> FormProfile user=user button-page='pageChat'}} + {{>InputWide label="Email" type="text" name="email" value=email readOnly=true }} + {{>InputWide label="Login" type="text" name="login" value=login readOnly=true }} + {{>InputWide label="First Name" type="text" name="first_name" value=firstName readOnly=true }} + {{>InputWide label="Last Name" type="text" name="last_name" value=lastName readOnly=true }} + {{>InputWide label="Name in Chat" type="text" name="name_in_chat" value=nameInChat readOnly=true }} + {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true readOnly=true }} + {{/FormProfile}} +
\ No newline at end of file diff --git a/src/pages/registration/index.ts b/src/pages/registration/index.ts new file mode 100644 index 000000000..e10a6b1a2 --- /dev/null +++ b/src/pages/registration/index.ts @@ -0,0 +1 @@ +export { default as PageRegistration } from './registration.hbs?raw'; diff --git a/src/pages/registration/registration.hbs b/src/pages/registration/registration.hbs new file mode 100644 index 000000000..b2d27cd68 --- /dev/null +++ b/src/pages/registration/registration.hbs @@ -0,0 +1,11 @@ +
+ {{#> FormAuth caption='Registration' ok-text='sign up' cancel-text='Login' ok-page='pageChat' cancel-page='loginPage'}} + {{>Input label="Email" type="email" name="email" }} + {{>Input label="Login" type="text" name="login"}} + {{>Input label="First Name" type="text" name="first_name" }} + {{>Input label="Second Name" type="text" name="second_name"}} + {{>Input label="Phone" type="text" name="phone"}} + {{>Input label="Password" type="password" name="password"}} + {{>Input label="Password (2nd time)" type="password" name="password2"}} + {{/FormAuth}} +
\ No newline at end of file diff --git a/src/styles/fonts.css b/src/styles/fonts.css new file mode 100644 index 000000000..239a13691 --- /dev/null +++ b/src/styles/fonts.css @@ -0,0 +1,8 @@ +* { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + text-rendering: optimizelegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} \ No newline at end of file diff --git a/src/styles/main.css b/src/styles/main.css new file mode 100644 index 000000000..5aa174cda --- /dev/null +++ b/src/styles/main.css @@ -0,0 +1,3 @@ +@import url("variables.css"); +@import url("fonts.css"); +@import url("reset.css"); \ No newline at end of file diff --git a/src/styles/reset.css b/src/styles/reset.css new file mode 100644 index 000000000..153bf2556 --- /dev/null +++ b/src/styles/reset.css @@ -0,0 +1,29 @@ +* { + box-sizing: border-box!important; + color: var(--gray-dark); + font-size: 14px; + font-family: Arial, serif; + margin: 0; + padding: 0; +} +input:focus-visible { + outline: none; +} +input, select { width: 100% } +.container{ + display: flex; + justify-content: center; + align-items: flex-start; + height: 100vh; + width: 100vw; + position: relative; +} +.container-center{ + align-items: center; +} + +.container-shadow{ + border-radius: 12px; + background: #FFF; + box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); +} \ No newline at end of file diff --git a/src/styles/variables.css b/src/styles/variables.css new file mode 100644 index 000000000..548c03249 --- /dev/null +++ b/src/styles/variables.css @@ -0,0 +1,14 @@ +:root { + --white:white; + --orange:#FF7A00; + --red:#FC4343; + --red-light:#fedede; + --success:#a043fc; + --gray-0:#f3f3f3; + --gray-1:#EBEBEB; + --gray-light:#9A9A9A; + --gray-3:#464646; + --gray-dark:#3C3C3C; + + box-sizing: border-box; +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..75abdef26 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 000000000..d6903a9c9 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,18 @@ +import {resolve} from 'path'; +import {defineConfig} from 'vite' +import handlebars from 'vite-plugin-handlebars'; + + +export default defineConfig({ + root: resolve(__dirname, 'src'), + build: { + outDir: resolve(__dirname, 'dist'), + }, + plugins: [ + handlebars({ + context: { + username: 'Elena' + } + }) as Plugin, + ], +}) \ No newline at end of file From e830d898b67231b40b695a0ff0bad69f173b440f Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 17:17:32 +0400 Subject: [PATCH 02/55] add express --- package-lock.json | 901 ++++++++++++++++++-- package.json | 6 +- public/1.jpeg | Bin 0 -> 9728 bytes public/2.jpg | Bin 0 -> 37154 bytes public/3.jpg | Bin 0 -> 48747 bytes server.js | 11 + src/components/avatar/avatar.hbs | 2 +- src/components/chat-list/chat-list.pcss | 1 - src/config.ts | 1 + src/main.ts | 19 + src/mocks/chat-message.mocks.ts | 3 +- src/mocks/chat.mocks.ts | 13 +- src/mocks/user-profile.mocks.ts | 2 +- src/pages/all-components/all-components.hbs | 6 +- vite.config.ts | 11 +- 15 files changed, 864 insertions(+), 112 deletions(-) create mode 100644 public/1.jpeg create mode 100644 public/2.jpg create mode 100644 public/3.jpg create mode 100644 server.js create mode 100644 src/config.ts diff --git a/package-lock.json b/package-lock.json index 62ab4d411..bb307f2a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,10 +7,10 @@ "": { "name": "middle.messenger.praktikum.yandex", "version": "0.0.0", - "dependencies": { - "@types/node": "^20.5.7" - }, "devDependencies": { + "@types/express": "^4.17.17", + "@types/node": "^20.5.7", + "express": "^4.18.2", "postcss-preset-env": "^9.1.2", "typescript": "^5.2.2", "vite": "^4.4.9", @@ -41,9 +41,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-3.0.1.tgz", - "integrity": "sha512-Tsp6FcSPaPN/+4T7iBPxBVopJUs7bimnNx4yuWeGXkH084Vro/y8fmrGg1LGSWH8SU6YuH20fP5Rtqtb979jyw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-3.0.2.tgz", + "integrity": "sha512-NMVs/l7Y9eIKL5XjbCHEgGcG8LOUT2qVcRjX6EzkCdlvftHVKr2tHIPzHavfrULRZ5Q2gxrJ9f44dAlj6fX97Q==", "dev": true, "funding": [ { @@ -83,9 +83,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.3.0.tgz", - "integrity": "sha512-jgudbE+TXZLssSTGFRCkJF9gAM8ABZ2c9/gbLupwA8Y1SpcddxK2z74/MOSdWuboUHbshei8uSQNbp9Wu1Bx+Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.3.1.tgz", + "integrity": "sha512-cehc/DQCyb4hL4fspvyL7WiY+uAy8Iuaz0yTyndC/AyBmxkNpgtSgCSsr0aR4vkaSFVZfNNVlKbjHFwOsPGB1Q==", "dev": true, "funding": [ { @@ -98,7 +98,7 @@ } ], "dependencies": { - "@csstools/color-helpers": "^3.0.1", + "@csstools/color-helpers": "^3.0.2", "@csstools/css-calc": "^1.1.3" }, "engines": { @@ -200,9 +200,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.2.tgz", - "integrity": "sha512-sfEBBWVMNPE3mHllI+FR43W2qy7eIjqCySAoivPFV068yKbUy6mH8Sra5Gjar54M3p2qvH8S/6KPlvEDBTvrmg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.3.tgz", + "integrity": "sha512-5oNUbO89SX7BuSB0ZiUxDaQt4R2K3A+RQZlxNHOvghZJO/UqgomLPII6JkgrywLQ0Y4JDzbyNuwr0OKo2v0RsQ==", "dev": true, "funding": [ { @@ -215,7 +215,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-color-parser": "^1.3.1", "@csstools/css-parser-algorithms": "^2.3.1", "@csstools/css-tokenizer": "^2.2.0", "@csstools/postcss-progressive-custom-properties": "^3.0.0" @@ -228,9 +228,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.2.tgz", - "integrity": "sha512-121MUtL/fv+lO9FQJKP05UAKC6xYl4hZYyWl+pGbfXIa3KkgCbcMfhkIc0zV2JpwsB5uhls81bwl+XJKhKwECw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.3.tgz", + "integrity": "sha512-q/fv8pdRR07GAJTvemXbQ02hwVGmVcOjBJj7+gnlGrAVwSzrPEsJc8zM/EzoqVJTZtm/DwG6TWu+VJIxVpyUBg==", "dev": true, "funding": [ { @@ -243,7 +243,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-color-parser": "^1.3.1", "@csstools/css-parser-algorithms": "^2.3.1", "@csstools/css-tokenizer": "^2.2.0", "@csstools/postcss-progressive-custom-properties": "^3.0.0" @@ -308,9 +308,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.2.tgz", - "integrity": "sha512-ogriVRZFMgV/oS4pwuXTdFJ7I+saq0oSHzev/XsvXOoRHXOK9jB2q6zEfl3o1Edl0X2wHmacwtfRk8RBmopnYw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.3.tgz", + "integrity": "sha512-dEK3WbajX538Zu3lPMtBPAO1pooR7zslJ1mDrWKQzlwQczls3fEz+tlRhd7KWMMlsoIwNGMIGq2W/GqEErDjkg==", "dev": true, "funding": [ { @@ -323,7 +323,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-color-parser": "^1.3.1", "@csstools/css-parser-algorithms": "^2.3.1", "@csstools/css-tokenizer": "^2.2.0", "@csstools/postcss-progressive-custom-properties": "^3.0.0" @@ -336,9 +336,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.2.tgz", - "integrity": "sha512-K4W97KaMnCLUS7/hfdxsM10ghPtIwfYP+VGUwpMgNYa7LVwE+9vkL/N/hzwqSShICtWD6doX1yAT0qcKUbgs0w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.3.tgz", + "integrity": "sha512-2TqrRD8JzSwQCRKKNc9BFhSEmsz+mR3RtwSw5mQSGILC+LIYCVWeYwC33cI+saFWv0DGZ0NXLx5VSX2tdJyU6w==", "dev": true, "funding": [ { @@ -351,7 +351,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-color-parser": "^1.3.1", "@csstools/css-parser-algorithms": "^2.3.1", "@csstools/css-tokenizer": "^2.2.0" }, @@ -389,9 +389,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.0.tgz", - "integrity": "sha512-0I6siRcDymG3RrkNTSvHDMxTQ6mDyYE8awkcaHNgtYacd43msl+4ZWDfQ1yZQ/viczVWjqJkLmPiRHSgxn5nZA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.1.tgz", + "integrity": "sha512-KJGLbjjjg+mdNclLyCfsZaJS4xCaRaxKAnmWKpIp1FarEem3ZdoOxTlIELwvlE5BVg1t3QTmp0+DPSlLTTFMhA==", "dev": true, "funding": [ { @@ -592,9 +592,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.2.tgz", - "integrity": "sha512-tr7HjHDaDvRcnzK559l3VcpfhiAd0ga1jhThGR/tONfVzOVssG9x0QLg0LpLrlx7+niGgHL1SdfgHmFiTJjGIw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.3.tgz", + "integrity": "sha512-8Wdpmy8mvVyHsToJkrnNpwpAgqCPNpQMLNqkR62smbEuFcmRHEiDnb0OlkKjErzmiBMr7vjZAQ6e2lA9oVguQQ==", "dev": true, "funding": [ { @@ -607,7 +607,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-color-parser": "^1.3.1", "@csstools/css-parser-algorithms": "^2.3.1", "@csstools/css-tokenizer": "^2.2.0", "@csstools/postcss-progressive-custom-properties": "^3.0.0" @@ -645,9 +645,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.2.tgz", - "integrity": "sha512-sn2zqcM8QPj4wN2okdNbK0JdwhZU506EEmIeSybh2UOJgTorbyQS7ak2sJ+2Y4LDYr4rPGBs/hBFmyYgoostdg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.3.tgz", + "integrity": "sha512-9MOzad5i0fnkOI6qXzcznuyGhLYARBkR8wDsyqbANkZ20srHJZ6PAy44g5eNw3+B7yvslUK4hx9ehnbbI9x4rw==", "dev": true, "funding": [ { @@ -660,7 +660,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-color-parser": "^1.3.1", "@csstools/css-parser-algorithms": "^2.3.1", "@csstools/css-tokenizer": "^2.2.0", "@csstools/postcss-progressive-custom-properties": "^3.0.0" @@ -725,9 +725,9 @@ } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-3.0.1.tgz", - "integrity": "sha512-a5Ojrf31XfdsmFhbLR41JG8HD9d7mWeOqROUJpTi9MTJDAHeJstvhrmpHS39C11luwSHanLou4v3PI9xLbWolQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-3.0.2.tgz", + "integrity": "sha512-vO2onX7/TPU3LMrSvg+FhMxTujhU+LELP9zln7SiB5BJqZi+y/ZOJZRBHFvCfM9J1lnNkskMN96bP5g3yg7Jmw==", "dev": true, "funding": [ { @@ -740,7 +740,7 @@ } ], "dependencies": { - "@csstools/color-helpers": "^3.0.1", + "@csstools/color-helpers": "^3.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -1173,10 +1173,118 @@ "node": ">=12" } }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, "node_modules/autoprefixer": { "version": "10.4.15", @@ -1215,6 +1323,30 @@ "postcss": "^8.1.0" } }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/browserslist": { "version": "4.21.10", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", @@ -1247,10 +1379,32 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001525", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", - "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", + "version": "1.0.30001527", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", + "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", "dev": true, "funding": [ { @@ -1267,6 +1421,42 @@ } ] }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, "node_modules/css-blank-pseudo": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-6.0.0.tgz", @@ -1342,9 +1532,9 @@ } }, "node_modules/cssdb": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.7.1.tgz", - "integrity": "sha512-kM+Fs0BFyhJNeE6wbOrlnRsugRdL6vn7QcON0aBDZ7XRd7RI2pMlk+nxoHuTb4Et+aBobXgK0I+6NGLA0LLgTw==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.7.2.tgz", + "integrity": "sha512-pQPYP7/kch4QlkTcLuUNiNL2v/E+O+VIdotT+ug62/+2B2/jkzs5fMM6RHCzGCZ9C82pODEMSIzRRUzJOrl78g==", "dev": true, "funding": [ { @@ -1369,12 +1559,55 @@ "node": ">=4" } }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, "node_modules/electron-to-chromium": { "version": "1.4.508", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", "dev": true }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", @@ -1741,6 +1974,90 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fraction.js": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", @@ -1754,6 +2071,15 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1774,6 +2100,21 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -1807,6 +2148,73 @@ "node": ">= 0.4.0" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-core-module": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", @@ -1819,6 +2227,63 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -1828,6 +2293,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -1846,6 +2317,15 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -1867,12 +2347,48 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -2262,9 +2778,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.2.tgz", - "integrity": "sha512-OfjeI/1rQWtj38Quy3+D9+mpOReOX3vOXfQNCfsmFIl6xK1AAJ1ta1uGjAswYwsN8uJ9Y52K8U53Jk8QJWfJLg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.3.tgz", + "integrity": "sha512-+0WxmblCb2Khfj9wpJQKd/9QhtHK/ImIqfnXX4HEoTDmjdtI6IUjXnC83bYX0CaHitpPjWnoQjoasW7qb1TCHw==", "dev": true, "funding": [ { @@ -2277,7 +2793,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.3.0", + "@csstools/css-color-parser": "^1.3.1", "@csstools/css-parser-algorithms": "^2.3.1", "@csstools/css-tokenizer": "^2.2.0", "@csstools/postcss-progressive-custom-properties": "^3.0.0" @@ -2314,6 +2830,32 @@ "postcss": "^8.4" } }, + "node_modules/postcss-nesting": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.1.tgz", + "integrity": "sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^3.0.0", + "postcss-selector-parser": "^6.0.13" + }, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/postcss-opacity-percentage": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-2.0.0.tgz", @@ -2396,9 +2938,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.1.2.tgz", - "integrity": "sha512-+v7BbUNLgUD1j+dBQw3YRExLnIhroBradExkhDLpkLwZowzhgUQgSYW4PJul2SlST2qyistlEIPaHTJK9tZlEw==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.1.3.tgz", + "integrity": "sha512-h8iPXykc4i/MDkbu8GuROt90mQJcj4//P49keGW+mcfs9xWeUZFotsT0m2YV9zpdCvSNJojOww1Os6BpVTpHbA==", "dev": true, "funding": [ { @@ -2412,14 +2954,14 @@ ], "dependencies": { "@csstools/postcss-cascade-layers": "^4.0.0", - "@csstools/postcss-color-function": "^3.0.2", - "@csstools/postcss-color-mix-function": "^2.0.2", + "@csstools/postcss-color-function": "^3.0.3", + "@csstools/postcss-color-mix-function": "^2.0.3", "@csstools/postcss-exponential-functions": "^1.0.0", "@csstools/postcss-font-format-keywords": "^3.0.0", - "@csstools/postcss-gradients-interpolation-method": "^4.0.2", - "@csstools/postcss-hwb-function": "^3.0.2", + "@csstools/postcss-gradients-interpolation-method": "^4.0.3", + "@csstools/postcss-hwb-function": "^3.0.3", "@csstools/postcss-ic-unit": "^3.0.0", - "@csstools/postcss-is-pseudo-class": "^4.0.0", + "@csstools/postcss-is-pseudo-class": "^4.0.1", "@csstools/postcss-logical-float-and-clear": "^2.0.0", "@csstools/postcss-logical-resize": "^2.0.0", "@csstools/postcss-logical-viewport-units": "^2.0.1", @@ -2427,12 +2969,12 @@ "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.2", "@csstools/postcss-nested-calc": "^3.0.0", "@csstools/postcss-normalize-display-values": "^3.0.0", - "@csstools/postcss-oklab-function": "^3.0.2", + "@csstools/postcss-oklab-function": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^3.0.0", - "@csstools/postcss-relative-color-syntax": "^2.0.2", + "@csstools/postcss-relative-color-syntax": "^2.0.3", "@csstools/postcss-scope-pseudo-class": "^3.0.0", "@csstools/postcss-stepped-value-functions": "^3.0.1", - "@csstools/postcss-text-decoration-shorthand": "^3.0.1", + "@csstools/postcss-text-decoration-shorthand": "^3.0.2", "@csstools/postcss-trigonometric-functions": "^3.0.1", "@csstools/postcss-unset-value": "^3.0.0", "autoprefixer": "^10.4.15", @@ -2457,7 +2999,7 @@ "postcss-gap-properties": "^5.0.0", "postcss-image-set-function": "^6.0.0", "postcss-initial": "^4.0.1", - "postcss-lab-function": "^6.0.2", + "postcss-lab-function": "^6.0.3", "postcss-logical": "^7.0.0", "postcss-nesting": "^12.0.1", "postcss-opacity-percentage": "^2.0.0", @@ -2476,32 +3018,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-preset-env/node_modules/postcss-nesting": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.1.tgz", - "integrity": "sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/selector-specificity": "^3.0.0", - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/postcss-pseudo-class-any-link": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-9.0.0.tgz", @@ -2574,6 +3090,58 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/resolve": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", @@ -2607,6 +3175,97 @@ "fsevents": "~2.3.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2625,6 +3284,15 @@ "node": ">=0.10.0" } }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -2637,6 +3305,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -2663,6 +3353,15 @@ "node": ">=0.8.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -2699,6 +3398,24 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vite": { "version": "4.4.9", "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", diff --git a/package.json b/package.json index c422ca798..86c3feba0 100644 --- a/package.json +++ b/package.json @@ -2,19 +2,21 @@ "name": "middle.messenger.praktikum.yandex", "private": true, "version": "0.0.0", - "type": "module", "scripts": { "dev": "vite", "build": "tsc && vite build", "preview": "vite preview" }, "devDependencies": { + "@types/express": "^4.17.17", + "@types/node": "^20.5.7", + "express": "^4.18.2", "postcss-preset-env": "^9.1.2", "typescript": "^5.2.2", "vite": "^4.4.9", "vite-plugin-handlebars": "^1.6.0" }, "dependencies": { - "@types/node": "^20.5.7" + } } diff --git a/public/1.jpeg b/public/1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..d5f67d4f4180e8988b4a08fe0da6cf5b5f96759b GIT binary patch literal 9728 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 literal 0 HcmV?d00001 diff --git a/public/2.jpg b/public/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ff2ca5f5e37ff87bd04dccebd3c45489c0a61c3 GIT binary patch literal 37154 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
~98a1HBKl}c~eXcDK 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 CG$L~V literal 0 HcmV?d00001 diff --git a/public/3.jpg b/public/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..06ec0b2c1d40464a2f889b6b4baead3373e3a118 GIT binary patch literal 48747 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%0A50oUkDZZG{5`2Kr)FwL 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�Bo|$B+MpR!c=WM0D4uF2g#)#$wz=4ZVKW7Tj)Y|Lws zuSk3BgsVjr9oZe&zbF2We?{@Q)|ICv3v#v*>qP8ic^@p`VtRDlO@1;HCp8GR{S%Xv zn|}0WHTfcL?Z_+qaLGAP=wy~63H~kmsikPEgh|soU)+6UmN~5Oe-2VV6?2VGB@FLFRxNyfU znmU{d6mC2}6trd~_?aEL{dmSc*yZUFRl6G@^d$WpjSoxFHiY|-)jAqIXvBNcHr*qq z=~O={@+D$%^oEg0?LvZQWfMswtiuP7y((*3(IM{4YM@Em@LLyRX%^Usx_?4#J;x@7 z^s?57i)fO!WAH=difz(5UYTS3rO9KEnp_S{?i7(|OqSRwTG8ib92rG)0qi&a!>eNqW+? zj4YbnBxUBj;}-ZtdR(&fN1>OtKAJFAC0{e+MG3wU{4;);{4@PC_;P-j@y&9I(Gh!- zjqZdrnDNPaF?4guyV%Eu7*@k~z}SnSZMftnCRnJG-0ET5JN=vpMG;grb0>y#mBnl> zk1OW8_aV|*oxTENdBDh5j85OUdE4k5+6e74O6{Qr12)X`0m z-ANI93stKbK0bUO)LP%cdNH#!yQN>PQqi%!B7}=9w#1l_yc4ED+7r^WTC#6v^WgrX zFUs|?mNsOUY;>UrY;Qz_v{5Mvi!aLywL%d^cu2_he?AZDC!+9rSz~35jhQ9f=woC~ z2Q3m364r_+URYgDgv84)!c5He`S3r)UJSh%W$4)1IZ_zP7R04|6ex)Zvda;;ke7;9 zV#L$7BqUK?vtzXH3{v=B*y)3b^^lWTwZr+U)QYjRL5{f%c)KWMS@{C-aBOWyo zAukp-NtqqX=fd_PSeUf2vcy=}**SXfy(q5>8xkwZ5OO006-Y>0UxQ<0nI~_>d|00( zUfvCj>tkbNrCv4joA}bbjD0QdHbOCm$rf0c-nT`LnxG>)GQeov7t%F@wxBqXR~FHWWwtVx(B-2_ {{#if image}} - image avatar + {{#imageUrl src=image alt="image avatar" class="avatar__image "}}{{/imageUrl}} {{/if}} {{#if isLoadAvatar}}
diff --git a/src/components/chat-list/chat-list.pcss b/src/components/chat-list/chat-list.pcss index 19aebc752..b7ecde318 100644 --- a/src/components/chat-list/chat-list.pcss +++ b/src/components/chat-list/chat-list.pcss @@ -3,7 +3,6 @@ flex-direction: column; border-right: 1px solid var(--gray-light); height: 100%; - //max-width: 340px; padding: 10px; diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 000000000..632e7decd --- /dev/null +++ b/src/config.ts @@ -0,0 +1 @@ +export const urlImages='/'; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 2aa5f53b2..2f4dca511 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,6 +5,7 @@ import * as Pages from './pages'; import {mockUser} from "./mocks/user-profile.mocks"; import {chat1, mockListChats} from "./mocks/chat.mocks"; import {message1, mockListMessages} from "./mocks/chat-message.mocks"; +import {urlImages} from "./config"; const pages = { "allComponents": [Pages.AllComponentsPage,{chat1:chat1,chatList:mockListChats,message:message1,messageList:mockListMessages,currentUser:mockUser}], @@ -38,4 +39,22 @@ document.addEventListener('click', e => { e.preventDefault(); e.stopImmediatePropagation(); } +}); + +// @ts-ignore +Handlebars.registerHelper("imageUrl", function( options) { + const attrs = Object.keys(options.hash) + .map(function(key) { + if(key==='src'){ + const imgUrl = new URL(urlImages+options.hash[key], import.meta.url).href; + return key + '="' + imgUrl + '"';} + return key + '="' + options.hash[key] + '"'; + }) + .join(" "); + + return ( + "" + "" + ); }); \ No newline at end of file diff --git a/src/mocks/chat-message.mocks.ts b/src/mocks/chat-message.mocks.ts index 8ba86bbcc..72821078c 100644 --- a/src/mocks/chat-message.mocks.ts +++ b/src/mocks/chat-message.mocks.ts @@ -1,5 +1,6 @@ import {ChatMessage} from "../models/chat-message"; + export const message1: ChatMessage = { id: 123, user_id: 231, @@ -10,7 +11,7 @@ export const message1: ChatMessage = { file: { id: 132, user_id: 231, - path: "../../assets/avatars/2.jpg", + path: `2.jpg`, filename: "file name", content_type: "image/jpeg", content_size: 543672, diff --git a/src/mocks/chat.mocks.ts b/src/mocks/chat.mocks.ts index 25e210400..28bfc0ce3 100644 --- a/src/mocks/chat.mocks.ts +++ b/src/mocks/chat.mocks.ts @@ -1,16 +1,17 @@ import {Chat} from "../models/chat"; + export const chat1:Chat={ id: 123, title: "my-chat", - avatar: "../../assets/avatars/3.jpg", + avatar: `3.jpg`, unread_count: 15, created_by: 12345, last_message: { user: { first_name: "Petya", second_name: "Pupkin", - avatar: "../../assets/avatars/3.jpg", + avatar: `3.jpg`, email: "my@email.com", login: "userLogin", phone: "8(911)-222-33-22", @@ -23,14 +24,14 @@ export const chat1:Chat={ export const chat2:Chat={ id: 124, title: "my-chat1", - avatar: "../../assets/avatars/1.jpeg", + avatar: `1.jpeg`, unread_count: 15, created_by: 12345, last_message: { user: { first_name: "Lena", second_name: "Lukova", - avatar: "../../assets/avatars/1.jpeg", + avatar: `1.jpg`, email: "my@email.com", login: "lenaLogin", phone: "8(911)-222-33-22", @@ -43,14 +44,14 @@ export const chat2:Chat={ export const chat3:Chat={ id: 125, title: "my-chat3", - avatar: "../../assets/avatars/1.jpeg", + avatar: `2.jpg`, unread_count: 0, created_by: 12345, last_message: { user: { first_name: "Lena", second_name: "Lukova", - avatar: "../../assets/avatars/1.jpeg", + avatar: `2.jpg`, email: "my@email.com", login: "lenaLogin", phone: "8(911)-222-33-22", diff --git a/src/mocks/user-profile.mocks.ts b/src/mocks/user-profile.mocks.ts index 3fb3174f2..6f14149d2 100644 --- a/src/mocks/user-profile.mocks.ts +++ b/src/mocks/user-profile.mocks.ts @@ -8,5 +8,5 @@ export const mockUser:User={ password: "password123", phone: "+7985632369", email:"email@gmail.com", - avatar: "../../assets/avatars/1.jpeg", + avatar: "1.jpeg", } \ No newline at end of file diff --git a/src/pages/all-components/all-components.hbs b/src/pages/all-components/all-components.hbs index d6e89e271..113d2474e 100644 --- a/src/pages/all-components/all-components.hbs +++ b/src/pages/all-components/all-components.hbs @@ -12,9 +12,9 @@ {{>Input label="Login" type="text" name="login" }} {{>Input label="Error" type="text" name="error" error=true errorText='Error!!'}} {{> Avatar isLoadAvatar=true}} - {{> Avatar image="../../assets/avatars/1.jpeg"isLoadAvatar=true}} - {{> Avatar image="../../assets/avatars/2.jpg"isLoadAvatar=true}} - {{> Avatar image="../../assets/avatars/3.jpg"isLoadAvatar=true}} + {{> Avatar image="1.jpeg"isLoadAvatar=true}} + {{> Avatar image="2.jpg"isLoadAvatar=true}} + {{> Avatar image="3.jpg"isLoadAvatar=true}} {{>InputWide label="Login" type="text" name="login" value='MyLogin' readOnly=false }} {{>InputWide label="Login" type="text" name="login" value='MyLogin' readOnly=true noLine=true }} {{>InputWide label="Error" type="text" name="error" error=true errorText='Error!!' readOnly=false}} diff --git a/vite.config.ts b/vite.config.ts index d6903a9c9..b563b45b4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,14 +5,15 @@ import handlebars from 'vite-plugin-handlebars'; export default defineConfig({ root: resolve(__dirname, 'src'), + publicDir:resolve(__dirname, 'public'), build: { outDir: resolve(__dirname, 'dist'), + copyPublicDir:true, + emptyOutDir: true, + + }, plugins: [ - handlebars({ - context: { - username: 'Elena' - } - }) as Plugin, + handlebars({}) as Plugin, ], }) \ No newline at end of file From 9259828a643ed808fc19617f30bac739dfd45d9b Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 17:50:57 +0400 Subject: [PATCH 03/55] fixed errors --- package.json | 9 ++++++--- server.js | 3 ++- src/components/message-list/message-list.hbs | 2 +- src/config.ts | 3 ++- src/main.ts | 8 ++++++-- src/pages/all-pages/all-pages.hbs | 12 ++++++++++++ src/pages/all-pages/index.ts | 1 + src/pages/index.ts | 1 + src/pages/login/login.hbs | 4 ++-- src/pages/password-edit/password-edit.hbs | 4 ++-- src/pages/profile/profile.hbs | 4 ++-- 11 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 src/pages/all-pages/all-pages.hbs create mode 100644 src/pages/all-pages/index.ts diff --git a/package.json b/package.json index 86c3feba0..2cf7bf262 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "preview": "vite preview" + "preview": "vite preview", + "start": "tsc && vite build && node ./server.js" }, "devDependencies": { "@types/express": "^4.17.17", @@ -16,7 +17,9 @@ "vite": "^4.4.9", "vite-plugin-handlebars": "^1.6.0" }, - "dependencies": { - + "engine": { + "engines": { + "node": ">= 14.0.0" + } } } diff --git a/server.js b/server.js index 535384e00..38e1bd7ab 100644 --- a/server.js +++ b/server.js @@ -1,8 +1,9 @@ // server.js const express = require('express'); +const PORT = 3000; const app = express(); -const PORT = 4000; + app.use(express.static(`${__dirname}/dist/`)); diff --git a/src/components/message-list/message-list.hbs b/src/components/message-list/message-list.hbs index 67591e553..c492229a2 100644 --- a/src/components/message-list/message-list.hbs +++ b/src/components/message-list/message-list.hbs @@ -20,7 +20,7 @@ {{> Button type="arrow"}} diff --git a/src/config.ts b/src/config.ts index 632e7decd..a15980d79 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1 +1,2 @@ -export const urlImages='/'; \ No newline at end of file +export const urlImages='/'; +export const PORT = 3000; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 2f4dca511..cca838e55 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,9 @@ import './styles/main.css'; +// @ts-ignore import Handlebars from 'handlebars'; +// @ts-ignore import * as Components from './components'; +// @ts-ignore import * as Pages from './pages'; import {mockUser} from "./mocks/user-profile.mocks"; import {chat1, mockListChats} from "./mocks/chat.mocks"; @@ -16,7 +19,8 @@ const pages = { "pagePasswordEdit": [Pages.PagePasswordEdit,{user:mockUser}], "pageChat": [Pages.PageChat,{chatList:mockListChats,messageList:mockListMessages,currentUser:mockUser}], "page500": [Pages.Page500], - "page404": [Pages.Page404] + "page404": [Pages.Page404], + "allPages": [Pages.AllPages] }; Object.entries(Components).forEach(([name, component]) => { Handlebars.registerPartial(name, component); @@ -29,7 +33,7 @@ const navigate = (page: string) => { container.innerHTML = Handlebars.compile(source)(context); } -document.addEventListener('DOMContentLoaded', () => navigate('allComponents')); +document.addEventListener('DOMContentLoaded', () => navigate('allPages')); document.addEventListener('click', e => { //@ts-ignore diff --git a/src/pages/all-pages/all-pages.hbs b/src/pages/all-pages/all-pages.hbs new file mode 100644 index 000000000..d4d50b4e9 --- /dev/null +++ b/src/pages/all-pages/all-pages.hbs @@ -0,0 +1,12 @@ +
+
+ {{>Link caption="Page 404" type='success' page="page404" }} + {{>Link caption="Page 500" type='success' page="page500" }} + {{>Link caption="Login Page" type='success' page="loginPage" }} + {{>Link caption="Page Registration" type='success' page="pageRegistration" }} + {{>Link caption="Page Profile" type='success' page="pageProfile" }} + {{>Link caption="Page Profile Edit" type='success' page="pageProfileEdit" }} + {{>Link caption="Page Password Edit" type='success' page="pagePasswordEdit" }} + {{>Link caption="Page Chat" type='success' page="pageChat" }} +
+
\ No newline at end of file diff --git a/src/pages/all-pages/index.ts b/src/pages/all-pages/index.ts new file mode 100644 index 000000000..dc97ee7cd --- /dev/null +++ b/src/pages/all-pages/index.ts @@ -0,0 +1 @@ +export { default as AllPages } from './all-pages.hbs?raw'; diff --git a/src/pages/index.ts b/src/pages/index.ts index 742d908e1..f76b3cd2e 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -7,3 +7,4 @@ export { PagePasswordEdit } from './password-edit'; export { PageChat } from './chat-page'; export { Page500} from './500'; export { Page404} from './404'; +export { AllPages} from './all-pages'; diff --git a/src/pages/login/login.hbs b/src/pages/login/login.hbs index 7cf4bf61c..efded4236 100644 --- a/src/pages/login/login.hbs +++ b/src/pages/login/login.hbs @@ -1,8 +1,8 @@
{{#> FormAuth caption='Login' ok-text='sign in' cancel-text='Register' ok-page='pageChat' cancel-page='pageRegistration'}}
- {{>Input label="Login" type="text" name="login" }} - {{>Input label="Password" type="password" name="password"}} + {{>Input label="Login" type="text" name="login" value='' }} + {{>Input label="Password" type="password" name="password" value='' }}
{{/FormAuth}}
\ No newline at end of file diff --git a/src/pages/password-edit/password-edit.hbs b/src/pages/password-edit/password-edit.hbs index 8afb8b2bf..34bc396bc 100644 --- a/src/pages/password-edit/password-edit.hbs +++ b/src/pages/password-edit/password-edit.hbs @@ -1,7 +1,7 @@
{{#> FormProfile withButton=true button-text="Save Password" button-page="pageProfile" user=user}} - {{>InputWide label="Old Password" type="password" name="old_password" value=password }} - {{>InputWide label="New Password" type="password" name="new_password" }} + {{>InputWide label="Old Password" type="password" name="oldPassword" value=password }} + {{>InputWide label="New Password" type="password" name="newPassword" }} {{>InputWide label="Repeat New Password" type="password" name="repeat_password" noLine=true }} {{/FormProfile}}
\ No newline at end of file diff --git a/src/pages/profile/profile.hbs b/src/pages/profile/profile.hbs index 026e5e312..215c93403 100644 --- a/src/pages/profile/profile.hbs +++ b/src/pages/profile/profile.hbs @@ -2,8 +2,8 @@ {{#> FormProfile user=user button-page='pageChat'}} {{>InputWide label="Email" type="text" name="email" value=email readOnly=true }} {{>InputWide label="Login" type="text" name="login" value=login readOnly=true }} - {{>InputWide label="First Name" type="text" name="first_name" value=firstName readOnly=true }} - {{>InputWide label="Last Name" type="text" name="last_name" value=lastName readOnly=true }} + {{>InputWide label="First Name" type="text" name="first_name" value=first_name readOnly=true }} + {{>InputWide label="Last Name" type="text" name="last_name" value=second_name readOnly=true }} {{>InputWide label="Name in Chat" type="text" name="name_in_chat" value=nameInChat readOnly=true }} {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true readOnly=true }} {{/FormProfile}} From b2916dcd91dfae9568fd0d488ed533eaf9159c8d Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 18:17:01 +0400 Subject: [PATCH 04/55] readmy.md --- README.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 029cf16a6..fe8bb0f3e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,27 @@ # Messenger -### Project 1 for course Middle Yandex. +___ + ### Project 1 for course Middle Yandex. ### Design +___ -[Figma](https://www.figma.com/file/FfgnMjuShWBBLmFMls5Ryy/Chat_my_design?type=design&node-id=0-1&mode=design&t=14mgPG10l7FRQJOL-0 "Link on Figma") +[Link on Figma](https://www.figma.com/file/FfgnMjuShWBBLmFMls5Ryy/Chat_my_design?type=design&node-id=0-1&mode=design&t=14mgPG10l7FRQJOL-0 "Link on Figma") ### Tech stack: +___ + - Vite 4.4.9 -- Node.js 18.17.1 +- Node.js >14.0.0 - Handlebars (vite-plugin-handlebars) - Typescript 5.2.2 -- Postcss(plugin postcss-preset-env) \ No newline at end of file +- Postcss(plugin postcss-preset-env) + +### How to use +___ + + use ```npm run dev``` - for start development
+ use ```npm run start``` - for build and start server + +### Deploy +___ From 2be6b18a8b394d68519825d17f680db29a1bfa4a Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 18:19:30 +0400 Subject: [PATCH 05/55] netlify --- netlify.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 netlify.yaml diff --git a/netlify.yaml b/netlify.yaml new file mode 100644 index 000000000..2d514c3ac --- /dev/null +++ b/netlify.yaml @@ -0,0 +1,9 @@ +# Global settings applied to the whole site. +# + # “base” is the directory to change to before starting build. If you set base: + # that is where we will look for package.json/.nvmrc/etc, not repo root! + # “command” is your build command. + # “publish” is the directory to publish (relative to the root of your repo). + + [build] + publish = "dist" \ No newline at end of file From c7d319cc0e6b7fe670c8902fe97249c76ab7f722 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 18:44:49 +0400 Subject: [PATCH 06/55] netlify --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fe8bb0f3e..2918f8e10 100644 --- a/README.md +++ b/README.md @@ -23,5 +23,6 @@ ___ use ```npm run dev``` - for start development
use ```npm run start``` - for build and start server -### Deploy +### Demo ___ +[Site on Netlify](https://messenger-yandex-el.netlify.app/) \ No newline at end of file From bf7400ff6c9ad7a46bc367e4295e58dea3129750 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 18:47:46 +0400 Subject: [PATCH 07/55] fixed error --- src/config.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/config.ts b/src/config.ts index a15980d79..632e7decd 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,2 +1 @@ -export const urlImages='/'; -export const PORT = 3000; \ No newline at end of file +export const urlImages='/'; \ No newline at end of file From c92e0b56dd67ed99b469261d6868f9d76500d017 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 18:49:01 +0400 Subject: [PATCH 08/55] fixed error --- src/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.ts b/src/config.ts index 632e7decd..35e27eba2 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1 +1 @@ -export const urlImages='/'; \ No newline at end of file +export const urlImages='/'; From 11b08db43d559061c2ef1ecf374620f5ee5e6abe Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 18:52:12 +0400 Subject: [PATCH 09/55] fixed error --- src/config.ts | 1 - src/main.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 src/config.ts diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index 35e27eba2..000000000 --- a/src/config.ts +++ /dev/null @@ -1 +0,0 @@ -export const urlImages='/'; diff --git a/src/main.ts b/src/main.ts index cca838e55..2861f76b8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,7 +8,7 @@ import * as Pages from './pages'; import {mockUser} from "./mocks/user-profile.mocks"; import {chat1, mockListChats} from "./mocks/chat.mocks"; import {message1, mockListMessages} from "./mocks/chat-message.mocks"; -import {urlImages} from "./config"; +export const urlImages='/'; const pages = { "allComponents": [Pages.AllComponentsPage,{chat1:chat1,chatList:mockListChats,message:message1,messageList:mockListMessages,currentUser:mockUser}], From 23fa533fa8f16b133a07ef6ee0db766f4bead7fd Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 19:01:13 +0400 Subject: [PATCH 10/55] fixed error --- src/config.ts | 1 + src/main.ts | 127 +++++++++++++++++++++++++------------------------- 2 files changed, 65 insertions(+), 63 deletions(-) create mode 100644 src/config.ts diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 000000000..632e7decd --- /dev/null +++ b/src/config.ts @@ -0,0 +1 @@ +export const urlImages='/'; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 2861f76b8..adbab1ef1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,64 +1,65 @@ -import './styles/main.css'; -// @ts-ignore -import Handlebars from 'handlebars'; -// @ts-ignore -import * as Components from './components'; -// @ts-ignore -import * as Pages from './pages'; -import {mockUser} from "./mocks/user-profile.mocks"; -import {chat1, mockListChats} from "./mocks/chat.mocks"; -import {message1, mockListMessages} from "./mocks/chat-message.mocks"; -export const urlImages='/'; - -const pages = { - "allComponents": [Pages.AllComponentsPage,{chat1:chat1,chatList:mockListChats,message:message1,messageList:mockListMessages,currentUser:mockUser}], - "loginPage": [Pages.PageLogin], - "pageRegistration": [Pages.PageRegistration], - "pageProfile": [Pages.PageProfile,{user:mockUser}], - "pageProfileEdit": [Pages.PageProfileEdit,{user:mockUser}], - "pagePasswordEdit": [Pages.PagePasswordEdit,{user:mockUser}], - "pageChat": [Pages.PageChat,{chatList:mockListChats,messageList:mockListMessages,currentUser:mockUser}], - "page500": [Pages.Page500], - "page404": [Pages.Page404], - "allPages": [Pages.AllPages] -}; -Object.entries(Components).forEach(([name, component]) => { - Handlebars.registerPartial(name, component); -}); - -const navigate = (page: string) => { - //@ts-ignore - const [source, context] = pages[page]; - const container = document.getElementById('app')!; - container.innerHTML = Handlebars.compile(source)(context); -} - -document.addEventListener('DOMContentLoaded', () => navigate('allPages')); - -document.addEventListener('click', e => { - //@ts-ignore - const page = e.target.getAttribute('page'); - if (page) { - navigate(page); - e.preventDefault(); - e.stopImmediatePropagation(); - } -}); - -// @ts-ignore -Handlebars.registerHelper("imageUrl", function( options) { - const attrs = Object.keys(options.hash) - .map(function(key) { - if(key==='src'){ - const imgUrl = new URL(urlImages+options.hash[key], import.meta.url).href; - return key + '="' + imgUrl + '"';} - return key + '="' + options.hash[key] + '"'; - }) - .join(" "); - - return ( - "" + "" - ); +import './styles/main.css'; +// @ts-ignore +import Handlebars from 'handlebars'; +// @ts-ignore +import * as Components from './components'; +// @ts-ignore +import * as Pages from './pages'; +import {mockUser} from "./mocks/user-profile.mocks"; +import {chat1, mockListChats} from "./mocks/chat.mocks"; +import {message1, mockListMessages} from "./mocks/chat-message.mocks"; +import {urlImages} from "./config"; + + +const pages = { + "allComponents": [Pages.AllComponentsPage,{chat1:chat1,chatList:mockListChats,message:message1,messageList:mockListMessages,currentUser:mockUser}], + "loginPage": [Pages.PageLogin], + "pageRegistration": [Pages.PageRegistration], + "pageProfile": [Pages.PageProfile,{user:mockUser}], + "pageProfileEdit": [Pages.PageProfileEdit,{user:mockUser}], + "pagePasswordEdit": [Pages.PagePasswordEdit,{user:mockUser}], + "pageChat": [Pages.PageChat,{chatList:mockListChats,messageList:mockListMessages,currentUser:mockUser}], + "page500": [Pages.Page500], + "page404": [Pages.Page404], + "allPages": [Pages.AllPages] +}; +Object.entries(Components).forEach(([name, component]) => { + Handlebars.registerPartial(name, component); +}); + +const navigate = (page: string) => { + //@ts-ignore + const [source, context] = pages[page]; + const container = document.getElementById('app')!; + container.innerHTML = Handlebars.compile(source)(context); +} + +document.addEventListener('DOMContentLoaded', () => navigate('allPages')); + +document.addEventListener('click', e => { + //@ts-ignore + const page = e.target.getAttribute('page'); + if (page) { + navigate(page); + e.preventDefault(); + e.stopImmediatePropagation(); + } +}); + +// @ts-ignore +Handlebars.registerHelper("imageUrl", function( options) { + const attrs = Object.keys(options.hash) + .map(function(key) { + if(key==='src'){ + const imgUrl = new URL(urlImages+options.hash[key], import.meta.url).href; + return key + '="' + imgUrl + '"';} + return key + '="' + options.hash[key] + '"'; + }) + .join(" "); + + return ( + "" + "" + ); }); \ No newline at end of file From e8f05e961749d356f108eec402008d1dd339c619 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 19:09:47 +0400 Subject: [PATCH 11/55] fixed error --- src/config.ts | 2 +- src/main.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/config.ts b/src/config.ts index 632e7decd..f460bb548 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1 +1 @@ -export const urlImages='/'; \ No newline at end of file +export const urlImages='/'; diff --git a/src/main.ts b/src/main.ts index adbab1ef1..9ab224721 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,7 +10,6 @@ import {chat1, mockListChats} from "./mocks/chat.mocks"; import {message1, mockListMessages} from "./mocks/chat-message.mocks"; import {urlImages} from "./config"; - const pages = { "allComponents": [Pages.AllComponentsPage,{chat1:chat1,chatList:mockListChats,message:message1,messageList:mockListMessages,currentUser:mockUser}], "loginPage": [Pages.PageLogin], From 43df296fce977877353ec47a1db487ee1c24dfa0 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 19:11:45 +0400 Subject: [PATCH 12/55] fixed error --- src/main.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main.ts b/src/main.ts index 9ab224721..37a3517ed 100644 --- a/src/main.ts +++ b/src/main.ts @@ -32,9 +32,7 @@ const navigate = (page: string) => { const container = document.getElementById('app')!; container.innerHTML = Handlebars.compile(source)(context); } - document.addEventListener('DOMContentLoaded', () => navigate('allPages')); - document.addEventListener('click', e => { //@ts-ignore const page = e.target.getAttribute('page'); @@ -44,7 +42,6 @@ document.addEventListener('click', e => { e.stopImmediatePropagation(); } }); - // @ts-ignore Handlebars.registerHelper("imageUrl", function( options) { const attrs = Object.keys(options.hash) From 7a0a48ccd953aab46fd75d9a35d39b05c5cec856 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 19:13:00 +0400 Subject: [PATCH 13/55] fixed error --- src/main.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 37a3517ed..2d0aff81b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -25,7 +25,6 @@ const pages = { Object.entries(Components).forEach(([name, component]) => { Handlebars.registerPartial(name, component); }); - const navigate = (page: string) => { //@ts-ignore const [source, context] = pages[page]; From 0fe67ec2dafc60d159d7d18f09734574007790ac Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 19:32:56 +0400 Subject: [PATCH 14/55] fixed error --- src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 2d0aff81b..2fd85053c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -57,4 +57,4 @@ Handlebars.registerHelper("imageUrl", function( options) { attrs + ">" + "" ); -}); \ No newline at end of file +}); From 89159a5674c919051bd3ea73ce726777b41b27f4 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 19:40:56 +0400 Subject: [PATCH 15/55] fixed error --- src/styles/fonts.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/fonts.css b/src/styles/fonts.css index 239a13691..a38ad9e14 100644 --- a/src/styles/fonts.css +++ b/src/styles/fonts.css @@ -5,4 +5,4 @@ text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -} \ No newline at end of file +} From 5a3cc8f96241c337d208ce21d70da2a33e7bc65b Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 19:43:07 +0400 Subject: [PATCH 16/55] fixed error --- src/styles/global.css | 17 +++++++++++++++++ src/styles/main.css | 2 +- src/styles/reset.css | 17 ----------------- src/styles/variables.css | 1 + 4 files changed, 19 insertions(+), 18 deletions(-) create mode 100644 src/styles/global.css diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 000000000..9c29cf847 --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,17 @@ +.container{ + display: flex; + justify-content: center; + align-items: flex-start; + height: 100vh; + width: 100vw; + position: relative; +} +.container-center{ + align-items: center; +} + +.container-shadow{ + border-radius: 12px; + background: #FFF; + box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); +} \ No newline at end of file diff --git a/src/styles/main.css b/src/styles/main.css index 5aa174cda..67438d64e 100644 --- a/src/styles/main.css +++ b/src/styles/main.css @@ -1,3 +1,3 @@ @import url("variables.css"); @import url("fonts.css"); -@import url("reset.css"); \ No newline at end of file +@import url("reset.css"); diff --git a/src/styles/reset.css b/src/styles/reset.css index 153bf2556..326319294 100644 --- a/src/styles/reset.css +++ b/src/styles/reset.css @@ -10,20 +10,3 @@ input:focus-visible { outline: none; } input, select { width: 100% } -.container{ - display: flex; - justify-content: center; - align-items: flex-start; - height: 100vh; - width: 100vw; - position: relative; -} -.container-center{ - align-items: center; -} - -.container-shadow{ - border-radius: 12px; - background: #FFF; - box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); -} \ No newline at end of file diff --git a/src/styles/variables.css b/src/styles/variables.css index 548c03249..2ce22c9b7 100644 --- a/src/styles/variables.css +++ b/src/styles/variables.css @@ -12,3 +12,4 @@ box-sizing: border-box; } + From 8cc2a98ff7275de583bcba20c3ab0e64856752a4 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 19:44:29 +0400 Subject: [PATCH 17/55] fixed error --- src/styles/global.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/global.css b/src/styles/global.css index 9c29cf847..b34387799 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -14,4 +14,4 @@ border-radius: 12px; background: #FFF; box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); -} \ No newline at end of file +} From fa881513212accafca400aaabd97714b52f4cfe1 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 19:56:36 +0400 Subject: [PATCH 18/55] added lf --- src/config.ts | 2 +- src/main.ts | 120 +++++++++++++++++++++--------------------- src/styles/global.css | 2 +- 3 files changed, 62 insertions(+), 62 deletions(-) diff --git a/src/config.ts b/src/config.ts index f460bb548..35e27eba2 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1 +1 @@ -export const urlImages='/'; +export const urlImages='/'; diff --git a/src/main.ts b/src/main.ts index 2fd85053c..ad7ee8766 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,60 +1,60 @@ -import './styles/main.css'; -// @ts-ignore -import Handlebars from 'handlebars'; -// @ts-ignore -import * as Components from './components'; -// @ts-ignore -import * as Pages from './pages'; -import {mockUser} from "./mocks/user-profile.mocks"; -import {chat1, mockListChats} from "./mocks/chat.mocks"; -import {message1, mockListMessages} from "./mocks/chat-message.mocks"; -import {urlImages} from "./config"; - -const pages = { - "allComponents": [Pages.AllComponentsPage,{chat1:chat1,chatList:mockListChats,message:message1,messageList:mockListMessages,currentUser:mockUser}], - "loginPage": [Pages.PageLogin], - "pageRegistration": [Pages.PageRegistration], - "pageProfile": [Pages.PageProfile,{user:mockUser}], - "pageProfileEdit": [Pages.PageProfileEdit,{user:mockUser}], - "pagePasswordEdit": [Pages.PagePasswordEdit,{user:mockUser}], - "pageChat": [Pages.PageChat,{chatList:mockListChats,messageList:mockListMessages,currentUser:mockUser}], - "page500": [Pages.Page500], - "page404": [Pages.Page404], - "allPages": [Pages.AllPages] -}; -Object.entries(Components).forEach(([name, component]) => { - Handlebars.registerPartial(name, component); -}); -const navigate = (page: string) => { - //@ts-ignore - const [source, context] = pages[page]; - const container = document.getElementById('app')!; - container.innerHTML = Handlebars.compile(source)(context); -} -document.addEventListener('DOMContentLoaded', () => navigate('allPages')); -document.addEventListener('click', e => { - //@ts-ignore - const page = e.target.getAttribute('page'); - if (page) { - navigate(page); - e.preventDefault(); - e.stopImmediatePropagation(); - } -}); -// @ts-ignore -Handlebars.registerHelper("imageUrl", function( options) { - const attrs = Object.keys(options.hash) - .map(function(key) { - if(key==='src'){ - const imgUrl = new URL(urlImages+options.hash[key], import.meta.url).href; - return key + '="' + imgUrl + '"';} - return key + '="' + options.hash[key] + '"'; - }) - .join(" "); - - return ( - "" + "" - ); -}); +import './styles/main.css'; +// @ts-ignore +import Handlebars from 'handlebars'; +// @ts-ignore +import * as Components from './components'; +// @ts-ignore +import * as Pages from './pages'; +import {mockUser} from "./mocks/user-profile.mocks"; +import {chat1, mockListChats} from "./mocks/chat.mocks"; +import {message1, mockListMessages} from "./mocks/chat-message.mocks"; +import {urlImages} from "./config"; + +const pages = { + "allComponents": [Pages.AllComponentsPage,{chat1:chat1,chatList:mockListChats,message:message1,messageList:mockListMessages,currentUser:mockUser}], + "loginPage": [Pages.PageLogin], + "pageRegistration": [Pages.PageRegistration], + "pageProfile": [Pages.PageProfile,{user:mockUser}], + "pageProfileEdit": [Pages.PageProfileEdit,{user:mockUser}], + "pagePasswordEdit": [Pages.PagePasswordEdit,{user:mockUser}], + "pageChat": [Pages.PageChat,{chatList:mockListChats,messageList:mockListMessages,currentUser:mockUser}], + "page500": [Pages.Page500], + "page404": [Pages.Page404], + "allPages": [Pages.AllPages] +}; +Object.entries(Components).forEach(([name, component]) => { + Handlebars.registerPartial(name, component); +}); +const navigate = (page: string) => { + //@ts-ignore + const [source, context] = pages[page]; + const container = document.getElementById('app')!; + container.innerHTML = Handlebars.compile(source)(context); +} +document.addEventListener('DOMContentLoaded', () => navigate('allPages')); +document.addEventListener('click', e => { + //@ts-ignore + const page = e.target.getAttribute('page'); + if (page) { + navigate(page); + e.preventDefault(); + e.stopImmediatePropagation(); + } +}); +// @ts-ignore +Handlebars.registerHelper("imageUrl", function( options) { + const attrs = Object.keys(options.hash) + .map(function(key) { + if(key==='src'){ + const imgUrl = new URL(urlImages+options.hash[key], import.meta.url).href; + return key + '="' + imgUrl + '"';} + return key + '="' + options.hash[key] + '"'; + }) + .join(" "); + + return ( + "" + "" + ); +}); diff --git a/src/styles/global.css b/src/styles/global.css index b34387799..9c29cf847 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -14,4 +14,4 @@ border-radius: 12px; background: #FFF; box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); -} +} \ No newline at end of file From 90e932046ba1fd6fea9ae46f483860facd9e0aff Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:03:26 +0400 Subject: [PATCH 19/55] added lf --- src/styles/global.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/global.css b/src/styles/global.css index 9c29cf847..b34387799 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -14,4 +14,4 @@ border-radius: 12px; background: #FFF; box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); -} \ No newline at end of file +} From 6abd1b57d593a886748129b2b3957b153e54d891 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:08:31 +0400 Subject: [PATCH 20/55] added cr --- src/styles/fonts.css | 9 +-------- src/styles/global.css | 18 +----------------- src/styles/main.css | 4 +--- src/styles/reset.css | 13 +------------ src/styles/variables.css | 16 +--------------- 5 files changed, 5 insertions(+), 55 deletions(-) diff --git a/src/styles/fonts.css b/src/styles/fonts.css index a38ad9e14..ef722590b 100644 --- a/src/styles/fonts.css +++ b/src/styles/fonts.css @@ -1,8 +1 @@ -* { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - text-rendering: optimizelegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} +* { font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; font-weight: 400; text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } \ No newline at end of file diff --git a/src/styles/global.css b/src/styles/global.css index b34387799..6beac8d49 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,17 +1 @@ -.container{ - display: flex; - justify-content: center; - align-items: flex-start; - height: 100vh; - width: 100vw; - position: relative; -} -.container-center{ - align-items: center; -} - -.container-shadow{ - border-radius: 12px; - background: #FFF; - box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); -} +.container{ display: flex; justify-content: center; align-items: flex-start; height: 100vh; width: 100vw; position: relative; } .container-center{ align-items: center; } .container-shadow{ border-radius: 12px; background: #FFF; box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); } \ No newline at end of file diff --git a/src/styles/main.css b/src/styles/main.css index 67438d64e..9fa0bb3a7 100644 --- a/src/styles/main.css +++ b/src/styles/main.css @@ -1,3 +1 @@ -@import url("variables.css"); -@import url("fonts.css"); -@import url("reset.css"); +@import url("variables.css"); @import url("fonts.css"); @import url("reset.css"); \ No newline at end of file diff --git a/src/styles/reset.css b/src/styles/reset.css index 326319294..63a073690 100644 --- a/src/styles/reset.css +++ b/src/styles/reset.css @@ -1,12 +1 @@ -* { - box-sizing: border-box!important; - color: var(--gray-dark); - font-size: 14px; - font-family: Arial, serif; - margin: 0; - padding: 0; -} -input:focus-visible { - outline: none; -} -input, select { width: 100% } +* { box-sizing: border-box!important; color: var(--gray-dark); font-size: 14px; font-family: Arial, serif; margin: 0; padding: 0; } input:focus-visible { outline: none; } input, select { width: 100% } \ No newline at end of file diff --git a/src/styles/variables.css b/src/styles/variables.css index 2ce22c9b7..0c8279090 100644 --- a/src/styles/variables.css +++ b/src/styles/variables.css @@ -1,15 +1 @@ -:root { - --white:white; - --orange:#FF7A00; - --red:#FC4343; - --red-light:#fedede; - --success:#a043fc; - --gray-0:#f3f3f3; - --gray-1:#EBEBEB; - --gray-light:#9A9A9A; - --gray-3:#464646; - --gray-dark:#3C3C3C; - - box-sizing: border-box; -} - +:root { --white:white; --orange:#FF7A00; --red:#FC4343; --red-light:#fedede; --success:#a043fc; --gray-0:#f3f3f3; --gray-1:#EBEBEB; --gray-light:#9A9A9A; --gray-3:#464646; --gray-dark:#3C3C3C; box-sizing: border-box; } \ No newline at end of file From 9009af254eab11a9b47e50f73e3987842ad17b8b Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:09:46 +0400 Subject: [PATCH 21/55] added lf --- src/styles/fonts.css | 9 ++++++++- src/styles/global.css | 18 +++++++++++++++++- src/styles/main.css | 4 +++- src/styles/reset.css | 13 ++++++++++++- src/styles/variables.css | 16 +++++++++++++++- 5 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/styles/fonts.css b/src/styles/fonts.css index ef722590b..a38ad9e14 100644 --- a/src/styles/fonts.css +++ b/src/styles/fonts.css @@ -1 +1,8 @@ -* { font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; font-weight: 400; text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } \ No newline at end of file +* { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + text-rendering: optimizelegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/src/styles/global.css b/src/styles/global.css index 6beac8d49..9c29cf847 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1 +1,17 @@ -.container{ display: flex; justify-content: center; align-items: flex-start; height: 100vh; width: 100vw; position: relative; } .container-center{ align-items: center; } .container-shadow{ border-radius: 12px; background: #FFF; box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); } \ No newline at end of file +.container{ + display: flex; + justify-content: center; + align-items: flex-start; + height: 100vh; + width: 100vw; + position: relative; +} +.container-center{ + align-items: center; +} + +.container-shadow{ + border-radius: 12px; + background: #FFF; + box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); +} \ No newline at end of file diff --git a/src/styles/main.css b/src/styles/main.css index 9fa0bb3a7..67438d64e 100644 --- a/src/styles/main.css +++ b/src/styles/main.css @@ -1 +1,3 @@ -@import url("variables.css"); @import url("fonts.css"); @import url("reset.css"); \ No newline at end of file +@import url("variables.css"); +@import url("fonts.css"); +@import url("reset.css"); diff --git a/src/styles/reset.css b/src/styles/reset.css index 63a073690..326319294 100644 --- a/src/styles/reset.css +++ b/src/styles/reset.css @@ -1 +1,12 @@ -* { box-sizing: border-box!important; color: var(--gray-dark); font-size: 14px; font-family: Arial, serif; margin: 0; padding: 0; } input:focus-visible { outline: none; } input, select { width: 100% } \ No newline at end of file +* { + box-sizing: border-box!important; + color: var(--gray-dark); + font-size: 14px; + font-family: Arial, serif; + margin: 0; + padding: 0; +} +input:focus-visible { + outline: none; +} +input, select { width: 100% } diff --git a/src/styles/variables.css b/src/styles/variables.css index 0c8279090..2ce22c9b7 100644 --- a/src/styles/variables.css +++ b/src/styles/variables.css @@ -1 +1,15 @@ -:root { --white:white; --orange:#FF7A00; --red:#FC4343; --red-light:#fedede; --success:#a043fc; --gray-0:#f3f3f3; --gray-1:#EBEBEB; --gray-light:#9A9A9A; --gray-3:#464646; --gray-dark:#3C3C3C; box-sizing: border-box; } \ No newline at end of file +:root { + --white:white; + --orange:#FF7A00; + --red:#FC4343; + --red-light:#fedede; + --success:#a043fc; + --gray-0:#f3f3f3; + --gray-1:#EBEBEB; + --gray-light:#9A9A9A; + --gray-3:#464646; + --gray-dark:#3C3C3C; + + box-sizing: border-box; +} + From fe1e148377888bbffcb9f23925908c07ce294828 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:13:42 +0400 Subject: [PATCH 22/55] added lf --- src/styles/fonts.css | 1 + src/styles/global.css | 3 ++- src/styles/main.css | 1 + src/styles/reset.css | 1 + src/styles/variables.css | 1 + 5 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/styles/fonts.css b/src/styles/fonts.css index a38ad9e14..5fb50e506 100644 --- a/src/styles/fonts.css +++ b/src/styles/fonts.css @@ -6,3 +6,4 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } + diff --git a/src/styles/global.css b/src/styles/global.css index 9c29cf847..66fc5984e 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -14,4 +14,5 @@ border-radius: 12px; background: #FFF; box-shadow: 0 0 6px 0 rgb(0 0 0 / 14%); -} \ No newline at end of file +} + diff --git a/src/styles/main.css b/src/styles/main.css index 67438d64e..c0e31efc5 100644 --- a/src/styles/main.css +++ b/src/styles/main.css @@ -1,3 +1,4 @@ @import url("variables.css"); @import url("fonts.css"); @import url("reset.css"); + diff --git a/src/styles/reset.css b/src/styles/reset.css index 326319294..f8339be12 100644 --- a/src/styles/reset.css +++ b/src/styles/reset.css @@ -10,3 +10,4 @@ input:focus-visible { outline: none; } input, select { width: 100% } + diff --git a/src/styles/variables.css b/src/styles/variables.css index 2ce22c9b7..c2d2641a1 100644 --- a/src/styles/variables.css +++ b/src/styles/variables.css @@ -13,3 +13,4 @@ box-sizing: border-box; } + From 7b583571c8e5c42943d1725058e86552cd14bcc1 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:14:53 +0400 Subject: [PATCH 23/55] added lf --- src/models/user.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/models/user.ts b/src/models/user.ts index 272ffd920..cfe9ce046 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -7,4 +7,5 @@ export interface User { phone:string; email:string; avatar?:string; -} \ No newline at end of file +} + From 26efede34c1167fc0bb23d77a278fbf1580d1a74 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:32:26 +0400 Subject: [PATCH 24/55] added new lines --- src/components/avatar/avatar.hbs | 3 +- src/components/avatar/avatar.pcss | 3 +- src/components/avatar/index.ts | 1 + src/components/badge/badge.hbs | 3 +- src/components/badge/badge.pcss | 2 ++ src/components/badge/index.ts | 1 + src/components/button/button.hbs | 3 +- src/components/button/button.pcss | 2 ++ src/components/button/index.ts | 1 + src/components/chat-item/chat-item.hbs | 2 ++ src/components/chat-item/chat-item.pcss | 3 +- src/components/chat-item/index.ts | 2 ++ src/components/chat-list/chat-list.hbs | 2 ++ src/components/chat-list/chat-list.pcss | 3 +- src/components/chat-list/index.ts | 2 ++ src/components/error/error.hbs | 3 +- src/components/error/error.pcss | 2 ++ src/components/error/index.ts | 2 ++ src/components/form-auth/form-auth.hbs | 3 +- src/components/form-auth/form-auth.pcss | 3 +- src/components/form-auth/index.ts | 1 + src/components/form-profile/form-profile.hbs | 3 +- src/components/form-profile/form-profile.pcss | 3 +- src/components/form-profile/index.ts | 1 + src/components/index.ts | 2 +- src/components/input-search/index.ts | 2 ++ src/components/input-search/input-search.hbs | 3 +- src/components/input-search/input-search.pcss | 1 + src/components/input-wide/index.ts | 2 ++ src/components/input-wide/input-wide.hbs | 3 +- src/components/input-wide/input-wide.pcss | 2 ++ src/components/input/index.ts | 2 ++ src/components/input/input.hbs | 3 +- src/components/input/input.pcss | 2 ++ src/components/link/index.ts | 2 ++ src/components/link/link.hbs | 3 +- src/components/link/link.pcss | 2 ++ src/components/loader/index.ts | 2 ++ src/components/loader/loader.css | 2 +- src/components/loader/loader.hbs | 2 ++ src/components/message-list/index.ts | 2 ++ src/components/message-list/message-list.hbs | 2 ++ src/components/message-list/message-list.pcss | 3 +- src/components/message/index.ts | 2 ++ src/components/message/message.hbs | 2 ++ src/components/message/message.pcss | 3 +- src/components/modal/index.ts | 2 ++ src/components/modal/modal.hbs | 23 ++++++------- src/components/modal/modal.pcss | 5 +-- src/config.ts | 3 +- src/index.html | 3 +- src/main.ts | 32 ++++++++++++------- src/mocks/chat-message.mocks.ts | 5 +-- src/mocks/chat.mocks.ts | 9 +++--- src/mocks/user-profile.mocks.ts | 6 ++-- src/models/chat-message.ts | 14 ++++---- src/models/chat.ts | 13 ++++---- src/models/file.ts | 12 +++---- src/models/user.ts | 17 +++++----- src/pages/404/404.hbs | 3 +- src/pages/404/index.ts | 3 +- src/pages/500/500.hbs | 2 +- src/pages/500/index.ts | 3 +- src/pages/all-components/all-components.css | 8 ++--- src/pages/all-components/all-components.hbs | 2 ++ src/pages/all-components/index.ts | 4 ++- src/pages/all-pages/all-pages.hbs | 22 ++++++------- src/pages/all-pages/index.ts | 3 +- src/pages/chat-page/chat-page.css | 1 + src/pages/chat-page/chat-page.hbs | 16 +++++----- src/pages/chat-page/index.ts | 3 +- src/pages/index.ts | 21 ++++++------ src/pages/login/index.ts | 3 +- src/pages/login/login.hbs | 5 +-- src/pages/password-edit/index.ts | 3 +- src/pages/password-edit/password-edit.hbs | 2 +- src/pages/profile-edit/index.ts | 3 +- src/pages/profile-edit/profile-edit.hbs | 14 ++++---- src/pages/profile/index.ts | 3 +- src/pages/profile/profile.hbs | 14 ++++---- src/pages/registration/index.ts | 3 +- src/pages/registration/registration.hbs | 5 +-- 82 files changed, 247 insertions(+), 146 deletions(-) diff --git a/src/components/avatar/avatar.hbs b/src/components/avatar/avatar.hbs index 8beeb8f29..e3cc960d7 100644 --- a/src/components/avatar/avatar.hbs +++ b/src/components/avatar/avatar.hbs @@ -7,4 +7,5 @@
Load New Avatar
{{/if}} - \ No newline at end of file + + diff --git a/src/components/avatar/avatar.pcss b/src/components/avatar/avatar.pcss index 65a32eab8..c3897013e 100644 --- a/src/components/avatar/avatar.pcss +++ b/src/components/avatar/avatar.pcss @@ -55,4 +55,5 @@ } -} \ No newline at end of file +} + diff --git a/src/components/avatar/index.ts b/src/components/avatar/index.ts index 3ef359235..a6796d370 100644 --- a/src/components/avatar/index.ts +++ b/src/components/avatar/index.ts @@ -1,2 +1,3 @@ import './avatar.pcss'; export { default as Avatar } from './avatar.hbs?raw'; + diff --git a/src/components/badge/badge.hbs b/src/components/badge/badge.hbs index 2d8a596aa..8a083344f 100644 --- a/src/components/badge/badge.hbs +++ b/src/components/badge/badge.hbs @@ -1 +1,2 @@ -
{{text}}
\ No newline at end of file +
{{text}}
+ diff --git a/src/components/badge/badge.pcss b/src/components/badge/badge.pcss index 06407bdcc..ee769aa7d 100644 --- a/src/components/badge/badge.pcss +++ b/src/components/badge/badge.pcss @@ -29,3 +29,5 @@ } + + diff --git a/src/components/badge/index.ts b/src/components/badge/index.ts index 2382fb45d..1385a39ea 100644 --- a/src/components/badge/index.ts +++ b/src/components/badge/index.ts @@ -1,2 +1,3 @@ import './badge.pcss'; export { default as Badge } from './badge.hbs?raw'; + diff --git a/src/components/button/button.hbs b/src/components/button/button.hbs index 1a0fc7012..9775d9ea5 100644 --- a/src/components/button/button.hbs +++ b/src/components/button/button.hbs @@ -1 +1,2 @@ - \ No newline at end of file + + diff --git a/src/components/button/button.pcss b/src/components/button/button.pcss index 05df5f5c0..08dd1c206 100644 --- a/src/components/button/button.pcss +++ b/src/components/button/button.pcss @@ -69,3 +69,5 @@ height: 25px; } + + diff --git a/src/components/button/index.ts b/src/components/button/index.ts index f3d2c354f..852d96811 100644 --- a/src/components/button/index.ts +++ b/src/components/button/index.ts @@ -1,2 +1,3 @@ import './button.pcss'; export { default as Button } from './button.hbs?raw'; + diff --git a/src/components/chat-item/chat-item.hbs b/src/components/chat-item/chat-item.hbs index f746634e7..9d2dbf954 100644 --- a/src/components/chat-item/chat-item.hbs +++ b/src/components/chat-item/chat-item.hbs @@ -19,3 +19,5 @@ {{/with}} + + diff --git a/src/components/chat-item/chat-item.pcss b/src/components/chat-item/chat-item.pcss index 912a5cb06..914f78c0d 100644 --- a/src/components/chat-item/chat-item.pcss +++ b/src/components/chat-item/chat-item.pcss @@ -45,4 +45,5 @@ overflow: hidden; text-overflow: ellipsis; } -} \ No newline at end of file +} + diff --git a/src/components/chat-item/index.ts b/src/components/chat-item/index.ts index e3afa1a4e..86d891918 100644 --- a/src/components/chat-item/index.ts +++ b/src/components/chat-item/index.ts @@ -1,2 +1,4 @@ import './chat-item.pcss'; export { default as ChatItem } from './chat-item.hbs?raw'; + + diff --git a/src/components/chat-list/chat-list.hbs b/src/components/chat-list/chat-list.hbs index 254367f6d..085aee98f 100644 --- a/src/components/chat-list/chat-list.hbs +++ b/src/components/chat-list/chat-list.hbs @@ -11,3 +11,5 @@ {{/each}} + + diff --git a/src/components/chat-list/chat-list.pcss b/src/components/chat-list/chat-list.pcss index b7ecde318..ea431dec8 100644 --- a/src/components/chat-list/chat-list.pcss +++ b/src/components/chat-list/chat-list.pcss @@ -19,4 +19,5 @@ .chat-list__chats{ overflow-y:auto ; } -} \ No newline at end of file +} + diff --git a/src/components/chat-list/index.ts b/src/components/chat-list/index.ts index aac275333..50644232c 100644 --- a/src/components/chat-list/index.ts +++ b/src/components/chat-list/index.ts @@ -1,2 +1,4 @@ import './chat-list.pcss'; export { default as ChatList } from './chat-list.hbs?raw'; + + diff --git a/src/components/error/error.hbs b/src/components/error/error.hbs index 8dc40e54e..8e2f2a076 100644 --- a/src/components/error/error.hbs +++ b/src/components/error/error.hbs @@ -7,4 +7,5 @@ {{errorText}} {{>Link caption="Go back" page=page }} - \ No newline at end of file + + diff --git a/src/components/error/error.pcss b/src/components/error/error.pcss index 7e652b67f..9801e31b2 100644 --- a/src/components/error/error.pcss +++ b/src/components/error/error.pcss @@ -17,3 +17,5 @@ } + + diff --git a/src/components/error/index.ts b/src/components/error/index.ts index 7f46e5502..b1223cab0 100644 --- a/src/components/error/index.ts +++ b/src/components/error/index.ts @@ -1,2 +1,4 @@ import './error.pcss'; export { default as Error } from './error.hbs?raw'; + + diff --git a/src/components/form-auth/form-auth.hbs b/src/components/form-auth/form-auth.hbs index d722c33c4..a2b4c41ff 100644 --- a/src/components/form-auth/form-auth.hbs +++ b/src/components/form-auth/form-auth.hbs @@ -9,4 +9,5 @@ {{> Button caption=ok-text page=ok-page }} {{>Link caption=cancel-text page=cancel-page }} - \ No newline at end of file + + diff --git a/src/components/form-auth/form-auth.pcss b/src/components/form-auth/form-auth.pcss index c0aface79..5540b8922 100644 --- a/src/components/form-auth/form-auth.pcss +++ b/src/components/form-auth/form-auth.pcss @@ -22,4 +22,5 @@ margin-top: 30px; align-self: end; } -} \ No newline at end of file +} + diff --git a/src/components/form-auth/index.ts b/src/components/form-auth/index.ts index ba7d00a1e..f86104ef9 100644 --- a/src/components/form-auth/index.ts +++ b/src/components/form-auth/index.ts @@ -1,2 +1,3 @@ import './form-auth.pcss'; export { default as FormAuth } from './form-auth.hbs?raw'; + diff --git a/src/components/form-profile/form-profile.hbs b/src/components/form-profile/form-profile.hbs index e987f38d7..225f30a0e 100644 --- a/src/components/form-profile/form-profile.hbs +++ b/src/components/form-profile/form-profile.hbs @@ -22,4 +22,5 @@
{{> Button type="cancel" page=button-page }} -
\ No newline at end of file + + diff --git a/src/components/form-profile/form-profile.pcss b/src/components/form-profile/form-profile.pcss index a9ce09571..f04cb068b 100644 --- a/src/components/form-profile/form-profile.pcss +++ b/src/components/form-profile/form-profile.pcss @@ -45,4 +45,5 @@ &:hover{ opacity: 0.8; } -} \ No newline at end of file +} + diff --git a/src/components/form-profile/index.ts b/src/components/form-profile/index.ts index 8422934a0..3dfd05032 100644 --- a/src/components/form-profile/index.ts +++ b/src/components/form-profile/index.ts @@ -1,2 +1,3 @@ import './form-profile.pcss'; export { default as FormProfile } from './form-profile.hbs?raw'; + diff --git a/src/components/index.ts b/src/components/index.ts index 80d5156ab..ea52e5650 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -13,4 +13,4 @@ export { ChatList } from './chat-list'; export { MessageList } from './message-list'; export { Message } from './message'; export { Badge } from './badge'; -export { Error } from './error'; \ No newline at end of file +export { Error } from './error'; diff --git a/src/components/input-search/index.ts b/src/components/input-search/index.ts index a98caeeb6..47357389d 100644 --- a/src/components/input-search/index.ts +++ b/src/components/input-search/index.ts @@ -1,2 +1,4 @@ import './input-search.pcss'; export { default as InputSearch } from './input-search.hbs?raw'; + + diff --git a/src/components/input-search/input-search.hbs b/src/components/input-search/input-search.hbs index f9646e8ba..325287127 100644 --- a/src/components/input-search/input-search.hbs +++ b/src/components/input-search/input-search.hbs @@ -6,4 +6,5 @@ name="{{name}}" type="text" /> - \ No newline at end of file + + diff --git a/src/components/input-search/input-search.pcss b/src/components/input-search/input-search.pcss index 001602d65..68ad8ea1e 100644 --- a/src/components/input-search/input-search.pcss +++ b/src/components/input-search/input-search.pcss @@ -54,3 +54,4 @@ + diff --git a/src/components/input-wide/index.ts b/src/components/input-wide/index.ts index fff32995c..f3cde17cd 100644 --- a/src/components/input-wide/index.ts +++ b/src/components/input-wide/index.ts @@ -1,2 +1,4 @@ import './input-wide.pcss'; export { default as InputWide } from './input-wide.hbs?raw'; + + diff --git a/src/components/input-wide/input-wide.hbs b/src/components/input-wide/input-wide.hbs index f4f5ec093..24c1e2988 100644 --- a/src/components/input-wide/input-wide.hbs +++ b/src/components/input-wide/input-wide.hbs @@ -15,4 +15,5 @@
{{errorText}}
{{/if}} - \ No newline at end of file + + diff --git a/src/components/input-wide/input-wide.pcss b/src/components/input-wide/input-wide.pcss index bba86c804..033e2f867 100644 --- a/src/components/input-wide/input-wide.pcss +++ b/src/components/input-wide/input-wide.pcss @@ -52,3 +52,5 @@ + + diff --git a/src/components/input/index.ts b/src/components/input/index.ts index d02901614..2495c9886 100644 --- a/src/components/input/index.ts +++ b/src/components/input/index.ts @@ -1,2 +1,4 @@ import './input.pcss'; export { default as Input } from './input.hbs?raw'; + + diff --git a/src/components/input/input.hbs b/src/components/input/input.hbs index 638d08233..530185cc3 100644 --- a/src/components/input/input.hbs +++ b/src/components/input/input.hbs @@ -14,4 +14,5 @@ {{/if}} - \ No newline at end of file + + diff --git a/src/components/input/input.pcss b/src/components/input/input.pcss index 5100f32f5..498821d85 100644 --- a/src/components/input/input.pcss +++ b/src/components/input/input.pcss @@ -60,3 +60,5 @@ + + diff --git a/src/components/link/index.ts b/src/components/link/index.ts index a62ffdb09..cf93aa888 100644 --- a/src/components/link/index.ts +++ b/src/components/link/index.ts @@ -1,2 +1,4 @@ import './link.pcss'; export { default as Link } from './link.hbs?raw'; + + diff --git a/src/components/link/link.hbs b/src/components/link/link.hbs index 784966727..40aadf13f 100644 --- a/src/components/link/link.hbs +++ b/src/components/link/link.hbs @@ -3,4 +3,5 @@ page="{{page}}"> {{caption}} {{#if linkIcon}} {{/if}} -
\ No newline at end of file + + diff --git a/src/components/link/link.pcss b/src/components/link/link.pcss index 6ca3f647e..c80ec7213 100644 --- a/src/components/link/link.pcss +++ b/src/components/link/link.pcss @@ -35,3 +35,5 @@ } + + diff --git a/src/components/loader/index.ts b/src/components/loader/index.ts index 768bc084d..2d4daf40b 100644 --- a/src/components/loader/index.ts +++ b/src/components/loader/index.ts @@ -1,2 +1,4 @@ import './loader.css'; export { default as Loader } from './loader.hbs?raw'; + + diff --git a/src/components/loader/loader.css b/src/components/loader/loader.css index 3b48860cc..6248f7a36 100644 --- a/src/components/loader/loader.css +++ b/src/components/loader/loader.css @@ -30,4 +30,4 @@ 100% { transform: rotate(360deg); } -} \ No newline at end of file +} diff --git a/src/components/loader/loader.hbs b/src/components/loader/loader.hbs index f23547956..a7ca5f9f4 100644 --- a/src/components/loader/loader.hbs +++ b/src/components/loader/loader.hbs @@ -1 +1,3 @@ + + diff --git a/src/components/message-list/index.ts b/src/components/message-list/index.ts index 4c21edd17..f37189640 100644 --- a/src/components/message-list/index.ts +++ b/src/components/message-list/index.ts @@ -1,2 +1,4 @@ import './message-list.pcss'; export { default as MessageList } from './message-list.hbs?raw'; + + diff --git a/src/components/message-list/message-list.hbs b/src/components/message-list/message-list.hbs index c492229a2..e6b920c6c 100644 --- a/src/components/message-list/message-list.hbs +++ b/src/components/message-list/message-list.hbs @@ -26,3 +26,5 @@ {{> Button type="arrow"}} + + diff --git a/src/components/message-list/message-list.pcss b/src/components/message-list/message-list.pcss index d78421581..e9f31b858 100644 --- a/src/components/message-list/message-list.pcss +++ b/src/components/message-list/message-list.pcss @@ -59,4 +59,5 @@ } } -} \ No newline at end of file +} + diff --git a/src/components/message/index.ts b/src/components/message/index.ts index 0e8f55e95..4a60e90af 100644 --- a/src/components/message/index.ts +++ b/src/components/message/index.ts @@ -1,2 +1,4 @@ import './message.pcss'; export { default as Message } from './message.hbs?raw'; + + diff --git a/src/components/message/message.hbs b/src/components/message/message.hbs index 65737c600..b3bb84cc1 100644 --- a/src/components/message/message.hbs +++ b/src/components/message/message.hbs @@ -17,3 +17,5 @@ {{/if}} {{/with}} + + diff --git a/src/components/message/message.pcss b/src/components/message/message.pcss index 2debf00a7..172251162 100644 --- a/src/components/message/message.pcss +++ b/src/components/message/message.pcss @@ -58,4 +58,5 @@ display: flex; justify-content: flex-end; } -} \ No newline at end of file +} + diff --git a/src/components/modal/index.ts b/src/components/modal/index.ts index c8f6321b0..0acc72f33 100644 --- a/src/components/modal/index.ts +++ b/src/components/modal/index.ts @@ -1,2 +1,4 @@ import './modal.pcss'; export { default as Modal } from './modal.hbs?raw'; + + diff --git a/src/components/modal/modal.hbs b/src/components/modal/modal.hbs index ad19ba894..e253e619e 100644 --- a/src/components/modal/modal.hbs +++ b/src/components/modal/modal.hbs @@ -1,15 +1,16 @@ + diff --git a/src/pages/404/index.ts b/src/pages/404/index.ts index d69c907ce..02d2daa5d 100644 --- a/src/pages/404/index.ts +++ b/src/pages/404/index.ts @@ -1 +1,2 @@ -export { default as Page404 } from './404.hbs?raw'; +export {default as Page404} from './404.hbs?raw'; + diff --git a/src/pages/500/500.hbs b/src/pages/500/500.hbs index e0b9e8fc4..789fe0cc4 100644 --- a/src/pages/500/500.hbs +++ b/src/pages/500/500.hbs @@ -1,3 +1,3 @@
{{>Error errorNumber="500" errorText="Something went wrong :(" page="pageChat"}} -
\ No newline at end of file + diff --git a/src/pages/500/index.ts b/src/pages/500/index.ts index e31f83152..602432c44 100644 --- a/src/pages/500/index.ts +++ b/src/pages/500/index.ts @@ -1 +1,2 @@ -export { default as Page500 } from './500.hbs?raw'; +export {default as Page500} from './500.hbs?raw'; + diff --git a/src/pages/all-components/all-components.css b/src/pages/all-components/all-components.css index 0ec7c80ba..283ba39ab 100644 --- a/src/pages/all-components/all-components.css +++ b/src/pages/all-components/all-components.css @@ -1,9 +1,9 @@ -.container-all{ +.container-all { display: grid; - grid-template-rows: repeat(10,auto); - gap:10px; + grid-template-rows: repeat(10, auto); + gap: 10px; justify-items: center; width: 100vw; height: 100vh; padding: 20px; -} \ No newline at end of file +} diff --git a/src/pages/all-components/all-components.hbs b/src/pages/all-components/all-components.hbs index 113d2474e..9d8723cbe 100644 --- a/src/pages/all-components/all-components.hbs +++ b/src/pages/all-components/all-components.hbs @@ -29,3 +29,5 @@ {{#> Modal caption="Load File" ok-text='Save'}}
Ok
{{/Modal}}--> + + diff --git a/src/pages/all-components/index.ts b/src/pages/all-components/index.ts index 05ad87cbb..eff111fe2 100644 --- a/src/pages/all-components/index.ts +++ b/src/pages/all-components/index.ts @@ -1,2 +1,4 @@ import './all-components.css'; -export { default as AllComponentsPage } from './all-components.hbs?raw'; + +export {default as AllComponentsPage} from './all-components.hbs?raw'; + diff --git a/src/pages/all-pages/all-pages.hbs b/src/pages/all-pages/all-pages.hbs index d4d50b4e9..9ecb1c256 100644 --- a/src/pages/all-pages/all-pages.hbs +++ b/src/pages/all-pages/all-pages.hbs @@ -1,12 +1,12 @@
-
- {{>Link caption="Page 404" type='success' page="page404" }} - {{>Link caption="Page 500" type='success' page="page500" }} - {{>Link caption="Login Page" type='success' page="loginPage" }} - {{>Link caption="Page Registration" type='success' page="pageRegistration" }} - {{>Link caption="Page Profile" type='success' page="pageProfile" }} - {{>Link caption="Page Profile Edit" type='success' page="pageProfileEdit" }} - {{>Link caption="Page Password Edit" type='success' page="pagePasswordEdit" }} - {{>Link caption="Page Chat" type='success' page="pageChat" }} -
-
\ No newline at end of file +
+ {{>Link caption="Page 404" type='success' page="page404" }} + {{>Link caption="Page 500" type='success' page="page500" }} + {{>Link caption="Login Page" type='success' page="loginPage" }} + {{>Link caption="Page Registration" type='success' page="pageRegistration" }} + {{>Link caption="Page Profile" type='success' page="pageProfile" }} + {{>Link caption="Page Profile Edit" type='success' page="pageProfileEdit" }} + {{>Link caption="Page Password Edit" type='success' page="pagePasswordEdit" }} + {{>Link caption="Page Chat" type='success' page="pageChat" }} +
+ diff --git a/src/pages/all-pages/index.ts b/src/pages/all-pages/index.ts index dc97ee7cd..75a6b99ad 100644 --- a/src/pages/all-pages/index.ts +++ b/src/pages/all-pages/index.ts @@ -1 +1,2 @@ -export { default as AllPages } from './all-pages.hbs?raw'; +export {default as AllPages} from './all-pages.hbs?raw'; + diff --git a/src/pages/chat-page/chat-page.css b/src/pages/chat-page/chat-page.css index 2ff35f4e1..b490b80ae 100644 --- a/src/pages/chat-page/chat-page.css +++ b/src/pages/chat-page/chat-page.css @@ -21,3 +21,4 @@ .chat-page__main { grid-area: chat-page__main; } + diff --git a/src/pages/chat-page/chat-page.hbs b/src/pages/chat-page/chat-page.hbs index a13914bf8..9c7684995 100644 --- a/src/pages/chat-page/chat-page.hbs +++ b/src/pages/chat-page/chat-page.hbs @@ -1,9 +1,9 @@ - -
-
- {{>ChatList list=chatList}} -
-
- {{>MessageList messageList=messageList currentUser=currentUser}} -
+
+
+ {{>ChatList list=chatList}} +
+
+ {{>MessageList messageList=messageList currentUser=currentUser}}
+
+ diff --git a/src/pages/chat-page/index.ts b/src/pages/chat-page/index.ts index 07c56de4c..89e919547 100644 --- a/src/pages/chat-page/index.ts +++ b/src/pages/chat-page/index.ts @@ -1,3 +1,4 @@ import "./chat-page.css"; -export { default as PageChat } from './chat-page.hbs?raw'; +export {default as PageChat} from './chat-page.hbs?raw'; + diff --git a/src/pages/index.ts b/src/pages/index.ts index f76b3cd2e..55d46010c 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -1,10 +1,11 @@ -export { AllComponentsPage } from './all-components'; -export { PageLogin } from './login'; -export { PageRegistration } from './registration'; -export { PageProfileEdit } from './profile-edit'; -export { PageProfile } from './profile'; -export { PagePasswordEdit } from './password-edit'; -export { PageChat } from './chat-page'; -export { Page500} from './500'; -export { Page404} from './404'; -export { AllPages} from './all-pages'; +export {AllComponentsPage} from './all-components'; +export {PageLogin} from './login'; +export {PageRegistration} from './registration'; +export {PageProfileEdit} from './profile-edit'; +export {PageProfile} from './profile'; +export {PagePasswordEdit} from './password-edit'; +export {PageChat} from './chat-page'; +export {Page500} from './500'; +export {Page404} from './404'; +export {AllPages} from './all-pages'; + diff --git a/src/pages/login/index.ts b/src/pages/login/index.ts index ebe40f0ed..a5c63c31b 100644 --- a/src/pages/login/index.ts +++ b/src/pages/login/index.ts @@ -1 +1,2 @@ -export { default as PageLogin } from './login.hbs?raw'; +export {default as PageLogin} from './login.hbs?raw'; + diff --git a/src/pages/login/login.hbs b/src/pages/login/login.hbs index efded4236..4cc69215d 100644 --- a/src/pages/login/login.hbs +++ b/src/pages/login/login.hbs @@ -1,8 +1,9 @@
- {{#> FormAuth caption='Login' ok-text='sign in' cancel-text='Register' ok-page='pageChat' cancel-page='pageRegistration'}} + {{#> FormAuth caption='Login' ok-text='sign in' cancel-text='Register' ok-page='pageChat' + cancel-page='pageRegistration'}}
{{>Input label="Login" type="text" name="login" value='' }} {{>Input label="Password" type="password" name="password" value='' }}
{{/FormAuth}} -
\ No newline at end of file +
diff --git a/src/pages/password-edit/index.ts b/src/pages/password-edit/index.ts index e884824a3..21bacdf00 100644 --- a/src/pages/password-edit/index.ts +++ b/src/pages/password-edit/index.ts @@ -1 +1,2 @@ -export { default as PagePasswordEdit } from './password-edit.hbs?raw'; +export {default as PagePasswordEdit} from './password-edit.hbs?raw'; + diff --git a/src/pages/password-edit/password-edit.hbs b/src/pages/password-edit/password-edit.hbs index 34bc396bc..2c35aaf4d 100644 --- a/src/pages/password-edit/password-edit.hbs +++ b/src/pages/password-edit/password-edit.hbs @@ -4,4 +4,4 @@ {{>InputWide label="New Password" type="password" name="newPassword" }} {{>InputWide label="Repeat New Password" type="password" name="repeat_password" noLine=true }} {{/FormProfile}} - \ No newline at end of file + diff --git a/src/pages/profile-edit/index.ts b/src/pages/profile-edit/index.ts index 60dbf6faa..93994255a 100644 --- a/src/pages/profile-edit/index.ts +++ b/src/pages/profile-edit/index.ts @@ -1 +1,2 @@ -export { default as PageProfileEdit } from './profile-edit.hbs?raw'; +export {default as PageProfileEdit} from './profile-edit.hbs?raw'; + diff --git a/src/pages/profile-edit/profile-edit.hbs b/src/pages/profile-edit/profile-edit.hbs index bd7dbc5d1..2c42cc998 100644 --- a/src/pages/profile-edit/profile-edit.hbs +++ b/src/pages/profile-edit/profile-edit.hbs @@ -1,10 +1,10 @@
{{#> FormProfile withButton=true button-text="Save User Profile" button-page="pageProfile" user=user}} - {{>InputWide label="Email" type="text" name="email" value=email }} - {{>InputWide label="Login" type="text" name="login" value=login }} - {{>InputWide label="First Name" type="text" name="first_name" value=firstName }} - {{>InputWide label="Last Name" type="text" name="last_name" value=lastName }} - {{>InputWide label="Name in Chat" type="text" name="name_in_chat" value=nameInChat }} - {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true }} + {{>InputWide label="Email" type="text" name="email" value=email }} + {{>InputWide label="Login" type="text" name="login" value=login }} + {{>InputWide label="First Name" type="text" name="first_name" value=firstName }} + {{>InputWide label="Last Name" type="text" name="last_name" value=lastName }} + {{>InputWide label="Name in Chat" type="text" name="name_in_chat" value=nameInChat }} + {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true }} {{/FormProfile}} -
\ No newline at end of file + diff --git a/src/pages/profile/index.ts b/src/pages/profile/index.ts index 79060e5fc..641fbedce 100644 --- a/src/pages/profile/index.ts +++ b/src/pages/profile/index.ts @@ -1 +1,2 @@ -export { default as PageProfile } from './profile.hbs?raw'; +export {default as PageProfile} from './profile.hbs?raw'; + diff --git a/src/pages/profile/profile.hbs b/src/pages/profile/profile.hbs index 215c93403..ca90cc547 100644 --- a/src/pages/profile/profile.hbs +++ b/src/pages/profile/profile.hbs @@ -1,10 +1,10 @@
{{#> FormProfile user=user button-page='pageChat'}} - {{>InputWide label="Email" type="text" name="email" value=email readOnly=true }} - {{>InputWide label="Login" type="text" name="login" value=login readOnly=true }} - {{>InputWide label="First Name" type="text" name="first_name" value=first_name readOnly=true }} - {{>InputWide label="Last Name" type="text" name="last_name" value=second_name readOnly=true }} - {{>InputWide label="Name in Chat" type="text" name="name_in_chat" value=nameInChat readOnly=true }} - {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true readOnly=true }} + {{>InputWide label="Email" type="text" name="email" value=email readOnly=true }} + {{>InputWide label="Login" type="text" name="login" value=login readOnly=true }} + {{>InputWide label="First Name" type="text" name="first_name" value=first_name readOnly=true }} + {{>InputWide label="Last Name" type="text" name="last_name" value=second_name readOnly=true }} + {{>InputWide label="Name in Chat" type="text" name="name_in_chat" value=nameInChat readOnly=true }} + {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true readOnly=true }} {{/FormProfile}} -
\ No newline at end of file + diff --git a/src/pages/registration/index.ts b/src/pages/registration/index.ts index e10a6b1a2..03e88f4a7 100644 --- a/src/pages/registration/index.ts +++ b/src/pages/registration/index.ts @@ -1 +1,2 @@ -export { default as PageRegistration } from './registration.hbs?raw'; +export {default as PageRegistration} from './registration.hbs?raw'; + diff --git a/src/pages/registration/registration.hbs b/src/pages/registration/registration.hbs index b2d27cd68..b4e5b660d 100644 --- a/src/pages/registration/registration.hbs +++ b/src/pages/registration/registration.hbs @@ -1,5 +1,6 @@
- {{#> FormAuth caption='Registration' ok-text='sign up' cancel-text='Login' ok-page='pageChat' cancel-page='loginPage'}} + {{#> FormAuth caption='Registration' ok-text='sign up' cancel-text='Login' ok-page='pageChat' + cancel-page='loginPage'}} {{>Input label="Email" type="email" name="email" }} {{>Input label="Login" type="text" name="login"}} {{>Input label="First Name" type="text" name="first_name" }} @@ -8,4 +9,4 @@ {{>Input label="Password" type="password" name="password"}} {{>Input label="Password (2nd time)" type="password" name="password2"}} {{/FormAuth}} -
\ No newline at end of file + From 428784e4cb9c796e05f0d318f0498524ec8ec00a Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:34:52 +0400 Subject: [PATCH 25/55] added new lines --- src/components/avatar/avatar.pcss | 18 ++++++++++-------- src/components/avatar/index.ts | 4 +++- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/components/avatar/avatar.pcss b/src/components/avatar/avatar.pcss index c3897013e..26fccd0bc 100644 --- a/src/components/avatar/avatar.pcss +++ b/src/components/avatar/avatar.pcss @@ -1,6 +1,6 @@ .avatar { border-radius: 100px; - border:1px var(--red) solid; + border: 1px var(--red) solid; cursor: pointer; height: 130px; width: 130px; @@ -10,20 +10,21 @@ background: url("../../assets/icons/image.svg") no-repeat center; position: relative; - &.sm{ + &.sm { height: 50px; width: 50px; } - &:hover .avatar__image{ + &:hover .avatar__image { background-color: var(--red); } - &:hover .avatar__hover{ + &:hover .avatar__hover { background-color: var(--red); opacity: 0.8; } - .avatar__image{ + + .avatar__image { border-radius: 100%; width: 100%; height: 100%; @@ -33,7 +34,7 @@ display: block; } - .avatar__hover{ + .avatar__hover { transition: .5s ease; opacity: 0; position: absolute; @@ -46,14 +47,15 @@ display: flex; align-items: center; justify-content: center; - .avatar__hover__text{ + + .avatar__hover__text { color: white; font-size: 16px; width: 100px; text-align: center; } } - + } diff --git a/src/components/avatar/index.ts b/src/components/avatar/index.ts index a6796d370..56ba64284 100644 --- a/src/components/avatar/index.ts +++ b/src/components/avatar/index.ts @@ -1,3 +1,5 @@ import './avatar.pcss'; -export { default as Avatar } from './avatar.hbs?raw'; + +export {default as Avatar} from './avatar.hbs?raw'; + From 9fd97bd30fc12eecddc8d2d75b0a380174ada723 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:37:29 +0400 Subject: [PATCH 26/55] added new lines --- src/components/badge/badge.pcss | 11 ++++++----- src/components/badge/index.ts | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/badge/badge.pcss b/src/components/badge/badge.pcss index ee769aa7d..801c81ad3 100644 --- a/src/components/badge/badge.pcss +++ b/src/components/badge/badge.pcss @@ -3,11 +3,11 @@ border-radius: 20px; padding: 1px 6px; cursor: pointer; - background:transparent; + background: transparent; width: auto; max-width: 45px; - span{ + span { text-align: center; font-size: 12px; color: var(--gray-light); @@ -16,12 +16,13 @@ &.badge-primary { background: var(--gray-light); - span{ + span { color: var(--white); } } - &.badge-ready{ - span{ + + &.badge-ready { + span { color: var(--red); } } diff --git a/src/components/badge/index.ts b/src/components/badge/index.ts index 1385a39ea..7d9c977a5 100644 --- a/src/components/badge/index.ts +++ b/src/components/badge/index.ts @@ -1,3 +1,4 @@ import './badge.pcss'; -export { default as Badge } from './badge.hbs?raw'; + +export {default as Badge} from './badge.hbs?raw'; From 61bb68ed6ac02489c8e814108223d77617473d54 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:42:36 +0400 Subject: [PATCH 27/55] added new lines --- src/components/chat-item/chat-item.hbs | 14 +++++++------- src/components/chat-item/index.ts | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/components/chat-item/chat-item.hbs b/src/components/chat-item/chat-item.hbs index 9d2dbf954..4f2778829 100644 --- a/src/components/chat-item/chat-item.hbs +++ b/src/components/chat-item/chat-item.hbs @@ -3,14 +3,14 @@
{{> Avatar image=avatar size='sm'}}
-
-
- {{title}} -
-
- {{last_message.time}} -
+
+
+ {{title}}
+
+ {{last_message.time}} +
+

{{last_message.content}}

diff --git a/src/components/chat-item/index.ts b/src/components/chat-item/index.ts index 86d891918..b4ab342bc 100644 --- a/src/components/chat-item/index.ts +++ b/src/components/chat-item/index.ts @@ -1,4 +1,5 @@ import './chat-item.pcss'; -export { default as ChatItem } from './chat-item.hbs?raw'; + +export {default as ChatItem} from './chat-item.hbs?raw'; From 34baa611759beab077fe7344e1e633db64ce10cd Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:43:27 +0400 Subject: [PATCH 28/55] added new lines --- src/components/badge/badge.pcss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/badge/badge.pcss b/src/components/badge/badge.pcss index 801c81ad3..1ece28af9 100644 --- a/src/components/badge/badge.pcss +++ b/src/components/badge/badge.pcss @@ -1,11 +1,12 @@ .badge { border: none; border-radius: 20px; + width: auto; + max-width: 45px; padding: 1px 6px; cursor: pointer; background: transparent; - width: auto; - max-width: 45px; + span { text-align: center; From 01ddaf649105f75c262b6ab6dec7cc55975ab174 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:49:58 +0400 Subject: [PATCH 29/55] added new lines --- README.md | 3 ++- netlify.yaml | 3 ++- package.json | 1 + server.js | 2 ++ tsconfig.json | 2 ++ vite.config.ts | 3 ++- 6 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2918f8e10..2a2e3bfac 100644 --- a/README.md +++ b/README.md @@ -25,4 +25,5 @@ ___ ### Demo ___ -[Site on Netlify](https://messenger-yandex-el.netlify.app/) \ No newline at end of file +[Site on Netlify](https://messenger-yandex-el.netlify.app/) + diff --git a/netlify.yaml b/netlify.yaml index 2d514c3ac..39155c6aa 100644 --- a/netlify.yaml +++ b/netlify.yaml @@ -6,4 +6,5 @@ # “publish” is the directory to publish (relative to the root of your repo). [build] - publish = "dist" \ No newline at end of file + publish = "dist" + diff --git a/package.json b/package.json index 2cf7bf262..7f71e7f8b 100644 --- a/package.json +++ b/package.json @@ -23,3 +23,4 @@ } } } + diff --git a/server.js b/server.js index 38e1bd7ab..2c197b482 100644 --- a/server.js +++ b/server.js @@ -10,3 +10,5 @@ app.use(express.static(`${__dirname}/dist/`)); app.listen(PORT, function () { console.log(`⚡️[server]: Server is running at http://localhost:${PORT} ${__dirname}`); }); + + diff --git a/tsconfig.json b/tsconfig.json index 75abdef26..b9078462c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,3 +21,5 @@ }, "include": ["src"] } + + diff --git a/vite.config.ts b/vite.config.ts index b563b45b4..a186220be 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -16,4 +16,5 @@ export default defineConfig({ plugins: [ handlebars({}) as Plugin, ], -}) \ No newline at end of file +}) + From 901d0f976aa473703874194be4e71a9f033d1968 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 20:54:01 +0400 Subject: [PATCH 30/55] fixed engines --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index 7f71e7f8b..42df37e61 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,8 @@ "vite": "^4.4.9", "vite-plugin-handlebars": "^1.6.0" }, - "engine": { "engines": { "node": ">= 14.0.0" } - } } From 97b5cd66a620c8a207c49733e326298d3081715e Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 21:03:39 +0400 Subject: [PATCH 31/55] merge from sprint_1 --- src/styles/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/main.css b/src/styles/main.css index c0e31efc5..f04e7f338 100644 --- a/src/styles/main.css +++ b/src/styles/main.css @@ -1,4 +1,5 @@ @import url("variables.css"); @import url("fonts.css"); @import url("reset.css"); +@import url("global.css"); From 4369c1acc9e3a183c8e06b0918e0d0fcde33298e Mon Sep 17 00:00:00 2001 From: ellevanova Date: Tue, 5 Sep 2023 21:21:26 +0400 Subject: [PATCH 32/55] fixed errors --- src/components/form-auth/form-auth.hbs | 4 ++-- src/components/form-profile/form-profile.hbs | 2 +- src/pages/all-components/all-components.hbs | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/form-auth/form-auth.hbs b/src/components/form-auth/form-auth.hbs index a2b4c41ff..2975af5fa 100644 --- a/src/components/form-auth/form-auth.hbs +++ b/src/components/form-auth/form-auth.hbs @@ -1,4 +1,4 @@ -
+

{{caption}}

@@ -9,5 +9,5 @@ {{> Button caption=ok-text page=ok-page }} {{>Link caption=cancel-text page=cancel-page }}
-
+ diff --git a/src/components/form-profile/form-profile.hbs b/src/components/form-profile/form-profile.hbs index 225f30a0e..770f26639 100644 --- a/src/components/form-profile/form-profile.hbs +++ b/src/components/form-profile/form-profile.hbs @@ -1,6 +1,6 @@
- {{> Avatar image=user.image}} + {{> Avatar image=user.image isLoadAvatar=true}}

{{user.firstName}} {{user.lastName}}

{{#with user}} diff --git a/src/pages/all-components/all-components.hbs b/src/pages/all-components/all-components.hbs index 9d8723cbe..f798616db 100644 --- a/src/pages/all-components/all-components.hbs +++ b/src/pages/all-components/all-components.hbs @@ -12,9 +12,9 @@ {{>Input label="Login" type="text" name="login" }} {{>Input label="Error" type="text" name="error" error=true errorText='Error!!'}} {{> Avatar isLoadAvatar=true}} - {{> Avatar image="1.jpeg"isLoadAvatar=true}} - {{> Avatar image="2.jpg"isLoadAvatar=true}} - {{> Avatar image="3.jpg"isLoadAvatar=true}} + {{> Avatar image="1.jpeg" isLoadAvatar=true}} + {{> Avatar image="2.jpg" isLoadAvatar=true}} + {{> Avatar image="3.jpg" isLoadAvatar=true}} {{>InputWide label="Login" type="text" name="login" value='MyLogin' readOnly=false }} {{>InputWide label="Login" type="text" name="login" value='MyLogin' readOnly=true noLine=true }} {{>InputWide label="Error" type="text" name="error" error=true errorText='Error!!' readOnly=false}} From 0d2dbac4e15bf85ffdfbb2bf237f5af1b2b1c03e Mon Sep 17 00:00:00 2001 From: ellevanova Date: Wed, 6 Sep 2023 16:32:51 +0400 Subject: [PATCH 33/55] fixed errors by review --- src/components/chat-item/chat-item.hbs | 4 ++-- src/components/chat-list/chat-list.hbs | 8 +++---- src/components/chat-list/chat-list.pcss | 24 ++++++++++--------- src/components/form-auth/form-auth.hbs | 4 ++-- src/components/message-list/message-list.hbs | 12 +++++----- src/components/message-list/message-list.pcss | 3 +-- src/components/message/message.hbs | 14 +++++------ src/components/modal/modal.hbs | 4 ++-- src/index.html | 6 ++--- src/pages/login/login.hbs | 4 ++-- src/pages/password-edit/password-edit.hbs | 6 ++--- src/pages/profile-edit/profile-edit.hbs | 10 ++++---- src/pages/profile/profile.hbs | 8 +++---- src/pages/registration/registration.hbs | 4 ++-- 14 files changed, 55 insertions(+), 56 deletions(-) diff --git a/src/components/chat-item/chat-item.hbs b/src/components/chat-item/chat-item.hbs index 4f2778829..03938d6bd 100644 --- a/src/components/chat-item/chat-item.hbs +++ b/src/components/chat-item/chat-item.hbs @@ -1,4 +1,4 @@ -
+
  • {{#with chat}}
    {{> Avatar image=avatar size='sm'}} @@ -18,6 +18,6 @@ {{> Button type="number" caption=unread_count}}
    {{/with}} -
  • + diff --git a/src/components/chat-list/chat-list.hbs b/src/components/chat-list/chat-list.hbs index 085aee98f..bc81aece7 100644 --- a/src/components/chat-list/chat-list.hbs +++ b/src/components/chat-list/chat-list.hbs @@ -1,15 +1,15 @@
    -
    +
    + -
    +
      {{#each list as |chat|}} {{>ChatItem chat=chat}} {{/each}} -
    +
    diff --git a/src/components/chat-list/chat-list.pcss b/src/components/chat-list/chat-list.pcss index ea431dec8..84e7743a8 100644 --- a/src/components/chat-list/chat-list.pcss +++ b/src/components/chat-list/chat-list.pcss @@ -6,18 +6,20 @@ padding: 10px; -.chat-list__header { - display: flex; - justify-content: flex-end; -} + .chat-list__header { + display: flex; + justify-content: flex-end; + } -.chat-list__search { - padding: 10px 0; - margin-bottom: 10px; - border-bottom: 1px solid var(--gray-light); -} - .chat-list__chats{ - overflow-y:auto ; + .chat-list__search { + padding: 10px 0; + margin-bottom: 10px; + border-bottom: 1px solid var(--gray-light); + } + + .chat-list__chats { + overflow-y: auto; + list-style-type: none; } } diff --git a/src/components/form-auth/form-auth.hbs b/src/components/form-auth/form-auth.hbs index 2975af5fa..a2b4c41ff 100644 --- a/src/components/form-auth/form-auth.hbs +++ b/src/components/form-auth/form-auth.hbs @@ -1,4 +1,4 @@ -
    +

    {{caption}}

    @@ -9,5 +9,5 @@ {{> Button caption=ok-text page=ok-page }} {{>Link caption=cancel-text page=cancel-page }}
    -
    +
    diff --git a/src/components/message-list/message-list.hbs b/src/components/message-list/message-list.hbs index e6b920c6c..844abfdb9 100644 --- a/src/components/message-list/message-list.hbs +++ b/src/components/message-list/message-list.hbs @@ -8,20 +8,20 @@ {{> Button type="dots"}} {{/with}}
    -
    +
      {{#each messageList as |message|}}
      {{>Message message=message myMessage=message.main}}
      {{/each}} -
    + diff --git a/src/components/message-list/message-list.pcss b/src/components/message-list/message-list.pcss index e9f31b858..bf6a1b6f2 100644 --- a/src/components/message-list/message-list.pcss +++ b/src/components/message-list/message-list.pcss @@ -6,8 +6,6 @@ width: 100%; padding: 10px; - - .message-list__header { display: flex; justify-content: space-between; @@ -35,6 +33,7 @@ padding: 20px 0; margin-bottom:20px; height: 100%; + list-style-type: none; .message-list__main__message{ margin:20px 10px; } diff --git a/src/components/message/message.hbs b/src/components/message/message.hbs index b3bb84cc1..2ec71c88a 100644 --- a/src/components/message/message.hbs +++ b/src/components/message/message.hbs @@ -1,21 +1,21 @@ -
    +
  • {{#with message}} {{#if file}} -
    - included file +
    + included_file
    {{>Badge text="01.20" type="primary"}}
    -
    + {{else}} -
    +

    {{content}}

    {{>Badge text="01.20" }}
    -
    + {{/if}} {{/with}} -
  • + diff --git a/src/components/modal/modal.hbs b/src/components/modal/modal.hbs index e253e619e..7ff165526 100644 --- a/src/components/modal/modal.hbs +++ b/src/components/modal/modal.hbs @@ -1,4 +1,4 @@ - -
    + diff --git a/src/index.html b/src/index.html index 15ef3a00e..ec6366173 100644 --- a/src/index.html +++ b/src/index.html @@ -7,10 +7,8 @@ Chat - -
    - - + +
    diff --git a/src/pages/login/login.hbs b/src/pages/login/login.hbs index 4cc69215d..8944bcded 100644 --- a/src/pages/login/login.hbs +++ b/src/pages/login/login.hbs @@ -1,4 +1,4 @@ -
    +
    {{#> FormAuth caption='Login' ok-text='sign in' cancel-text='Register' ok-page='pageChat' cancel-page='pageRegistration'}}
    @@ -6,4 +6,4 @@ {{>Input label="Password" type="password" name="password" value='' }}
    {{/FormAuth}} -
    + diff --git a/src/pages/password-edit/password-edit.hbs b/src/pages/password-edit/password-edit.hbs index 2c35aaf4d..15d5a0432 100644 --- a/src/pages/password-edit/password-edit.hbs +++ b/src/pages/password-edit/password-edit.hbs @@ -1,7 +1,7 @@ -
    +
    {{#> FormProfile withButton=true button-text="Save Password" button-page="pageProfile" user=user}} {{>InputWide label="Old Password" type="password" name="oldPassword" value=password }} {{>InputWide label="New Password" type="password" name="newPassword" }} - {{>InputWide label="Repeat New Password" type="password" name="repeat_password" noLine=true }} + {{>InputWide label="Repeat New Password" type="password" name="repeatPassword" noLine=true }} {{/FormProfile}} -
    + diff --git a/src/pages/profile-edit/profile-edit.hbs b/src/pages/profile-edit/profile-edit.hbs index 2c42cc998..2aa2bc4e3 100644 --- a/src/pages/profile-edit/profile-edit.hbs +++ b/src/pages/profile-edit/profile-edit.hbs @@ -1,10 +1,10 @@ -
    +
    {{#> FormProfile withButton=true button-text="Save User Profile" button-page="pageProfile" user=user}} {{>InputWide label="Email" type="text" name="email" value=email }} {{>InputWide label="Login" type="text" name="login" value=login }} - {{>InputWide label="First Name" type="text" name="first_name" value=firstName }} - {{>InputWide label="Last Name" type="text" name="last_name" value=lastName }} - {{>InputWide label="Name in Chat" type="text" name="name_in_chat" value=nameInChat }} + {{>InputWide label="First Name" type="text" name="first_name" value=first_name }} + {{>InputWide label="Last Name" type="text" name="second_name" value=second_name }} + {{>InputWide label="Name in Chat" type="text" name="display_name" value=nameInChat }} {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true }} {{/FormProfile}} -
    + diff --git a/src/pages/profile/profile.hbs b/src/pages/profile/profile.hbs index ca90cc547..53b5c7cc1 100644 --- a/src/pages/profile/profile.hbs +++ b/src/pages/profile/profile.hbs @@ -1,10 +1,10 @@ -
    +
    {{#> FormProfile user=user button-page='pageChat'}} {{>InputWide label="Email" type="text" name="email" value=email readOnly=true }} {{>InputWide label="Login" type="text" name="login" value=login readOnly=true }} {{>InputWide label="First Name" type="text" name="first_name" value=first_name readOnly=true }} - {{>InputWide label="Last Name" type="text" name="last_name" value=second_name readOnly=true }} - {{>InputWide label="Name in Chat" type="text" name="name_in_chat" value=nameInChat readOnly=true }} + {{>InputWide label="Last Name" type="text" name="second_name" value=second_name readOnly=true }} + {{>InputWide label="Name in Chat" type="text" name="display_name" value=nameInChat readOnly=true }} {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true readOnly=true }} {{/FormProfile}} -
    + diff --git a/src/pages/registration/registration.hbs b/src/pages/registration/registration.hbs index b4e5b660d..78709a279 100644 --- a/src/pages/registration/registration.hbs +++ b/src/pages/registration/registration.hbs @@ -1,4 +1,4 @@ -
    +
    {{#> FormAuth caption='Registration' ok-text='sign up' cancel-text='Login' ok-page='pageChat' cancel-page='loginPage'}} {{>Input label="Email" type="email" name="email" }} @@ -9,4 +9,4 @@ {{>Input label="Password" type="password" name="password"}} {{>Input label="Password (2nd time)" type="password" name="password2"}} {{/FormAuth}} -
    + From cdb98a514f869e193be315bb663654eb17b1f99a Mon Sep 17 00:00:00 2001 From: ellevanova Date: Thu, 7 Sep 2023 21:47:42 +0400 Subject: [PATCH 34/55] added eslint --- .eslintignore | 3 + .eslintrc.json | 20 + .postcssrc.json | 2 +- package-lock.json | 1976 +++++++++++++++++++++++++++++++++++++++++---- package.json | 12 +- src/main.ts | 11 +- 6 files changed, 1854 insertions(+), 170 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..70aa65d02 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +/dist +/node_modules +/server.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..6751428a9 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,20 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + } +} diff --git a/.postcssrc.json b/.postcssrc.json index a3f4f1837..7316564a5 100644 --- a/.postcssrc.json +++ b/.postcssrc.json @@ -2,4 +2,4 @@ "plugins": { "postcss-preset-env": {} } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index bb307f2a6..6f46bdb9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,11 +10,26 @@ "devDependencies": { "@types/express": "^4.17.17", "@types/node": "^20.5.7", + "@typescript-eslint/eslint-plugin": "^6.6.0", + "@typescript-eslint/parser": "^6.6.0", + "eslint": "^8.48.0", "express": "^4.18.2", "postcss-preset-env": "^9.1.2", "typescript": "^5.2.2", "vite": "^4.4.9", "vite-plugin-handlebars": "^1.6.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@csstools/cascade-layer-name-parser": { @@ -1173,6 +1188,176 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -1222,6 +1407,12 @@ "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -1246,6 +1437,12 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "dev": true + }, "node_modules/@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", @@ -1267,147 +1464,541 @@ "@types/node": "*" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz", + "integrity": "sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==", "dev": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.6.0", + "@typescript-eslint/type-utils": "6.6.0", + "@typescript-eslint/utils": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": ">= 0.6" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/autoprefixer": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", - "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "node_modules/@typescript-eslint/parser": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.6.0.tgz", + "integrity": "sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001520", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" + "@typescript-eslint/scope-manager": "6.6.0", + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0", + "debug": "^4.3.4" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "postcss": "^8.1.0" + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", + "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz", + "integrity": "sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==", "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/utils": "6.6.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, "engines": { - "node": ">= 0.8" + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", + "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", + "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", "dev": true, - "funding": [ - { + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.6.0.tgz", + "integrity": "sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.6.0", + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/typescript-estree": "6.6.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", + "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001528", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001528.tgz", + "integrity": "sha512-0Db4yyjR9QMNlsxh+kKWzQtkyflkG/snYheSzkjmvdEtEXB1+jt7A2HmSEiO6XIJPIbo92lHNGNySvE5pZcs5Q==", + "dev": true, + "funding": [ + { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, @@ -1421,6 +2012,46 @@ } ] }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1457,6 +2088,20 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/css-blank-pseudo": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-6.0.0.tgz", @@ -1568,6 +2213,12 @@ "ms": "2.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1587,6 +2238,30 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1594,9 +2269,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.510", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.510.tgz", + "integrity": "sha512-xPfLIPFcN/WLXBpQ/K4UgE98oUBO5Tia6BD4rkSR0wE7ep/PwBVlgvPJQrIBpmJGVAmUzwPKuDbVt9XV6+uC2g==", "dev": true }, "node_modules/encodeurl": { @@ -1933,22 +2608,6 @@ "node": ">=12" } }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild-windows-arm64": { "version": "0.14.54", "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", @@ -1965,21 +2624,197 @@ "node": ">=12" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -2031,6 +2866,85 @@ "node": ">= 0.10.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -2049,6 +2963,42 @@ "node": ">= 0.8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2080,6 +3030,12 @@ "node": ">= 0.6" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2115,6 +3071,79 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -2148,6 +3177,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", @@ -2200,6 +3238,50 @@ "node": ">=0.10.0" } }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2227,6 +3309,136 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -2242,6 +3454,15 @@ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -2251,6 +3472,19 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -2284,6 +3518,18 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -2317,6 +3563,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2338,34 +3590,102 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { - "ee-first": "1.1.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=6" } }, "node_modules/parseurl": { @@ -2377,6 +3697,33 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -2389,12 +3736,33 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/postcss": { "version": "8.4.29", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", @@ -3090,6 +4458,15 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -3103,6 +4480,15 @@ "node": ">= 0.10" } }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -3118,6 +4504,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -3142,21 +4548,38 @@ "node": ">= 0.8" } }, - "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "glob": "^7.1.3" }, "bin": { - "resolve": "bin/resolve" + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rollup": { @@ -3175,6 +4598,29 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3201,6 +4647,21 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -3252,6 +4713,27 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -3266,6 +4748,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3293,6 +4784,42 @@ "node": ">= 0.8" } }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -3305,6 +4832,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -3314,6 +4859,42 @@ "node": ">=0.6" } }, + "node_modules/ts-api-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", + "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -3392,6 +4973,15 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3533,6 +5123,22 @@ "esbuild-windows-arm64": "0.14.54" } }, + "node_modules/vite-plugin-handlebars/node_modules/esbuild/node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite-plugin-handlebars/node_modules/rollup": { "version": "2.77.3", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", @@ -3585,11 +5191,67 @@ } } }, + "node_modules/vite-plugin-handlebars/node_modules/vite/node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 42df37e61..b381d2a4c 100644 --- a/package.json +++ b/package.json @@ -4,21 +4,23 @@ "version": "0.0.0", "scripts": { "dev": "vite", - "build": "tsc && vite build", + "build": "eslint . &&tsc && vite build", "preview": "vite preview", "start": "tsc && vite build && node ./server.js" }, "devDependencies": { "@types/express": "^4.17.17", "@types/node": "^20.5.7", + "@typescript-eslint/eslint-plugin": "^6.6.0", + "@typescript-eslint/parser": "^6.6.0", + "eslint": "^8.48.0", "express": "^4.18.2", "postcss-preset-env": "^9.1.2", "typescript": "^5.2.2", "vite": "^4.4.9", "vite-plugin-handlebars": "^1.6.0" }, - "engines": { - "node": ">= 14.0.0" - } + "engines": { + "node": ">= 14.0.0" + } } - diff --git a/src/main.ts b/src/main.ts index aa482b6ca..c65233874 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,9 +1,6 @@ import './styles/main.css'; -// @ts-ignore import Handlebars from 'handlebars'; -// @ts-ignore import * as Components from './components'; -// @ts-ignore import * as Pages from './pages'; import {mockUser} from "./mocks/user-profile.mocks"; import {chat1, mockListChats} from "./mocks/chat.mocks"; @@ -38,16 +35,16 @@ const navigate = (page: string) => { container.innerHTML = Handlebars.compile(source)(context); } document.addEventListener('DOMContentLoaded', () => navigate('allPages')); -document.addEventListener('click', e => { - //@ts-ignore - const page = e.target.getAttribute('page'); +document.addEventListener('click', (e:Event) => { + if(!e)return; + // @ts-ignore + const page = e.target?.getAttribute('page'); if (page) { navigate(page); e.preventDefault(); e.stopImmediatePropagation(); } }); -// @ts-ignore Handlebars.registerHelper("imageUrl", function (options) { const attrs = Object.keys(options.hash) .map(function (key) { From fca4bceed2afd3218da70537723ac20421c0729e Mon Sep 17 00:00:00 2001 From: ellevanova Date: Sat, 16 Sep 2023 14:26:38 +0400 Subject: [PATCH 35/55] added eventBus,Block, some components --- package-lock.json | 21 ++ package.json | 2 + src/components/button/button.hbs | 2 - src/components/button/button.ts | 27 +++ src/components/button/index.ts | 2 +- src/components/form-auth/form-auth.hbs | 4 +- src/components/form-auth/form-auth.ts | 40 ++++ src/components/form-auth/index.ts | 2 +- src/components/index.ts | 4 +- src/main.ts | 29 ++- src/pages/all-components/all-components.ts | 31 +++ src/pages/all-components/index.ts | 2 +- src/pages/index.ts | 4 +- src/pages/login/index.ts | 3 +- src/pages/login/login.ts | 34 ++++ src/utils/Block.ts | 188 ++++++++++++++++++ src/utils/EventBus.ts | 50 +++++ .../__tests__/register-components.test.ts | 0 src/utils/registerComponents.ts | 38 ++++ 19 files changed, 464 insertions(+), 19 deletions(-) delete mode 100644 src/components/button/button.hbs create mode 100644 src/components/button/button.ts create mode 100644 src/components/form-auth/form-auth.ts create mode 100644 src/pages/all-components/all-components.ts create mode 100644 src/pages/login/login.ts create mode 100644 src/utils/Block.ts create mode 100644 src/utils/EventBus.ts create mode 100644 src/utils/__tests__/register-components.test.ts create mode 100644 src/utils/registerComponents.ts diff --git a/package-lock.json b/package-lock.json index 6f46bdb9f..fd61cf477 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,14 @@ "devDependencies": { "@types/express": "^4.17.17", "@types/node": "^20.5.7", + "@types/uuid": "^9.0.4", "@typescript-eslint/eslint-plugin": "^6.6.0", "@typescript-eslint/parser": "^6.6.0", "eslint": "^8.48.0", "express": "^4.18.2", "postcss-preset-env": "^9.1.2", "typescript": "^5.2.2", + "uuid": "^9.0.1", "vite": "^4.4.9", "vite-plugin-handlebars": "^1.6.0" }, @@ -1464,6 +1466,12 @@ "@types/node": "*" } }, + "node_modules/@types/uuid": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.4.tgz", + "integrity": "sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz", @@ -4997,6 +5005,19 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index b381d2a4c..27c0fd724 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,14 @@ "devDependencies": { "@types/express": "^4.17.17", "@types/node": "^20.5.7", + "@types/uuid": "^9.0.4", "@typescript-eslint/eslint-plugin": "^6.6.0", "@typescript-eslint/parser": "^6.6.0", "eslint": "^8.48.0", "express": "^4.18.2", "postcss-preset-env": "^9.1.2", "typescript": "^5.2.2", + "uuid": "^9.0.1", "vite": "^4.4.9", "vite-plugin-handlebars": "^1.6.0" }, diff --git a/src/components/button/button.hbs b/src/components/button/button.hbs deleted file mode 100644 index 9775d9ea5..000000000 --- a/src/components/button/button.hbs +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/components/button/button.ts b/src/components/button/button.ts new file mode 100644 index 000000000..d4539b13c --- /dev/null +++ b/src/components/button/button.ts @@ -0,0 +1,27 @@ +import Block from "../../utils/Block"; + +interface IButtonProps { + type: 'arrow' | 'dots'|'paperclip'|'cancel'|'number', + caption: string, + page: string, + onClick: () => void +} + +export class Button extends Block { + constructor(props: IButtonProps) { + super(props); + this.props.events = { + click: this.props.onClick || (() => {}) + } + } + + protected render(): string { + const { type='', caption='', page='' } = this.props; + return (` + + `) + } +} diff --git a/src/components/button/index.ts b/src/components/button/index.ts index 852d96811..f16b52eed 100644 --- a/src/components/button/index.ts +++ b/src/components/button/index.ts @@ -1,3 +1,3 @@ import './button.pcss'; -export { default as Button } from './button.hbs?raw'; +export { Button as default } from './button.ts'; diff --git a/src/components/form-auth/form-auth.hbs b/src/components/form-auth/form-auth.hbs index a2b4c41ff..40029fcbb 100644 --- a/src/components/form-auth/form-auth.hbs +++ b/src/components/form-auth/form-auth.hbs @@ -6,8 +6,8 @@ {{> @partial-block }}
    - {{> Button caption=ok-text page=ok-page }} - {{>Link caption=cancel-text page=cancel-page }} + {{{ Button caption=ok-text page=ok-page }}} + {{{Link caption=cancel-text page=cancel-page }}}
    diff --git a/src/components/form-auth/form-auth.ts b/src/components/form-auth/form-auth.ts new file mode 100644 index 000000000..5dce666b7 --- /dev/null +++ b/src/components/form-auth/form-auth.ts @@ -0,0 +1,40 @@ +import Block from "../../utils/Block"; + +export class FormAuth extends Block { + private caption: string; + constructor() { + super({ + validate: { + login: (value: string) => value.length < 3 && value.length !== 0 ? `Length of login should not be less 3 letters.` : '' + }/*, + onLogin: (event:Event) => { + event.preventDefault(); + const login = this.refs.login.value(); + const password = this.refs.password.value(); + + console.log({ + login, + password + }) + }*/ + }); + this.caption='Login' + } + + protected render(): string { + return(` +
    +

    + ${this.caption} +

    +
    + {{> @partial-block }} +
    +
    + {{{ Button caption='ok-text' page='ok-page' }}} + {{>Link caption=cancel-text page=cancel-page }}} +
    +
    + `) + } +} diff --git a/src/components/form-auth/index.ts b/src/components/form-auth/index.ts index f86104ef9..f05e574a6 100644 --- a/src/components/form-auth/index.ts +++ b/src/components/form-auth/index.ts @@ -1,3 +1,3 @@ import './form-auth.pcss'; -export { default as FormAuth } from './form-auth.hbs?raw'; +export { FormAuth as default } from './form-auth.ts'; diff --git a/src/components/index.ts b/src/components/index.ts index ea52e5650..62575fb3b 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,10 +1,10 @@ -export { Button } from './button'; +export { default as Button } from './button' export { Input } from './input'; export { Link } from './link'; export { Loader } from './loader'; export { Avatar } from './avatar'; export { InputWide } from './input-wide'; -export { FormAuth } from './form-auth'; +export { default as FormAuth } from './form-auth'; export { FormProfile } from './form-profile'; export { Modal } from './modal'; export { ChatItem } from './chat-item'; diff --git a/src/main.ts b/src/main.ts index c65233874..7eed2ec5d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -6,6 +6,8 @@ import {mockUser} from "./mocks/user-profile.mocks"; import {chat1, mockListChats} from "./mocks/chat.mocks"; import {message1, mockListMessages} from "./mocks/chat-message.mocks"; import {urlImages} from "./config"; +import {registerComponent} from "./utils/registerComponents"; +import {AllComponentsPage} from "./pages"; const pages = { "allComponents": [Pages.AllComponentsPage, { @@ -15,7 +17,7 @@ const pages = { messageList: mockListMessages, currentUser: mockUser }], - "loginPage": [Pages.PageLogin], + "loginPage": [Pages.LoginPage], "pageRegistration": [Pages.PageRegistration], "pageProfile": [Pages.PageProfile, {user: mockUser}], "pageProfileEdit": [Pages.PageProfileEdit, {user: mockUser}], @@ -26,15 +28,28 @@ const pages = { "allPages": [Pages.AllPages] }; Object.entries(Components).forEach(([name, component]) => { - Handlebars.registerPartial(name, component); + if(typeof component==='string')Handlebars.registerPartial(name, component); + }); +registerComponent('Button', Components.Button); +registerComponent('FormAuth', Components.FormAuth); +registerComponent('LoginPage', Pages.LoginPage); const navigate = (page: string) => { + const app = document.getElementById('app'); + + if(page !== 'allComponents') { + const container = document.getElementById('app')!; + // @ts-ignore + container.innerHTML = Handlebars.compile(pages[page])({}); + return; + } + //@ts-ignore - const [source, context] = pages[page]; - const container = document.getElementById('app')!; - container.innerHTML = Handlebars.compile(source)(context); + const Component = pages[page] + const component = new AllComponentsPage(); + app?.append(component.getContent()!); } -document.addEventListener('DOMContentLoaded', () => navigate('allPages')); +document.addEventListener('DOMContentLoaded', () => navigate('allComponents')); document.addEventListener('click', (e:Event) => { if(!e)return; // @ts-ignore @@ -63,3 +78,5 @@ Handlebars.registerHelper("imageUrl", function (options) { ); }); + + diff --git a/src/pages/all-components/all-components.ts b/src/pages/all-components/all-components.ts new file mode 100644 index 000000000..3e316b11d --- /dev/null +++ b/src/pages/all-components/all-components.ts @@ -0,0 +1,31 @@ +import Block from "../../utils/Block"; + +export class AllComponents extends Block { + + constructor() { + super({ + validate: { + login: (value: string) => value.length < 3 && value.length !== 0 ? `Length of login should not be less 3 letters.` : '' + }, + onClick: (event:any) => { + event.preventDefault(); + console.log("click") + } + }); + } + + protected render(): string { + return(` +
    +
    + {{{ Button caption="sign in"}}} + {{{ Button type="number" caption="330"}}} + {{{ Button type="arrow" onClick=onClick}}} + {{{ Button type="dots" onClick=onClick}}} + {{{ Button type="paperclip" onClick=onClick}}} + {{{ Button type="cancel" onClick=onClick}}} +
    +
    + `) + } +} diff --git a/src/pages/all-components/index.ts b/src/pages/all-components/index.ts index eff111fe2..6410653e6 100644 --- a/src/pages/all-components/index.ts +++ b/src/pages/all-components/index.ts @@ -1,4 +1,4 @@ import './all-components.css'; -export {default as AllComponentsPage} from './all-components.hbs?raw'; +export {AllComponents as default} from './all-components.ts'; diff --git a/src/pages/index.ts b/src/pages/index.ts index 55d46010c..1ec85e2e5 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -1,5 +1,4 @@ -export {AllComponentsPage} from './all-components'; -export {PageLogin} from './login'; +export {default as AllComponentsPage} from './all-components'; export {PageRegistration} from './registration'; export {PageProfileEdit} from './profile-edit'; export {PageProfile} from './profile'; @@ -8,4 +7,5 @@ export {PageChat} from './chat-page'; export {Page500} from './500'; export {Page404} from './404'; export {AllPages} from './all-pages'; +export {default as LoginPage} from './login'; diff --git a/src/pages/login/index.ts b/src/pages/login/index.ts index a5c63c31b..bd7785b99 100644 --- a/src/pages/login/index.ts +++ b/src/pages/login/index.ts @@ -1,2 +1 @@ -export {default as PageLogin} from './login.hbs?raw'; - +export { LoginPage as default} from './login'; diff --git a/src/pages/login/login.ts b/src/pages/login/login.ts new file mode 100644 index 000000000..3293d3dd6 --- /dev/null +++ b/src/pages/login/login.ts @@ -0,0 +1,34 @@ +import Block from "../../utils/Block"; + +export class LoginPage extends Block { + constructor() { + super({ + validate: { + login: (value: string) => value.length < 3 && value.length !== 0 ? `Length of login should not be less 3 letters.` : '' + }/*, + onLogin: (event:Event) => { + event.preventDefault(); + const login = this.refs.login.value(); + const password = this.refs.password.value(); + + console.log({ + login, + password + }) + }*/ + }); + } + + protected render(): string { + return(` +
    + + + {{{ Button caption='ok-text' page='ok-page' }}} + +
    + `) + } +} diff --git a/src/utils/Block.ts b/src/utils/Block.ts new file mode 100644 index 000000000..907daff3b --- /dev/null +++ b/src/utils/Block.ts @@ -0,0 +1,188 @@ +import EventBus from "./EventBus"; +import { v4 as uuidv4 } from 'uuid'; +import Handlebars from "handlebars"; + +class Block { + static EVENTS = { + INIT: "init", + FLOW_CDM: "flow:component-did-mount", + FLOW_CDU: "flow:component-did-update", + FLOW_RENDER: "flow:render" + }; + + public id = uuidv4(); + protected props: any; + private _element: HTMLElement | null = null; + protected _meta: { props: any; }|null=null; + private _eventBus: () => EventBus; + private children: Record; + private refs: any; + + constructor( propsWithChildren:any = {}) { + const eventBus = new EventBus(); + const {props, children} = this._getChildrenAndProps(propsWithChildren); + + this._meta = { + props + }; + + this.children = children; + this.props = this._makePropsProxy(props); + console.log('init props',props,this.props) + + this._eventBus = () => eventBus; + + this._registerEvents(eventBus); + eventBus.emit(Block.EVENTS.INIT); + } + + _getChildrenAndProps(childrenAndProps: any) { + const props: Record = {}; + const children: Record = {}; + + Object.entries(childrenAndProps).forEach(([key, value]) => { + if (value instanceof Block) { + children[key] = value; + } else { + props[key] = value; + } + }); + + return {props, children}; + } + _registerEvents(eventBus:EventBus) { + eventBus.on(Block.EVENTS.INIT, this._init.bind(this)); + eventBus.on(Block.EVENTS.FLOW_CDM, this._componentDidMount.bind(this)); + eventBus.on(Block.EVENTS.FLOW_CDU, this._componentDidUpdate.bind(this)); + eventBus.on(Block.EVENTS.FLOW_RENDER, this._render.bind(this)); + } + + private _init() { + this.init(); + + this._eventBus().emit(Block.EVENTS.FLOW_RENDER); + } + protected init() { + } + + private _componentDidMount() { + this.componentDidMount(); + } + + protected componentDidMount() {} + + public dispatchComponentDidMount() { + this._eventBus().emit(Block.EVENTS.FLOW_CDM); + Object.values(this.children).forEach(child => child.dispatchComponentDidMount()); + } + + private _componentDidUpdate(oldProps:any, newProps:any) { + const response = this.componentDidUpdate(oldProps, newProps); + if(response) { + + this._eventBus().emit(Block.EVENTS.FLOW_RENDER); + } + } + + protected componentDidUpdate(oldProps:any, newProps:any) { + if(oldProps!==newProps) this.setProps(newProps); + return true; + } + + setProps = (nextProps:any) => { + if (!nextProps) { + return; + } + + //Object.assign(this.props, nextProps); + + }; + + get element() { + return this._element; + } + + private _render() { + const fragment = this.compile(this.render(), this.props); + + const newElement = fragment.firstElementChild as HTMLElement; + + if (this._element) { + this._element.replaceWith(newElement); + } + + this._element = newElement; + + this._addEvents(); + } + + _addEvents() { + const {events = {}} = this.props as { events: Record void> }; + + Object.keys(events).forEach(eventName => { + this._element?.addEventListener(eventName, events[eventName]); + }); + } + private compile(template: string, context: any) { + const contextAndStubs = {...context, __refs: this.refs}; + + const html = Handlebars.compile(template)(contextAndStubs); + + const temp = document.createElement('template'); + + temp.innerHTML = html; + + contextAndStubs.__children?.forEach(({embed}: any) => { + embed(temp.content); + }); + + return temp.content; + } + + protected render(): string { + return ''; + } + + getContent() { + return this.element; + } + + _makePropsProxy(props:any) { + // Можно и так передать this + // Такой способ больше не применяется с приходом ES6+ + const self = this; + return new Proxy(props, { + get(target, prop) { + const value = target[prop]; + return typeof value === "function" ? value.bind(target) : value; + }, + set(target, prop, value) { + const oldTarget = {...target} + + target[prop] = value; + + // Запускаем обновление компоненты + // Плохой cloneDeep, в следующей итерации нужно заставлять добавлять cloneDeep им самим + self._eventBus().emit(Block.EVENTS.FLOW_CDU, oldTarget, target); + return true; + }, + deleteProperty() { + throw new Error("Нет доступа"); + } + }); + } + + /*_createDocumentElement() { + // Можно сделать метод, который через фрагменты в цикле создаёт сразу несколько блоков + //return document.createElement(); + } + + show() { + this.getContent().style.display = "block"; + } + + hide() { + this.getContent().style.display = "none"; + }*/ +} +export default Block; diff --git a/src/utils/EventBus.ts b/src/utils/EventBus.ts new file mode 100644 index 000000000..8bab0961a --- /dev/null +++ b/src/utils/EventBus.ts @@ -0,0 +1,50 @@ +export default class EventBus { + private readonly listeners: { [event: string]: Array<(...args: Type[]) => void> } = {}; + + constructor() { + this.listeners = {}; + } + + /** + * Подписка на событие + * @param event + * @param callback + */ + on(event: string, callback: (...args: any) => void) { + if (!this.listeners[event]) { + this.listeners[event] = []; + } + + this.listeners[event].push(callback); + } + + /** + * Отписка + * @param event + * @param callback + */ + off(event: string, callback: (...args: any) => void) { + if (!this.listeners[event]) { + throw new Error(`Нет события: ${event}`); + } + + this.listeners[event] = this.listeners[event].filter( + listener => listener !== callback + ); + } + + /** + * Триггер события + * @param event + * @param args + */ + emit(event: string, ...args: Type[]) { + if (!this.listeners[event]) { + throw new Error(`Нет события: ${event}`); + } + + this.listeners[event].forEach(listener => { + listener(...args); + }); + } +} diff --git a/src/utils/__tests__/register-components.test.ts b/src/utils/__tests__/register-components.test.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/utils/registerComponents.ts b/src/utils/registerComponents.ts new file mode 100644 index 000000000..323dd608c --- /dev/null +++ b/src/utils/registerComponents.ts @@ -0,0 +1,38 @@ +import Handlebars from 'handlebars'; +import Block from "./Block"; +import {HelperOptions} from "handlebars"; + +export function registerComponent(name: string, Component: typeof Block) { + if (name in Handlebars.helpers) { + throw `The ${name} component is already registered!`; + } + + Handlebars.registerHelper(name, function (this: unknown, {hash, data, fn}: HelperOptions) { + const component = new Component(hash); + const dataAttribute = `data-id="${component.id}"`; + + if ('ref' in hash) { + (data.root.__refs = data.root.__refs || {})[hash.ref] = component; + } + + (data.root.__children = data.root.__children || []).push({ + component, + embed(fragment: DocumentFragment) { + const stub = fragment.querySelector(`[${dataAttribute}]`); + + if (!stub) { + return; + } + + const element=component.getContent(); + element?.append(...Array.from(stub.childNodes)); + + stub.replaceWith(element!); + } + }); + + const contents = fn ? fn(this) : ''; + + return `
    ${contents}
    `; + }); +} From af5e3d6f4fc0ebd1ccf240085df00d70d447847d Mon Sep 17 00:00:00 2001 From: ellevanova Date: Sat, 16 Sep 2023 20:18:34 +0400 Subject: [PATCH 36/55] added components --- src/components/avatar/avatar.hbs | 11 ------ src/components/avatar/avatar.pcss | 8 +++-- src/components/avatar/avatar.ts | 31 +++++++++++++++++ src/components/avatar/index.ts | 2 +- src/components/badge/badge.hbs | 2 -- src/components/badge/badge.pcss | 1 + src/components/badge/badge.ts | 21 ++++++++++++ src/components/badge/index.ts | 2 +- src/components/chat-item/chat-item.hbs | 23 ------------- src/components/chat-item/chat-item.ts | 38 ++++++++++++++++++++ src/components/chat-item/index.ts | 2 +- src/components/chat-list/chat-list.hbs | 15 -------- src/components/chat-list/chat-list.ts | 40 ++++++++++++++++++++++ src/components/chat-list/index.ts | 2 +- src/components/error/error.hbs | 11 ------ src/components/error/error.ts | 31 +++++++++++++++++ src/components/error/index.ts | 2 +- src/components/index.ts | 12 +++---- src/components/input/input.ts | 0 src/components/link/index.ts | 2 +- src/components/link/link.hbs | 7 ---- src/components/link/link.ts | 29 ++++++++++++++++ src/index.html | 2 +- src/main.ts | 11 ++++-- src/mocks/chat.mocks.ts | 8 ++--- src/models/{chat.ts => IChat.ts} | 6 ++-- src/pages/all-components/all-components.ts | 39 ++++++++++++++++----- src/pages/all-pages/all-pages.hbs | 2 +- src/pages/profile-edit/profile-edit.hbs | 2 +- src/pages/profile/profile.hbs | 2 +- 30 files changed, 258 insertions(+), 106 deletions(-) delete mode 100644 src/components/avatar/avatar.hbs create mode 100644 src/components/avatar/avatar.ts delete mode 100644 src/components/badge/badge.hbs create mode 100644 src/components/badge/badge.ts delete mode 100644 src/components/chat-item/chat-item.hbs create mode 100644 src/components/chat-item/chat-item.ts delete mode 100644 src/components/chat-list/chat-list.hbs create mode 100644 src/components/chat-list/chat-list.ts delete mode 100644 src/components/error/error.hbs create mode 100644 src/components/error/error.ts create mode 100644 src/components/input/input.ts delete mode 100644 src/components/link/link.hbs create mode 100644 src/components/link/link.ts rename src/models/{chat.ts => IChat.ts} (69%) diff --git a/src/components/avatar/avatar.hbs b/src/components/avatar/avatar.hbs deleted file mode 100644 index e3cc960d7..000000000 --- a/src/components/avatar/avatar.hbs +++ /dev/null @@ -1,11 +0,0 @@ -
    - {{#if image}} - {{#imageUrl src=image alt="image avatar" class="avatar__image "}}{{/imageUrl}} - {{/if}} - {{#if isLoadAvatar}} -
    -
    Load New Avatar
    -
    - {{/if}} -
    - diff --git a/src/components/avatar/avatar.pcss b/src/components/avatar/avatar.pcss index 26fccd0bc..900dc83ba 100644 --- a/src/components/avatar/avatar.pcss +++ b/src/components/avatar/avatar.pcss @@ -2,18 +2,22 @@ border-radius: 100px; border: 1px var(--red) solid; cursor: pointer; - height: 130px; - width: 130px; display: flex; justify-content: center; align-items: center; background: url("../../assets/icons/image.svg") no-repeat center; position: relative; + height: 130px; + width: 130px; &.sm { height: 50px; width: 50px; } + &.md { + height: 130px; + width: 130px; + } &:hover .avatar__image { background-color: var(--red); diff --git a/src/components/avatar/avatar.ts b/src/components/avatar/avatar.ts new file mode 100644 index 000000000..d56e68fd1 --- /dev/null +++ b/src/components/avatar/avatar.ts @@ -0,0 +1,31 @@ +import Block from "../../utils/Block"; + +interface IAvatarProps { + size: 'sm' | 'md', + isLoadAvatar: boolean, + onClickLoadAvatar: () => void, + imageUrl: string +} + +export class Avatar extends Block { + constructor(props: IAvatarProps) { + super(props); + this.props.events = { + click: this.props.onClickLoadAvatar || (() => { + }) + } + } + + protected render(): string { + const {size = 'md', isLoadAvatar = false, imageUrl = ''} = this.props; + return (` +
    + ${imageUrl ? ` + image avatar` : ``} + ${isLoadAvatar ? ` +
    +
    Load New Avatar
    +
    ` : ""} +
    `) + } +} diff --git a/src/components/avatar/index.ts b/src/components/avatar/index.ts index 56ba64284..5807dfafa 100644 --- a/src/components/avatar/index.ts +++ b/src/components/avatar/index.ts @@ -1,5 +1,5 @@ import './avatar.pcss'; -export {default as Avatar} from './avatar.hbs?raw'; +export { Avatar as default} from './avatar'; diff --git a/src/components/badge/badge.hbs b/src/components/badge/badge.hbs deleted file mode 100644 index 8a083344f..000000000 --- a/src/components/badge/badge.hbs +++ /dev/null @@ -1,2 +0,0 @@ -
    {{text}}
    - diff --git a/src/components/badge/badge.pcss b/src/components/badge/badge.pcss index 1ece28af9..0951ca38f 100644 --- a/src/components/badge/badge.pcss +++ b/src/components/badge/badge.pcss @@ -3,6 +3,7 @@ border-radius: 20px; width: auto; max-width: 45px; + max-height: 20px; padding: 1px 6px; cursor: pointer; background: transparent; diff --git a/src/components/badge/badge.ts b/src/components/badge/badge.ts new file mode 100644 index 000000000..efccd779e --- /dev/null +++ b/src/components/badge/badge.ts @@ -0,0 +1,21 @@ +import Block from "../../utils/Block"; + +interface IBadgeProps { + type: 'primary' | 'ready', + text: string, +} + +export class Badge extends Block { + constructor(props: IBadgeProps) { + super(props); + } + + protected render(): string { + const { type='', text=''} = this.props; + return (` +
    + ${text} +
    + `) + } +} diff --git a/src/components/badge/index.ts b/src/components/badge/index.ts index 7d9c977a5..9e0317d7b 100644 --- a/src/components/badge/index.ts +++ b/src/components/badge/index.ts @@ -1,4 +1,4 @@ import './badge.pcss'; -export {default as Badge} from './badge.hbs?raw'; +export {Badge as default} from './badge'; diff --git a/src/components/chat-item/chat-item.hbs b/src/components/chat-item/chat-item.hbs deleted file mode 100644 index 03938d6bd..000000000 --- a/src/components/chat-item/chat-item.hbs +++ /dev/null @@ -1,23 +0,0 @@ -
  • - {{#with chat}} -
    - {{> Avatar image=avatar size='sm'}} -
    -
    -
    - {{title}} -
    -
    - {{last_message.time}} -
    -
    -
    -
    -

    {{last_message.content}}

    -
    - {{> Button type="number" caption=unread_count}} -
    - {{/with}} -
  • - - diff --git a/src/components/chat-item/chat-item.ts b/src/components/chat-item/chat-item.ts new file mode 100644 index 000000000..f54c0e941 --- /dev/null +++ b/src/components/chat-item/chat-item.ts @@ -0,0 +1,38 @@ +import Block from "../../utils/Block"; +import {IChat} from "../../models/IChat.ts"; + +interface IChatItemProps { + chat:IChat, +} + +export class ChatItem extends Block { + constructor(props: IChatItemProps) { + super(props); + } + + public renderForList=this.render; + protected render(): string { + const { chat } = this.props; + return (` +
  • +
    + {{{ Avatar imageUrl=${chat.avatar} isLoadAvatar=false size='sm' }}} +
    +
    +
    + ${chat.title} +
    +
    + ${chat.last_message.time} +
    +
    +
    +
    +

    ${chat.last_message.content}

    +
    + {{{ Button type="number" caption=${chat.unread_count}}}} +
    +
  • + `) + } +} diff --git a/src/components/chat-item/index.ts b/src/components/chat-item/index.ts index b4ab342bc..7fb390a27 100644 --- a/src/components/chat-item/index.ts +++ b/src/components/chat-item/index.ts @@ -1,5 +1,5 @@ import './chat-item.pcss'; -export {default as ChatItem} from './chat-item.hbs?raw'; +export {ChatItem as default} from './chat-item'; diff --git a/src/components/chat-list/chat-list.hbs b/src/components/chat-list/chat-list.hbs deleted file mode 100644 index bc81aece7..000000000 --- a/src/components/chat-list/chat-list.hbs +++ /dev/null @@ -1,15 +0,0 @@ -
    - - -
      - {{#each list as |chat|}} - {{>ChatItem chat=chat}} - {{/each}} -
    -
    - - diff --git a/src/components/chat-list/chat-list.ts b/src/components/chat-list/chat-list.ts new file mode 100644 index 000000000..7348d3361 --- /dev/null +++ b/src/components/chat-list/chat-list.ts @@ -0,0 +1,40 @@ +import Block from "../../utils/Block"; +import {IChat} from "../../models/IChat.ts"; +import {ChatItem} from "../index.ts"; + +interface IChatListProps { + list:IChat[] +} + +export class ChatList extends Block { + constructor(props: IChatListProps) { + super(props); + } + + getChats(list:IChat[]):string{ + if(!list||list.length===0)return ''; + return list.map(chat=>{ + const chatBlock=new ChatItem({chat:chat}) + return(` + ${chatBlock.renderForList()} + `) + }).join('') + } + protected render(): string { + const {list } = this.props; + + return (` +
    + + +
      + ${this.getChats(list)} +
    +
    + `) + } +} diff --git a/src/components/chat-list/index.ts b/src/components/chat-list/index.ts index 50644232c..f8fdf23e4 100644 --- a/src/components/chat-list/index.ts +++ b/src/components/chat-list/index.ts @@ -1,4 +1,4 @@ import './chat-list.pcss'; -export { default as ChatList } from './chat-list.hbs?raw'; +export { ChatList as default } from './chat-list'; diff --git a/src/components/error/error.hbs b/src/components/error/error.hbs deleted file mode 100644 index 8e2f2a076..000000000 --- a/src/components/error/error.hbs +++ /dev/null @@ -1,11 +0,0 @@ -
    -

    {{errorNumber}}

    -

    - Woops! -

    -

    - {{errorText}} -

    - {{>Link caption="Go back" page=page }} -
    - diff --git a/src/components/error/error.ts b/src/components/error/error.ts new file mode 100644 index 000000000..abc13819f --- /dev/null +++ b/src/components/error/error.ts @@ -0,0 +1,31 @@ +import Block from "../../utils/Block"; + +interface IErrorProps { + errorNumber: string, + pageGoBack: string, + errorText: string, +} + +export class Error extends Block { + constructor(props: IErrorProps) { + super(props); + this.props.events = { + click: this.props.onClick || (() => {}) + } + } + protected render(): string { + const { errorNumber='',pageGoBack='',errorText=''} = this.props; + return (` +
    +

    ${errorNumber}

    +

    + Woops! +

    +

    + ${errorText} +

    + {{{ Link page='${pageGoBack}' caption='Go Back' }}} +
    + `) + } +} diff --git a/src/components/error/index.ts b/src/components/error/index.ts index b1223cab0..1738eb489 100644 --- a/src/components/error/index.ts +++ b/src/components/error/index.ts @@ -1,4 +1,4 @@ import './error.pcss'; -export { default as Error } from './error.hbs?raw'; +export { Error as default } from './error'; diff --git a/src/components/index.ts b/src/components/index.ts index 62575fb3b..6f5f29d8d 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,16 +1,16 @@ export { default as Button } from './button' export { Input } from './input'; -export { Link } from './link'; +export {default as Link } from './link'; export { Loader } from './loader'; -export { Avatar } from './avatar'; +export {default as Avatar } from './avatar'; export { InputWide } from './input-wide'; export { default as FormAuth } from './form-auth'; export { FormProfile } from './form-profile'; export { Modal } from './modal'; -export { ChatItem } from './chat-item'; +export { default as ChatItem } from './chat-item'; export { InputSearch } from './input-search'; -export { ChatList } from './chat-list'; +export {default as ChatList } from './chat-list'; export { MessageList } from './message-list'; export { Message } from './message'; -export { Badge } from './badge'; -export { Error } from './error'; +export {default as Badge } from './badge'; +export { default as Error } from './error'; diff --git a/src/components/input/input.ts b/src/components/input/input.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/components/link/index.ts b/src/components/link/index.ts index cf93aa888..7184693e6 100644 --- a/src/components/link/index.ts +++ b/src/components/link/index.ts @@ -1,4 +1,4 @@ import './link.pcss'; -export { default as Link } from './link.hbs?raw'; +export { Link as default } from './link'; diff --git a/src/components/link/link.hbs b/src/components/link/link.hbs deleted file mode 100644 index 40aadf13f..000000000 --- a/src/components/link/link.hbs +++ /dev/null @@ -1,7 +0,0 @@ - - {{caption}} - {{#if linkIcon}} {{/if}} - - diff --git a/src/components/link/link.ts b/src/components/link/link.ts new file mode 100644 index 000000000..9b2118b39 --- /dev/null +++ b/src/components/link/link.ts @@ -0,0 +1,29 @@ +import Block from "../../utils/Block"; + +interface ILinkProps { + caption: string, + page: string, + href: string, + type: string, + linkIcon:boolean + linkLine:boolean +} + +export class Link extends Block { + constructor(props: ILinkProps) { + super(props); + } + + protected render(): string { + const { href='#', caption='', page='' ,linkIcon=false,linkLine=false,type=''} = this.props; + const classLink=`link ${type?"link"+type:''} ${linkLine?'link-line':''}` + return (` + + ${caption} + ${linkIcon ? '' : ''} + + `) + } +} diff --git a/src/index.html b/src/index.html index ec6366173..ed81248b3 100644 --- a/src/index.html +++ b/src/index.html @@ -4,7 +4,7 @@ - Chat + IChat diff --git a/src/main.ts b/src/main.ts index 7eed2ec5d..ca1965d3a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,6 @@ import * as Pages from './pages'; import {mockUser} from "./mocks/user-profile.mocks"; import {chat1, mockListChats} from "./mocks/chat.mocks"; import {message1, mockListMessages} from "./mocks/chat-message.mocks"; -import {urlImages} from "./config"; import {registerComponent} from "./utils/registerComponents"; import {AllComponentsPage} from "./pages"; @@ -32,8 +31,14 @@ Object.entries(Components).forEach(([name, component]) => { }); registerComponent('Button', Components.Button); +registerComponent('Badge', Components.Badge); +registerComponent('Avatar', Components.Avatar); +registerComponent('ChatItem', Components.ChatItem); +registerComponent('ChatList', Components.ChatList); +registerComponent('Error', Components.Error); registerComponent('FormAuth', Components.FormAuth); registerComponent('LoginPage', Pages.LoginPage); +registerComponent('Link', Components.Link); const navigate = (page: string) => { const app = document.getElementById('app'); @@ -60,7 +65,7 @@ document.addEventListener('click', (e:Event) => { e.stopImmediatePropagation(); } }); -Handlebars.registerHelper("imageUrl", function (options) { +/*Handlebars.registerHelper("imageUrl", function (options) { const attrs = Object.keys(options.hash) .map(function (key) { if (key === 'src') { @@ -76,7 +81,7 @@ Handlebars.registerHelper("imageUrl", function (options) { attrs + ">" + "" ); -}); +});*/ diff --git a/src/mocks/chat.mocks.ts b/src/mocks/chat.mocks.ts index 7cb32bb78..274b98000 100644 --- a/src/mocks/chat.mocks.ts +++ b/src/mocks/chat.mocks.ts @@ -1,7 +1,7 @@ -import {Chat} from "../models/chat"; +import {IChat} from "../models/IChat.ts"; -export const chat1: Chat = { +export const chat1: IChat = { id: 123, title: "my-chat", avatar: `3.jpg`, @@ -21,7 +21,7 @@ export const chat1: Chat = { } } -export const chat2: Chat = { +export const chat2: IChat = { id: 124, title: "my-chat1", avatar: `1.jpeg`, @@ -41,7 +41,7 @@ export const chat2: Chat = { } } -export const chat3: Chat = { +export const chat3: IChat = { id: 125, title: "my-chat3", avatar: `2.jpg`, diff --git a/src/models/chat.ts b/src/models/IChat.ts similarity index 69% rename from src/models/chat.ts rename to src/models/IChat.ts index cd11c8611..9ea909468 100644 --- a/src/models/chat.ts +++ b/src/models/IChat.ts @@ -1,15 +1,15 @@ import {User} from "./user"; -export interface Chat { +export interface IChat { id: number; title: string; avatar: string; unread_count: number; created_by: number; - last_message: LastMessage; + last_message: ILastMessage; } -export interface LastMessage { +export interface ILastMessage { user: User; time: string; content: string; diff --git a/src/pages/all-components/all-components.ts b/src/pages/all-components/all-components.ts index 3e316b11d..d6402da1b 100644 --- a/src/pages/all-components/all-components.ts +++ b/src/pages/all-components/all-components.ts @@ -1,4 +1,5 @@ import Block from "../../utils/Block"; +import {chat1, mockListChats} from "../../mocks/chat.mocks.ts"; export class AllComponents extends Block { @@ -10,21 +11,41 @@ export class AllComponents extends Block { onClick: (event:any) => { event.preventDefault(); console.log("click") - } + }, + onClickLoadAvatar: (event:any) => { + event.preventDefault(); + console.log("click") + }, + chat:chat1, + chatList:mockListChats }); } protected render(): string { return(`
    -
    - {{{ Button caption="sign in"}}} - {{{ Button type="number" caption="330"}}} - {{{ Button type="arrow" onClick=onClick}}} - {{{ Button type="dots" onClick=onClick}}} - {{{ Button type="paperclip" onClick=onClick}}} - {{{ Button type="cancel" onClick=onClick}}} -
    +
    + {{{ Button caption="sign in"}}} + {{{ Button type="number" caption="330"}}} + {{{ Button type="arrow" onClick=onClick}}} + {{{ Button type="dots" onClick=onClick}}} + {{{ Button type="paperclip" onClick=onClick}}} + {{{ Button type="cancel" onClick=onClick}}} + {{{ Badge text="01.20" type="primary"}}} + {{{ Badge text="01.20" type="ready"}}} + {{{ Badge text="01.20" }}} + {{{ Avatar isLoadAvatar=false size='sm' onClickLoadAvatar=onClickLoadAvatar}}} + {{{ Avatar imageUrl="1.jpeg" isLoadAvatar=false onClickLoadAvatar=onClickLoadAvatar}}} + {{{ Avatar imageUrl="2.jpg" isLoadAvatar=true onClickLoadAvatar=onClickLoadAvatar}}} + {{{ Avatar imageUrl="3.jpg" isLoadAvatar=true onClickLoadAvatar=onClickLoadAvatar}}} + {{{ChatItem chat=chat}}} + {{{ChatList list=chatList}}} + + {{{Link caption="Login" page="loginPage" linkIcon=true }}} + {{{Link caption="Profile" type='success' page="page404" }}} + {{{Link caption="Edit Profile" page="pageProfileEdit" type='danger' linkLine=true }}} + {{{Error errorNumber='400' pageGoBack='' errorText='errorText'}}} +
    `) } diff --git a/src/pages/all-pages/all-pages.hbs b/src/pages/all-pages/all-pages.hbs index 9ecb1c256..561edeee6 100644 --- a/src/pages/all-pages/all-pages.hbs +++ b/src/pages/all-pages/all-pages.hbs @@ -7,6 +7,6 @@ {{>Link caption="Page Profile" type='success' page="pageProfile" }} {{>Link caption="Page Profile Edit" type='success' page="pageProfileEdit" }} {{>Link caption="Page Password Edit" type='success' page="pagePasswordEdit" }} - {{>Link caption="Page Chat" type='success' page="pageChat" }} + {{>Link caption="Page IChat" type='success' page="pageChat" }} diff --git a/src/pages/profile-edit/profile-edit.hbs b/src/pages/profile-edit/profile-edit.hbs index 2aa2bc4e3..31d04685d 100644 --- a/src/pages/profile-edit/profile-edit.hbs +++ b/src/pages/profile-edit/profile-edit.hbs @@ -4,7 +4,7 @@ {{>InputWide label="Login" type="text" name="login" value=login }} {{>InputWide label="First Name" type="text" name="first_name" value=first_name }} {{>InputWide label="Last Name" type="text" name="second_name" value=second_name }} - {{>InputWide label="Name in Chat" type="text" name="display_name" value=nameInChat }} + {{>InputWide label="Name in IChat" type="text" name="display_name" value=nameInChat }} {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true }} {{/FormProfile}} diff --git a/src/pages/profile/profile.hbs b/src/pages/profile/profile.hbs index 53b5c7cc1..f651133d3 100644 --- a/src/pages/profile/profile.hbs +++ b/src/pages/profile/profile.hbs @@ -4,7 +4,7 @@ {{>InputWide label="Login" type="text" name="login" value=login readOnly=true }} {{>InputWide label="First Name" type="text" name="first_name" value=first_name readOnly=true }} {{>InputWide label="Last Name" type="text" name="second_name" value=second_name readOnly=true }} - {{>InputWide label="Name in Chat" type="text" name="display_name" value=nameInChat readOnly=true }} + {{>InputWide label="Name in IChat" type="text" name="display_name" value=nameInChat readOnly=true }} {{>InputWide label="Phone" type="text" name="phone" value=phone noLine=true readOnly=true }} {{/FormProfile}} From 40a6fe3c2d1de5a337116f4a64378d90466d9530 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Sat, 16 Sep 2023 21:47:29 +0400 Subject: [PATCH 37/55] added components --- src/components/form-profile/form-profile.hbs | 2 +- src/components/index.ts | 10 +-- src/components/input/index.ts | 2 +- src/components/input/input.hbs | 2 +- src/components/input/input.ts | 65 +++++++++++++++++++ src/components/loader/index.ts | 2 +- src/components/loader/loader.hbs | 3 - src/components/loader/loader.ts | 9 +++ src/components/message-list/index.ts | 2 +- src/components/message-list/message-list.hbs | 30 --------- src/components/message-list/message-list.ts | 55 ++++++++++++++++ src/components/message/index.ts | 2 +- src/components/message/message.hbs | 21 ------ src/components/message/message.ts | 35 ++++++++++ src/components/modal/index.ts | 2 +- src/components/modal/modal.hbs | 16 ----- src/components/modal/modal.ts | 36 ++++++++++ src/main.ts | 5 ++ src/mocks/chat-message.mocks.ts | 8 +-- src/mocks/user-profile.mocks.ts | 4 +- src/models/IChat.ts | 4 +- .../{chat-message.ts => IChatMessage.ts} | 6 +- src/models/{file.ts => IFile.ts} | 2 +- src/models/{user.ts => IUser.ts} | 2 +- src/pages/all-components/all-components.hbs | 2 +- src/pages/all-components/all-components.ts | 32 ++++++++- src/pages/profile-edit/profile-edit.hbs | 2 +- src/utils/Block.ts | 2 +- 28 files changed, 262 insertions(+), 101 deletions(-) delete mode 100644 src/components/loader/loader.hbs create mode 100644 src/components/loader/loader.ts delete mode 100644 src/components/message-list/message-list.hbs create mode 100644 src/components/message-list/message-list.ts delete mode 100644 src/components/message/message.hbs create mode 100644 src/components/message/message.ts delete mode 100644 src/components/modal/modal.hbs create mode 100644 src/components/modal/modal.ts rename src/models/{chat-message.ts => IChatMessage.ts} (63%) rename src/models/{file.ts => IFile.ts} (86%) rename src/models/{user.ts => IUser.ts} (87%) diff --git a/src/components/form-profile/form-profile.hbs b/src/components/form-profile/form-profile.hbs index 770f26639..8f8f7838e 100644 --- a/src/components/form-profile/form-profile.hbs +++ b/src/components/form-profile/form-profile.hbs @@ -14,7 +14,7 @@ {{else}}
    - {{>Link caption="Change User Data" page="pageProfileEdit" type='success' linkLine=true }} + {{>Link caption="Change IUser Data" page="pageProfileEdit" type='success' linkLine=true }} {{>Link caption="Change Password" page="pagePasswordEdit" type='success' linkLine=true }} {{>Link caption="Cancel" page=button-page type='danger' }}
    diff --git a/src/components/index.ts b/src/components/index.ts index 6f5f29d8d..7d79aaca2 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,16 +1,16 @@ export { default as Button } from './button' -export { Input } from './input'; +export {default as Input } from './input'; export {default as Link } from './link'; -export { Loader } from './loader'; +export {default as Loader } from './loader'; export {default as Avatar } from './avatar'; export { InputWide } from './input-wide'; export { default as FormAuth } from './form-auth'; export { FormProfile } from './form-profile'; -export { Modal } from './modal'; +export {default as Modal } from './modal'; export { default as ChatItem } from './chat-item'; export { InputSearch } from './input-search'; export {default as ChatList } from './chat-list'; -export { MessageList } from './message-list'; -export { Message } from './message'; +export {default as MessageList } from './message-list'; +export {default as Message } from './message'; export {default as Badge } from './badge'; export { default as Error } from './error'; diff --git a/src/components/input/index.ts b/src/components/input/index.ts index 2495c9886..daca222f4 100644 --- a/src/components/input/index.ts +++ b/src/components/input/index.ts @@ -1,4 +1,4 @@ import './input.pcss'; -export { default as Input } from './input.hbs?raw'; +export { Input as default } from './input'; diff --git a/src/components/input/input.hbs b/src/components/input/input.hbs index 530185cc3..64baa12cc 100644 --- a/src/components/input/input.hbs +++ b/src/components/input/input.hbs @@ -9,7 +9,7 @@ />
    {{label}}
    {{#if error}} -
    +
    {{errorText}}
    {{/if}} diff --git a/src/components/input/input.ts b/src/components/input/input.ts index e69de29bb..2dbfe81fc 100644 --- a/src/components/input/input.ts +++ b/src/components/input/input.ts @@ -0,0 +1,65 @@ +import Block from "../../utils/Block"; + +interface IInputProps { + type: 'text' | 'button', + name: string, + value: string, + error: boolean, + label: string, + errorText: string, + onChange: (value: string) => void + validate: (value: string) => void +} + +export class Input extends Block { + + constructor(props:IInputProps) { + super({ + ...props, + onblur: () => this.validate() + }); + //this.error={ errorText: '',error:false }; + } + + public value() { + if (!this.validate()) { + return false; + } + return this.refs.input._element.value + } + + private validate() { + const value = this.refs.input._element.value; + const error = this.props.validate(value); + if (error) { + // this.error={ errorText:error,error:true }; + return false; + } + //this.error={ errorText: '',error:false }; + return true; + } + + protected render(): string { + const {type = '', name = '', value = '', label = "",error=false,errorText=''} = this.props; + //const {error=false,errorText=''}=this.error; + return (` +
    + +
    + `) + } +} diff --git a/src/components/loader/index.ts b/src/components/loader/index.ts index 2d4daf40b..b36aaef4d 100644 --- a/src/components/loader/index.ts +++ b/src/components/loader/index.ts @@ -1,4 +1,4 @@ import './loader.css'; -export { default as Loader } from './loader.hbs?raw'; +export { Loader as default } from './loader'; diff --git a/src/components/loader/loader.hbs b/src/components/loader/loader.hbs deleted file mode 100644 index a7ca5f9f4..000000000 --- a/src/components/loader/loader.hbs +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/components/loader/loader.ts b/src/components/loader/loader.ts new file mode 100644 index 000000000..079bc2082 --- /dev/null +++ b/src/components/loader/loader.ts @@ -0,0 +1,9 @@ +import Block from "../../utils/Block"; + +export class Loader extends Block { + protected render(): string { + return (` + + `) + } +} diff --git a/src/components/message-list/index.ts b/src/components/message-list/index.ts index f37189640..aee93ff87 100644 --- a/src/components/message-list/index.ts +++ b/src/components/message-list/index.ts @@ -1,4 +1,4 @@ import './message-list.pcss'; -export { default as MessageList } from './message-list.hbs?raw'; +export { MessageList as default } from './message-list'; diff --git a/src/components/message-list/message-list.hbs b/src/components/message-list/message-list.hbs deleted file mode 100644 index 844abfdb9..000000000 --- a/src/components/message-list/message-list.hbs +++ /dev/null @@ -1,30 +0,0 @@ -
    -
    - {{#with currentUser}} -
    - {{> Avatar image=avatar size='sm'}} - {{nameInChat}} -
    - {{> Button type="dots"}} - {{/with}} -
    -
      - {{#each messageList as |message|}} -
      - {{>Message message=message myMessage=message.main}} -
      - {{/each}} -
    - -
    - - diff --git a/src/components/message-list/message-list.ts b/src/components/message-list/message-list.ts new file mode 100644 index 000000000..87adf861a --- /dev/null +++ b/src/components/message-list/message-list.ts @@ -0,0 +1,55 @@ +import Block from "../../utils/Block"; +import {IChatMessage} from "../../models/IChatMessage.ts"; +import {IUser} from "../../models/IUser.ts"; +import { Message} from "../index.ts"; + +interface IMessageListProps { + messageList:IChatMessage[]; + currentUser:IUser +} + +export class MessageList extends Block { + constructor(props: IMessageListProps) { + super(props); + } + + getListMessages(list:IChatMessage[]):string{ + if(!list||list.length===0)return ''; + return list.map(message=>{ + const messageBlock=new Message({message:message,myMessage:message.main||false}) + return(` +
    + ${messageBlock.renderForList()} +
    + `) + }).join('') + } + protected render(): string { + const { messageList,currentUser } = this.props; + const {avatar,nameInChat}=currentUser; + return (` +
    +
    +
    + {{{ Avatar image=${avatar} size='sm'}}} + ${nameInChat} +
    + {{{ Button type="dots"}}} +
    +
      + ${this.getListMessages(messageList)} +
    + +
    + `) + } +} diff --git a/src/components/message/index.ts b/src/components/message/index.ts index 4a60e90af..f3589184c 100644 --- a/src/components/message/index.ts +++ b/src/components/message/index.ts @@ -1,4 +1,4 @@ import './message.pcss'; -export { default as Message } from './message.hbs?raw'; +export { Message as default} from './message'; diff --git a/src/components/message/message.hbs b/src/components/message/message.hbs deleted file mode 100644 index 2ec71c88a..000000000 --- a/src/components/message/message.hbs +++ /dev/null @@ -1,21 +0,0 @@ -
  • - {{#with message}} - {{#if file}} -
    - included_file -
    - {{>Badge text="01.20" type="primary"}} -
    -
    - {{else}} -
    -

    {{content}}

    -
    - {{>Badge text="01.20" }} -
    -
    - {{/if}} - {{/with}} -
  • - - diff --git a/src/components/message/message.ts b/src/components/message/message.ts new file mode 100644 index 000000000..7f546b275 --- /dev/null +++ b/src/components/message/message.ts @@ -0,0 +1,35 @@ +import Block from "../../utils/Block"; +import {IChatMessage} from "../../models/IChatMessage.ts"; + +interface IMessageProps { + message:IChatMessage; + myMessage:boolean +} + +export class Message extends Block { + constructor(props: IMessageProps) { + super(props); + } + public renderForList=this.render; + + protected render(): string { + const { message,myMessage } = this.props; + return (` +
  • + ${message.file?` +
    + included_file +
    + {{{ Badge text="01.20" type="primary" }}} +
    +
    `:`
    +

    {{content}}

    +
    + {{{Badge text="01.20" }}} +
    +
    ` + } +
  • + `) + } +} diff --git a/src/components/modal/index.ts b/src/components/modal/index.ts index 0acc72f33..3fa7354f4 100644 --- a/src/components/modal/index.ts +++ b/src/components/modal/index.ts @@ -1,4 +1,4 @@ import './modal.pcss'; -export { default as Modal } from './modal.hbs?raw'; +export { Modal as default } from './modal'; diff --git a/src/components/modal/modal.hbs b/src/components/modal/modal.hbs deleted file mode 100644 index 7ff165526..000000000 --- a/src/components/modal/modal.hbs +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/src/components/modal/modal.ts b/src/components/modal/modal.ts new file mode 100644 index 000000000..6e9b85fc5 --- /dev/null +++ b/src/components/modal/modal.ts @@ -0,0 +1,36 @@ +import Block from "../../utils/Block"; + +interface IModalProps { + caption: string, + okText: string, + okClick: () => void, + cancelText: string, + cancelClick: () => void, +} + +export class Modal extends Block { + constructor(props: IModalProps) { + super(props); + + } + + protected render(): string { + const { caption='',okText='',cancelText=''} = this.props; + return (` + + `) + } +} diff --git a/src/main.ts b/src/main.ts index ca1965d3a..ae5c4bc15 100644 --- a/src/main.ts +++ b/src/main.ts @@ -36,6 +36,11 @@ registerComponent('Avatar', Components.Avatar); registerComponent('ChatItem', Components.ChatItem); registerComponent('ChatList', Components.ChatList); registerComponent('Error', Components.Error); +registerComponent('Input', Components.Input); +registerComponent('Loader', Components.Loader); +registerComponent('Message', Components.Message); +registerComponent('MessageList', Components.MessageList); +registerComponent('Modal', Components.Modal); registerComponent('FormAuth', Components.FormAuth); registerComponent('LoginPage', Pages.LoginPage); registerComponent('Link', Components.Link); diff --git a/src/mocks/chat-message.mocks.ts b/src/mocks/chat-message.mocks.ts index e5a087666..3b5b491a1 100644 --- a/src/mocks/chat-message.mocks.ts +++ b/src/mocks/chat-message.mocks.ts @@ -1,7 +1,7 @@ -import {ChatMessage} from "../models/chat-message"; +import {IChatMessage} from "../models/IChatMessage.ts"; -export const message1: ChatMessage = { +export const message1: IChatMessage = { id: 123, user_id: 231, chat_id: 312, @@ -19,7 +19,7 @@ export const message1: ChatMessage = { } } -export const message2: ChatMessage = { +export const message2: IChatMessage = { id: 123, user_id: 231, chat_id: 312, @@ -30,7 +30,7 @@ export const message2: ChatMessage = { 'Хассельблад в итоге адаптировал SWC для космоса, но что-то пошло не так и на ракету они так никогда и не попали. Всего их было произведено 25 штук, одну из них недавно продали на аукционе за 45000 евро.', } -export const message3: ChatMessage = { +export const message3: IChatMessage = { id: 123, user_id: 231, chat_id: 312, diff --git a/src/mocks/user-profile.mocks.ts b/src/mocks/user-profile.mocks.ts index c998119ae..09b9f52b2 100644 --- a/src/mocks/user-profile.mocks.ts +++ b/src/mocks/user-profile.mocks.ts @@ -1,6 +1,6 @@ -import {User} from "../models/user"; +import {IUser} from "../models/IUser.ts"; -export const mockUser: User = { +export const mockUser: IUser = { first_name: "Elena", second_name: "Family", login: "loginElena", diff --git a/src/models/IChat.ts b/src/models/IChat.ts index 9ea909468..ba6a28887 100644 --- a/src/models/IChat.ts +++ b/src/models/IChat.ts @@ -1,4 +1,4 @@ -import {User} from "./user"; +import {IUser} from "./IUser.ts"; export interface IChat { id: number; @@ -10,7 +10,7 @@ export interface IChat { } export interface ILastMessage { - user: User; + user: IUser; time: string; content: string; } diff --git a/src/models/chat-message.ts b/src/models/IChatMessage.ts similarity index 63% rename from src/models/chat-message.ts rename to src/models/IChatMessage.ts index e4565b587..d7d201c69 100644 --- a/src/models/chat-message.ts +++ b/src/models/IChatMessage.ts @@ -1,12 +1,12 @@ -import {File} from "./file"; +import {IFile} from "./IFile.ts"; -export interface ChatMessage { +export interface IChatMessage { id: number; user_id: number; chat_id: number; time: string; type: string; content: number | string; - file?: File; + file?: IFile; main?: boolean; } diff --git a/src/models/file.ts b/src/models/IFile.ts similarity index 86% rename from src/models/file.ts rename to src/models/IFile.ts index 7fc5f6977..441da398d 100644 --- a/src/models/file.ts +++ b/src/models/IFile.ts @@ -1,4 +1,4 @@ -export interface File { +export interface IFile { id: number; user_id: number; path: string; diff --git a/src/models/user.ts b/src/models/IUser.ts similarity index 87% rename from src/models/user.ts rename to src/models/IUser.ts index dea263919..d2aab1c3c 100644 --- a/src/models/user.ts +++ b/src/models/IUser.ts @@ -1,4 +1,4 @@ -export interface User { +export interface IUser { login?: string; password?: string; nameInChat?: string; diff --git a/src/pages/all-components/all-components.hbs b/src/pages/all-components/all-components.hbs index f798616db..29bb41f3d 100644 --- a/src/pages/all-components/all-components.hbs +++ b/src/pages/all-components/all-components.hbs @@ -26,7 +26,7 @@
    diff --git a/src/pages/all-components/all-components.ts b/src/pages/all-components/all-components.ts index d6402da1b..c4f98d85a 100644 --- a/src/pages/all-components/all-components.ts +++ b/src/pages/all-components/all-components.ts @@ -1,23 +1,41 @@ import Block from "../../utils/Block"; import {chat1, mockListChats} from "../../mocks/chat.mocks.ts"; +import {mockListMessages} from "../../mocks/chat-message.mocks.ts"; +import {mockUser} from "../../mocks/user-profile.mocks.ts"; export class AllComponents extends Block { constructor() { super({ validate: { - login: (value: string) => value.length < 3 && value.length !== 0 ? `Length of login should not be less 3 letters.` : '' + login: (value: string) => { + console.log(value) + return value.length < 3 && value.length !== 0 ? `Length of login should not be less 3 letters.` : '' + } }, onClick: (event:any) => { event.preventDefault(); console.log("click") }, + onLogin: (event:any) => { + event.preventDefault(); + const login = this.refs.login.value(); + const password = this.refs.password.value(); + + console.log({ + login, + password + }) + }, onClickLoadAvatar: (event:any) => { event.preventDefault(); console.log("click") }, chat:chat1, - chatList:mockListChats + chatList:mockListChats, + message:mockListMessages[0], + messageList:mockListMessages, + user:mockUser }); } @@ -25,7 +43,7 @@ export class AllComponents extends Block { return(`
    - {{{ Button caption="sign in"}}} + {{{ Button caption="sign in" onClick=onLogin}}} {{{ Button type="number" caption="330"}}} {{{ Button type="arrow" onClick=onClick}}} {{{ Button type="dots" onClick=onClick}}} @@ -45,6 +63,14 @@ export class AllComponents extends Block { {{{Link caption="Profile" type='success' page="page404" }}} {{{Link caption="Edit Profile" page="pageProfileEdit" type='danger' linkLine=true }}} {{{Error errorNumber='400' pageGoBack='' errorText='errorText'}}} + + {{{ Input label="Login" type="text" name="login" validate=validate.login ref="login" }}} + {{{ Input label="Error" type="text" name="error" error=true errorText='Error!!' validate=validate.login ref="password"}}} + + {{{ Message message=message}}} + {{{ Message message=message myMessage=true}}} + {{{ MessageList messageList=messageList currentUser=user}}} +
    `) diff --git a/src/pages/profile-edit/profile-edit.hbs b/src/pages/profile-edit/profile-edit.hbs index 31d04685d..2dd2fdab9 100644 --- a/src/pages/profile-edit/profile-edit.hbs +++ b/src/pages/profile-edit/profile-edit.hbs @@ -1,5 +1,5 @@
    - {{#> FormProfile withButton=true button-text="Save User Profile" button-page="pageProfile" user=user}} + {{#> FormProfile withButton=true button-text="Save IUser Profile" button-page="pageProfile" user=user}} {{>InputWide label="Email" type="text" name="email" value=email }} {{>InputWide label="Login" type="text" name="login" value=login }} {{>InputWide label="First Name" type="text" name="first_name" value=first_name }} diff --git a/src/utils/Block.ts b/src/utils/Block.ts index 907daff3b..7baffa551 100644 --- a/src/utils/Block.ts +++ b/src/utils/Block.ts @@ -16,7 +16,7 @@ class Block { protected _meta: { props: any; }|null=null; private _eventBus: () => EventBus; private children: Record; - private refs: any; + protected refs: any; constructor( propsWithChildren:any = {}) { const eventBus = new EventBus(); From 467a36473a63bf9726fe0ffbf62ac62f45e99fc4 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Sun, 17 Sep 2023 15:42:00 +0400 Subject: [PATCH 38/55] added components --- src/components/chat-list/chat-list.ts | 2 +- src/components/index.ts | 7 +- src/components/input-search/index.ts | 2 +- src/components/input-search/input-search.hbs | 10 --- src/components/input-search/input-search.ts | 55 +++++++++++++ src/components/input-short/index.ts | 4 + .../input-short.pcss} | 0 src/components/input-short/input-short.ts | 70 ++++++++++++++++ src/components/input-wide/index.ts | 2 +- src/components/input-wide/input-wide.hbs | 19 ----- src/components/input-wide/input-wide.ts | 80 +++++++++++++++++++ src/components/input/index.ts | 3 +- src/components/input/input.hbs | 18 ----- src/components/input/input.ts | 70 +++++----------- src/components/message/message.ts | 2 +- src/main.ts | 38 +++++---- src/pages/all-components/all-components.hbs | 21 +---- src/pages/all-components/all-components.ts | 5 +- src/utils/Block.ts | 21 +++-- src/utils/object.utils.ts | 25 ++++++ src/utils/registerComponents.ts | 1 + 21 files changed, 304 insertions(+), 151 deletions(-) delete mode 100644 src/components/input-search/input-search.hbs create mode 100644 src/components/input-search/input-search.ts create mode 100644 src/components/input-short/index.ts rename src/components/{input/input.pcss => input-short/input-short.pcss} (100%) create mode 100644 src/components/input-short/input-short.ts delete mode 100644 src/components/input-wide/input-wide.hbs create mode 100644 src/components/input-wide/input-wide.ts delete mode 100644 src/components/input/input.hbs create mode 100644 src/utils/object.utils.ts diff --git a/src/components/chat-list/chat-list.ts b/src/components/chat-list/chat-list.ts index 7348d3361..8a85bdb80 100644 --- a/src/components/chat-list/chat-list.ts +++ b/src/components/chat-list/chat-list.ts @@ -29,7 +29,7 @@ export class ChatList extends Block { {{{Link caption="Profile" page="pageProfile" linkIcon=true }}}
      ${this.getChats(list)} diff --git a/src/components/index.ts b/src/components/index.ts index 7d79aaca2..ca83742bb 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,14 +1,15 @@ export { default as Button } from './button' -export {default as Input } from './input'; +export {default as InputShort } from './input-short'; export {default as Link } from './link'; export {default as Loader } from './loader'; export {default as Avatar } from './avatar'; -export { InputWide } from './input-wide'; +export {default as InputWide } from './input-wide'; export { default as FormAuth } from './form-auth'; export { FormProfile } from './form-profile'; export {default as Modal } from './modal'; +export {default as Input } from './input'; export { default as ChatItem } from './chat-item'; -export { InputSearch } from './input-search'; +export { default as InputSearch } from './input-search'; export {default as ChatList } from './chat-list'; export {default as MessageList } from './message-list'; export {default as Message } from './message'; diff --git a/src/components/input-search/index.ts b/src/components/input-search/index.ts index 47357389d..cc69ea7fb 100644 --- a/src/components/input-search/index.ts +++ b/src/components/input-search/index.ts @@ -1,4 +1,4 @@ import './input-search.pcss'; -export { default as InputSearch } from './input-search.hbs?raw'; +export { InputSearch as default } from './input-search'; diff --git a/src/components/input-search/input-search.hbs b/src/components/input-search/input-search.hbs deleted file mode 100644 index 325287127..000000000 --- a/src/components/input-search/input-search.hbs +++ /dev/null @@ -1,10 +0,0 @@ - - diff --git a/src/components/input-search/input-search.ts b/src/components/input-search/input-search.ts new file mode 100644 index 000000000..4427245ab --- /dev/null +++ b/src/components/input-search/input-search.ts @@ -0,0 +1,55 @@ +import Block from "../../utils/Block"; + +interface IInputSearch { + name: string, + value: string +} + +export class InputSearch extends Block { + + constructor(props:IInputSearch) { + super({ + ...props, + errorText: '', error:false, + }); + + } + + public value() { + + return this.refs?.input?.value() + } + +/* private validate() { + console.log(this) + const value =this.refs?.input?.value(); + const error = this.props.validate(value); + + console.log('value,error',value,error) + this.props.value=value; + if (error) { + this.setProps({...this.props, errorText: error,error:true}); + return false; + } + this.setProps({...this.props, errorText: '',error:false} ); + return true; + }*/ + + protected render(): string { + const { name = '', value = ''} = this.props; + + return (` + + `) + } +} diff --git a/src/components/input-short/index.ts b/src/components/input-short/index.ts new file mode 100644 index 000000000..b38dc657a --- /dev/null +++ b/src/components/input-short/index.ts @@ -0,0 +1,4 @@ +import './input-short.pcss'; +export { InputShort as default } from './input-short.ts'; + + diff --git a/src/components/input/input.pcss b/src/components/input-short/input-short.pcss similarity index 100% rename from src/components/input/input.pcss rename to src/components/input-short/input-short.pcss diff --git a/src/components/input-short/input-short.ts b/src/components/input-short/input-short.ts new file mode 100644 index 000000000..140ab021b --- /dev/null +++ b/src/components/input-short/input-short.ts @@ -0,0 +1,70 @@ +import Block from "../../utils/Block"; + +interface IInputProps { + type: 'text' | 'button', + name: string, + value: string, + label: string, + onChange: (value: string) => void + validate: (value: string) => void +} + +export class InputShort extends Block { + + constructor(props:IInputProps) { + super({ + ...props, + errorText: '', error:false , + onBlur: () => this.validate() + }); + + } + + public value() { + if (!this.validate()) { + return false; + } + return this.refs?.input?.value() + } + + private validate() { + console.log(this) + const value =this.refs?.input?.value(); + const error = this.props.validate(value); + + console.log('value,error',value,error) + this.props.value=value; + if (error) { + this.setProps({...this.props, errorText: error,error:true}); + return false; + } + this.setProps({...this.props, errorText: '',error:false} ); + return true; + } + + protected render(): string { + const {type = '', name = '', value = '', label = "",error=false,errorText=''} = this.props; + + return (` +
      + +
      + `) + } +} diff --git a/src/components/input-wide/index.ts b/src/components/input-wide/index.ts index f3cde17cd..ca08cb585 100644 --- a/src/components/input-wide/index.ts +++ b/src/components/input-wide/index.ts @@ -1,4 +1,4 @@ import './input-wide.pcss'; -export { default as InputWide } from './input-wide.hbs?raw'; +export { InputWide as default } from './input-wide'; diff --git a/src/components/input-wide/input-wide.hbs b/src/components/input-wide/input-wide.hbs deleted file mode 100644 index 24c1e2988..000000000 --- a/src/components/input-wide/input-wide.hbs +++ /dev/null @@ -1,19 +0,0 @@ -
      - - {{#if error}} -
      -
      {{errorText}}
      -
      - {{/if}} -
      - diff --git a/src/components/input-wide/input-wide.ts b/src/components/input-wide/input-wide.ts new file mode 100644 index 000000000..00de745b3 --- /dev/null +++ b/src/components/input-wide/input-wide.ts @@ -0,0 +1,80 @@ +import Block from "../../utils/Block"; + +interface IInputWideProps { + type: 'text' | 'button', + name: string, + value: string, + label: string, + validate: (value: string) => void, + readOnly: boolean, + noLine: boolean +} + +export class InputWide extends Block { + + constructor(props: IInputWideProps) { + super({ + ...props, + errorText: '', error: false, + onBlur: () => this.validate() + }); + } + + public value() { + if (!this.validate()) { + return false; + } + return this.refs?.input?.value() + } + + private validate() { + console.log(this) + const value = this.refs?.input?.value(); + const error = this.props.validate(value); + + console.log('value,error', value, error) + this.props.value = value; + if (error) { + this.setProps({...this.props, errorText: error, error: true}); + return false; + } + this.setProps({...this.props, errorText: '', error: false}); + return true; + } + + protected render(): string { + const { + type = '', + name = '', + value = '', + label = "", + error = false, + errorText = '', + readOnly = false, + noLine = false + } = this.props; + + return (` +
      + + ${error ? `
      +
      ${errorText}
      +
      ` : ""} +
      + `) + } +} diff --git a/src/components/input/index.ts b/src/components/input/index.ts index daca222f4..0d20e108d 100644 --- a/src/components/input/index.ts +++ b/src/components/input/index.ts @@ -1,4 +1,3 @@ -import './input.pcss'; -export { Input as default } from './input'; +export { Input as default } from './input.ts'; diff --git a/src/components/input/input.hbs b/src/components/input/input.hbs deleted file mode 100644 index 64baa12cc..000000000 --- a/src/components/input/input.hbs +++ /dev/null @@ -1,18 +0,0 @@ -
      - -
      - diff --git a/src/components/input/input.ts b/src/components/input/input.ts index 2dbfe81fc..44fa3487f 100644 --- a/src/components/input/input.ts +++ b/src/components/input/input.ts @@ -1,65 +1,33 @@ -import Block from "../../utils/Block"; +import Block from "../../utils/Block.ts"; + interface IInputProps { - type: 'text' | 'button', - name: string, - value: string, - error: boolean, - label: string, - errorText: string, - onChange: (value: string) => void - validate: (value: string) => void + classes: string, + placeholder: string, + onBlur:()=>void, + ref:string, + value:string } export class Input extends Block { - - constructor(props:IInputProps) { + constructor(props: IInputProps) { super({ ...props, - onblur: () => this.validate() - }); - //this.error={ errorText: '',error:false }; - } - - public value() { - if (!this.validate()) { - return false; - } - return this.refs.input._element.value - } - - private validate() { - const value = this.refs.input._element.value; - const error = this.props.validate(value); - if (error) { - // this.error={ errorText:error,error:true }; - return false; - } - //this.error={ errorText: '',error:false }; - return true; + events: { + blur: props.onBlur || (() => {}) + } + }) } protected render(): string { - const {type = '', name = '', value = '', label = "",error=false,errorText=''} = this.props; - //const {error=false,errorText=''}=this.error; + const { classes, placeholder,ref,value } = this.props; return (` -
      - -
      + `) } } diff --git a/src/components/message/message.ts b/src/components/message/message.ts index 7f546b275..d28dc4687 100644 --- a/src/components/message/message.ts +++ b/src/components/message/message.ts @@ -23,7 +23,7 @@ export class Message extends Block { {{{ Badge text="01.20" type="primary" }}} `:`
      -

      {{content}}

      +

      ${message.content}

      {{{Badge text="01.20" }}}
      diff --git a/src/main.ts b/src/main.ts index ae5c4bc15..0da2c265d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,6 +8,25 @@ import {message1, mockListMessages} from "./mocks/chat-message.mocks"; import {registerComponent} from "./utils/registerComponents"; import {AllComponentsPage} from "./pages"; +const allComponents={ + 'Button': Components.Button, + 'Avatar': Components.Avatar, + 'ChatItem': Components.ChatItem, + 'ChatList': Components.ChatList, + 'Badge': Components.Badge, + 'Error': Components.Error, + 'Input': Components.Input, + 'InputShort': Components.InputShort, + 'InputWide': Components.InputWide, + 'InputSearch': Components.InputSearch, + 'Loader': Components.Loader, + 'Message': Components.Message, + 'MessageList': Components.MessageList, + 'Modal': Components.Modal, + 'FormAuth': Components.FormAuth, + 'LoginPage': Pages.LoginPage, + 'Link': Components.Link +} const pages = { "allComponents": [Pages.AllComponentsPage, { chat1: chat1, @@ -26,24 +45,11 @@ const pages = { "page404": [Pages.Page404], "allPages": [Pages.AllPages] }; -Object.entries(Components).forEach(([name, component]) => { - if(typeof component==='string')Handlebars.registerPartial(name, component); +Object.entries(allComponents).forEach(([name, component]) => { + registerComponent(name, component); }); -registerComponent('Button', Components.Button); -registerComponent('Badge', Components.Badge); -registerComponent('Avatar', Components.Avatar); -registerComponent('ChatItem', Components.ChatItem); -registerComponent('ChatList', Components.ChatList); -registerComponent('Error', Components.Error); -registerComponent('Input', Components.Input); -registerComponent('Loader', Components.Loader); -registerComponent('Message', Components.Message); -registerComponent('MessageList', Components.MessageList); -registerComponent('Modal', Components.Modal); -registerComponent('FormAuth', Components.FormAuth); -registerComponent('LoginPage', Pages.LoginPage); -registerComponent('Link', Components.Link); + const navigate = (page: string) => { const app = document.getElementById('app'); diff --git a/src/pages/all-components/all-components.hbs b/src/pages/all-components/all-components.hbs index 29bb41f3d..213eb5764 100644 --- a/src/pages/all-components/all-components.hbs +++ b/src/pages/all-components/all-components.hbs @@ -2,25 +2,8 @@
      {{#> AllComponents}} - {{> Button caption="sign in"}} - {{> Button type="number" caption="330"}} - {{> Button type="arrow" page="pageChat"}} - {{> Loader}} - {{>Link caption="Login" page="loginPage" linkIcon=true }} - {{>Link caption="Profile" type='success' page="page404" }} - {{>Link caption="Edit Profile" page="pageProfileEdit" type='danger' linkLine=true }} - {{>Input label="Login" type="text" name="login" }} - {{>Input label="Error" type="text" name="error" error=true errorText='Error!!'}} - {{> Avatar isLoadAvatar=true}} - {{> Avatar image="1.jpeg" isLoadAvatar=true}} - {{> Avatar image="2.jpg" isLoadAvatar=true}} - {{> Avatar image="3.jpg" isLoadAvatar=true}} - {{>InputWide label="Login" type="text" name="login" value='MyLogin' readOnly=false }} - {{>InputWide label="Login" type="text" name="login" value='MyLogin' readOnly=true noLine=true }} - {{>InputWide label="Error" type="text" name="error" error=true errorText='Error!!' readOnly=false}} - {{>ChatItem chat=chat1}} - {{>InputSearch }} - {{>Badge text="01.20" type="primary"}} {{>Badge text="01.20" }} + {{>InputShort label="Login" type="text" name="login" }} + {{/AllComponents}}
      diff --git a/src/pages/all-components/all-components.ts b/src/pages/all-components/all-components.ts index c4f98d85a..14309b1ee 100644 --- a/src/pages/all-components/all-components.ts +++ b/src/pages/all-components/all-components.ts @@ -64,8 +64,9 @@ export class AllComponents extends Block { {{{Link caption="Edit Profile" page="pageProfileEdit" type='danger' linkLine=true }}} {{{Error errorNumber='400' pageGoBack='' errorText='errorText'}}} - {{{ Input label="Login" type="text" name="login" validate=validate.login ref="login" }}} - {{{ Input label="Error" type="text" name="error" error=true errorText='Error!!' validate=validate.login ref="password"}}} + {{{ InputShort label="Login" type="text" name="login" validate=validate.login ref="login" }}} + {{{ InputSearch label="Search" type="text" name="login" ref="search" }}} + {{{ Message message=message}}} {{{ Message message=message myMessage=true}}} diff --git a/src/utils/Block.ts b/src/utils/Block.ts index 7baffa551..efacf7eb5 100644 --- a/src/utils/Block.ts +++ b/src/utils/Block.ts @@ -1,6 +1,8 @@ import EventBus from "./EventBus"; import { v4 as uuidv4 } from 'uuid'; import Handlebars from "handlebars"; +import {isDeepEqual} from "./object.utils.ts"; + class Block { static EVENTS = { @@ -12,11 +14,11 @@ class Block { public id = uuidv4(); protected props: any; - private _element: HTMLElement | null = null; + protected _element: HTMLElement | null = null; protected _meta: { props: any; }|null=null; private _eventBus: () => EventBus; private children: Record; - protected refs: any; + protected refs: Record = {}; constructor( propsWithChildren:any = {}) { const eventBus = new EventBus(); @@ -28,7 +30,7 @@ class Block { this.children = children; this.props = this._makePropsProxy(props); - console.log('init props',props,this.props) + // console.log('init props',props,this.props) this._eventBus = () => eventBus; @@ -85,16 +87,16 @@ class Block { } protected componentDidUpdate(oldProps:any, newProps:any) { - if(oldProps!==newProps) this.setProps(newProps); - return true; + // this.setProps(newProps); + return isDeepEqual(oldProps, newProps); } setProps = (nextProps:any) => { + console.log('nextProps',nextProps) if (!nextProps) { return; } - - //Object.assign(this.props, nextProps); + Object.assign(this.props, nextProps); }; @@ -102,6 +104,11 @@ class Block { return this._element; } + public value() { + // @ts-ignore + return this._element&&this._element.value ? this._element.value : ''; + } + private _render() { const fragment = this.compile(this.render(), this.props); diff --git a/src/utils/object.utils.ts b/src/utils/object.utils.ts new file mode 100644 index 000000000..0d8976b50 --- /dev/null +++ b/src/utils/object.utils.ts @@ -0,0 +1,25 @@ +export const isDeepEqual = (object1:any, object2:any) => { + + const objKeys1 = Object.keys(object1); + const objKeys2 = Object.keys(object2); + + if (objKeys1.length !== objKeys2.length) return false; + + for (var key of objKeys1) { + const value1 = object1[key]; + const value2 = object2[key]; + + const isObjects = isObject(value1) && isObject(value2); + + if ((isObjects && !isDeepEqual(value1, value2)) || + (!isObjects && value1 !== value2) + ) { + return false; + } + } + return true; +}; + +const isObject = (object:any) => { + return object != null && typeof object === "object"; +}; diff --git a/src/utils/registerComponents.ts b/src/utils/registerComponents.ts index 323dd608c..9af70a6b0 100644 --- a/src/utils/registerComponents.ts +++ b/src/utils/registerComponents.ts @@ -11,6 +11,7 @@ export function registerComponent(name: string, Component: typeof Block) { const component = new Component(hash); const dataAttribute = `data-id="${component.id}"`; + console.log(hash) if ('ref' in hash) { (data.root.__refs = data.root.__refs || {})[hash.ref] = component; } From 45fc35f8e4f7fb948ac42ce0c7ec9b23e25eb888 Mon Sep 17 00:00:00 2001 From: ellevanova Date: Mon, 18 Sep 2023 19:19:08 +0400 Subject: [PATCH 39/55] added pages --- src/components/button/button.ts | 10 ++-- src/components/form-auth/form-auth.hbs | 2 +- src/components/form-auth/form-auth.ts | 63 +++++++++++++--------- src/components/input-short/input-short.ts | 19 ++++--- src/components/input/input.ts | 6 ++- src/components/link/link.ts | 14 ++--- src/main.ts | 31 ++++++----- src/pages/all-components/all-components.ts | 9 +--- src/pages/all-pages/all-pages.ts | 25 +++++++++ src/pages/all-pages/index.ts | 3 +- src/pages/index.ts | 2 +- src/pages/login/login.ts | 25 ++++----- src/utils/Block.ts | 3 ++ src/utils/registerComponents.ts | 1 - 14 files changed, 127 insertions(+), 86 deletions(-) create mode 100644 src/pages/all-pages/all-pages.ts diff --git a/src/components/button/button.ts b/src/components/button/button.ts index d4539b13c..3f12b3ad2 100644 --- a/src/components/button/button.ts +++ b/src/components/button/button.ts @@ -9,10 +9,12 @@ interface IButtonProps { export class Button extends Block { constructor(props: IButtonProps) { - super(props); - this.props.events = { - click: this.props.onClick || (() => {}) - } + super({ + ...props, + events: { + click: props.onClick || (() => {}) + } + }) } protected render(): string { diff --git a/src/components/form-auth/form-auth.hbs b/src/components/form-auth/form-auth.hbs index 40029fcbb..c8edb4f5d 100644 --- a/src/components/form-auth/form-auth.hbs +++ b/src/components/form-auth/form-auth.hbs @@ -7,7 +7,7 @@
      {{{ Button caption=ok-text page=ok-page }}} - {{{Link caption=cancel-text page=cancel-page }}} + {{{ Link caption=cancel-text page=cancel-page }}}
      diff --git a/src/components/form-auth/form-auth.ts b/src/components/form-auth/form-auth.ts index 5dce666b7..783c2ea18 100644 --- a/src/components/form-auth/form-auth.ts +++ b/src/components/form-auth/form-auth.ts @@ -1,40 +1,51 @@ import Block from "../../utils/Block"; +interface IFormAuthProps { + caption: string, + children: string, + onClickOkButton: (event:any) => void, + onClickCancelButton: (event:any) => void, + captionOk: string, + captionCancel: string, + pageOk:string, + pageCancel:string +} export class FormAuth extends Block { - private caption: string; - constructor() { + constructor(props:IFormAuthProps) { super({ + ...props, validate: { - login: (value: string) => value.length < 3 && value.length !== 0 ? `Length of login should not be less 3 letters.` : '' - }/*, - onLogin: (event:Event) => { - event.preventDefault(); - const login = this.refs.login.value(); - const password = this.refs.password.value(); - - console.log({ - login, - password - }) - }*/ + login: (value: string) => { + console.log(value) + return value.length < 3 && value.length !== 0 ? `Length of login should not be less 3 letters.` : '' + }, + password: (value: string) => { + console.log(value) + return value.length < 6 && value.length !== 0 ? `Length of password should not be less 6 letters.` : '' + } + }, + onClickOk: (event:any)=>{ + console.log('OK') + props.onClickOkButton(event) + } }); - this.caption='Login' } protected render(): string { + const {caption='Login',children='',onClickCancelButton,captionOk,captionCancel,pageCancel}=this.props; return(`
      -

      - ${this.caption} -

      -
      - {{> @partial-block }} -
      -
      - {{{ Button caption='ok-text' page='ok-page' }}} - {{>Link caption=cancel-text page=cancel-page }}} -
      -
      +

      + ${caption} +

      +
      + ${children} +
      +
      + {{{ Button caption="${captionOk}" onClick=onClickOk }}} + {{{ Link caption="${captionCancel}" page="${pageCancel}" onClick=${onClickCancelButton} }}} +
      + `) } } diff --git a/src/components/input-short/input-short.ts b/src/components/input-short/input-short.ts index 140ab021b..7d7cc15fb 100644 --- a/src/components/input-short/input-short.ts +++ b/src/components/input-short/input-short.ts @@ -1,7 +1,7 @@ import Block from "../../utils/Block"; interface IInputProps { - type: 'text' | 'button', + type: 'text' | 'password', name: string, value: string, label: string, @@ -14,7 +14,8 @@ export class InputShort extends Block { constructor(props:IInputProps) { super({ ...props, - errorText: '', error:false , + errorText: '', + error:false , onBlur: () => this.validate() }); @@ -24,15 +25,13 @@ export class InputShort extends Block { if (!this.validate()) { return false; } - return this.refs?.input?.value() + return this.refs?.[this.props.ref].value() } private validate() { - console.log(this) - const value =this.refs?.input?.value(); + const value =this.refs?.[this.props.ref].value(); const error = this.props.validate(value); - console.log('value,error',value,error) this.props.value=value; if (error) { this.setProps({...this.props, errorText: error,error:true}); @@ -43,19 +42,19 @@ export class InputShort extends Block { } protected render(): string { - const {type = '', name = '', value = '', label = "",error=false,errorText=''} = this.props; + const {type = '', ref = '', value = '', label = "",error=false,errorText=''} = this.props; return (`
    `) diff --git a/src/utils/Block.ts b/src/utils/Block.ts index 0a79d2582..29fef2cff 100644 --- a/src/utils/Block.ts +++ b/src/utils/Block.ts @@ -1,28 +1,30 @@ import EventBus from "./EventBus"; -import { v4 as uuidv4 } from 'uuid'; +import {v4 as uuidv4} from 'uuid'; import Handlebars from "handlebars"; import {isDeepEqual} from "./object.utils.ts"; -export interface IProps{ - events?:object +export interface IProps { + events?: object } + export class Block { static EVENTS = { INIT: "init", FLOW_CDM: "flow:component-did-mount", FLOW_CDU: "flow:component-did-update", - FLOW_RENDER: "flow:render" + FLOW_RENDER: "flow:render", + FLOW_CWUM: "flow:component-will-unmount" }; public id = uuidv4(); protected _props: IProps; protected _element: HTMLElement | null = null; - protected _meta: { props: IProps; }|null=null; + protected _meta: { props: IProps; } | null = null; private _eventBus: () => EventBus; private children: Record = {}; protected refs: Record = {}; - constructor( propsWithChildren:IProps ) { + constructor(propsWithChildren: IProps) { const eventBus = new EventBus(); const {props, children} = this._getChildrenAndProps(propsWithChildren); @@ -31,8 +33,8 @@ export class Block { }; this.children = children; - this._props = this._makePropsProxy(props,this); - // console.log('init props',props,this.props) + this._props = this._makePropsProxy(props, this); + // console.log('init props',props,this.props) this._eventBus = () => eventBus; @@ -54,11 +56,13 @@ export class Block { return {props, children}; } - _registerEvents(eventBus:EventBus) { + + _registerEvents(eventBus: EventBus) { eventBus.on(Block.EVENTS.INIT, this._init.bind(this)); eventBus.on(Block.EVENTS.FLOW_CDM, this._componentDidMount.bind(this)); eventBus.on(Block.EVENTS.FLOW_CDU, this._componentDidUpdate.bind(this)); eventBus.on(Block.EVENTS.FLOW_RENDER, this._render.bind(this)); + eventBus.on(Block.EVENTS.FLOW_CWUM, this._componentWillUnmount.bind(this)); } private _init() { @@ -66,6 +70,7 @@ export class Block { this._eventBus().emit(Block.EVENTS.FLOW_RENDER); } + protected init() { } @@ -73,31 +78,41 @@ export class Block { this.componentDidMount(); } - protected componentDidMount() {} + protected componentDidMount() { + } public dispatchComponentDidMount() { this._eventBus().emit(Block.EVENTS.FLOW_CDM); Object.values(this.children).forEach(child => child.dispatchComponentDidMount()); } - private _componentDidUpdate(oldProps:IProps, newProps:IProps) { + private _componentDidUpdate(oldProps: IProps, newProps: IProps) { const response = this.componentDidUpdate(oldProps, newProps); - if(response) { + if (response) { this._eventBus().emit(Block.EVENTS.FLOW_RENDER); } } - protected componentDidUpdate(oldProps:IProps, newProps:IProps) { + protected componentDidUpdate(oldProps: IProps, newProps: IProps) { // this.setProps(newProps); - return isDeepEqual(oldProps as {[index: string]:IProps}, newProps as {[index: string]:IProps}); + return isDeepEqual(oldProps as { [index: string]: IProps }, newProps as { [index: string]: IProps }); + } + + private _componentWillUnmount() { + this.componentWillUnmount() + this._removeEvents(); } - setProps = (nextProps:IProps) => { + protected componentWillUnmount() { + this._removeEvents(); + } + + setProps = (nextProps: IProps) => { if (!nextProps) { return; } - Object.assign(this._props, nextProps); + Object.assign(this._props, nextProps); }; @@ -106,12 +121,14 @@ export class Block { } public value() { - return this._element&&(this._element).value ? (this._element).value : ''; + return this._element && (this._element).value ? (this._element).value : ''; } -public getRefs(){ + + public getRefs() { return this.refs -} - private _render() { + } + + private _render() { const fragment = this.compile(this.render(), this._props); const newElement = fragment.firstElementChild as HTMLElement; @@ -132,10 +149,18 @@ public getRefs(){ this._element?.addEventListener(eventName, events[eventName]); }); } - private compile(template: string, context: object) { + _removeEvents() { + const {events = {}} = this._props as { events: Record void> }; + + Object.keys(events).forEach(eventName => { + this._element?.removeEventListener(eventName, events[eventName]); + }); + } + + private compile(template: string, context: object) { - const contextAndStubs = {...context,__children: [] as Array<{ component:unknown,embed(node:DocumentFragment):void }>, __refs: this.refs}; + const contextAndStubs = {...context, __children: [] as Array<{ component: unknown, embed(node: DocumentFragment): void }>, __refs: this.refs}; const html = Handlebars.compile(template)(contextAndStubs); @@ -158,7 +183,7 @@ public getRefs(){ return this.element; } - _makePropsProxy(props:{[index: string|symbol]:unknown},self:Block) { + _makePropsProxy(props: { [index: string | symbol]: unknown }, self: Block) { return new Proxy(props, { get(target, prop) { const value = target[prop]; @@ -169,8 +194,6 @@ public getRefs(){ target[prop] = value; - // Запускаем обновление компоненты - // Плохой cloneDeep, в следующей итерации нужно заставлять добавлять cloneDeep им самим self._eventBus().emit(Block.EVENTS.FLOW_CDU, oldTarget, target); return true; }, @@ -180,17 +203,7 @@ public getRefs(){ }); } - /*_createDocumentElement() { - // Можно сделать метод, который через фрагменты в цикле создаёт сразу несколько блоков - //return document.createElement(); - } - - show() { - this.getContent().style.display = "block"; - } - hide() { - this.getContent().style.display = "none"; - }*/ } + export default Block; diff --git a/src/utils/Http.ts b/src/utils/Http.ts index 6b94b569a..bbfddeaa3 100644 --- a/src/utils/Http.ts +++ b/src/utils/Http.ts @@ -1,57 +1,55 @@ enum METHODS { - GET= 'GET', - POST = 'POST', + GET = 'GET', + POST = 'POST', PUT = 'PUT', DELETE = 'DELETE' } -type IOptionsRequest ={ - data?:string; - method:METHODS.GET|METHODS.POST|METHODS.PUT|METHODS.DELETE; - timeout?:number; - headers?:Record; +type IOptionsRequest = { + data?: string; + method?: METHODS.GET | METHODS.POST | METHODS.PUT | METHODS.DELETE; + timeout?: number; + headers?: Record; + params?: object; } + +type HTTPMethod = (url: string, options?: IOptionsRequest) => Promise + /** - * Функцию реализовывать здесь необязательно, но может помочь не плодить логику у GET-метода - * На входе: объект. Пример: {a: 1, b: 2, c: {d: 123}, k: [1, 2, 3]} - * На выходе: строка. Пример: ?a=1&b=2&c=[object Object]&k=1,2,3 + * Get string of query params from object params + * @param data */ -function queryStringify(data:object) { - // Можно делать трансформацию GET-параметров в отдельной функции - //if(!data)return '' - let result='?'; - result=result+Object.entries(data).map(([key, value])=>{ return `${key}=${Array.isArray(value)?value.join(','):String(value)}` +function queryStringify(data: object) { + let result = '?'; + result = result + Object.entries(data).map(([key, value]) => { + return `${key}=${Array.isArray(value) ? value.join(',') : String(value)}` }).join("&") return result; } class HTTPTransport { - get = (url:string, options:IOptionsRequest = {method: METHODS.GET},params:object) => { + get: HTTPMethod = (url, options = {}) => { return this.request(url, { ...options, - data: queryStringify(params||{})||'' , + data: queryStringify(options.params || {}) || '', method: METHODS.GET }, options.timeout); }; - put = (url:string, options:IOptionsRequest = {method: METHODS.PUT}) => { + put: HTTPMethod = (url, options = {}) => { return this.request(url, {...options, method: METHODS.PUT}, options.timeout); }; - post = (url:string, options:IOptionsRequest = {method: METHODS.POST}) => { + post: HTTPMethod = (url, options = {}) => { return this.request(url, {...options, method: METHODS.POST}, options.timeout); }; - delete = (url:string, options:IOptionsRequest = {method: METHODS.DELETE}) => { + delete: HTTPMethod = (url, options = {}) => { return this.request(url, {...options, method: METHODS.DELETE}, options.timeout); }; - // PUT, POST, DELETE - // options: - // headers — obj - // data — obj - request = (url:string, options:IOptionsRequest = {method: METHODS.GET}, timeout = 5000) => { + request = (url: string, options: IOptionsRequest = {method: METHODS.GET}, timeout = 5000) => { const {method, headers, data} = options; return new Promise((resolve, reject) => { @@ -59,7 +57,7 @@ class HTTPTransport { const xhr = new XMLHttpRequest(); xhr.timeout = timeout; const isGet = method === METHODS.GET; - xhr.open(method, isGet ? `${url}${data}` : url,); + xhr.open(method || METHODS.GET, isGet ? `${url}${data}` : url,); if (headers) { @@ -88,4 +86,5 @@ class HTTPTransport { }; } + export default HTTPTransport;