PageSourceSearch

https://dntz.xyz/_nuxt/CyqXkK5G.js

js dntz.xyz collected 2026-10-07 15:40:04 UTC 53,676 bytes, 1 lines download raw bytes

1import{e as H,r as x,f as X,c as o,o as t,a,g as B,n as Y,h as d,i as E,j as h,w as u,t as n,k as O,d as i,u as le,l as se,m as ne,p as ae,q as ie,b as r,F as y,s as v,v as V,x as z}from"./BGFXF08U.js";import{_ as R}from"./DBhVYmt5.js";import{_ as L,a as I}from"./C4Nt-CAX.js";import{_}from"./TaGkMdSL.js";import{_ as J}from"./hwcbV3gs.js";const re={key:0,class:"absolute bottom-0 left-0 h-12 bg-gradient-to-b from-transparent to-(--background-global) w-full"},D=H({__name:"Spoiler",props:{height:{default:200},alwaysOpened:{type:Boolean},full:{type:Boolean},double:{type:Boolean},none:{type:Boolean},collapsedLabel:{},expandedLabel:{}},emits:["toggle"],setup(C,{expose:S,emit:w}){const c=C,P=w,b=x(),g=x(!1),N=x(`${c.height}px`),A=j=>{c.alwaysOpened||g.value!==j&&(g.value=j,P("toggle",g.value))},T=()=>{A(!g.value)},W=()=>{A(!0)},U=()=>{A(!1)};return X(()=>[c.height,c.alwaysOpened,g.value,b?.value?.scrollHeight],()=>{c.alwaysOpened&&(g.value=!1),N.value=c.alwaysOpened?"auto":g?.value?b?.value?.scrollHeight+"px":c.height+"px"}),S({opened:g,open:W,close:U}),(j,M)=>(t(),o("div",null,[a("div",{class:d(["overflow-hidden relative",{"cursor-pointer":c.full&&!g.value&&!c.alwaysOpened,"!max-h-max":c.alwaysOpened}]),style:Y({transition:".2s",maxHeight:N.value}),ref_key:"container",ref:b,onClick:M[0]||(M[0]=()=>{c.full&&!g.value&&!c.alwaysOpened&&T()})},[E(j.$slots,"default",{opened:g.value||c.alwaysOpened}),!g.value&&!c.alwaysOpened?(t(),o("div",re)):h("",!0)],6),c.alwaysOpened?(t(),B(R,{key:1,double:c.double,none:c.none},null,8,["double","none"])):(t(),B(R,{key:0,double:c.double,none:c.none},{default:u(()=>[a("button",{onClick:T,class:"outline-0 text-gray-500 cursor-pointer"}," [ "+n(g.value?c.expandedLabel??"Свернуть":c.collapsedLabel??"Развернуть")+" ] ",1)]),_:1},8,["double","none"]))]))}}),ue=[{key:"lang",label:"Languages"},{key:"syntax",label:"Syntax & Preprocessors"},{key:"framework",label:"Frameworks"},{key:"platform",label:"Platforms"},{key:"ui",label:"UI Libraries"},{key:"graphic",label:"Graphic Libraries"},{key:"build",label:"Build Tools"},{key:"testing",label:"Testing"},{key:"state",label:"State Management"},{key:"validation",label:"Validation"},{key:"util",label:"Utils"},{key:"map",label:"Map & GIS"},{key:"cms",label:"CMS"},{key:"crm",label:"CRM"},{key:"billing",label:"Billing Systems"}],ee=[{key:"js",label:"JavaScript",link:"https://developer.mozilla.org/docs/Web/JavaScript",category:"lang",notion:""},{key:"ts",label:"TypeScript",link:"https://www.typescriptlang.org/",category:"lang",notion:""},{key:"php",label:"PHP",link:"https://www.php.net/",category:"lang",notion:""},{key:"java",label:"Java",link:"https://www.java.com/",category:"lang",notion:"Плагины Spigot, расширения под WebView"},{key:"sql",label:"SQL",link:"https://en.wikipedia.org/wiki/SQL",category:"lang",notion:""},{key:"graphql",label:"GraphQL",link:"https://graphql.org/",category:"lang",notion:""},{key:"html",label:"HTML5",link:"https://developer.mozilla.org/docs/Web/HTML",category:"syntax",notion:""},{key:"css",label:"CSS3",category:"syntax",link:"https://developer.mozilla.org/docs/Web/CSS",notion:""},{key:"scss",label:"SCSS",category:"syntax",link:"https://sass-lang.com/",notion:""},{key:"sass",label:"SASS",category:"syntax",link:"https://sass-lang.com/documentation/syntax#the-indented-syntax",notion:""},{key:"less",label:"Less",category:"syntax",link:"https://lesscss.org/",notion:""},{key:"postcss",label:"PostCSS",category:"syntax",link:"https://postcss.org/",notion:""},{key:"jsx",label:"JSX",category:"syntax",link:"https://react.dev/docs/introducing-jsx",notion:""},{key:"tsx",label:"TSX",category:"syntax",link:"https://www.typescriptlang.org/docs/handbook/jsx.html",notion:""},{key:"sfc",label:"Vue SFC",category:"syntax",link:"https://vuejs.org/guide/scaling-up/sfc.html",notion:""},{key:"jss",label:"JSS (CSS-in-JS)",category:"syntax",link:"https://cssinjs.org/",notion:""},{key:"emotion",label:"Emotion",category:"syntax",link:"https://emotion.sh/docs/introduction",notion:""},{key:"jinja2",label:"Jinja2",link:"https://jinja.palletsprojects.com/",category:"syntax",notion:""},{key:"nunjucks",label:"Nunjucks",link:"https://mozilla.github.io/nunjucks/",category:"syntax",notion:""},{key:"modules",label:"CommonJS / ESM / UMD",link:"https://nodejs.org/",category:"syntax",notion:"Создание библиотек, плагинов и CLI"},{key:"md",label:"Markdown",category:"syntax",link:"https://www.markdownguide.org/",notion:""},{key:"mdx",label:"MDX",category:"syntax",link:"https://mdxjs.com/",notion:""},{key:"vue2",label:"Vue 2",link:"https://v2.vuejs.org/",category:"framework",notion:""},{key:"vue3",label:"Vue 3",link:"https://vuejs.org/",category:"framework",notion:"Основной фреймворк"},{key:"react",label:"React",link:"https://react.dev/",category:"framework",notion:"Middle уровень"},{key:"nuxt2",label:"Nuxt 2",link:"https://v2.nuxt.com/",category:"framework",notion:""},{key:"nuxt3",label:"Nuxt 3",link:"https://nuxt.com/",category:"framework",notion:""},{key:"quasar",label:"Quasar",link:"https://quasar.dev/",category:"framework",notion:""},{key:"nest",label:"NestJS",link:"https://nestjs.com/",category:"framework",notion:""},{key:"strapi",label:"Strapi",link:"https://strapi.io/",category:"framework",notion:""},{key:"tres",label:"Tres.js",link:"https://tresjs.org/",category:"framework",notion:""},{key:"lite-ssr",label:"LiteSSR",link:"https://lssr.dntz.xyz/",category:"framework",notion:"Разработал собственную SSR-библиотеку"},{key:"cordova",label:"Apache Cordova",link:"https://cordova.apache.org/",category:"platform",notion:""},{key:"express",label:"Express.js",link:"https://expressjs.com/",category:"platform",notion:""},{key:"nwjs",label:"NW.js",link:"https://nwjs.io/",category:"platform",notion:""},{key:"electron",label:"Electron",link:"https://www.electronjs.org/",category:"platform",notion:""},{key:"primevue",label:"PrimeVue",link:"https://www.primefaces.org/primevue/",category:"ui",notion:""},{key:"vuetify",label:"Vuetify",link:"https://vuetifyjs.com/",category:"ui",notion:""},{key:"antdv",label:"Ant Design Vue",link:"https://antdv.com/",category:"ui",notion:""},{key:"mui",label:"Material UI",link:"https://mui.com/",category:"ui",notion:""},{key:"bootstrap",label:"Bootstrap",link:"https://getbootstrap.com/",category:"ui",notion:""},{key:"daisy",label:"DaisyUI",link:"https://daisyui.com/",category:"ui",notion:""},{key:"headlessui",label:"Headless UI",link:"https://headlessui.com/",category:"ui",notion:""},{key:"tailwind",label:"Tailwind CSS",link:"https://tailwindcss.com/",category:"ui",notion:""},{key:"react-blessed",label:"React Blessed",link:"https://github.com/Yomguithereal/react-blessed",category:"ui",notion:""},{key:"fa",label:"FontAwesome",link:"https://fontawesome.com/",category:"ui",notion:""},{key:"mdi",label:"Material Design Icons",link:"https://materialdesignicons.com/",category:"ui",notion:""},{key:"three",label:"Three.js",link:"https://threejs.org/",category:"framework",notion:""},{key:"chartjs",label:"ChartJS",link:"https://chartjs.org/",category:"graphic",notion:""},{key:"echarts",label:"Apache Echarts",link:"https://echarts.apache.org/",category:"graphic",notion:""},{key:"konva",label:"Konva.js",link:"https://konvajs.org/",category:"graphic",notion:""},{key:"canvas",label:"Canvas API",link:"https://developer.mozilla.org/docs/Web/API/Canvas_API",category:"graphic",notion:""},{key:"codemirror",label:"CodeMirror",link:"https://codemirror.net/",category:"graphic",notion:""},{key:"tiptap",label:"TipTap",link:"https://tiptap.dev/",category:"graphic",notion:""},{key:"vite",label:"Vite",link:"https://vitejs.dev/",category:"build",notion:""},{key:"webpack",label:"Webpack",link:"https://webpack.js.org/",category:"build",notion:""},{key:"rollup",label:"Rollup",link:"https://rollupjs.org/",category:"build",notion:""},{key:"esbuild",label:"esbuild",link:"https://esbuild.github.io/",category:"build",notion:""},{key:"babel",label:"Babel",link:"https://babeljs.io/",category:"build",notion:""},{key:"storybook",label:"Storybook",link:"https://storybook.js.org/",category:"build",notion:""},{key:"vue-sfc-loader",label:"Vue SFC Loader",link:"https://github.com/FranckFreiburger/vue3-sfc-loader",category:"build",notion:""},{key:"nexe",label:"Nexe",link:"https://github.com/nexe/nexe",category:"build",notion:""},{key:"vitest",label:"Vitest",link:"https://vitest.dev/",category:"testing",notion:""},{key:"jest",label:"Jest",link:"https://jestjs.io/",category:"testing",notion:"Ограниченный коммерческий опыт"},{key:"pinia",label:"Pinia",link:"https://pinia.vuejs.org/",category:"state",notion:""},{key:"vuex",label:"Vuex",link:"https://vuex.vuejs.org/",category:"state",notion:""},{key:"redux",label:"Redux",link:"https://redux.js.org/",category:"state",notion:""}
1,{key:"zod",label:"Zod",link:"https://zod.dev/",category:"validation",notion:""},{key:"vee-validate",label:"VeeValidate",link:"https://vee-validate.logaretm.com/",category:"validation",notion:""},{key:"vuelidate",label:"Vuelidate",link:"https://vuelidate-next.netlify.app/",category:"validation",notion:""},{key:"axios",label:"Axios",link:"https://axios-http.com/",category:"util",notion:""},{key:"lodash",label:"Lodash",link:"https://lodash.com/",category:"util",notion:""},{key:"vueuse",label:"VueUse",link:"https://vueuse.com/",category:"util",notion:""},{key:"jquery",label:"jQuery",link:"https://jquery.com/",category:"util",notion:""},{key:"i18n",label:"i18n",link:"https://www.npmjs.com/package/i18n",category:"util",notion:""},{key:"chalk",label:"Chalk",link:"https://github.com/chalk/chalk/",category:"util",notion:""},{key:"node",label:"Node.js",link:"https://nodejs.org/",category:"util",notion:""},{key:"ws",label:"ws",link:"https://github.com/websockets/ws",category:"util",notion:""},{key:"postgres",label:"PostgreSQL",link:"https://www.postgresql.org/",category:"util",notion:""},{key:"redis",label:"Redis",link:"https://redis.io/",category:"util",notion:""},{key:"socketio",label:"Socket.IO",link:"https://socket.io/",category:"util",notion:""},{key:"sqlite",label:"SQLite",link:"https://sqlite.org/",category:"util",notion:""},{key:"leaflet",label:"Leaflet",link:"https://leafletjs.com/",category:"map",notion:""},{key:"yandexmaps",label:"Yandex Maps API",link:"https://yandex.com/dev/maps/",category:"map",notion:""},{key:"wordpress",label:"WordPress",link:"https://wordpress.org/",category:"cms",notion:""},{key:"bitrix",label:"1C-Битрикс",link:"https://www.1c-bitrix.ru/",category:"cms",notion:""},{key:"mobx",label:"MobX",link:"https://mobx.js.org/",category:"cms",notion:"Редко практикую сейчас"},{key:"bitrix24",label:"Битрикс24",link:"https://www.bitrix24.ru/",category:"crm",notion:"Работал, но давно"},{key:"espocrm",label:"EspoCRM",link:"https://www.espocrm.com/",category:"crm",notion:""},{key:"mikbill",label:"MikBill",link:"https://www.mikbill.com/",category:"billing",notion:""},{key:"lanbilling",label:"LanBilling",link:"https://lanbilling.ru/",category:"billing",notion:""}],F=O(()=>{const C=[],S=[];return ue.forEach((w,c)=>{const P=ee.filter(g=>g.category===w.key),b={...w,items:P};c%2===0?C.push(b):S.push(b)}),[C,S]}),G=x([{nda:!0,period:["Февраль 2025","Июнь 2025"],title:"Многоуровневая платформа для визуального проектирования и управления отчётами",technologies:["ts","vite","vue3","sfc","tailwind","scss","axios","primevue","tiptap","vueuse","zod","i18n","vue-sfc-loader","nexe","codemirror","chartjs"],contribution:["Разработал масштабируемое SPA-приложение на Vue 3 с использованием Vite, TypeScript, TailwindCSS, Vue, PrimeVue.","Реализовал архитектуру плагинов для UI: поддержка динамического подключения datasource-адаптеров, тем оформления, расширений для визуального конструктора отчётов. ","Организовал систему регистрации и интеграции UI-плагинов через декларативные API (registerExtension, defineUiPlugin). ","Внедрил поддержку динамической загрузки компонентов, асинхронных форм, валидации (Zod), локализации, кастомных редакторов запросов и настроек источников данных. ","Настроил сборку и оптимизацию фронтенда для разных платформ (Windows, Linux), кастомные чанки для крупных зависимостей, а так же сборка бинарных пакетов. ","Реализовал взаимодействие с backend через WebSocket (реалтайм-уведомления, обновления данных), REST API, а также интеграцию с системой авторизации. ","Разработал и поддерживал UI для управления отчётами, источниками данных, шаблонами, пользователями, группами и правами доступа. ","Внедрил систему темизации и расширяемости интерфейса (поддержка кастомных тем и визуальных расширений)."],methodology:"Agile/Scrum, недельные спринты",achievments:["Реализовал масштабируемую архитектуру фронтенда с поддержкой динамических плагинов, тем, расширяемых UI-компонентов и интеграцией с системой отчётов, что позволило создавать и подключать новые модули без изменений основного приложения."],architecture:"Проект построен по принципу монорепозитория (monorepo) и включает в себя несколько сервисов и плагинов: основной backend (NestJS), frontend-приложение (Vue 3 + Vite), ядро для расширений, систему плагинов и инструменты для сборки и деплоя."},{nda:!0,period:["Ноябрь 2024","Февраль 2025"],title:"Перенос фармацептического маркетплейса с 1С.Битрикс на SSR",technologies:["ts","vite","lite-ssr","vue3","sfc","scss","axios","vueuse","bitrix","yandexmaps","php","vuelidate"],contribution:["Реализация бесшовной интеграции SSR страниц с 1С Битрикс, а в последствии, дальнейший перенос всего функционала на LSSR","Перенос текущего функционала сайта на SSR","Руководство командой и процессом разработки","Генерация артефактов, и полная коммуникация с заказчиками","Формирование и описание задач для команды разработки","Внедрение новых способов оптимизации рендера страниц на стороне SSR"],methodology:"Agile/Scrum, недельные спринты",achievments:["Удалось добиться FCP в 0.8s, TBT в 50ms и SI в 0.9s на самой загруженной странице, выполняющей 12 отдельных запросов для получения данных и формирования конечной страницы (условность API 1С.Битрикс)"],architecture:"Feature-Sliced Design"},{nda:!1,period:["Октябрь 2024","Ноябрь 2024"],title:"LiteSSR. Разработка универсального плагина Vite для реализации SSR",technologies:["ts","vite","esbuild","chalk","express","rollup","vue3","react","axios","modules"],contribution:["Разработка плагина для Vite","Реализация универсального API для работы с SSR и регистрации генераторов страниц","Разработка генератора Vue","Разработка минимального генератора для React","Разработка системы плагинов LSSR","Разработка системы плагинов для генераторов","Разработка плагинов для SSR (Cookie, Proxy, Cached-Data)","Разработка плагинов для генератора Vue (VueRouter, Axios, oFetch, Unhead)"],methodology:"Agile/Scrum, недельные спринты",achievments:["Получилось отделить серверную логику SSR, от самих генераторов, и даже реализовать полноценный генератор для Vue, который максимально использует стандартный подход разработки SPA приложений, не требующий рефакторинга кода, при переносе уже существующих SPA приложений на SSR"],architecture:"Система пакетов (модулей) на базе workspace'ов"},{nda:!1,period:["Июнь 2024","Октябрь 2024"],title:"Веб-сайт и конструктор страниц сайта компании ЭФКО",technologies:["ts","vite","vue3","nuxt3","sfc","tailwind","scss","axios","daisy","vueuse","zod","pinia","i18n"],contribution:["Разработка визуального конструктора страниц на базе GrapesJS с шаблонизацией Vue","Разработка генератора роутинга, и визуальной части страниц","Написание плагинов и модулей Nuxt3, для работы с динамическим роутингом и локализацией в рантайме","Руководство командой и процессом разработки","Декомпозиция и описание работ","Генерация артефактов для команды разработки"],methodology:"Agile/Scrum, недельные спринты",achievments:["Удалось реализовать удобный визуальный редактор веб-страниц, с поддержкой шаблонизатора Vue"],architecture:"Nuxt"},{nda:!0,period:["Апрель 2024","Июнь 2024"],title:"Модернизация ЛК и МП страховой компании",technologies:["ts","vite","vue2","vue3","sfc","scss","axios","vueuse","vee-validate","pinia","chartjs","cordova"],contribution:["Поддержка существующей кодовой базы","Разработка нового функционала","Частичный рефакторинг существующего функционала","Формирование технической документации"],methodology:"Agile/Scrum, 2х-недельные спринты",achievments:["Удалось провести рефакторинг всей проблемной кодовой базы, оптимизировать работу веб-сайта, разделить пере-используемый функционал в отдельные модули, за короткий срок"],architecture:"Перенос (изначально) модульной системы на FSD"},{nda:!0,period:["Октябрь 2023","Декабрь 2023"],title:"Доработка логистического сервиса",technologies:["ts","vue3","konva","sass","axios"],contribution:["Разработал интерактивный компоновщик трюмов траулеров и транспортных судов на базе Konva.js с drag&drop и слоями.","Реализовал расчёт весовых ограничений по слоям и моментальную валидацию перегруза с визуальными подсказками.","Добавил сценарии погрузки/выгрузки с симуляцией очередности, фиксацией точек доступа и предупреждениями о нарушениях техники безопасности.","Интегрировал модуль с API логистики и подготовил экспорт планов рейса в существующие отчётные формы."],methodology:"Agile/Scrum, 2х-недельные спринты",achievments:["Сократил время подготовки рейса на ~35% благодаря визуализации и автоматическим расчётам вместимости."],architecture:"Vue 3 SPA с Konva.js, интегрированная в логистическую платформу"},{nda:!1,period:["Сентябрь 2023","Декабрь 2023"],title:"In-DAP (PoC проект)",description:"Разработка отечественного узконаправленного аналога Grafana/Zabbix",technologies:["ts","vite","vue3","sfc","vue-sfc-loader","scss","graphql","vueuse","antdv","codemirror","echarts","zod","pinia"],contribution:["Разработка PoC системы мониторинга и сбора метрик","Создание системы визуализации данных","Разработка конфигуратора витрин визуализации","Формирование пользовательской и технической документации"],methodology:"Agile/Scrum, недельные спринты",achievments:["Удалось реализовать удобный конфигуратор витрин (дешбордов) для предоставления данных по сущностям, позволяющий через веб-интерфейс использовать готовые графики, писать собственные виджеты на Vue+JS в рантайме, настраивать получение данных через GraphQL"],architecture:"Модульная"},{nda:!0,period:["Февраль 2023","Сентябрь 2023"],title:"Бэк-офис панель благотворительного фонда",contribution:["Разработка CRM конкурсной площадки","Реализация конструируемых шаблонов заявок и отчётов","Оптимизация работы с большим количеством форм на стороне клиента","Оптимизация работы с большими объемами данных на ф
1ронте","Рефакторинг унаследованного легаси-функционала"],methodology:"Agile/Scrum, 2х-недельные спринты",architecture:"Модульная"},{nda:!0,period:["Декабрь 2022","Февраль 2023"],title:"Разработка веб-сайта интернет-провайдера",contribution:["Разработка b2c и b2b клиентских частей сайта","Реализация функционала работы с полигональными зонами на карте (авторасчёт возможностей подключения, определение тарифных зон и т.д.)","Интеграция с распознаванием местоположений (Navigator, DaData)","Разработка функционала автоматического подбора тарифов","Создание корп. UI-Kit"],methodology:"Agile/Scrum, недельные спринты",achievments:["Удалось разработать отдельный сервис FrontEnd на Nuxt, поддерживающий конфигурацию SEO, SiteMap и веб-страниц из 1С-Битрикс. Так же удалось реализовать проксирование запросов к внешним API без хранения токенов на стороне клиента"],architecture:"Модульная"},{nda:!1,period:["Ноябрь 2022","Декабрь 2022"],title:"СОГАЗ-маркетинг",contribution:["Поддержка существующей кодовой базы","Разработка нового функционала","Рефакторинг существующего функционала"],methodology:"Agile/Scrum, 2х-недельные спринты",architecture:"Модульная"},{nda:!1,period:["Май 2022","Ноябрь 2022"],title:'Веб-сайт и системы группы региональных интернет провайдеров ООО "Новые Сети" и ООО "РуНэт"',contribution:["Разработка веб-сайта провайдера","Разработка модулей системы биллинга","Настройка системы управления для ТВ-Приставок","Настройка сервиса IPTV","Модификация прошивок Android ТВ-Приставок","Разработка Android ТВ Лаунчера"],methodology:"Waterfall",achievments:["Удалось создать автоматизированную систему по бюджетной цене, состоящая из биллинга, эквайринга, сервисов IPTV, а так же полную оснастку для ТВ приставок"],architecture:"Модульная"},{nda:!0,period:["Февраль 2022","Июль 2022"],title:"B2B Маркетплейс",contribution:["Разработка всей клиентской части B2B Маркетплейса","Реализация функционала заказа товаров с брендированием и сертификацией от производителей","Создание CLI утилиты для парсинга товаров с 1688"],methodology:"Agile/Scrum, 2х-недельные спринты",architecture:"Модульная"},{nda:!0,period:["Декабрь 2021","Январь 2022"],title:"Система автоматизации работы с заявками на реконструкции",contribution:["Доработка и сопровождение микросервиса","Работа с одностраничной формой (180 полей)","Обработка данных из БД и XML файлов"],methodology:"Agile/Scrum, недельные спринты",architecture:"Микросервисная"},{nda:!0,period:["Июнь 2021","Декабрь 2022"],title:"Внутренний портал гос. службы",contribution:["Разработка внутреннего портала для предоставления нормативных документов","Систематизация истории изменений, с пояснениями по изменяющимся пунктам","Категоризация информации"],methodology:"Agile/Scrum, недельные спринты",architecture:"Модульная"},{nda:!0,period:["Ноябрь 2020","Июнь 2021"],title:"Система сбора статистики по голосованиям по МСК и её области",contribution:["Реализация функционала сбора и анализ статистики по итогам голосований","Разработка микросервиса визуализации данных","Создание 3D карты с отображением статистики"],achievments:["Удалось сделать оптимизированную карту, отрисовывающую порядка 200.000 строений получаемых из GeoJSON"],methodology:"Agile/Scrum, недельные спринты",architecture:"Модульная"},{nda:!1,period:["Декабрь 2019","Март 2020"],title:'Веб-сайт региональной веб-студии "Сигника"',contribution:["Разработка и поддержка веб-сайта студии","Создание API и админ-панели","Реализация функционала сбора заявок и метрик"],methodology:"Waterfall",architecture:"Модульная"},{nda:!0,period:["Февраль 2019","Ноябрь 2019"],title:"CRM Система для работы с проектами в сфере наладки сетей и системного администрирования",contribution:["Разработка CRM системы для автоматизации работы интернет-провайдера","Реализация функционала учёта работников, проектов, материалов, затрат","Реализация функционала сбора статистики по выполнению работ","Реализация функционала расчета выплат и генерация отчётов","Разработка WebView Android-приложения для работников"],methodology:"Waterfall",architecture:"Монолитная"},{nda:!1,period:["Декабрь 2016","Март 2018"],title:'Разработка и ведение SPA интернет-магазина для ООО "АрсМебель"',contribution:['Разработка SPA веб-приложения интернет-магазина мебели для "киосков"',"Разработка Rest API и админ-панели интернет магазина","Разработка сервиса учёта остатков и логистики интернет-заказов для операторов","Ведение и поддержка сервисов интернет-магазина","Масштабирование решения на несколько дочерних компаний"],methodology:"Waterfall",architecture:"Монолитная"}]),Z=x([{period:["Февраль 2024","по наст. время"],title:"LiteSSR",description:"Набор инструментов для SSR и SSG на базе Vite с поддержкой модульной архитектуры и расширений.",contribution:["Разработал ядро LiteSSR и систему API для декларативной регистрации генераторов и плагинов.","Сконструировал пайплайн сборки с динамическим подключением middleware, кешем данных и прокси-слоем.","Поддерживаю доÐ
1ºÑƒÐ¼ÐµÐ½Ñ‚ацию, релизы и roadmap; веду коммуникацию с OSS-сообществом."],achievments:["Проект стабильно используется небольшими продуктами и pet-проектами для миграции SPA → SSR.","Получил вклад контрибьюторов: pull-request’ы с новыми плагинами и улучшением документации."],methodology:"Agile/Kanban",architecture:"Workspace-монорепозиторий (ядро + плагины)",technologies:["ts","vite","esbuild","rollup","express","axios","vue3","react","chalk"],github:"https://github.com/DanteZZ/lite-ssr",npm:"https://www.npmjs.com/package/lite-ssr"},{period:["Март 2024","по наст. время"],title:"LiteSSR Vue Renderer",description:"Отдельный генератор Vue3 для LiteSSR с готовыми плагинами и best-practice конфигурацией.",contribution:["Реализовал совместимость с Composition API, маршрутизацией и meta-рендерингом через Unhead.","Написал набор плагинов (@lite-ssr/vue-unhead и др.) для быстрой интеграции в существующие SPA.","Настроил тесты и пример приложения, чтобы облегчить вход новичкам и уменьшить количество вопросов."],methodology:"Kanban",architecture:"Workspace-пакет, интегрированный с LiteSSR",technologies:["ts","vue3","vite","sfc","tailwind","axios"],github:"https://github.com/DanteZZ/lite-ssr/tree/main/packages/vue",npm:"https://www.npmjs.com/package/@lite-ssr/vue"},{period:["Июнь 2023","по наст. время"],title:"NW.js Advanced Builder",description:"Кросс-платформенный сборщик standalone-приложений на базе NW.js c единым CLI.",contribution:["Создал CLI с поддержкой Windows/Linux/macOS, упаковкой ресурсов и автоматическим обновлением manifest.","Реализовал скрипты для сборки arm64/x64, подписи, инклюда нативных модулей и интеграции CI/CD.","Поддерживаю issue-трекер, документацию и примеры шаблонов для старта проектов."],methodology:"Kanban",architecture:"Node CLI + шаблоны проектов",technologies:["ts","node","nwjs","electron","chalk"],github:"https://github.com/DanteZZ/nw-advenced-builder",npm:"https://www.npmjs.com/package/nw-advenced-builder"},{period:["Август 2022","по наст. время"],title:"Open Game Engine",description:"TypeScript-first игровой движок на Canvas с модульным API, вдохновлённый GameMaker и Unity.",contribution:["Спроектировал ECS-ядро, систему компонентов и событий для 2D-игр.","Реализовал конвейер загрузки ассетов, спрайтов, анимаций и базового редактора сцен.","Пишу документацию, примеры и демо-проекты; поддерживаю выпуск обновлений через npm."],methodology:"Kanban",architecture:"Monorepo (ядро + вспомогательные модули)",technologies:["ts","vite","rollup","canvas","axios"],github:"https://github.com/DanteZZ/oge-ts",npm:"https://www.npmjs.com/package/oge-ts"},{period:["Январь 2024","по наст. время"],title:"Nu11Net Client",description:"Игровой клиент Nu11Net — десктопная терминальная игра-симулятор «хакера» с полноценной сетевой песочницей.",contribution:["Спроектировал игровой UX в духе ретро-операционной системы: терминал, файловая система, сетевые устройства и переносные носители.","Построил NW.js-оболочку с автоматической сборкой и деплоем под Linux, интегрировал игровой движок OGE и систему сценариев.","Реализовал локальную эмуляцию сети (DHCP, DNS, роутеры), WebSocket-взаимодействие с сервером и механики PvP/кооперативного взлома.","Настроил pipeline релизов (webpack, Jenkins, .deb-пакеты) и nightly-сборки."],methodology:"Agile/Kanban",architecture:"NW.js desktop-игра (Vue 2 + TypeScript)",technologies:["ts","vue2","nwjs","webpack","canvas","socketio","lodash"],github:"https://github.com/mtrofimov/nu11net-client"}
1,{period:["Декабрь 2023","по наст. время"],title:"Nu11Net Server",description:"Игровой сервер Nu11Net: ядро симуляции виртуальных машин, сетевых событий и кооперативных сценариев.",contribution:["Спроектировал модульную систему: управление устройствами, «интернет-провайдер», обработку пакетов и PvP-события.","Реализовал WebSocket-протокол поверх `ws`, эмуляцию DHCP/DNS и обработку сетевых пакетов с сохранением состояния.","Создал терминальную админ-панель на React Blessed для лайв-мониторинга и управления кластерами.","Поддерживаю CI-пайплайн релизов, резервные копии sqlite и документацию игровых сценариев."],methodology:"Agile/Kanban",architecture:"Node.js сервис с модульными сервисами и терминальным UI",technologies:["node","ws","sqlite","react","react-blessed","lodash","chalk"],github:"https://github.com/mtrofimov/nu11net-server"}]),ce={class:"relative group inline-block"},de={class:"pre absolute z-50 bottom-full mb-2 px-2 py-1 bg-gray-900 text-white text-sm rounded opacity-0 group-hover:opacity-100 transition pointer-events-none whitespace-pre"},K=H({__name:"Tooltip",props:{text:{}},setup(C){return(S,w)=>(t(),o("div",ce,[E(S.$slots,"default"),a("div",de,[E(S.$slots,"content",{},()=>[i(n(C.text),1)])])]))}}),Q={hard:["Написание пригодного к постоянному масштабированию кода","Аудит, глубокое ревью кода и грамотное формирование требований по “изменению” кодовой базы","Глубокий рефакторинг (не путать с обычным), формирование плана рефакторинга","Оценка проектов, Pre-Sale и защита оценки перед заказчиками","CI/CD, Имею опыт внедрения, сопровождения, владею навыком “обучать” dev-ops’ов работе с определёнными технологическими стеками с их стороны"],soft:["Менторство, формирование индивидуальных планов развития специалистов, контроль, валидация","Наладка коммуникации внутри команды","Проведение 1-1 и моральная поддержка разработчиков в трудные периоды","Проведение интервью и срезов знаний разработчиков","Общение с заказчиками, умение отстоять интересы компании перед заказчиком “не портя с ним отношений“"]},pe={class:"p-3 grid grid-cols-1 gap-16 lg:grid-cols-[256px_auto] print:text-[13px] print:!p-0"},ge={class:"grid grid-cols-1 sm:grid-cols-2 gap-12 gap-y-0"},ye={class:"text-lg font-semibold mb-2 print:!text-base print:mb-0"},ke=["href"],he={key:0,class:"text-gray-800 hover:text-sky-600 transition-colors"},be={key:1,class:"text-nowrap"},me={class:"text-gray-50 light:text-gray-800 hover:text-sky-500 transition-colors"},ve={key:0,class:"text-sky-500"},xe={class:"text-lg font-semibold mb-2 print:!text-base print:mb-0"},fe=["href"],Se={key:0,class:"text-gray-800 hover:text-sky-600 transition-colors"},we={key:1,class:"text-nowrap"},_e={class:"text-gray-50 light:text-gray-800 hover:text-sky-500 transition-colors"},Ce={key:0,class:"text-sky-500"},Pe={class:"grid grid-cols-1 sm:grid-cols-2 gap-12 gap-y-0 mb-10"},Ae={key:1,class:"mr-2"},je={class:"relative"},Ve={key:1,class:"mr-2"},Le={key:0,class:"opacity-50 ml-1"},Ie={key:0,class:"mb-3"},Re={class:"mb-1 print:mb-0"},Ne={key:1,class:"mr-2"},Te={class:"mb-1 print:mb-0"},Me={key:1,class:"mr-2"},De={class:"mb-3"},We={class:"mb-3"},Oe={key:4,class:"mb-3"},Be=["href"],Ue={key:0,class:"text-gray-800 hover:text-sky-600 transition-colors"},qe={key:1,class:"text-nowrap"},Ee={class:"text-gray-50 light:text-gray-800 hover:text-sky-500 transition-colors"},He={key:0,class:"mb-3"},$e={class:"mb-1 print:mb-0"},ze={key:1,class:"mr-2"},Je={class:"mb-1 print:mb-0"}
1,Fe={key:1,class:"mr-2"},Ge={class:"mb-3"},Ze={class:"mb-3"},Ke={key:4,class:"mb-3"},Qe=["href"],Xe={key:0,class:"text-gray-800 hover:text-sky-600 transition-colors"},Ye={key:1,class:"text-nowrap"},et={class:"text-gray-50 light:text-gray-800 hover:text-sky-500 transition-colors"},tt=["href"],ot=["href"],lt=500,st=4,nt=500,at=3,pt=H({__name:"index",setup(C){const S=O(()=>new Date().toLocaleDateString("ru-RU",{year:"numeric",month:"2-digit",day:"2-digit"}));le({title:`CV - Maxim Trofimov ${S.value}`});const{isLight:w}=ie(),c=se(),P=ne(),b=x(null),g=x(null),N=x(null),A=x(null),T=x(null),W=x(null),U=(k,e)=>{e?(N.value?.open?.(),b.value=k,T.value?.filter((s,p)=>p!==k).forEach(s=>{s.close?.()})):b.value=null},j=(k,e)=>{e?(A.value?.open?.(),g.value=k,W.value?.filter((s,p)=>p!==k).forEach(s=>{s.close?.()})):g.value=null},M=k=>ee.filter(e=>k.includes(e.key)),$=()=>{"hr"in c.query?P.replace("/cv/"):P.replace("/cv?hr")},l=x(!1),te=O(()=>{const k=Math.max(G.value.length-st,0);return k>0?`Ещё ${k} проектов`:"Развернуть"}),oe=O(()=>{const k=Math.max(Z.value.length-at,0);return k>0?`Ещё ${k} проектов`:"Развернуть"});return X(()=>c.query,()=>{const k="hr"in c.query;l.value=k,w.value=k,k&&(b.value=null,g.value=null)},{immediate:!0}),ae(()=>{l.value&&(l.value=!1,w.value=!1),b.value=null,g.value=null}),(k,e)=>(t(),o("div",pe,[r(J,{class:"hidden lg:block","hr-mode":l.value,onToggleHrMode:$},null,8,["hr-mode"]),e[38]||(e[38]=a("div",{class:"hidden lg:block"},null,-1)),a("div",null,[r(_,null,{default:u(()=>[r(L,{class:"text-3xl !text-gray-300 light:!text-gray-700"},{default:u(()=>[...e[0]||(e[0]=[i(" Curriculum Vitae ",-1)])]),_:1})]),_:1}),r(R),r(J,{class:"lg:hidden","hr-mode":l.value,onToggleHrMode:$},null,8,["hr-mode"]),r(_,null,{default:u(()=>[r(L,{h:"2",class:d({"!text-gray-700 print:!text-xl":l.value})},{default:u(()=>[...e[1]||(e[1]=[i(" Обо мне ",-1),a("span",{class:"text-lg text-gray-500 print:hidden"},"(кратко)",-1)])]),_:1},8,["class"]),r(I,null,{default:u(()=>[...e[2]||(e[2]=[i(" Более 12 лет занимаюсь разработкой, из них 9 лет коммерческой. Работал как над небольшими стартапами, так и над масштабируемыми распределёнными системами. Имею опыт написания библиотек для NodeJS (одинарных/пакетных), SSR / PWA / SPA и мобильных (WebView) приложений ",-1)])]),_:1}),r(I,null,{default:u(()=>[...e[3]||(e[3]=[i(" Берусь за самые нестандартные для рядового FrontEnd разработчика кейсы. Периодически реализую экспериментальные pet-проекты, для изучения возможностей нестандартного использования web-технологий. ",-1)])]),_:1})]),_:1}),r(R),r(D,{"always-opened":l.value},{default:u(()=>[r(_,null,{default:u(()=>[r(L,{h:"2",class:d({"!text-gray-700 print:!text-xl":l.value})},{default:u(()=>[...e[4]||(e[4]=[i(" Технологический стек ",-1)])]),_:1},8,["class"]),a("div",ge,[a("div",null,[(t(!0),o(y,null,v(V(F)[0],s=>(t(),o("div",null,[a("div",ye,n(s.label),1),r(I,{class:"block"},{default:u(()=>[(t(!0),o(y,null,v(s.items,(p,f)=>(t(),B(z(p?.notion?K:"span"),{text:p?.notion},{default:u(()=>[a("a",{href:p.link||"#",target:"_blank",class:"mr-1 text-gray-500 hover:text-sky-700 transition-colors"},[l.value?(t(),o("span",he,n(p.label+(f<s.items.length-1?", ":"")),1)):(t(),o("span",be,[e[5]||(e[5]=i(n("{")+" ",-1)),a("span",me,[i(n(p.label),1),p.notion?(t(),o("span",ve,"*")):h("",!0)]),e[6]||(e[6]=i(" "+n("}"),-1))]))],8,ke)]),_:2},1032,["text"]))),256))]),_:2},1024)]))),256))]),a("div",null,[(t(!0),o(y,null,v(V(F)[1],s=>(t(),o("div",null,[a("div",xe,n(s.label),1),r(I,{class:"block"},{default:u(()=>[(t(!0),o(y,null,v(s.items,(p,f)=>(t(),B(z(p.notion?K:"span"),{text:p.notion},{default:u(()=>[a("a",{href:p.link||"#",target:"_blank",class:"mr-1 text-gray-500 hover:text-sky-700 transition-colors"},[l.value?(t(),o("span",Se,n(p.label+(f<s.items.length-1?", ":"")),1)):(t(),o("span",we,[e[7]||(e[7]=i(n("{")+" ",-1)),a("span",_e,[i(n(p.label),1),p.notion?(t(),o("span",Ce,"*")):h("",!0)]),e[8]||(e[8]=i(" "+n("}"),-1))]))],8,fe)]),_:2},1032,["text"]))),256))]),_:2},1024)]))),256))])])]),_:1})]),_:1},8,["always-opened"]),r(_,null,{default:u(()=>[r(L,{h:"2",class:d({"!text-gray-700 print:!text-xl":l.value})},{default:u(()=>[...e[9]||(e[9]=[i(" Профессиональные навыки ",-1)])]),_:1},8,["class"]),a("div",Pe,[a("div",null,[e[13]||(e[13]=a("div",{class:"text-lg font-semibold leading-8 print:!text-base"}," HardSkills ",-1)),(t(!0),o(y,null,v(V(Q).hard,s=>(t(),o("p",null,[l.value?(t(),o("span",Ae,"•")):(t(),o(y,{key:0},[e[10]||(e[10]=i(" [",-1)),e[11]||(e[11]=a("span",{class:"text-green-400"},"✓",-1)),e[12]||(e[12]=i("] ",-1))],64)),i(" "+n(s),1)]))),256))]),a("div",null,[e[17]||(e[17]=a("div",{class:"text-lg font-semibold leading-8 print:!text-base"}," SoftSkills ",-1)),(t(!0),o(y,null,v(V(Q).soft,s=>(t(),o("p",je,[l.value?(t(),o("span",Ve,"•")):(t(),o(y,{key:0},[e[14]||(e[14]=i(" [",-1)),e[15]||(e[15]=a("span",{class:"text-green-400"},"✓",-1)),e[16]||(e[16]=i("] ",-1))],64)),i(" "+n(s),1)]))),256))])])]),_:1}),r(R,{class:"break-after-page"}),r(D,{ref_key:"projectsContainerSpoiler",ref:N,"always-opened":l.value,height:lt,none:l.value,"collapsed-label":te.value},{default:u(()=>[r(_,null,{default:u(()=>[r(L,{h:"2",class:d({"!text-gray-700 print:!text-xl":l.value})},{default:u(()=>[...e[18]||(e[18]=[i(" Коммерческие проекты ",-1)])]),_:1},8,["class"]),r(I,null,{default:u(()=>[...e[19]||(e[19]=[a("span",{class:"opacity-50 ml-1"},"**",-1),i(" - Названия и некоторые детали проектов я не имею права разглашать в связи с NDA. ",-1)])]),_:1})]),_:1}),a("div",{class:d(["grid grid-cols-1 lg:grid-cols-2 gap-12 gap-y-6",{"!grid-cols-1 !gap-0":l.value,group:!l.value}])},[(t(!0),o(y,null,v(V(G),(s,p)=>(t(),o("div",{class:d(["transition-size",{"lg:col-span-2":b.value===p}]),style:Y({"grid-row-start":k.$viewport.isGreaterOrEquals("lg")&&b.value===p+1&&b.value%2===1?Math.ceil(b.value/2)+1:"auto"})},[r(D,{ref_for:!0,ref_key:"projectSpoilers",ref:T,full:"",onToggle:f=>U(p,f),"always-opened":l.value,none:l.value},{default:u(({opened:f})=>[r(_,{class:d(["relative",{"transition-opacity group-hover:opacity-65 hover:!opacity-100":p!==b.value}])},{default:u(()=>[a("div",{class:d(["text-lg font-semibold mb-0 leading-5",{"!text-xl mb-1 print:!text-[1rem]":l.value}])},[i(n(s.title),1),s.nda?(t(),o("span",Le,"**")):h("",!0)],2),a("div",{class:d(["text-sm mb-2 text-sky-300 light:text-sky-600 print:!text-gray-300",{"!text-gray-500":l.value}])}," [ "+n(s.period[0])+" - "+n(s.period[1])+" ] ",3),s.description?(t(),o("p",Ie,n(s.description),1)):h("",!0),f?(t(),o("p",{key:1,class:d(["text-sky-500 mb-1",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Мой вклад:":"[ Мой вклад ]"),3)):h("",!0),(t(!0),o(y,null,v(s.contribution,m=>(t(),o("p",Re,[l.value?(t(),o("span",Ne,"•")):(t(),o(y,{key:0},[e[20]||(e[20]=i(" [",-1)),e[21]||(e[21]=a("span",{class:"text-green-500"},"+",-1)),e[22]||(e[22]=i("] ",-1))],64)),i(" "+n(m),1)]))),256)),s.achievments?.length?(t(),o(y,{key:2},[a("p",{class:d(["text-sky-500 mb-1",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Достижения:":"[ Достижения ]"),3),(t(!0),o(y,null,v(s.achievments,m=>(t(),o("p",Te,[l.value?(t(),o("span",Me,"•")):(t(),o(y,{key:0},[e[23]||(e[23]=i(" [",-1)),e[24]||(e[24]=a("span",{class:"text-green-500"},"↑",-1)),e[25]||(e[25]=i("] ",-1))],64)),i(" "+n(m),1)]))),256))],64)):h("",!0),a("p",{class:d(["text-sky-500 mb-1 mt-3",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Методология:":"[ Методология ]"),3),a("p",De,n(s.methodology),1),a("p",{class:d(["text-sky-500 mb-1 mt-3",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Архитектура:":"[ Архитектура ]"),3),a("p",We,n(s.architecture),1),s.technologies?(t(),o("p",{key:3,class:d(["text-sky-500 mb-1 mt-3",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Технологии:":"[ Технологии ]"),3)):h("",!0),s.technologies?(t(),o("p",Oe,[(t(!0),o(y,null,v(M(s.technologies),(m,q)=>(t(),o("span",null,[a("a",{href:m.link||"#",target:"_blank",class:"mr-1 text-gray-500 hover:text-sky-700 transition-colors"},[l.value?(t(),o("span",Ue,n(m.label+(q<s.technologies.length-1?", ":"")),1)):(t(),o("span",qe,[e[26]||(e[26]=i(n("{")+" ",-1)),a("span",Ee,n(m.label),1),e[27]||
1(e[27]=i(" "+n("}"),-1))]))],8,Be)]))),256))])):h("",!0)]),_:2},1032,["class"])]),_:2},1032,["onToggle","always-opened","none"])],6))),256))],2)]),_:1},8,["always-opened","none","collapsed-label"]),r(R),r(D,{ref_key:"opensourceContainerSpoiler",ref:A,"always-opened":l.value,height:nt,none:l.value,"collapsed-label":oe.value},{default:u(()=>[r(_,null,{default:u(()=>[r(L,{h:"2",class:d({"!text-gray-700 print:!text-xl":l.value})},{default:u(()=>[...e[28]||(e[28]=[i(" Open Source проекты ",-1)])]),_:1},8,["class"]),r(I,null,{default:u(()=>[...e[29]||(e[29]=[i(" Ключевые публичные инициативы с открытым исходным кодом и постоянной поддержкой. ",-1)])]),_:1})]),_:1}),a("div",{class:d(["grid grid-cols-1 lg:grid-cols-2 gap-12 gap-y-6",{"!grid-cols-1 !gap-0":l.value,group:!l.value}])},[(t(!0),o(y,null,v(V(Z),(s,p)=>(t(),o("div",{class:d(["transition-size",{"lg:col-span-2":g.value===p}])},[r(D,{ref_for:!0,ref_key:"opensourceSpoilers",ref:W,full:"",onToggle:f=>j(p,f),"always-opened":l.value,none:l.value},{default:u(({opened:f})=>[r(_,{class:d(["relative",{"transition-opacity group-hover:opacity-65 hover:!opacity-100":p!==g.value}])},{default:u(()=>[a("div",{class:d(["text-lg font-semibold mb-0 leading-5",{"!text-xl mb-1 print:!text-[1rem]":l.value}])},n(s.title),3),a("div",{class:d(["text-sm mb-2 text-sky-300 light:text-sky-600 print:!text-gray-300",{"!text-gray-500":l.value}])}," [ "+n(s.period[0])+" - "+n(s.period[1])+" ] ",3),s.description?(t(),o("p",He,n(s.description),1)):h("",!0),f?(t(),o("p",{key:1,class:d(["text-sky-500 mb-1",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Мой вклад:":"[ Мой вклад ]"),3)):h("",!0),(t(!0),o(y,null,v(s.contribution,m=>(t(),o("p",$e,[l.value?(t(),o("span",ze,"•")):(t(),o(y,{key:0},[e[30]||(e[30]=i(" [",-1)),e[31]||(e[31]=a("span",{class:"text-green-500"},"+",-1)),e[32]||(e[32]=i("] ",-1))],64)),i(" "+n(m),1)]))),256)),s.achievments?.length?(t(),o(y,{key:2},[a("p",{class:d(["text-sky-500 mb-1",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Достижения:":"[ Достижения ]"),3),(t(!0),o(y,null,v(s.achievments,m=>(t(),o("p",Je,[l.value?(t(),o("span",Fe,"•")):(t(),o(y,{key:0},[e[33]||(e[33]=i(" [",-1)),e[34]||(e[34]=a("span",{class:"text-green-500"},"↑",-1)),e[35]||(e[35]=i("] ",-1))],64)),i(" "+n(m),1)]))),256))],64)):h("",!0),a("p",{class:d(["text-sky-500 mb-1 mt-3",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Методология:":"[ Методология ]"),3),a("p",Ge,n(s.methodology),1),a("p",{class:d(["text-sky-500 mb-1 mt-3",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Архитектура:":"[ Архитектура ]"),3),a("p",Ze,n(s.architecture),1),s.technologies?(t(),o("p",{key:3,class:d(["text-sky-500 mb-1 mt-3",{"!text-gray-700 underline underline-offset-3 font-semibold":l.value}])},n(l.value?"Технологии:":"[ Технологии ]"),3)):h("",!0),s.technologies?(t(),o("p",Ke,[(t(!0),o(y,null,v(M(s.technologies),(m,q)=>(t(),o("span",null,[a("a",{href:m.link||"#",target:"_blank",class:"mr-1 text-gray-500 hover:text-sky-700 transition-colors"},[l.value?(t(),o("span",Xe,n(m.label+(q<s.technologies.length-1?", ":"")),1)):(t(),o("span",Ye,[e[36]||(e[36]=i(n("{")+" ",-1)),a("span",et,n(m.label),1),e[37]||(e[37]=i(" "+n("}"),-1))]))],8,Qe)]))),256))])):h("",!0),s.github||s.npm?(t(),o("div",{key:5,class:d(["flex flex-wrap gap-x-4 gap-y-2 text-sm text-sky-400 light:text-sky-600 print:text-gray-400",{"!text-gray-600":l.value}])},[s.github?(t(),o("a",{key:0,href:s.github,target:"_blank",class:"hover:underline underline-offset-4"}," GitHub ",8,tt)):h("",!0),s.npm?(t(),o("a",{key:1,href:s.npm,target:"_blank",class:"hover:underline underline-offset-4"}," npm ",8,ot)):h("",!0)],2)):h("",!0)]),_:2},1032,["class"])]),_:2},1032,["onToggle","always-opened","none"])],2))),256))],2)]),_:1},8,["always-opened","none","collapsed-label"])])]))}});
1export{pt as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.