[{"data":1,"prerenderedAt":1600},["ShallowReactive",2],{"projects:ru:all:":3,"project:ru:fendos":1568},[4,224,398,528,623,764,903,1011,1111,1184,1259,1394,1440,1487,1528],{"id":5,"title":6,"body":7,"company":176,"confidential":177,"cover":178,"description":179,"extension":180,"featured":177,"gallery":181,"links":191,"meta":192,"metrics":193,"navigation":177,"order":203,"path":204,"role":205,"seo":206,"stack":207,"stem":221,"year":222,"__hash__":223},"projects_ru\u002Fwork\u002Fdyzlix.md","Dyzlix — Smart Fuel System",{"type":8,"value":9,"toc":168},"minimark",[10,15,19,23,30,80,83,86,128,132],[11,12,14],"h2",{"id":13},"продукт","Продукт",[16,17,18],"p",{},"Топливо — одна из крупнейших статей расходов траковой компании. Dyzlix предлагает лучшие заправки по маршруту, цене и доступности. Букеры назначают их водителям, транзакции по картам (EFS \u002F Relay) сопоставляются с бронированиями, а менеджеры видят экономию, MPG и простой на одном дашборде.",[11,20,22],{"id":21},"моя-роль","Моя роль",[16,24,25,29],{},[26,27,28],"strong",{},"Я создал фронтенд Dyzlix с нуля и полностью отвечаю за него."," Начал кодовую базу в октябре 2024 и сам выстроил всё вокруг неё:",[31,32,33,45,62,68,74],"ul",{},[34,35,36,39,40,44],"li",{},[26,37,38],{},"Архитектура"," — слоистая структура ",[41,42,43],"code",{},"app → pages → modules → shared",", правила потоков данных и шаблон модуля, по которому строится каждая фича.",[34,46,47,54,55],{},[48,49,50,53],"if-backend",{},[26,51,52],{},"Инфраструктура"," — сборка на Vite, конфигурация TypeScript, multi-stage Docker-образы для staging и production с отдачей через nginx, работа с окружениями и версионирование релизов."," ",[48,56,58,61],{":off":57},"true",[26,59,60],{},"Сборка"," — сборка на Vite, конфигурация TypeScript, работа с окружениями и версионирование релизов.",[34,63,64,67],{},[26,65,66],{},"DX и качество"," — ESLint и Prettier, Conventional Commits, git-хуки с гейтами type-check, дизайн-токенов, границ импортов и бюджета бандла, unit-тесты и smoke-харнесс на Playwright.",[34,69,70,73],{},[26,71,72],{},"Дизайн-система"," — общий UI-кит, дизайн-токены и тёмная тема.",[34,75,76,79],{},[26,77,78],{},"Фичи"," — большая часть продукта: дашборд, Fuel Book, живая трекинг-доска, карты, транзакции, простой, права и настройки.",[16,81,82],{},"Сегодня я основной автор кодовой базы (1 100+ коммитов) и ориентир в том, как строятся новые фичи.",[11,84,38],{"id":85},"архитектура",[31,87,88,102,112,122],{},[34,89,90,93,94,96,97,101],{},[26,91,92],{},"Слоистая структура"," — ",[41,95,43],{},", близко к Feature-Sliced Design. Скрипт boundaries контролирует направление импортов и падает только на ",[98,99,100],"em",{},"новых"," нарушениях.",[34,103,104,107,108,111],{},[26,105,106],{},"Единый поток данных"," — page → view → composable → типизированный query-хук в ",[41,109,110],{},"shared\u002Fapi",", TanStack Query для серверного состояния.",[34,113,114,117,118,121],{},[26,115,116],{},"UI с учётом прав"," — ~65 детальных прав ",[41,119,120],{},"CAN_*"," и доступ по провайдеру (EFS \u002F Relay).",[34,123,124,127],{},[26,125,126],{},"Real-time"," — STOMP поверх WebSocket для уведомлений о топливе и событий по картам.",[11,129,131],{"id":130},"ключевое","Ключевое",[31,133,134,140,150,156,162],{},[34,135,136,139],{},[26,137,138],{},"Живая трекинг-доска"," — виртуализированный список машин, маркеры и маршруты HERE Maps, воспроизведение маршрута и графики уровня топлива на D3.",[34,141,142,145,146,149],{},[26,143,144],{},"Ратчет-гейты качества"," в pre-push: type-check, контроль дизайн-токенов (без новых «сырых» цветов), границы импортов, бюджет бандла ~200 КБ gzip, allowlist лицензий и ",[41,147,148],{},"pnpm audit",".",[34,151,152,155],{},[26,153,154],{},"Релизы без простоя"," — сборки помечаются хешем; открытые вкладки подхватывают новый релиз при следующей навигации и автоматически восстанавливаются после устаревших чанков.",[34,157,158,161],{},[26,159,160],{},"Smoke-харнесс"," — каждый маршрут проверяется в 2 вьюпортах × 2 темах: ошибки консоли, упавшие запросы и скриншот-диффы.",[34,163,164,167],{},[26,165,166],{},"17 ADR"," документируют ключевые архитектурные решения.",{"title":169,"searchDepth":170,"depth":170,"links":171},"",2,[172,173,174,175],{"id":13,"depth":170,"text":14},{"id":21,"depth":170,"text":22},{"id":85,"depth":170,"text":38},{"id":130,"depth":170,"text":131},"Longhorn Logistics Group",true,"\u002Fimages\u002Fprojects\u002Fdyzlix\u002Fcover.jpg","Платформа управления топливом для американских траковых автопарков: рекомендации заправок, бронирования, транзакции по картам, живой трекинг и аналитика экономии.","md",[182,185,188],{"src":183,"alt":184,"caption":184},"\u002Fimages\u002Fprojects\u002Fdyzlix\u002Ftracking.jpg","Живой трекинг: виртуализированный список машин и кластеры HERE Maps",{"src":186,"alt":187,"caption":187},"\u002Fimages\u002Fprojects\u002Fdyzlix\u002Ffuel-book.jpg","Fuel Book: рекомендованные заправки, уровень топлива и бронирование",{"src":189,"alt":190,"caption":190},"\u002Fimages\u002Fprojects\u002Fdyzlix\u002Fdashboard.jpg","Аналитика: расходы, экономия, MPG и простой",{},{},[194,197,200],{"label":195,"value":196},"Моих коммитов","1 100+",{"label":198,"value":199},"Доля в истории","52%",{"label":201,"value":202},"Unit-тестов","320+",1,"\u002Fwork\u002Fdyzlix","Frontend lead · с нуля",{"title":6,"description":179},[208,209,210,211,212,213,214,215,216,217,218,219,220],"Vue 3.5","TypeScript","Vite","Pinia","TanStack Query","TanStack Table","TanStack Virtual","HERE Maps","D3","STOMP\u002FWebSocket","Tailwind CSS 4","Vitest","Playwright","work\u002Fdyzlix",2024,"AewEYaEk-pFsXoTqrjvQAy-2HqjC7mifswntbZF30nM",{"id":225,"title":226,"body":227,"company":176,"confidential":177,"cover":364,"description":365,"extension":180,"featured":177,"gallery":366,"links":379,"meta":380,"metrics":381,"navigation":177,"order":170,"path":389,"role":205,"seo":390,"stack":391,"stem":396,"year":222,"__hash__":397},"projects_ru\u002Fwork\u002Fbot-manager.md","Bot Manager — Telegram и операции автопарка",{"type":8,"value":228,"toc":358},[229,231,234,236,249,297,300,302,324,326],[11,230,14],{"id":13},[16,232,233],{},"Диспетчеры, служба безопасности и сервис общаются с сотнями водителей через Telegram-группы. Bot Manager — панель, в которой они работают каждый день: зеркалирует чаты, автоматизирует посты и оповещения и связывает их с данными автопарка — водителями, юнитами, осмотрами (PTI), заказ-нарядами и опасными зонами.",[11,235,22],{"id":21},[16,237,238,241,242,54,245,248],{},[26,239,240],{},"Bot Manager — мой проект с самого первого коммита."," Я создал репозиторий в декабре 2024 и ",[48,243,244],{},"сам построил весь фронтенд и его инфраструктуру",[48,246,247],{":off":57},"сам построил весь фронтенд",":",[31,250,251,260,280,286,292],{},[34,252,253,255,256,259],{},[26,254,38],{}," — слои ",[41,257,258],{},"app \u002F pages \u002F modules \u002F shared",", изолированные фич-модули, типизированный API-слой и реестр маршрутов с lazy-load и фича-флагами.",[34,261,262,54,275],{},[48,263,264,266,267,270,271,274],{},[26,265,52],{}," — настройка Vite и TypeScript, Docker-образы для staging и production, автодеплой из ",[41,268,269],{},"dev"," и ",[41,272,273],{},"main"," и определение нового релиза с предложением обновить страницу.",[48,276,277,279],{":off":57},[26,278,60],{}," — настройка Vite и TypeScript и определение нового релиза с предложением обновить страницу.",[34,281,282,285],{},[26,283,284],{},"Real-time и устойчивость"," — единый STOMP-клиент, стратегия переподключения и корректная обработка перезапуска сервера и истёкших сессий.",[34,287,288,291],{},[26,289,290],{},"DX"," — ESLint, Prettier, husky, lint-staged, commitlint со скоупами модулей и pre-push с type-check, тестами и staging-сборкой.",[34,293,294,296],{},[26,295,14],{}," — общий UI-кит и большая часть из 41 фич-модуля: Telegram Mirror, посты, опасные зоны, PTI и RBAC.",[16,298,299],{},"Я написал ~80% истории кодовой базы (1 700+ коммитов) и остаюсь её лидом.",[11,301,38],{"id":85},[31,303,304,312,318],{},[34,305,306,93,309,311],{},[26,307,308],{},"Слои",[41,310,258],{},"; тонкие страницы маршрутов, изолированные модули без взаимных импортов и 35 типизированных API-доменов с queries и mutations (TanStack Query), Pinia для клиентского состояния.",[34,313,314,317],{},[26,315,316],{},"Реестр маршрутов с lazy-load"," и фича-флагами на этапе сборки.",[34,319,320,323],{},[26,321,322],{},"RBAC"," — ~20 групп прав, применяемых к маршрутам и даже к отдельным папкам чатов.",[11,325,131],{"id":130},[31,327,328,334,340,346,352],{},[34,329,330,333],{},[26,331,332],{},"Telegram Mirror"," — Telegram-подобный клиент с папками чатов, закреплёнными сообщениями, медиа и голосовыми, историей удалённых сообщений и поиском. Список сообщений — двунаправленное окно с переходами: подгружает вокруг вьюпорта и центрируется на ответе или результате поиска.",[34,335,336,339],{},[26,337,338],{},"Устойчивый real-time"," — единый STOMP-клиент, сохраняющий обработчики при переподключениях, ставящий в очередь подписки до подключения и восстанавливающийся при возврате сети или вкладки.",[34,341,342,345],{},[26,343,344],{},"Корректная деградация"," — при 502\u002F503\u002F504 баннер «сервер перезапускается» с backoff и refetch; только 401 разлогинивает и возвращает на ту же страницу; при новом деплое предлагается обновиться.",[34,347,348,351],{},[26,349,350],{},"Планирование по часовым поясам"," — мультигрупповые посты с превью CT\u002FET\u002FMT\u002FPT, таргетингом по штатам, закреплением и автоудалением.",[34,353,354,357],{},[26,355,356],{},"Планка качества"," — ноль ошибок типов, Conventional Commits со скоупами модулей и pre-push с type-check, тестами и staging-сборкой.",{"title":169,"searchDepth":170,"depth":170,"links":359},[360,361,362,363],{"id":13,"depth":170,"text":14},{"id":21,"depth":170,"text":22},{"id":85,"depth":170,"text":38},{"id":130,"depth":170,"text":131},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Fcover.jpg","Внутренняя операционная панель американской транспортной компании: Telegram-подобный клиент для групп водителей, запланированные посты, опасные зоны, осмотры и ролевой доступ.",[367,370,373,376],{"src":368,"alt":369,"caption":369},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Fmulti-post.jpg","Планирование мультигрупповых постов по часовым поясам США",{"src":371,"alt":372,"caption":372},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Ftelegram-mirror.jpg","Telegram Mirror: папки чатов и зеркалированные группы водителей",{"src":374,"alt":375,"caption":375},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Fcustomers.jpg","Клиенты: подписки, подключённые события и статус оплаты",{"src":377,"alt":378,"caption":378},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Froles.jpg","Ролевая модель доступа",{},{},[382,384,386],{"label":195,"value":383},"1 700+",{"label":198,"value":385},"79%",{"label":387,"value":388},"Фич-модулей","41","\u002Fwork\u002Fbot-manager",{"title":226,"description":365},[392,209,210,211,212,217,393,215,394,395,219],"Vue 3","Leaflet","vue-i18n","Tailwind CSS","work\u002Fbot-manager","cNYCwdxLQXgxIGW7JfDFqDRfyX1EUSU5S5yI__2Kgds",{"id":399,"title":400,"body":401,"company":176,"confidential":177,"cover":489,"description":490,"extension":180,"featured":177,"gallery":491,"links":504,"meta":505,"metrics":506,"navigation":177,"order":514,"path":515,"role":516,"seo":517,"stack":518,"stem":525,"year":526,"__hash__":527},"projects_ru\u002Fwork\u002Fload-up.md","Load Up — TMS и диспетчерская доска",{"type":8,"value":402,"toc":483},[403,405,408,410,413,415,455,457],[11,404,14],{"id":13},[16,406,407],{},"Load Up управляет грузовой компанией от начала до конца. Диспетчеры бронируют и отслеживают грузы на живой доске; автопарк и сервис ведут машины, заказ-наряды и осмотры; служба безопасности отслеживает инциденты с видео; бухгалтерия ведёт расчёты и зарплаты — всё в одном веб-приложении, которым ежедневно пользуются многие отделы.",[11,409,22],{"id":21},[16,411,412],{},"Присоединился к команде в июне 2026 и выпускаю фичи в модулях доски, автопарка и безопасности внутри большой, быстро развивающейся кодовой базы со строгими конвенциями.",[11,414,38],{"id":85},[31,416,417,423,443,449],{},[34,418,419,422],{},[26,420,421],{},"React 19 + TanStack Router"," — файловые маршруты и автоматический code splitting (~210 файлов маршрутов).",[34,424,425,428,429,432,433,432,436,432,439,442],{},[26,426,427],{},"Feature-sliced домены"," — каждый из 24 модулей владеет своими ",[41,430,431],{},"api",", ",[41,434,435],{},"components",[41,437,438],{},"hooks",[41,440,441],{},"schemas"," и стором.",[34,444,445,448],{},[26,446,447],{},"Серверное состояние"," на TanStack Query с оптимистичными обновлениями; клиентское — Zustand; формы — react-hook-form и Zod.",[34,450,451,454],{},[26,452,453],{},"Детальные права"," — центральный каталог прав, используемый в сотнях компонентов.",[11,456,131],{"id":130},[31,458,459,465,471,477],{},[34,460,461,464],{},[26,462,463],{},"Всё в реальном времени"," — каналы STOMP\u002FWebSocket синхронизируют доску грузов, грузы, уведомления и данные безопасности; звонки RingCentral WebRTC встроены в приложение.",[34,466,467,470],{},[26,468,469],{},"Большие данные, плавный UI"," — общая виртуализированная таблица (TanStack Table + Virtual) и карты с кластеризацией и пространственным индексом.",[34,472,473,476],{},[26,474,475],{},"Корректность в нескольких вкладках"," — активность оператора отправляется только из одной вкладки через Web Locks и BroadcastChannel.",[34,478,479,482],{},[26,480,481],{},"Быстрая обратная связь"," — Vitest разделён на node- и jsdom-проекты, прогон сократился с 8,5 до 3,65 с.",{"title":169,"searchDepth":170,"depth":170,"links":484},[485,486,487,488],{"id":13,"depth":170,"text":14},{"id":21,"depth":170,"text":22},{"id":85,"depth":170,"text":38},{"id":130,"depth":170,"text":131},"\u002Fimages\u002Fprojects\u002Fload-up\u002Fcover.jpg","Крупная система управления перевозками для грузовой компании: живая доска грузов, рейсы, обслуживание автопарка, мониторинг безопасности, бухгалтерия и HR в одном React-приложении.",[492,495,498,501],{"src":493,"alt":494,"caption":494},"\u002Fimages\u002Fprojects\u002Fload-up\u002Fdashboard.jpg","Операционный дашборд: KPI и живая карта 600+ водителей",{"src":496,"alt":497,"caption":497},"\u002Fimages\u002Fprojects\u002Fload-up\u002Fupdate-board.jpg","Update Board: статусы автопарка, прицепы и локации в одной виртуализированной таблице",{"src":499,"alt":500,"caption":500},"\u002Fimages\u002Fprojects\u002Fload-up\u002Ftrips.jpg","Рейсы: погрузка, доставка и статус диспетчеризации",{"src":502,"alt":503,"caption":503},"\u002Fimages\u002Fprojects\u002Fload-up\u002Froute-planner.jpg","Планировщик маршрутов для траков на HERE Maps с весовыми станциями",{},{},[507,510,512],{"label":508,"value":509},"Кодовая база","~3 100 файлов",{"label":387,"value":511},"24",{"label":195,"value":513},"250+",3,"\u002Fwork\u002Fload-up","Frontend-инженер",{"title":400,"description":490},[519,209,520,521,212,213,214,522,217,523,524,393,218,219],"React 19","Vite 8","TanStack Router","Zustand","WebRTC","MapLibre","work\u002Fload-up",2026,"JhToBM3e85NWW9NljXNYQgsA4LN0Q_I1xg2f9KNXiLM",{"id":529,"title":530,"body":531,"company":593,"confidential":594,"cover":595,"description":596,"extension":180,"featured":177,"gallery":597,"links":598,"meta":601,"metrics":602,"navigation":177,"order":612,"path":613,"role":614,"seo":615,"stack":616,"stem":621,"year":526,"__hash__":622},"projects_ru\u002Fwork\u002Fexpensify.md","Expensify — open-source вклад",{"type":8,"value":532,"toc":588},[533,537,547,551,581,585],[11,534,536],{"id":535},"контекст","Контекст",[16,538,539,546],{},[540,541,545],"a",{"href":542,"rel":543},"https:\u002F\u002Fgithub.com\u002FExpensify\u002FApp",[544],"nofollow","Expensify"," — open-source приложение для учёта расходов и чата на React Native и React Native Web, которым пользуются миллионы людей в вебе, на iOS и Android. Контрибьюторы берут задачи из публичной очереди, пишут proposal и выпускают решение через строгий review и QA.",[11,548,550],{"id":549},"над-чем-я-работал","Над чем я работал",[31,552,553,559,565,571],{},[34,554,555,558],{},[26,556,557],{},"Отчёты о расходах и дубликаты"," — скрыл предупреждения о дубликатах в IOU-отчётах, исправил «Keep selected» для дубликатов в тредах транзакций, сохранил возможность отправки черновиков с несколькими расходами.",[34,560,561,564],{},[26,562,563],{},"Поиск и оптимистичные обновления"," — исправил optimistic snapshot поиска, чтобы результаты SmartScan оставались согласованными, исправил перемещения scan-failed и мерцание строк расходов.",[34,566,567,570],{},[26,568,569],{},"Воркспейсы и Expensify Card"," — запретил удаление участников с активной Expensify Card, отключил платёжные действия при выключенных платежах, добавил отображение GL-кодов категорий.",[34,572,573,576,577,580],{},[26,574,575],{},"Навигация и UX"," — исправил цикл кнопки «назад» после копилотинга в агента, сохранение текущей вкладки для ",[41,578,579],{},"exitTo","-ссылок, наложение офлайн-индикатора и safe-area.",[11,582,584],{"id":583},"чему-это-научило","Чему это научило",[16,586,587],{},"Работа в большой зрелой кодовой базе требует уважать её паттерны: оптимистичные данные на Onyx, offline-first поведение, строгая типизация и тесты для каждого изменения — и proposal’ы, которые ревьюеры могут быстро одобрить.",{"title":169,"searchDepth":170,"depth":170,"links":589},[590,591,592],{"id":535,"depth":170,"text":536},{"id":549,"depth":170,"text":550},{"id":583,"depth":170,"text":584},null,false,"\u002Fimages\u002Fprojects\u002Fexpensify.jpg","25 смерженных pull request’ов в production-приложение Expensify на React Native — исправления и фичи в отчётах о расходах, поиске, офлайн-сценариях и управлении воркспейсами.",[],{"live":599,"source":600},"https:\u002F\u002Fnew.expensify.com","https:\u002F\u002Fgithub.com\u002FExpensify\u002FApp\u002Fpulls?q=is%3Apr+author%3Ayusufdeveloper2903",{},[603,606,609],{"label":604,"value":605},"Смерженных PR","25",{"label":607,"value":608},"Платформы","Web · iOS · Android",{"label":610,"value":611},"Контрибьючу с","мая 2026",4,"\u002Fwork\u002Fexpensify","Open-source контрибьютор",{"title":530,"description":596},[209,617,618,619,620],"React Native","React Native Web","Onyx","Jest","work\u002Fexpensify","ukeU_EpAEpJYhV1yreQgKHuRLt0cx_aQDOhAlbpVxt8",{"id":624,"title":625,"body":626,"company":712,"confidential":177,"cover":713,"description":714,"extension":180,"featured":594,"gallery":715,"links":740,"meta":741,"metrics":742,"navigation":177,"order":752,"path":753,"role":754,"seo":755,"stack":756,"stem":762,"year":222,"__hash__":763},"projects_ru\u002Fwork\u002Fhunarda.md","Hunarda — онлайн-платформа обучения",{"type":8,"value":627,"toc":708},[628,630,637,657,661,664],[11,629,14],{"id":13},[16,631,632,633,636],{},"Hunarda — инновационная образовательная платформа, призванная изменить традиционный опыт обучения. Благодаря трём ключевым ролям — ",[26,634,635],{},"администратор, преподаватель и студент"," — она упрощает учебные процессы и развивает совместную работу.",[31,638,639,645,651],{},[34,640,641,644],{},[26,642,643],{},"Администраторы"," полностью управляют платформой: ведут учётные записи и системные настройки, обеспечивая безопасный доступ.",[34,646,647,650],{},[26,648,649],{},"Преподаватели"," создают и ведут курсы, загружают материалы и общаются со студентами через обсуждения и обратную связь.",[34,652,653,656],{},[26,654,655],{},"Студенты"," записываются на курсы, получают доступ к материалам и общаются с преподавателями и однокурсниками.",[11,658,660],{"id":659},"что-я-сделал","Что я сделал",[16,662,663],{},"Разработал админ-панель на Vue.js:",[31,665,666,672,678,684,690,696,702],{},[34,667,668,671],{},[26,669,670],{},"Дашборд и статистика"," — итоги платформы и помесячные графики доходов, продаж, курсов и студентов с фильтрами по категории, курсу и дате.",[34,673,674,677],{},[26,675,676],{},"Пользователи"," — сотрудники с ролями и студенты с баллами, фильтры по категориям и курсам, экспорт в Excel.",[34,679,680,683],{},[26,681,682],{},"Управление курсами"," — каталог категорий, курсов, архива, тегов и промокодов, тарифы.",[34,685,686,689],{},[26,687,688],{},"Финансы"," — оплаты через Click, Payme, Uzum, Paynet и наличными с фильтрами по способу, статусу, дате, курсу и промокоду.",[34,691,692,695],{},[26,693,694],{},"Чат"," — переписка преподавателей и студентов, доступная администратору.",[34,697,698,701],{},[26,699,700],{},"Контент"," — раздел «О нас» с FAQ, описанием проекта, условиями и контактами.",[34,703,704,707],{},[26,705,706],{},"UX"," — светлая и тёмная темы, мультиязычный интерфейс и пагинация в таблицах.",{"title":169,"searchDepth":170,"depth":170,"links":709},[710,711],{"id":13,"depth":170,"text":14},{"id":659,"depth":170,"text":660},"ZK (Zamonaviy Kommunikatsiyalar)","\u002Fimages\u002Fprojects\u002Fhunarda\u002Fcover.jpg","Образовательная платформа с тремя ролями — администратор, преподаватель и студент — для курсов, материалов, оплат, чата и аналитики.",[716,719,722,725,728,731,734,737],{"src":717,"alt":718,"caption":718},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fstatistics.jpg","Статистика: доходы, продажи, курсы и студенты по месяцам",{"src":720,"alt":721,"caption":721},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fdashboard.jpg","Админ-дашборд с профилем и итогами платформы",{"src":723,"alt":724,"caption":724},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fstudents.jpg","Студенты с баллами, фильтрами по курсам и экспортом в Excel (персональные данные размыты)",{"src":726,"alt":727,"caption":727},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Ffinance.jpg","Финансы: оплаты через Click, Payme, Uzum, Paynet и наличными, с промокодами",{"src":729,"alt":730,"caption":730},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fstaff.jpg","Управление сотрудниками с ролями (преподаватель, админ)",{"src":732,"alt":733,"caption":733},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fdirectory.jpg","Каталог курсов: категории, курсы, архив, теги и промокоды",{"src":735,"alt":736,"caption":736},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Flogin.jpg","Экран входа",{"src":738,"alt":739,"caption":739},"\u002Fimages\u002Fprojects\u002Fzk\u002Fpartners.jpg","ZK (Zamonaviy Kommunikatsiyalar) — партнёры: банки, телеком и госорганизации",{},{},[743,746,749],{"label":744,"value":745},"Роли","Админ · Преподаватель · Студент",{"label":747,"value":748},"Платёжных систем","5",{"label":750,"value":751},"Интерфейс","Светлая и тёмная тема",5,"\u002Fwork\u002Fhunarda","Frontend-разработчик (Vue.js)",{"title":625,"description":714},[757,758,759,760,761],"Vue.js","JavaScript","REST API","Excel export","i18n","work\u002Fhunarda","3FIFBqLWvG9uK8wxpAkcm762T8bEkuBkw0PyXHKfHb0",{"id":765,"title":766,"body":767,"company":712,"confidential":177,"cover":860,"description":861,"extension":180,"featured":594,"gallery":862,"links":884,"meta":885,"metrics":886,"navigation":177,"order":896,"path":897,"role":754,"seo":898,"stack":899,"stem":901,"year":222,"__hash__":902},"projects_ru\u002Fwork\u002Fecology-check.md","Ecology Check — национальная платформа экологических данных",{"type":8,"value":768,"toc":856},[769,771,774,815,818,820],[11,770,14],{"id":13},[16,772,773],{},"Ecology Check — проект, помогающий оценивать экологию страны. Он предлагает разные возможности для удобной работы с экологическими данными:",[31,775,776,783,790,797,803,809],{},[34,777,778,779,782],{},"Пользователи ",[26,780,781],{},"собирают данные"," о биоразнообразии, качестве воздуха и воды и землепользовании.",[34,784,785,786,789],{},"Проект ",[26,787,788],{},"анализирует"," эти данные, выявляя закономерности и тренды.",[34,791,792,793,796],{},"Данные ",[26,794,795],{},"визуализируются"," на картах, диаграммах и графиках.",[34,798,778,799,802],{},[26,800,801],{},"формируют отчёты"," с ключевыми выводами и работают совместно.",[34,804,805,808],{},[26,806,807],{},"Оповещения и уведомления"," помогают вовремя выявлять экологические проблемы.",[34,810,811,814],{},[26,812,813],{},"Интеграционный шлюз"," подключает другие источники данных для бесшовного обмена.",[16,816,817],{},"Платформа объединяет госведомства — комитет по экологии, лесное хозяйство, геологию, гидрометеорологию, сельское и водное хозяйство, здравоохранение, МЧС и экологические лаборатории — у каждого свой раздел.",[11,819,660],{"id":659},[31,821,822,828,838,844,850],{},[34,823,824,827],{},[26,825,826],{},"Разделы ведомств"," — дашборд ведомств, у каждого свои результаты, статистика и ввод данных.",[34,829,830,833,834,837],{},[26,831,832],{},"Карты"," — интерактивная карта Узбекистана и тематические карты (концентрации, водные ресурсы, флора и фауна, заповедники, состояние воздуха) с ",[26,835,836],{},"тепловой картой источников загрязнения",", анимирующей показатели во времени.",[34,839,840,843],{},[26,841,842],{},"Аналитика и статистика"," — таблицы показателей с фильтрами по датам и показателям и диаграммы по годам.",[34,845,846,849],{},[26,847,848],{},"Ввод данных"," — объекты мониторинга и лабораторные показатели по регионам для воздуха, воды и земли с экспортом в CSV.",[34,851,852,855],{},[26,853,854],{},"Справочники"," — классификаторы групп, единиц, форм собственности, типов загрязнителей, регионов и параметров, настройки и база знаний.",{"title":169,"searchDepth":170,"depth":170,"links":857},[858,859],{"id":13,"depth":170,"text":14},{"id":659,"depth":170,"text":660},"\u002Fimages\u002Fprojects\u002Fecology\u002Fcover.jpg","Платформа для оценки экологии страны: данные о качестве воздуха и воды, биоразнообразии и землепользовании от многих ведомств с анализом на картах, графиках и в отчётах.",[863,866,869,872,875,878,881],{"src":864,"alt":865,"caption":865},"\u002Fimages\u002Fprojects\u002Fecology\u002Fpollution-heatmap.jpg","Аналитика: тепловая карта источников загрязнения во времени",{"src":867,"alt":868,"caption":868},"\u002Fimages\u002Fprojects\u002Fecology\u002Fregions.jpg","Объекты и источники мониторинга по регионам: воздух, вода и земля",{"src":870,"alt":871,"caption":871},"\u002Fimages\u002Fprojects\u002Fecology\u002Fanalytics.jpg","Результаты показателей с фильтрами по датам и графиками",{"src":873,"alt":874,"caption":874},"\u002Fimages\u002Fprojects\u002Fecology\u002Fmap.jpg","Интерактивная карта Узбекистана",{"src":876,"alt":877,"caption":877},"\u002Fimages\u002Fprojects\u002Fecology\u002Fagencies.jpg","Разделы для каждого госведомства",{"src":879,"alt":880,"caption":880},"\u002Fimages\u002Fprojects\u002Fecology\u002Fclassifiers.jpg","Классификаторы: группы, единицы и типы загрязнителей",{"src":882,"alt":883,"caption":883},"\u002Fimages\u002Fprojects\u002Fzk\u002Fnumbers.jpg","ZK в цифрах: 100+ проектов, 10+ лет, 20+ разработчиков",{},{},[887,890,893],{"label":888,"value":889},"Области данных","Воздух · Вода · Земля · Биоразнообразие",{"label":891,"value":892},"Подключённых ведомств","10+",{"label":894,"value":895},"Регионов","14",6,"\u002Fwork\u002Fecology-check",{"title":766,"description":861},[757,758,393,900,759],"Charts","work\u002Fecology-check","AwtiYWt945ChBCirkq5ReEZT5o0zum_6p7fWqb_pUjk",{"id":904,"title":905,"body":906,"company":968,"confidential":177,"cover":969,"description":970,"extension":180,"featured":594,"gallery":971,"links":989,"meta":990,"metrics":991,"navigation":177,"order":998,"path":999,"role":754,"seo":1000,"stack":1001,"stem":1008,"year":1009,"__hash__":1010},"projects_ru\u002Fwork\u002Finvan.md","Invan — автоматизация торговли для tiin",{"type":8,"value":907,"toc":962},[908,910,920,922,948,952,955,959],[11,909,536],{"id":535},[16,911,912,915,916,919],{},[26,913,914],{},"tiin"," — сеть магазинов в Ташкенте. Её собственный IT-отдел создал ",[26,917,918],{},"Invan"," — платформу автоматизации торговли, которая работает в магазинах tiin и продаётся другим компаниям: касса (POS), складские остатки, база клиентов и поставщиков, чеки и этикетки, интеграции с Payme, Uzum, виртуальной кассой OFD.uz и маркировкой. По данным invan.uz, ею пользуются более 100 компаний.",[11,921,550],{"id":549},[31,923,924,930,942],{},[34,925,926,929],{},[26,927,928],{},"Админ-панель"," — модули большого back-office приложения, с которым менеджеры магазинов работают каждый день: заказы, товары, складские остатки, клиенты, аналитические графики, уведомления и настройки, а также экспорт отчётов в Excel.",[34,931,932,935,936,941],{},[26,933,934],{},"Лендинги"," — публичный сайт ",[540,937,940],{"href":938,"rel":939},"https:\u002F\u002Finvan.uz\u002F",[544],"invan.uz",": первый экран, POS-оборудование, интеграции, блог, тарифы и контакты, полностью адаптивный.",[34,943,944,947],{},[26,945,946],{},"Поддержка"," — исправление ошибок в production-проектах и новые модули по запросу бизнеса.",[11,949,951],{"id":950},"стек","Стек",[16,953,954],{},"Vue.js, Vuex, Vue Router, Axios, Bootstrap-Vue, Chart.js, Sass.",[11,956,958],{"id":957},"чему-я-научился","Чему я научился",[16,960,961],{},"Разработка для бизнеса, который сам пользуется продуктом в своих магазинах, даёт очень короткую обратную связь — кассиры и менеджеры сообщают о проблемах в тот же день, поэтому надёжность и простой интерфейс важнее всего.",{"title":169,"searchDepth":170,"depth":170,"links":963},[964,965,966,967],{"id":535,"depth":170,"text":536},{"id":549,"depth":170,"text":550},{"id":950,"depth":170,"text":951},{"id":957,"depth":170,"text":958},"Invan · IT-отдел tiin","\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-hero.jpg","Админ-панели и лендинги для Invan — платформы автоматизации торговли, созданной IT-отделом ташкентской сети магазинов tiin.",[972,974,977,980,983,986],{"src":969,"alt":973,"caption":973},"Лендинг invan.uz: первый экран",{"src":975,"alt":976,"caption":976},"\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-pos.jpg","Раздел POS-оборудования: моноблок, денежный ящик, принтер и сканер",{"src":978,"alt":979,"caption":979},"\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-integrations.jpg","Интеграции: Payme, Uzum, OFD.uz и Markirovka",{"src":981,"alt":982,"caption":982},"\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-pricing.jpg","Тарифы — админ-панель входит в каждый тариф",{"src":984,"alt":985,"caption":985,"portrait":177},"\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-mobile.jpg","Адаптивный лендинг на мобильном",{"src":987,"alt":988,"caption":988,"portrait":177},"\u002Fimages\u002Fprojects\u002Finvan\u002Ftiin-store.jpg","Магазин tiin в Ташкенте — Invan был IT-отделом сети",{"live":938},{},[992,995],{"label":993,"value":994},"Компаний на платформе","100+",{"label":996,"value":997},"Продукты","Админ-панель · Лендинг",7,"\u002Fwork\u002Finvan",{"title":905,"description":970},[757,1002,1003,1004,1005,1006,1007],"Vuex","Vue Router","Axios","Bootstrap-Vue","Chart.js","Sass","work\u002Finvan",2022,"UHfDkKhYZAFbY5gyr7N44FtbZi85ZHpHp9RJ1CEB1cI",{"id":1012,"title":1013,"body":1014,"company":1071,"confidential":177,"cover":1072,"description":1073,"extension":180,"featured":594,"gallery":1074,"links":1092,"meta":1094,"metrics":1095,"navigation":177,"order":1100,"path":1101,"role":1102,"seo":1103,"stack":1104,"stem":1108,"year":1109,"__hash__":1110},"projects_ru\u002Fwork\u002Fquramiz.md","Quramiz — маркетплейс стройматериалов",{"type":8,"value":1015,"toc":1065},[1016,1018,1024,1026,1029,1055,1057,1060,1062],[11,1017,14],{"id":13},[16,1019,1020,1023],{},[26,1021,1022],{},"Quramiz.uz"," — маркетплейс банка SQB для строительства и ремонта в Узбекистане: стройматериалы, инструменты, электрика, сантехника, отделка и многое другое, с доставкой по Ташкенту и регионам и возможностью покупки в кредит. Работает вместе с мобильным приложением для iOS и Android.",[11,1025,22],{"id":21},[16,1027,1028],{},"Вместе с коллегой сделал пользовательский интерфейс веб-магазина и вывел его в продакшн — это был мой первый боевой проект, стажёром в команде SQB.",[31,1030,1031,1037,1043,1049],{},[34,1032,1033,1036],{},[26,1034,1035],{},"Каталог и навигация"," — мега-меню категорий, страницы категорий с фильтрами по цене и бренду и сортировкой, страницы брендов и поиск.",[34,1038,1039,1042],{},[26,1040,1041],{},"Карточка товара"," — карточки с остатками и ценой за единицу, страница товара с описанием, характеристиками, отзывами и предложениями разных поставщиков, избранное и корзина.",[34,1044,1045,1048],{},[26,1046,1047],{},"Главная"," — промо-баннеры, карусели «сезон», «новинки» и «может понадобиться», бренды и блок мобильного приложения.",[34,1050,1051,1054],{},[26,1052,1053],{},"Адаптивный UI"," — отдельная мобильная версия с нижней навигацией.",[11,1056,951],{"id":950},[16,1058,1059],{},"Vue 2, Vuex, Vue Router, Axios и Yandex Maps поверх бэкенда на Laravel.",[11,1061,958],{"id":957},[16,1063,1064],{},"Реальный e-commerce научил мыслить компонентами — одна карточка товара работает в каруселях, сетке категорий и поиске — и показал, как важны покупателю мелочи вроде остатков, единиц измерения и цен.",{"title":169,"searchDepth":170,"depth":170,"links":1066},[1067,1068,1069,1070],{"id":13,"depth":170,"text":14},{"id":21,"depth":170,"text":22},{"id":950,"depth":170,"text":951},{"id":957,"depth":170,"text":958},"SQB банк","\u002Fimages\u002Fprojects\u002Fquramiz\u002Fhome-hero.jpg","Первый маркетплейс строительных и ремонтных материалов в Узбекистане от банка SQB — каталог, поиск, фильтры, корзина и предложения поставщиков.",[1075,1077,1080,1083,1086,1089],{"src":1072,"alt":1076,"caption":1076},"Главная: меню каталога, промо-баннер и преимущества доставки, оплаты и кредита",{"src":1078,"alt":1079,"caption":1079},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fhome-products.jpg","Карусели товаров и блок мобильного приложения",{"src":1081,"alt":1082,"caption":1082},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fcategory.jpg","Страница категории с фильтрами по цене и бренду",{"src":1084,"alt":1085,"caption":1085},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fproduct.jpg","Карточка товара: описание, характеристики, отзывы и предложения поставщиков",{"src":1087,"alt":1088,"caption":1088},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fhome-catalog-brands.jpg","Вкладки категорий, бренды и полный каталог",{"src":1090,"alt":1091,"caption":1091,"portrait":177},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fmobile.jpg","Мобильная версия с нижней навигацией",{"live":1093},"https:\u002F\u002Fquramiz.uz\u002F",{},[1096,1099],{"label":1097,"value":1098},"Команда","2 frontend-разработчика",{"label":607,"value":608},8,"\u002Fwork\u002Fquramiz","Frontend-разработчик (UI), вместе с коллегой",{"title":1013,"description":1073},[1105,1002,1003,1004,1106,1107],"Vue 2","Yandex Maps","Laravel","work\u002Fquramiz",2021,"8m6HzQVrdfhXkM_BShIJkEy9gdRvlROCxL1RFi3uVtY",{"id":1112,"title":1113,"body":1114,"company":593,"confidential":594,"cover":1167,"description":1168,"extension":180,"featured":594,"gallery":1169,"links":1170,"meta":1172,"metrics":1173,"navigation":177,"order":1174,"path":1175,"role":1176,"seo":1177,"stack":1178,"stem":1182,"year":222,"__hash__":1183},"projects_ru\u002Fwork\u002Fcustomer-platform.md","Customer Management Platform",{"type":8,"value":1115,"toc":1162},[1116,1120,1123,1125,1157,1159],[11,1117,1119],{"id":1118},"задача","Задача",[16,1121,1122],{},"Бизнесу — например, банкам и ритейлу — нужна единая админка для клиентов, расписаний и аналитики с разными правами для разных сотрудников.",[11,1124,660],{"id":659},[31,1126,1127,1133,1139,1145,1151],{},[34,1128,1129,1132],{},[26,1130,1131],{},"Модульная архитектура"," — каждый домен живёт в своём модуле со своими маршрутами и подключается к роутеру приложения.",[34,1134,1135,1138],{},[26,1136,1137],{},"Аутентификация и права"," — JWT-сервис авторизации и ролевая модель доступа на CASL.",[34,1140,1141,1144],{},[26,1142,1143],{},"Богатый UI"," — таблицы с пагинацией, календари (FullCalendar), графики (ApexCharts, ECharts), карты (Leaflet), редактор текста и формы с валидацией (Vuelidate).",[34,1146,1147,1150],{},[26,1148,1149],{},"Layout’ы"," — вертикальная и горизонтальная навигация, сворачиваемый сайдбар, светлая\u002Fтёмная тема и i18n.",[34,1152,1153,1156],{},[26,1154,1155],{},"Качество"," — TypeScript, Pinia-сторы с тестами (Vitest, Pinia testing), строгие правила ESLint.",[11,1158,951],{"id":950},[16,1160,1161],{},"Vue 3 (Composition API), TypeScript, Pinia, Vite, PrimeVue, Tailwind CSS.",{"title":169,"searchDepth":170,"depth":170,"links":1163},[1164,1165,1166],{"id":1118,"depth":170,"text":1119},{"id":659,"depth":170,"text":660},{"id":950,"depth":170,"text":951},"\u002Fimages\u002Fprojects\u002Fcustomer-platform.jpg","Модульная админ-платформа для управления клиентами — ролевой доступ, календари, графики, карты и мультиязычный интерфейс на Vue 3 и TypeScript.",[],{"source":1171},"https:\u002F\u002Fgithub.com\u002Fyusufdeveloper2903\u002FCustomer-Management-Platform",{},[],9,"\u002Fwork\u002Fcustomer-platform","Frontend-разработка",{"title":1113,"description":1168},[392,209,211,1179,1180,395,1181,393,219],"CASL","PrimeVue","ECharts","work\u002Fcustomer-platform","HQh8w_L2gfmzYpkmXgO4WEJg9cy2gXXO1kNyE82juRw",{"id":1185,"title":1186,"body":1187,"company":593,"confidential":594,"cover":1242,"description":1243,"extension":180,"featured":594,"gallery":1244,"links":1245,"meta":1247,"metrics":1248,"navigation":177,"order":1249,"path":1250,"role":1251,"seo":1252,"stack":1253,"stem":1257,"year":526,"__hash__":1258},"projects_ru\u002Fwork\u002Ftasker.md","Tasker — работа с GitHub issues",{"type":8,"value":1188,"toc":1237},[1189,1191,1194,1196,1222,1224],[11,1190,1119],{"id":1118},[16,1192,1193],{},"Контрибьютинг в крупный open-source проект — это десятки задач одновременно: новые «Help Wanted», упоминания, назначения и работа в процессе. Одних уведомлений GitHub недостаточно для ясной картины.",[11,1195,660],{"id":659},[31,1197,1198,1204,1210,1216],{},[34,1199,1200,1203],{},[26,1201,1202],{},"Дорожки задач"," — вкладки Help Wanted, Mentioned, To-do, Assigned, In Progress и Complete, у каждой свой запрос к GitHub.",[34,1205,1206,1209],{},[26,1207,1208],{},"Личный слой"," — приватные заметки и статусы для каждой задачи, хранятся в Supabase и синхронизируются между устройствами.",[34,1211,1212,1215],{},[26,1213,1214],{},"Сигналы"," — отметки о непрочитанном, отслеживание уведомлений и упоминаний, чтобы ничего не упустить.",[34,1217,1218,1221],{},[26,1219,1220],{},"Профиль и тема"," — настройка GitHub username и светлая\u002Fтёмная тема.",[11,1223,38],{"id":85},[16,1225,1226,1227,432,1230,432,1233,1236],{},"Feature-based структура на React (",[41,1228,1229],{},"features\u002Fissues",[41,1231,1232],{},"features\u002Fprofile",[41,1234,1235],{},"features\u002Ftheme","), где каждая задача по данным — отдельный хук; новые дорожки добавляются без изменения существующих.",{"title":169,"searchDepth":170,"depth":170,"links":1238},[1239,1240,1241],{"id":1118,"depth":170,"text":1119},{"id":659,"depth":170,"text":660},{"id":85,"depth":170,"text":38},"\u002Fimages\u002Fprojects\u002Ftasker.jpg","Дашборд, превращающий загруженную очередь open-source задач в личный workflow — help wanted, упоминания, назначенные и задачи в работе с заметками и статусами.",[],{"live":1246},"https:\u002F\u002Ftodo-tasker-one.vercel.app",{},[],10,"\u002Fwork\u002Ftasker","Дизайн и разработка",{"title":1186,"description":1243},[1254,210,1255,1256],"React","Supabase","GitHub API","work\u002Ftasker","4sZ9qbNwdrItQOUWmRpVQPvmYazC2mRWGNzDUehmfks",{"id":1260,"title":1261,"body":1262,"company":593,"confidential":594,"cover":1378,"description":1379,"extension":180,"featured":594,"gallery":1380,"links":1381,"meta":1383,"metrics":1384,"navigation":177,"order":1385,"path":1386,"role":1251,"seo":1387,"stack":1388,"stem":1392,"year":526,"__hash__":1393},"projects_ru\u002Fwork\u002Fportfolio.md","Портфолио-платформа",{"type":8,"value":1263,"toc":1372},[1264,1266,1269,1273,1324,1326,1361,1365,1368],[11,1265,1119],{"id":1118},[16,1267,1268],{},"Предыдущее портфолио было одной страницей на Vue 2: контент зашит в шаблоны, нет SEO, нет возможности подробно описать реальные проекты, а сборка перестала работать на современном Node.",[11,1270,1272],{"id":1271},"подход","Подход",[31,1274,1275,1281,1287,1293,1303,1308,1314],{},[34,1276,1277,1280],{},[26,1278,1279],{},"Статическая генерация на Nuxt 4"," — каждая страница на трёх языках заранее рендерится в HTML, поэтому открывается мгновенно и полностью индексируется.",[34,1282,1283,1286],{},[26,1284,1285],{},"Контент как данные"," — проекты и опыт хранятся в Markdown\u002FYAML и валидируются Zod-схемами в Nuxt Content. Новый кейс не требует правок компонентов.",[34,1288,1289,1292],{},[26,1290,1291],{},"Честные кейсы"," — коммерческие проекты помечены как закрытые с пояснением, что код закрыт по регламенту компании, а на скриншотах персональные данные размыты.",[34,1294,1295,1298,1299,1302],{},[26,1296,1297],{},"Три языка"," — английский, узбекский и русский: маршруты с префиксом языка, теги ",[41,1300,1301],{},"hreflang"," и английский фолбэк для непереведённых материалов.",[34,1304,1305,1307],{},[26,1306,72],{}," — семантические цветовые токены поверх Tailwind CSS v4, автоматическая светлая\u002Fтёмная тема и анимации с учётом reduced-motion.",[34,1309,1310,1313],{},[26,1311,1312],{},"Связь, которая всегда работает"," — короткая форма, которая готовит письмо в Gmail или почтовом приложении, плюс телефон и копирование email.",[34,1315,1316,1319,1320,1323],{},[26,1317,1318],{},"Клавиатура прежде всего"," — меню команд ",[41,1321,1322],{},"⌘K"," для перехода к любой странице, проекту или действию.",[11,1325,38],{"id":85},[1327,1328,1332],"pre",{"className":1329,"code":1330,"language":1331,"meta":169,"style":169},"language-txt shiki shiki-themes github-light github-dark","content\u002F\u003Clocale>\u002F{projects,experience}   →  типизированные коллекции\napp\u002Fcomposables\u002FuseLocalizedContent.ts   →  запросы с языковым фолбэком\napp\u002Fpages\u002F*                              →  загрузка данных, сборка секций\napp\u002Fcomponents\u002F{home,project,site,ui}    →  презентационные компоненты\nserver\u002Froutes\u002F{sitemap.xml,robots.txt}   →  пре-рендер SEO-файлов\n","txt",[41,1333,1334,1341,1346,1351,1356],{"__ignoreMap":169},[1335,1336,1338],"span",{"class":1337,"line":203},"line",[1335,1339,1340],{},"content\u002F\u003Clocale>\u002F{projects,experience}   →  типизированные коллекции\n",[1335,1342,1343],{"class":1337,"line":170},[1335,1344,1345],{},"app\u002Fcomposables\u002FuseLocalizedContent.ts   →  запросы с языковым фолбэком\n",[1335,1347,1348],{"class":1337,"line":514},[1335,1349,1350],{},"app\u002Fpages\u002F*                              →  загрузка данных, сборка секций\n",[1335,1352,1353],{"class":1337,"line":612},[1335,1354,1355],{},"app\u002Fcomponents\u002F{home,project,site,ui}    →  презентационные компоненты\n",[1335,1357,1358],{"class":1337,"line":752},[1335,1359,1360],{},"server\u002Froutes\u002F{sitemap.xml,robots.txt}   →  пре-рендер SEO-файлов\n",[11,1362,1364],{"id":1363},"результат","Результат",[16,1366,1367],{},"Быстрый, доступный сайт, который легко поддерживать: новый проект — это один Markdown-файл на каждый язык.",[1369,1370,1371],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":170,"depth":170,"links":1373},[1374,1375,1376,1377],{"id":1118,"depth":170,"text":1119},{"id":1271,"depth":170,"text":1272},{"id":85,"depth":170,"text":38},{"id":1363,"depth":170,"text":1364},"\u002Fimages\u002Fprojects\u002Fportfolio.jpg","Многоязычное статически генерируемое портфолио с подробными кейсами, галереями скриншотов, формой связи и меню команд ⌘K — сделано как небольшой продукт, а не лендинг.",[],{"source":1382},"https:\u002F\u002Fgithub.com\u002Fyusufdeveloper2903\u002Fmyportfolio",{},[],11,"\u002Fwork\u002Fportfolio",{"title":1261,"description":1379},[1389,209,1390,1391,761,219],"Nuxt 4","Nuxt Content","Tailwind CSS v4","work\u002Fportfolio","RIkELa5kJ01zzlQHpLZ_JOz0BLnT6GQ3ROx2SdjHp6g",{"id":1395,"title":1396,"body":1397,"company":593,"confidential":594,"cover":1427,"description":1428,"extension":180,"featured":594,"gallery":1429,"links":1430,"meta":1432,"metrics":1433,"navigation":177,"order":1434,"path":1435,"role":1176,"seo":1436,"stack":1437,"stem":1438,"year":1009,"__hash__":1439},"projects_ru\u002Fwork\u002Ffendos.md","Fendos",{"type":8,"value":1398,"toc":1422},[1399,1401,1404,1406,1417,1419],[11,1400,1119],{"id":1118},[16,1402,1403],{},"Настоящим киноманам мало просто посмотреть фильм. Они хотят знать всё — актёрский состав,\nвдохновение за сюжетом и свежие новости.",[11,1405,660],{"id":659},[31,1407,1408,1411,1414],{},[34,1409,1410],{},"Каталог фильмов с постерами, рейтингами и датами выхода.",[34,1412,1413],{},"Детальные страницы с информацией об актёрах и сюжете.",[34,1415,1416],{},"Адаптивную вёрстку — от маленьких телефонов до широких экранов.",[11,1418,958],{"id":957},[16,1420,1421],{},"Работа со сторонним API научила продумывать состояния загрузки и ошибок и отделять получение\nданных от отображения.",{"title":169,"searchDepth":170,"depth":170,"links":1423},[1424,1425,1426],{"id":1118,"depth":170,"text":1119},{"id":659,"depth":170,"text":660},{"id":957,"depth":170,"text":958},"\u002Fimages\u002Fprojects\u002Ffendos.jpg","Сайт для поиска фильмов, где киноманы могут изучать фильмы, актёрский состав и истории создания любимых картин.",[],{"live":1431},"https:\u002F\u002Fnetfmovies.netlify.app",{},[],12,"\u002Fwork\u002Ffendos",{"title":1396,"description":1428},[757,758,1007,759],"work\u002Ffendos","I_ZOvhdrQUqftm3QcbLIm814bUHRs7PjleuUJPcdaa4",{"id":1441,"title":1442,"body":1443,"company":593,"confidential":594,"cover":1473,"description":1474,"extension":180,"featured":594,"gallery":1475,"links":1476,"meta":1479,"metrics":1480,"navigation":177,"order":1481,"path":1482,"role":1176,"seo":1483,"stack":1484,"stem":1485,"year":1009,"__hash__":1486},"projects_ru\u002Fwork\u002Fmanual.md","Manual",{"type":8,"value":1444,"toc":1468},[1445,1447,1450,1452,1463,1465],[11,1446,1119],{"id":1118},[16,1448,1449],{},"Медицинскую информацию в интернете сложно читать и сложно ей доверять. Цель — спокойный и ясный\nинтерфейс, который делает сложную информацию доступной.",[11,1451,660],{"id":659},[31,1453,1454,1457,1460],{},[34,1455,1456],{},"Контентную вёрстку с сильной типографикой и чёткой иерархией.",[34,1458,1459],{},"Переиспользуемые секции для методов лечения, статей и призывов к действию.",[34,1461,1462],{},"Полностью адаптивный дизайн.",[11,1464,958],{"id":957},[16,1466,1467],{},"Читаемость — это функция: отступы, длина строки и контраст важны не меньше функциональности.",{"title":169,"searchDepth":170,"depth":170,"links":1469},[1470,1471,1472],{"id":1118,"depth":170,"text":1119},{"id":659,"depth":170,"text":660},{"id":957,"depth":170,"text":958},"\u002Fimages\u002Fprojects\u002Fmanual.jpg","Сайт с независимой и актуальной информацией о лекарствах в понятном формате для пациентов и специалистов.",[],{"live":1477,"source":1478},"https:\u002F\u002Fthemanual.netlify.app","https:\u002F\u002Fgithub.com\u002Fyusufdeveloper2903\u002Fmanual",{},[],13,"\u002Fwork\u002Fmanual",{"title":1442,"description":1474},[757,758,1007],"work\u002Fmanual","0q4kEaAKZ8h77iqCoqFbycKJAP7KLx6sqtx7UEKPPLE",{"id":1488,"title":1489,"body":1490,"company":593,"confidential":594,"cover":1514,"description":1515,"extension":180,"featured":594,"gallery":1516,"links":1517,"meta":1519,"metrics":1520,"navigation":177,"order":1521,"path":1522,"role":1176,"seo":1523,"stack":1524,"stem":1526,"year":1009,"__hash__":1527},"projects_ru\u002Fwork\u002Fpower-yoga.md","Power Yoga",{"type":8,"value":1491,"toc":1510},[1492,1494,1497,1499],[11,1493,1119],{"id":1118},[16,1495,1496],{},"Power Yoga предлагает много курсов — для спины, кора, утренней практики и другие. Посетителям\nнужно быстро понять предложение и выбрать подходящее занятие.",[11,1498,660],{"id":659},[31,1500,1501,1504,1507],{},[34,1502,1503],{},"Лендинг с курсами, сгруппированными по темам.",[34,1505,1506],{},"Понятное расписание и призывы к действию для регулярных и разовых занятий.",[34,1508,1509],{},"Адаптивную и лёгкую вёрстку.",{"title":169,"searchDepth":170,"depth":170,"links":1511},[1512,1513],{"id":1118,"depth":170,"text":1119},{"id":659,"depth":170,"text":660},"\u002Fimages\u002Fprojects\u002Fpower-yoga.jpg","Сайт онлайн-сервиса йоги с тематическими курсами в формате регулярных занятий или разовых сессий.",[],{"live":1518},"https:\u002F\u002Fyoga11.netlify.app",{},[],14,"\u002Fwork\u002Fpower-yoga",{"title":1489,"description":1515},[1525,1007,758],"HTML","work\u002Fpower-yoga","QVtQFSRc2FUjlN1teieKz7jAJlF9OYbhCfCeAojRarY",{"id":1529,"title":1530,"body":1531,"company":593,"confidential":594,"cover":1555,"description":1556,"extension":180,"featured":594,"gallery":1557,"links":1558,"meta":1560,"metrics":1561,"navigation":177,"order":1562,"path":1563,"role":1176,"seo":1564,"stack":1565,"stem":1566,"year":1009,"__hash__":1567},"projects_ru\u002Fwork\u002Fonline-shop.md","Online Shop",{"type":8,"value":1532,"toc":1551},[1533,1535,1538,1540],[11,1534,1119],{"id":1118},[16,1536,1537],{},"Магазину с частыми поступлениями нужна витрина, где покупатели быстро просматривают коллекции\nна любом устройстве.",[11,1539,660],{"id":659},[31,1541,1542,1545,1548],{},[34,1543,1544],{},"Страницы списка товаров и коллекций.",[34,1546,1547],{},"Переиспользуемые карточки товаров и layout-компоненты.",[34,1549,1550],{},"Адаптивный дизайн, оптимизированный для мобильных покупателей.",{"title":169,"searchDepth":170,"depth":170,"links":1552},[1553,1554],{"id":1118,"depth":170,"text":1119},{"id":659,"depth":170,"text":660},"\u002Fimages\u002Fprojects\u002Fonline-shop.jpg","Интернет-магазин модной одежды со списками товаров и страницами коллекций.",[],{"live":1559},"https:\u002F\u002Fshops-online.netlify.app\u002F",{},[],15,"\u002Fwork\u002Fonline-shop",{"title":1530,"description":1556},[757,758,1007],"work\u002Fonline-shop","cTiGCFv1NTifzaNU7tpYBUCKOLZitYY-m7_9ZfT05kU",{"id":1395,"title":1396,"body":1569,"company":593,"confidential":594,"cover":1427,"description":1428,"extension":180,"featured":594,"gallery":1594,"links":1595,"meta":1596,"metrics":1597,"navigation":177,"order":1434,"path":1435,"role":1176,"seo":1598,"stack":1599,"stem":1438,"year":1009,"__hash__":1439},{"type":8,"value":1570,"toc":1589},[1571,1573,1575,1577,1585,1587],[11,1572,1119],{"id":1118},[16,1574,1403],{},[11,1576,660],{"id":659},[31,1578,1579,1581,1583],{},[34,1580,1410],{},[34,1582,1413],{},[34,1584,1416],{},[11,1586,958],{"id":957},[16,1588,1421],{},{"title":169,"searchDepth":170,"depth":170,"links":1590},[1591,1592,1593],{"id":1118,"depth":170,"text":1119},{"id":659,"depth":170,"text":660},{"id":957,"depth":170,"text":958},[],{"live":1431},{},[],{"title":1396,"description":1428},[757,758,1007,759],1791207294127]