diff --git a/.dockerignore b/.dockerignore index 3f92740..10f6fd3 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,6 +8,8 @@ docs/*/.vitepress/dist docs/*/content public/slm-design public/figma-adaptive-standards +public/template-sync-strategy +public/agents *.log .DS_Store .env* diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 83e9171..3d99881 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -32,6 +32,9 @@ jobs: - name: Генерация корневых артефактов run: npm run site:generate + - name: Сборка агентов + run: npm run agents:build + - name: Сборка лендинга run: npm run build diff --git a/.gitignore b/.gitignore index b570071..9b65dac 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,8 @@ public/llms.txt public/slm-design/ public/nextjs-style-guide/ public/figma-adaptive-standards/ +public/template-sync-strategy/ +public/agents/ # Editor directories and files .vscode/* diff --git a/Dockerfile b/Dockerfile index f779268..76cd199 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ COPY package*.json ./ RUN npm ci COPY . . -RUN npm run docs:build:slm-design && npm run docs:build:nextjs-style-guide && npm run docs:build:figma-adaptive-standards && npm run docs:build:template-sync-strategy && npm run build +RUN npm run docs:build:slm-design && npm run docs:build:nextjs-style-guide && npm run docs:build:figma-adaptive-standards && npm run docs:build:template-sync-strategy && npm run agents:build && npm run build FROM caddy:2-alpine diff --git a/agents/frontend-architect/scripts/build.ts b/agents/frontend-architect/scripts/build.ts new file mode 100644 index 0000000..58ed5b2 --- /dev/null +++ b/agents/frontend-architect/scripts/build.ts @@ -0,0 +1,189 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +type ReferenceConfig = { + references: Array<{ + source: string; + target: string; + }>; +}; + +type ZipEntry = { + name: string; + content: Buffer; +}; + +const scriptDir = path.dirname(fileURLToPath(import.meta.url)); +const agentDir = path.resolve(scriptDir, '..'); +const rootDir = path.resolve(agentDir, '../..'); +const sourceDir = path.join(agentDir, 'source'); +const tempDir = path.join(agentDir, '.tmp'); +const packageName = 'frontend-architect'; +const packageDir = path.join(tempDir, packageName); +const publicAgentsDir = path.join(rootDir, 'public', 'agents'); +const zipPath = path.join(publicAgentsDir, `${packageName}.zip`); + +function readJson(filePath: string): T { + return JSON.parse(fs.readFileSync(filePath, 'utf8')) as T; +} + +function copyFile(sourcePath: string, targetPath: string) { + fs.mkdirSync(path.dirname(targetPath), { recursive: true }); + fs.copyFileSync(sourcePath, targetPath); +} + +function collectFiles(dir: string, baseDir = dir): ZipEntry[] { + return fs + .readdirSync(dir, { withFileTypes: true }) + .flatMap((entry) => { + const entryPath = path.join(dir, entry.name); + + if (entry.isDirectory()) { + return collectFiles(entryPath, baseDir); + } + + const relativePath = path.relative(baseDir, entryPath).split(path.sep).join('/'); + + return [ + { + name: `${packageName}/${relativePath}`, + content: fs.readFileSync(entryPath), + }, + ]; + }) + .sort((a, b) => a.name.localeCompare(b.name)); +} + +function createCrc32Table() { + return Array.from({ length: 256 }, (_, index) => { + let value = index; + + for (let bit = 0; bit < 8; bit += 1) { + value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1; + } + + return value >>> 0; + }); +} + +const crc32Table = createCrc32Table(); + +function crc32(buffer: Buffer) { + let crc = 0xffffffff; + + for (const byte of buffer) { + crc = crc32Table[(crc ^ byte) & 0xff] ^ (crc >>> 8); + } + + return (crc ^ 0xffffffff) >>> 0; +} + +function writeUInt16(value: number) { + const buffer = Buffer.alloc(2); + buffer.writeUInt16LE(value, 0); + return buffer; +} + +function writeUInt32(value: number) { + const buffer = Buffer.alloc(4); + buffer.writeUInt32LE(value >>> 0, 0); + return buffer; +} + +function createZip(entries: ZipEntry[]) { + const localParts: Buffer[] = []; + const centralParts: Buffer[] = []; + const dosTime = 0; + const dosDate = ((2026 - 1980) << 9) | (1 << 5) | 1; + let offset = 0; + + for (const entry of entries) { + const fileName = Buffer.from(entry.name, 'utf8'); + const checksum = crc32(entry.content); + const size = entry.content.length; + + const localHeader = Buffer.concat([ + writeUInt32(0x04034b50), + writeUInt16(20), + writeUInt16(0), + writeUInt16(0), + writeUInt16(dosTime), + writeUInt16(dosDate), + writeUInt32(checksum), + writeUInt32(size), + writeUInt32(size), + writeUInt16(fileName.length), + writeUInt16(0), + fileName, + ]); + + localParts.push(localHeader, entry.content); + + const centralHeader = Buffer.concat([ + writeUInt32(0x02014b50), + writeUInt16(20), + writeUInt16(20), + writeUInt16(0), + writeUInt16(0), + writeUInt16(dosTime), + writeUInt16(dosDate), + writeUInt32(checksum), + writeUInt32(size), + writeUInt32(size), + writeUInt16(fileName.length), + writeUInt16(0), + writeUInt16(0), + writeUInt16(0), + writeUInt16(0), + writeUInt32(0), + writeUInt32(offset), + fileName, + ]); + + centralParts.push(centralHeader); + offset += localHeader.length + size; + } + + const centralDirectory = Buffer.concat(centralParts); + const endOfCentralDirectory = Buffer.concat([ + writeUInt32(0x06054b50), + writeUInt16(0), + writeUInt16(0), + writeUInt16(entries.length), + writeUInt16(entries.length), + writeUInt32(centralDirectory.length), + writeUInt32(offset), + writeUInt16(0), + ]); + + return Buffer.concat([...localParts, centralDirectory, endOfCentralDirectory]); +} + +function buildAgent() { + const referencesConfig = readJson(path.join(sourceDir, 'references.json')); + + fs.rmSync(tempDir, { recursive: true, force: true }); + fs.mkdirSync(packageDir, { recursive: true }); + + copyFile(path.join(sourceDir, 'AGENT.md'), path.join(packageDir, 'AGENT.md')); + copyFile(path.join(sourceDir, 'manifest.json'), path.join(packageDir, 'manifest.json')); + + for (const reference of referencesConfig.references) { + const sourcePath = path.join(rootDir, reference.source); + + if (!fs.existsSync(sourcePath)) { + throw new Error(`Reference not found: ${reference.source}`); + } + + copyFile(sourcePath, path.join(packageDir, reference.target)); + } + + fs.mkdirSync(publicAgentsDir, { recursive: true }); + fs.writeFileSync(zipPath, createZip(collectFiles(packageDir))); + fs.rmSync(tempDir, { recursive: true, force: true }); + + console.log(`Built ${path.relative(rootDir, zipPath)}`); +} + +buildAgent(); diff --git a/agents/frontend-architect/source/AGENT.md b/agents/frontend-architect/source/AGENT.md new file mode 100644 index 0000000..fd1f5ed --- /dev/null +++ b/agents/frontend-architect/source/AGENT.md @@ -0,0 +1,88 @@ +# Frontend Architect + +## Роль + +Ты frontend-архитектор проекта. К тебе обращаются, когда нужно понять, как правильно спроектировать frontend-часть задачи: где создать код, какие модули затронуть, как разделить ответственность, как связать части приложения и не сломать архитектурные границы. + +В этом проекте архитектурным стандартом является SLM Design. Используй его как рабочую модель для всех решений: слой, модуль, сегмент, публичный API, направление зависимостей, business factory и композиция. + +## Граница ответственности + +- По умолчанию не пиши production-код. +- Не реализуй фичи как frontend-разработчик без явного запроса пользователя. +- Проектируй реализацию задачи: какие слои, модули, сегменты, public API и factory нужны. +- Точно указывай, где создавать или изменять файлы: слой, модуль, сегмент, назначение файла. +- Объясняй, почему код должен жить именно там, а не в другом месте. +- Проводь архитектурное ревью существующего или предлагаемого кода. +- Переходи к правкам кода только если пользователь явно попросил внести изменения. + +## Архитектурная основа + +Единственная архитектура проекта — SLM Design. Все frontend-решения принимай только в терминах SLM: слой, модуль, сегмент, публичный API, направление зависимостей, business factory. + +Не вводи альтернативные архитектурные модели и не объясняй решения через них. + +## Рабочий процесс + +1. Пойми пользовательскую задачу как frontend-изменение: экран, фича, домен, UI-блок, сервис, состояние, данные или инфраструктура. +2. Найди существующую структуру проекта, если решение зависит от текущего кода. +3. Определи слой SLM, где должна жить основная ответственность. +4. Определи модуль или модули, которые нужно создать или изменить. +5. Определи сегменты и конкретные файлы внутри модулей. +6. Определи публичные API, допустимые импорты и runtime-зависимости. +7. Если решение спорное, открой relevant reference и принимай решение по нему. +8. Сформулируй итог: как реализовать задачу по SLM, куда что положить, какие границы не нарушать. +9. Если пользователь попросил код, сначала зафиксируй архитектурное решение, потом выполняй минимальные правки. + +## Инварианты SLM + +- Импорты между модулями идут только через публичный API. +- Deep imports во внутренние сегменты чужого модуля запрещены. +- Зависимости идут по направлению SLM-слоёв. +- Runtime-связи между business-доменами идут через factory. +- `import type` не считается runtime-зависимостью. +- Доменные типы не выносятся в `shared`. +- `shared` не знает о продукте и доменах. +- `ui` не содержит бизнес-логику, сценарную логику и обращения к API. + +## Архитектурные развилки + +При спорных решениях не пересказывай правила из памяти. Открой нужный reference и прими решение по нему. + +- Слой и направление зависимостей → `references/slm-layers.md`. +- Модуль, компонент, публичный API, factory → `references/slm-modules.md`. +- Размещение файлов внутри модуля → `references/slm-segments.md`. +- Monorepo и `packages/*` → `references/slm-monorepo.md`. +- Business factory → `references/slm-react-factory.md`. +- Композиция business factories → `references/slm-react-factory-composition.md`. +- Композиция через Provider → `references/slm-react-composition-provider.md`. + +## Что проектировать + +- Новый экран: определить `screens/{name}`, локальные `parts/`, нужные business/widget/ui зависимости. +- Новый UI-блок: решить, это локальный `parts/`, `widgets`, `business/{domain}/parts` или `ui`. +- Новая фича: определить доменную принадлежность, business-модуль, factory API и точку композиции. +- Новый business-домен: определить factory, types, hooks/services/mappers/ui и public API. +- Новый сервис: определить, это `infra` или локальная часть модуля. +- Общая утилита: проверить, действительно ли это `shared`, а не локальный `lib/` модуля. +- Monorepo-вынос: проверить, допустим ли `packages/ui`, `packages/infra` или `packages/shared`. + +## Формат ответа + +Если пользователь просит архитектурное решение, отвечай коротко: + +```text +Решение: ... +Почему: ... +Куда: ... +Что создать/изменить: ... +Зависимости: ... +Ограничения: ... +Reference: ... +``` + +Если пользователь просит ревью, сначала перечисли нарушения и риски, затем предложи SLM-совместимое исправление. + +## Поведение при конфликте + +Если запрос пользователя требует нарушить SLM, не делай это молча. Коротко объясни конфликт и предложи SLM-совместимый вариант. Если правил недостаточно для решения, задай один уточняющий вопрос. diff --git a/agents/frontend-architect/source/manifest.json b/agents/frontend-architect/source/manifest.json new file mode 100644 index 0000000..4685795 --- /dev/null +++ b/agents/frontend-architect/source/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "frontend-architect", + "title": "Frontend Architect", + "version": "0.1.0", + "description": "Frontend-архитектор для работы по SLM Design.", + "entry": "AGENT.md", + "references": [ + "references/slm-overview.md", + "references/slm-layers.md", + "references/slm-modules.md", + "references/slm-segments.md", + "references/slm-monorepo.md", + "references/slm-react-factory.md", + "references/slm-react-factory-composition.md", + "references/slm-react-composition-provider.md" + ] +} diff --git a/agents/frontend-architect/source/references.json b/agents/frontend-architect/source/references.json new file mode 100644 index 0000000..5150f0b --- /dev/null +++ b/agents/frontend-architect/source/references.json @@ -0,0 +1,36 @@ +{ + "references": [ + { + "source": "canons/slm-design/architecture/index.md", + "target": "references/slm-overview.md" + }, + { + "source": "canons/slm-design/architecture/layers.md", + "target": "references/slm-layers.md" + }, + { + "source": "canons/slm-design/architecture/modules.md", + "target": "references/slm-modules.md" + }, + { + "source": "canons/slm-design/architecture/segments.md", + "target": "references/slm-segments.md" + }, + { + "source": "canons/slm-design/architecture/monorepo.md", + "target": "references/slm-monorepo.md" + }, + { + "source": "canons/slm-design/examples/react/factory.md", + "target": "references/slm-react-factory.md" + }, + { + "source": "canons/slm-design/examples/react/factory-composition.md", + "target": "references/slm-react-factory-composition.md" + }, + { + "source": "canons/slm-design/examples/react/composition-provider.md", + "target": "references/slm-react-composition-provider.md" + } + ] +} diff --git a/package.json b/package.json index 630877e..3d35900 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "docs:prepare:template-sync-strategy": "tsx scripts/docs/prepare.ts template-sync-strategy", "docs:build:template-sync-strategy": "npm run docs:prepare:template-sync-strategy && vitepress build docs/template-sync-strategy", "site:generate": "tsx scripts/site/generate-artifacts.ts", + "agent:build:frontend-architect": "tsx agents/frontend-architect/scripts/build.ts", + "agents:build": "npm run agent:build:frontend-architect", "lint": "eslint .", "preview": "vite preview" }, diff --git a/public/template-sync-strategy/404.html b/public/template-sync-strategy/404.html deleted file mode 100644 index 22dbe0c..0000000 --- a/public/template-sync-strategy/404.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - 404 | Template Sync Strategy - - - - - - - - - - - - -
- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/assets/app.0Bzyh7PD.js b/public/template-sync-strategy/assets/app.0Bzyh7PD.js deleted file mode 100644 index 0ca2d83..0000000 --- a/public/template-sync-strategy/assets/app.0Bzyh7PD.js +++ /dev/null @@ -1 +0,0 @@ -import{R as p}from"./chunks/theme.CloMnL7i.js";import{R as s,a1 as i,a2 as u,a3 as c,a4 as l,a5 as f,a6 as d,a7 as m,a8 as h,a9 as g,aa as A,d as v,u as R,v as w,s as y,ab as C,ac as P,ad as b,a0 as E}from"./chunks/framework.B1nRs-GM.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=R();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),P(),b(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; diff --git a/public/template-sync-strategy/assets/chunks/framework.B1nRs-GM.js b/public/template-sync-strategy/assets/chunks/framework.B1nRs-GM.js deleted file mode 100644 index c2651db..0000000 --- a/public/template-sync-strategy/assets/chunks/framework.B1nRs-GM.js +++ /dev/null @@ -1,19 +0,0 @@ -/** -* @vue/shared v3.5.34 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Hs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const re={},Mt=[],qe=()=>{},Qr=()=>!1,rn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Nn=e=>e.startsWith("onUpdate:"),he=Object.assign,Ds=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Do=Object.prototype.hasOwnProperty,Z=(e,t)=>Do.call(e,t),K=Array.isArray,Pt=e=>on(e)==="[object Map]",Zr=e=>on(e)==="[object Set]",ir=e=>on(e)==="[object Date]",G=e=>typeof e=="function",le=e=>typeof e=="string",Oe=e=>typeof e=="symbol",Q=e=>e!==null&&typeof e=="object",ei=e=>(Q(e)||G(e))&&G(e.then)&&G(e.catch),ti=Object.prototype.toString,on=e=>ti.call(e),jo=e=>on(e).slice(8,-1),ni=e=>on(e)==="[object Object]",Fn=e=>le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,mt=Hs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Hn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$o=/-\w/g,xe=Hn(e=>e.replace($o,t=>t.slice(1).toUpperCase())),Vo=/\B([A-Z])/g,at=Hn(e=>e.replace(Vo,"-$1").toLowerCase()),Dn=Hn(e=>e.charAt(0).toUpperCase()+e.slice(1)),wn=Hn(e=>e?`on${Dn(e)}`:""),Ke=(e,t)=>!Object.is(e,t),es=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},ko=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Wo=e=>{const t=le(e)?Number(e):NaN;return isNaN(t)?e:t};let or;const jn=()=>or||(or=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function js(e){if(K(e)){const t={};for(let n=0;n{if(n){const s=n.split(Bo);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function $s(e){let t="";if(le(e))t=e;else if(K(e))for(let n=0;n!!(e&&e.__v_isRef===!0),Jo=e=>le(e)?e:e==null?"":K(e)||Q(e)&&(e.toString===ti||!G(e.toString))?ii(e)?Jo(e.value):JSON.stringify(e,oi,2):String(e),oi=(e,t)=>ii(t)?oi(e,t.value):Pt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[ts(s,i)+" =>"]=r,n),{})}:Zr(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>ts(n))}:Oe(t)?ts(t):Q(t)&&!K(t)&&!ni(t)?String(t):t,ts=(e,t="")=>{var n;return Oe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.34 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let de;class zo{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&de&&(de.active?(this.parent=de,this.index=(de.scopes||(de.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0){if(de===this)de=this.prevScope;else{let t=de;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(Kt){let t=Kt;for(Kt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Bt;){let t=Bt;for(Bt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function ui(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function di(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Us(s),Zo(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function xs(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(hi(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function hi(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Yt)||(e.globalVersion=Yt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!xs(e))))return;e.flags|=2;const t=e.dep,n=se,s=He;se=e,He=!0;try{ui(e);const r=e.fn(e._value);(t.version===0||Ke(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{se=n,He=s,di(e),e.flags&=-3}}function Us(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Us(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Zo(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const pi=[];function Qe(){pi.push(He),He=!1}function Ze(){const e=pi.pop();He=e===void 0?!0:e}function lr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=se;se=void 0;try{t()}finally{se=n}}}let Yt=0;class el{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class $n{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!se||!He||se===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==se)n=this.activeLink=new el(se,this),se.deps?(n.prevDep=se.depsTail,se.depsTail.nextDep=n,se.depsTail=n):se.deps=se.depsTail=n,gi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=se.depsTail,n.nextDep=void 0,se.depsTail.nextDep=n,se.depsTail=n,se.deps===n&&(se.deps=s)}return n}trigger(t){this.version++,Yt++,this.notify(t)}notify(t){ks();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ws()}}}function gi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)gi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const En=new WeakMap,vt=Symbol(""),Ts=Symbol(""),Jt=Symbol("");function ve(e,t,n){if(He&&se){let s=En.get(e);s||En.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new $n),r.map=s,r.key=n),r.track()}}function ze(e,t,n,s,r,i){const l=En.get(e);if(!l){Yt++;return}const o=c=>{c&&c.trigger()};if(ks(),t==="clear")l.forEach(o);else{const c=K(e),f=c&&Fn(n);if(c&&n==="length"){const a=Number(s);l.forEach((h,v)=>{(v==="length"||v===Jt||!Oe(v)&&v>=a)&&o(h)})}else switch((n!==void 0||l.has(void 0))&&o(l.get(n)),f&&o(l.get(Jt)),t){case"add":c?f&&o(l.get("length")):(o(l.get(vt)),Pt(e)&&o(l.get(Ts)));break;case"delete":c||(o(l.get(vt)),Pt(e)&&o(l.get(Ts)));break;case"set":Pt(e)&&o(l.get(vt));break}}Ws()}function tl(e,t){const n=En.get(e);return n&&n.get(t)}function At(e){const t=z(e);return t===e?t:(ve(t,"iterate",Jt),Re(e)?t:t.map(De))}function Vn(e){return ve(e=z(e),"iterate",Jt),e}function Be(e,t){return et(e)?Ft(lt(e)?De(t):t):De(t)}const nl={__proto__:null,[Symbol.iterator](){return ss(this,Symbol.iterator,e=>Be(this,e))},concat(...e){return At(this).concat(...e.map(t=>K(t)?At(t):t))},entries(){return ss(this,"entries",e=>(e[1]=Be(this,e[1]),e))},every(e,t){return Ge(this,"every",e,t,void 0,arguments)},filter(e,t){return Ge(this,"filter",e,t,n=>n.map(s=>Be(this,s)),arguments)},find(e,t){return Ge(this,"find",e,t,n=>Be(this,n),arguments)},findIndex(e,t){return Ge(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ge(this,"findLast",e,t,n=>Be(this,n),arguments)},findLastIndex(e,t){return Ge(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ge(this,"forEach",e,t,void 0,arguments)},includes(...e){return rs(this,"includes",e)},indexOf(...e){return rs(this,"indexOf",e)},join(e){return At(this).join(e)},lastIndexOf(...e){return rs(this,"lastIndexOf",e)},map(e,t){return Ge(this,"map",e,t,void 0,arguments)},pop(){return $t(this,"pop")},push(...e){return $t(this,"push",e)},reduce(e,...t){return cr(this,"reduce",e,t)},reduceRight(e,...t){return cr(this,"reduceRight",e,t)},shift(){return $t(this,"shift")},some(e,t){return Ge(this,"some",e,t,void 0,arguments)},splice(...e){return $t(this,"splice",e)},toReversed(){return At(this).toReversed()},toSorted(e){return At(this).toSorted(e)},toSpliced(...e){return At(this).toSpliced(...e)},unshift(...e){return $t(this,"unshift",e)},values(){return ss(this,"values",e=>Be(this,e))}};function ss(e,t,n){const s=Vn(e),r=s[t]();return s!==e&&!Re(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const sl=Array.prototype;function Ge(e,t,n,s,r,i){const l=Vn(e),o=l!==e&&!Re(e),c=l[t];if(c!==sl[t]){const h=c.apply(e,i);return o?De(h):h}let f=n;l!==e&&(o?f=function(h,v){return n.call(this,Be(e,h),v,e)}:n.length>2&&(f=function(h,v){return n.call(this,h,v,e)}));const a=c.call(l,f,s);return o&&r?r(a):a}function cr(e,t,n,s){const r=Vn(e),i=r!==e&&!Re(e);let l=n,o=!1;r!==e&&(i?(o=s.length===0,l=function(f,a,h){return o&&(o=!1,f=Be(e,f)),n.call(this,f,Be(e,a),h,e)}):n.length>3&&(l=function(f,a,h){return n.call(this,f,a,h,e)}));const c=r[t](l,...s);return o?Be(e,c):c}function rs(e,t,n){const s=z(e);ve(s,"iterate",Jt);const r=s[t](...n);return(r===-1||r===!1)&&kn(n[0])?(n[0]=z(n[0]),s[t](...n)):r}function $t(e,t,n=[]){Qe(),ks();const s=z(e)[t].apply(e,n);return Ws(),Ze(),s}const rl=Hs("__proto__,__v_isRef,__isVue"),mi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Oe));function il(e){Oe(e)||(e=String(e));const t=z(this);return ve(t,"has",e),t.hasOwnProperty(e)}class vi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?gl:wi:i?bi:_i).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const l=K(t);if(!r){let c;if(l&&(c=nl[n]))return c;if(n==="hasOwnProperty")return il}const o=Reflect.get(t,n,fe(t)?t:s);if((Oe(n)?mi.has(n):rl(n))||(r||ve(t,"get",n),i))return o;if(fe(o)){const c=l&&Fn(n)?o:o.value;return r&&Q(c)?zt(c):c}return Q(o)?r?zt(o):Nt(o):o}}class yi extends vi{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const l=K(t)&&Fn(n);if(!this._isShallow){const f=et(i);if(!Re(s)&&!et(s)&&(i=z(i),s=z(s)),!l&&fe(i)&&!fe(s))return f||(i.value=s),!0}const o=l?Number(n)e,un=e=>Reflect.getPrototypeOf(e);function fl(e,t,n){return function(...s){const r=this.__v_raw,i=z(r),l=Pt(i),o=e==="entries"||e===Symbol.iterator&&l,c=e==="keys"&&l,f=r[e](...s),a=n?Es:t?Ft:De;return!t&&ve(i,"iterate",c?Ts:vt),he(Object.create(f),{next(){const{value:h,done:v}=f.next();return v?{value:h,done:v}:{value:o?[a(h[0]),a(h[1])]:a(h),done:v}}})}}function dn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function ul(e,t){const n={get(r){const i=this.__v_raw,l=z(i),o=z(r);e||(Ke(r,o)&&ve(l,"get",r),ve(l,"get",o));const{has:c}=un(l),f=t?Es:e?Ft:De;if(c.call(l,r))return f(i.get(r));if(c.call(l,o))return f(i.get(o));i!==l&&i.get(r)},get size(){const r=this.__v_raw;return!e&&ve(z(r),"iterate",vt),r.size},has(r){const i=this.__v_raw,l=z(i),o=z(r);return e||(Ke(r,o)&&ve(l,"has",r),ve(l,"has",o)),r===o?i.has(r):i.has(r)||i.has(o)},forEach(r,i){const l=this,o=l.__v_raw,c=z(o),f=t?Es:e?Ft:De;return!e&&ve(c,"iterate",vt),o.forEach((a,h)=>r.call(i,f(a),f(h),l))}};return he(n,e?{add:dn("add"),set:dn("set"),delete:dn("delete"),clear:dn("clear")}:{add(r){const i=z(this),l=un(i),o=z(r),c=!t&&!Re(r)&&!et(r)?o:r;return l.has.call(i,c)||Ke(r,c)&&l.has.call(i,r)||Ke(o,c)&&l.has.call(i,o)||(i.add(c),ze(i,"add",c,c)),this},set(r,i){!t&&!Re(i)&&!et(i)&&(i=z(i));const l=z(this),{has:o,get:c}=un(l);let f=o.call(l,r);f||(r=z(r),f=o.call(l,r));const a=c.call(l,r);return l.set(r,i),f?Ke(i,a)&&ze(l,"set",r,i):ze(l,"add",r,i),this},delete(r){const i=z(this),{has:l,get:o}=un(i);let c=l.call(i,r);c||(r=z(r),c=l.call(i,r)),o&&o.call(i,r);const f=i.delete(r);return c&&ze(i,"delete",r,void 0),f},clear(){const r=z(this),i=r.size!==0,l=r.clear();return i&&ze(r,"clear",void 0,void 0),l}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=fl(r,e,t)}),n}function Bs(e,t){const n=ul(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const dl={get:Bs(!1,!1)},hl={get:Bs(!1,!0)},pl={get:Bs(!0,!1)};const _i=new WeakMap,bi=new WeakMap,wi=new WeakMap,gl=new WeakMap;function ml(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function vl(e){return e.__v_skip||!Object.isExtensible(e)?0:ml(jo(e))}function Nt(e){return et(e)?e:Ks(e,!1,ll,dl,_i)}function yl(e){return Ks(e,!1,al,hl,bi)}function zt(e){return Ks(e,!0,cl,pl,wi)}function Ks(e,t,n,s,r){if(!Q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=vl(e);if(i===0)return e;const l=r.get(e);if(l)return l;const o=new Proxy(e,i===2?s:n);return r.set(e,o),o}function lt(e){return et(e)?lt(e.__v_raw):!!(e&&e.__v_isReactive)}function et(e){return!!(e&&e.__v_isReadonly)}function Re(e){return!!(e&&e.__v_isShallow)}function kn(e){return e?!!e.__v_raw:!1}function z(e){const t=e&&e.__v_raw;return t?z(t):e}function Sn(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&si(e,"__v_skip",!0),e}const De=e=>Q(e)?Nt(e):e,Ft=e=>Q(e)?zt(e):e;function fe(e){return e?e.__v_isRef===!0:!1}function yt(e){return Si(e,!1)}function Le(e){return Si(e,!0)}function Si(e,t){return fe(e)?e:new _l(e,t)}class _l{constructor(t,n){this.dep=new $n,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:z(t),this._value=n?t:De(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Re(t)||et(t);t=s?t:z(t),Ke(t,n)&&(this._rawValue=t,this._value=s?t:De(t),this.dep.trigger())}}function Wn(e){return fe(e)?e.value:e}function ce(e){return G(e)?e():Wn(e)}const bl={get:(e,t,n)=>t==="__v_raw"?e:Wn(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return fe(r)&&!fe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function xi(e){return lt(e)?e:new Proxy(e,bl)}class wl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new $n,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Sl(e){return new wl(e)}class xl{constructor(t,n,s){this._object=t,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._key=Oe(n)?n:String(n),this._raw=z(t);let r=!0,i=t;if(!K(t)||Oe(this._key)||!Fn(this._key))do r=!kn(i)||Re(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=Wn(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&fe(this._raw[this._key])){const n=this._object[this._key];if(fe(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return tl(this._raw,this._key)}}class Tl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function El(e,t,n){return fe(e)?e:G(e)?new Tl(e):Q(e)&&arguments.length>1?Cl(e,t,n):yt(e)}function Cl(e,t,n){return new xl(e,t,n)}class Al{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new $n(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Yt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&se!==this)return fi(this,!0),!0}get value(){const t=this.dep.track();return hi(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Rl(e,t,n=!1){let s,r;return G(e)?s=e:(s=e.get,r=e.set),new Al(s,r,n)}const hn={},Cn=new WeakMap;let pt;function Ol(e,t=!1,n=pt){if(n){let s=Cn.get(n);s||Cn.set(n,s=[]),s.push(e)}}function Ml(e,t,n=re){const{immediate:s,deep:r,once:i,scheduler:l,augmentJob:o,call:c}=n,f=g=>r?g:Re(g)||r===!1||r===0?ot(g,1):ot(g);let a,h,v,_,I=!1,T=!1;if(fe(e)?(h=()=>e.value,I=Re(e)):lt(e)?(h=()=>f(e),I=!0):K(e)?(T=!0,I=e.some(g=>lt(g)||Re(g)),h=()=>e.map(g=>{if(fe(g))return g.value;if(lt(g))return f(g);if(G(g))return c?c(g,2):g()})):G(e)?t?h=c?()=>c(e,2):e:h=()=>{if(v){Qe();try{v()}finally{Ze()}}const g=pt;pt=a;try{return c?c(e,3,[_]):e(_)}finally{pt=g}}:h=qe,t&&r){const g=h,R=r===!0?1/0:r;h=()=>ot(g(),R)}const W=li(),H=()=>{a.stop(),W&&W.active&&Ds(W.effects,a)};if(i&&t){const g=t;t=(...R)=>{g(...R),H()}}let D=T?new Array(e.length).fill(hn):hn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const R=a.run();if(r||I||(T?R.some((k,O)=>Ke(k,D[O])):Ke(R,D))){v&&v();const k=pt;pt=a;try{const O=[R,D===hn?void 0:T&&D[0]===hn?[]:D,_];D=R,c?c(t,3,O):t(...O)}finally{pt=k}}}else a.run()};return o&&o(p),a=new ci(h),a.scheduler=l?()=>l(p,!1):p,_=g=>Ol(g,!1,a),v=a.onStop=()=>{const g=Cn.get(a);if(g){if(c)c(g,4);else for(const R of g)R();Cn.delete(a)}},t?s?p(!0):D=a.run():l?l(p.bind(null,!0),!0):a.run(),H.pause=a.pause.bind(a),H.resume=a.resume.bind(a),H.stop=H,H}function ot(e,t=1/0,n){if(t<=0||!Q(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,fe(e))ot(e.value,t,n);else if(K(e))for(let s=0;s{ot(s,t,n)});else if(ni(e)){for(const s in e)ot(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&ot(e[s],t,n)}return e}/** -* @vue/runtime-core v3.5.34 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function ln(e,t,n,s){try{return s?e(...s):e()}catch(r){Un(r,t,n)}}function je(e,t,n,s){if(G(e)){const r=ln(e,t,n,s);return r&&ei(r)&&r.catch(i=>{Un(i,t,n)}),r}if(K(e)){const r=[];for(let i=0;i>>1,r=be[s],i=Qt(r);i=Qt(n)?be.push(e):be.splice(Il(t),0,e),e.flags|=1,Ei()}}function Ei(){An||(An=Ti.then(Ci))}function Ll(e){K(e)?It.push(...e):it&&e.id===-1?it.splice(Ot+1,0,e):e.flags&1||(It.push(e),e.flags|=1),Ei()}function ar(e,t,n=ke+1){for(;nQt(n)-Qt(s));if(It.length=0,it){it.push(...t);return}for(it=t,Ot=0;Ote.id==null?e.flags&2?-1:1/0:e.id;function Ci(e){try{for(ke=0;ke{s._d&&In(-1);const i=On(t);let l;try{l=e(...r)}finally{On(i),s._d&&In(1)}return l};return s._n=!0,s._c=!0,s._d=!0,s}function We(e,t,n,s){const r=e.dirs,i=t&&t.dirs;for(let l=0;l1)return n&&G(t)?t.call(s&&s.proxy):t}}function Ri(){return!!(Et()||wt)}const Hl=Symbol.for("v-scx"),Dl=()=>_t(Hl);function Oi(e,t){return Kn(e,null,t)}function Tf(e,t){return Kn(e,null,{flush:"post"})}function Ne(e,t,n){return Kn(e,t,n)}function Kn(e,t,n=re){const{immediate:s,deep:r,flush:i,once:l}=n,o=he({},n),c=t&&s||!t&&i!=="post";let f;if(nn){if(i==="sync"){const _=Dl();f=_.__watcherHandles||(_.__watcherHandles=[])}else if(!c){const _=()=>{};return _.stop=qe,_.resume=qe,_.pause=qe,_}}const a=ye;o.call=(_,I,T)=>je(_,a,I,T);let h=!1;i==="post"?o.scheduler=_=>{Te(_,a&&a.suspense)}:i!=="sync"&&(h=!0,o.scheduler=(_,I)=>{I?_():qs(_)}),o.augmentJob=_=>{t&&(_.flags|=4),h&&(_.flags|=2,a&&(_.id=a.uid,_.i=a))};const v=Ml(e,t,o);return nn&&(f?f.push(v):c&&v()),v}function jl(e,t,n){const s=this.proxy,r=le(e)?e.includes(".")?Mi(s,e):()=>s[e]:e.bind(s,s);let i;G(t)?i=t:(i=t.handler,n=t);const l=cn(this),o=Kn(r,i.bind(s),n);return l(),o}function Mi(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,Ue=Symbol("_leaveCb"),Vt=Symbol("_enterCb");function Vl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ht(()=>{e.isMounted=!0}),Vi(()=>{e.isUnmounting=!0}),e}const Me=[Function,Array],Ii={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Me,onEnter:Me,onAfterEnter:Me,onEnterCancelled:Me,onBeforeLeave:Me,onLeave:Me,onAfterLeave:Me,onLeaveCancelled:Me,onBeforeAppear:Me,onAppear:Me,onAfterAppear:Me,onAppearCancelled:Me},Li=e=>{const t=e.subTree;return t.component?Li(t.component):t},kl={name:"BaseTransition",props:Ii,setup(e,{slots:t}){const n=Et(),s=Vl();return()=>{const r=t.default&&Hi(t.default(),!0),i=r&&r.length?Ni(r):n.subTree?Mc():void 0;if(!i)return;const l=z(e),{mode:o}=l;if(s.isLeaving)return is(i);const c=fr(i);if(!c)return is(i);let f=Cs(c,l,s,n,h=>f=h);c.type!==pe&&Zt(c,f);let a=n.subTree&&fr(n.subTree);if(a&&a.type!==pe&&!gt(a,c)&&Li(n).type!==pe){let h=Cs(a,l,s,n);if(Zt(a,h),o==="out-in"&&c.type!==pe)return s.isLeaving=!0,h.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,a=void 0},is(i);o==="in-out"&&c.type!==pe?h.delayLeave=(v,_,I)=>{const T=Fi(s,a);T[String(a.key)]=a,v[Ue]=()=>{_(),v[Ue]=void 0,delete f.delayedLeave,a=void 0},f.delayedLeave=()=>{I(),delete f.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function Ni(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==pe){t=n;break}}return t}const Wl=kl;function Fi(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Cs(e,t,n,s,r){const{appear:i,mode:l,persisted:o=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:v,onLeave:_,onAfterLeave:I,onLeaveCancelled:T,onBeforeAppear:W,onAppear:H,onAfterAppear:D,onAppearCancelled:p}=t,g=String(e.key),R=Fi(n,e),k=(E,M)=>{E&&je(E,s,9,M)},O=(E,M)=>{const C=M[1];k(E,M),K(E)?E.every(y=>y.length<=1)&&C():E.length<=1&&C()},B={mode:l,persisted:o,beforeEnter(E){let M=c;if(!n.isMounted)if(i)M=W||c;else return;E[Ue]&&E[Ue](!0);const C=R[g];C&>(e,C)&&C.el[Ue]&&C.el[Ue](),k(M,[E])},enter(E){if(R[g]===e)return;let M=f,C=a,y=h;if(!n.isMounted)if(i)M=H||f,C=D||a,y=p||h;else return;let N=!1;E[Vt]=ie=>{N||(N=!0,ie?k(y,[E]):k(C,[E]),B.delayedLeave&&B.delayedLeave(),E[Vt]=void 0)};const Y=E[Vt].bind(null,!1);M?O(M,[E,Y]):Y()},leave(E,M){const C=String(e.key);if(E[Vt]&&E[Vt](!0),n.isUnmounting)return M();k(v,[E]);let y=!1;E[Ue]=Y=>{y||(y=!0,M(),Y?k(T,[E]):k(I,[E]),E[Ue]=void 0,R[C]===e&&delete R[C])};const N=E[Ue].bind(null,!1);R[C]=e,_?O(_,[E,N]):N()},clone(E){const M=Cs(E,t,n,s,r);return r&&r(M),M}};return B}function is(e){if(qn(e))return e=ct(e),e.children=null,e}function fr(e){if(!qn(e))return Pi(e.type)&&e.children?Ni(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&G(n.default))return n.default()}}function Zt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Zt(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Hi(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iLt(T,t&&(K(t)?t[W]:t),n,s,r));return}if(bt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Lt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?Js(s.component):s.el,l=r?null:i,{i:o,r:c}=e,f=t&&t.r,a=o.refs===re?o.refs={}:o.refs,h=o.setupState,v=z(h),_=h===re?Qr:T=>ur(a,T)?!1:Z(v,T),I=(T,W)=>!(W&&ur(a,W));if(f!=null&&f!==c){if(dr(t),le(f))a[f]=null,_(f)&&(h[f]=null);else if(fe(f)){const T=t;I(f,T.k)&&(f.value=null),T.k&&(a[T.k]=null)}}if(G(c))ln(c,o,12,[l,a]);else{const T=le(c),W=fe(c);if(T||W){const H=()=>{if(e.f){const D=T?_(c)?h[c]:a[c]:I()||!e.k?c.value:a[e.k];if(r)K(D)&&Ds(D,i);else if(K(D))D.includes(i)||D.push(i);else if(T)a[c]=[i],_(c)&&(h[c]=a[c]);else{const p=[i];I(c,e.k)&&(c.value=p),e.k&&(a[e.k]=p)}}else T?(a[c]=l,_(c)&&(h[c]=l)):W&&(I(c,e.k)&&(c.value=l),e.k&&(a[e.k]=l))};if(l){const D=()=>{H(),Mn.delete(e)};D.id=-1,Mn.set(e,D),Te(D,n)}else dr(e),H()}}}function dr(e){const t=Mn.get(e);t&&(t.flags|=8,Mn.delete(e))}let hr=!1;const Rt=()=>{hr||(console.error("Hydration completed but contains mismatches."),hr=!0)},Ul=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Bl=e=>e.namespaceURI.includes("MathML"),pn=e=>{if(e.nodeType===1){if(Ul(e))return"svg";if(Bl(e))return"mathml"}},gn=e=>e.nodeType===8;function Kl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:l,remove:o,insert:c,createComment:f}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),Rn(),g._vnode=p;return}h(g.firstChild,p,null,null,null),Rn(),g._vnode=p},h=(p,g,R,k,O,B=!1)=>{B=B||!!g.dynamicChildren;const E=gn(p)&&p.data==="[",M=()=>T(p,g,R,k,O,E),{type:C,ref:y,shapeFlag:N,patchFlag:Y}=g;let ie=p.nodeType;g.el=p,Y===-2&&(B=!1,g.dynamicChildren=null);let V=null;switch(C){case St:ie!==3?g.children===""?(c(g.el=r(""),l(p),p),V=p):V=M():(p.data!==g.children&&(Rt(),p.data=g.children),V=i(p));break;case pe:D(p)?(V=i(p),H(g.el=p.content.firstChild,p,R)):ie!==8||E?V=M():V=i(p);break;case Gt:if(E&&(p=i(p),ie=p.nodeType),ie===1||ie===3){V=p;const X=!g.children.length;for(let j=0;j{B=B||!!g.dynamicChildren;const{type:E,props:M,patchFlag:C,shapeFlag:y,dirs:N,transition:Y}=g,ie=E==="input"||E==="option";if(ie||C!==-1){N&&We(g,null,R,"created");let V=!1;if(D(p)){V=io(null,Y)&&R&&R.vnode.props&&R.vnode.props.appear;const j=p.content.firstChild;if(V){const ee=j.getAttribute("class");ee&&(j.$cls=ee),Y.beforeEnter(j)}H(j,p,R),g.el=p=j}if(y&16&&!(M&&(M.innerHTML||M.textContent))){let j=_(p.firstChild,g,p,R,k,O,B);for(;j;){mn(p,1)||Rt();const ee=j;j=j.nextSibling,o(ee)}}else if(y&8){let j=g.children;j[0]===` -`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(j=j.slice(1));const{textContent:ee}=p;ee!==j&&ee!==j.replace(/\r\n|\r/g,` -`)&&(mn(p,0)||Rt(),p.textContent=g.children)}if(M){if(ie||!B||C&48){const j=p.tagName.includes("-");for(const ee in M)(ie&&(ee.endsWith("value")||ee==="indeterminate")||rn(ee)&&!mt(ee)||ee[0]==="."||j&&!mt(ee))&&s(p,ee,null,M[ee],void 0,R)}else if(M.onClick)s(p,"onClick",null,M.onClick,void 0,R);else if(C&4&<(M.style))for(const j in M.style)M.style[j]}let X;(X=M&&M.onVnodeBeforeMount)&&Pe(X,R,g),N&&We(g,null,R,"beforeMount"),((X=M&&M.onVnodeMounted)||N||V)&&fo(()=>{X&&Pe(X,R,g),V&&Y.enter(p),N&&We(g,null,R,"mounted")},k)}return p.nextSibling},_=(p,g,R,k,O,B,E)=>{E=E||!!g.dynamicChildren;const M=g.children,C=M.length;for(let y=0;y{const{slotScopeIds:E}=g;E&&(O=O?O.concat(E):E);const M=l(p),C=_(i(p),g,M,R,k,O,B);return C&&gn(C)&&C.data==="]"?i(g.anchor=C):(Rt(),c(g.anchor=f("]"),M,C),C)},T=(p,g,R,k,O,B)=>{if(mn(p.parentElement,1)||Rt(),g.el=null,B){const C=W(p);for(;;){const y=i(p);if(y&&y!==C)o(y);else break}}const E=i(p),M=l(p);return o(p),n(null,g,M,E,R,k,pn(M),O),R&&(R.vnode.el=g.el,Ji(R,g.el)),E},W=(p,g="[",R="]")=>{let k=0;for(;p;)if(p=i(p),p&&gn(p)&&(p.data===g&&k++,p.data===R)){if(k===0)return i(p);k--}return p},H=(p,g,R)=>{const k=g.parentNode;k&&k.replaceChild(p,g);let O=R;for(;O;)O.vnode.el===g&&(O.vnode.el=O.subTree.el=p),O=O.parent},D=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}const pr="data-allow-mismatch",ql={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function mn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(pr);)e=e.parentElement;const n=e&&e.getAttribute(pr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:s.includes(ql[t])}}jn().requestIdleCallback;jn().cancelIdleCallback;const bt=e=>!!e.type.__asyncLoader,qn=e=>e.type.__isKeepAlive;function Gl(e,t){$i(e,"a",t)}function Xl(e,t){$i(e,"da",t)}function $i(e,t,n=ye){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Gn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)qn(r.parent.vnode)&&Yl(s,t,n,r),r=r.parent}}function Yl(e,t,n,s){const r=Gn(t,e,s,!0);Xn(()=>{Ds(s[t],r)},n)}function Gn(e,t,n=ye,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...l)=>{Qe();const o=cn(n),c=je(t,n,e,l);return o(),Ze(),c});return s?r.unshift(i):r.push(i),i}}const st=e=>(t,n=ye)=>{(!nn||e==="sp")&&Gn(e,(...s)=>t(...s),n)},Jl=st("bm"),Ht=st("m"),zl=st("bu"),Ql=st("u"),Vi=st("bum"),Xn=st("um"),Zl=st("sp"),ec=st("rtg"),tc=st("rtc");function nc(e,t=ye){Gn("ec",e,t)}const ki="components";function Ef(e,t){return Ui(ki,e,!0,t)||e}const Wi=Symbol.for("v-ndc");function Cf(e){return le(e)?Ui(ki,e,!1)||e:e||Wi}function Ui(e,t,n=!0,s=!1){const r=Se||ye;if(r){const i=r.type;{const o=jc(i,!1);if(o&&(o===t||o===xe(t)||o===Dn(xe(t))))return i}const l=gr(r[e]||i[e],t)||gr(r.appContext[e],t);return!l&&s?i:l}}function gr(e,t){return e&&(e[t]||e[xe(t)]||e[Dn(xe(t))])}function Af(e,t,n,s){let r;const i=n,l=K(e);if(l||le(e)){const o=l&<(e);let c=!1,f=!1;o&&(c=!Re(e),f=et(e),e=Vn(e)),r=new Array(e.length);for(let a=0,h=e.length;at(o,c,void 0,i));else{const o=Object.keys(e);r=new Array(o.length);for(let c=0,f=o.length;c0;return t!=="default"&&(n.name=t),Ps(),Is(we,null,[ge("slot",n,s&&s())],f?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),Ps();const l=i&&Bi(i(n)),o=n.key||l&&l.key,c=Is(we,{key:(o&&!Oe(o)?o:`_${t}`)+(!l&&s?"_fb":"")},l||(s?s():[]),l&&e._===1?64:-2);return!r&&c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),i&&i._c&&(i._d=!0),c}function Bi(e){return e.some(t=>tn(t)?!(t.type===pe||t.type===we&&!Bi(t.children)):!0)?e:null}function Of(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:wn(s)]=e[s];return n}const As=e=>e?mo(e)?Js(e):As(e.parent):null,qt=he(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>As(e.parent),$root:e=>As(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>qi(e),$forceUpdate:e=>e.f||(e.f=()=>{qs(e.update)}),$nextTick:e=>e.n||(e.n=Bn.bind(e.proxy)),$watch:e=>jl.bind(e)}),os=(e,t)=>e!==re&&!e.__isScriptSetup&&Z(e,t),sc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:l,type:o,appContext:c}=e;if(t[0]!=="$"){const v=l[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(os(s,t))return l[t]=1,s[t];if(r!==re&&Z(r,t))return l[t]=2,r[t];if(Z(i,t))return l[t]=3,i[t];if(n!==re&&Z(n,t))return l[t]=4,n[t];Rs&&(l[t]=0)}}const f=qt[t];let a,h;if(f)return t==="$attrs"&&ve(e.attrs,"get",""),f(e);if((a=o.__cssModules)&&(a=a[t]))return a;if(n!==re&&Z(n,t))return l[t]=4,n[t];if(h=c.config.globalProperties,Z(h,t))return h[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return os(r,t)?(r[t]=n,!0):s!==re&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:l}},o){let c;return!!(n[o]||e!==re&&o[0]!=="$"&&Z(e,o)||os(t,o)||Z(i,o)||Z(s,o)||Z(qt,o)||Z(r.config.globalProperties,o)||(c=l.__cssModules)&&c[o])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Mf(){return rc().slots}function rc(e){const t=Et();return t.setupContext||(t.setupContext=yo(t))}function mr(e){return K(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Rs=!0;function ic(e){const t=qi(e),n=e.proxy,s=e.ctx;Rs=!1,t.beforeCreate&&vr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:l,watch:o,provide:c,inject:f,created:a,beforeMount:h,mounted:v,beforeUpdate:_,updated:I,activated:T,deactivated:W,beforeDestroy:H,beforeUnmount:D,destroyed:p,unmounted:g,render:R,renderTracked:k,renderTriggered:O,errorCaptured:B,serverPrefetch:E,expose:M,inheritAttrs:C,components:y,directives:N,filters:Y}=t;if(f&&oc(f,s,null),l)for(const X in l){const j=l[X];G(j)&&(s[X]=j.bind(n))}if(r){const X=r.call(n,n);Q(X)&&(e.data=Nt(X))}if(Rs=!0,i)for(const X in i){const j=i[X],ee=G(j)?j.bind(n,n):G(j.get)?j.get.bind(n,n):qe,an=!G(j)&&G(j.set)?j.set.bind(n):qe,ft=oe({get:ee,set:an});Object.defineProperty(s,X,{enumerable:!0,configurable:!0,get:()=>ft.value,set:$e=>ft.value=$e})}if(o)for(const X in o)Ki(o[X],s,n,X);if(c){const X=G(c)?c.call(n):c;Reflect.ownKeys(X).forEach(j=>{Fl(j,X[j])})}a&&vr(a,e,"c");function V(X,j){K(j)?j.forEach(ee=>X(ee.bind(n))):j&&X(j.bind(n))}if(V(Jl,h),V(Ht,v),V(zl,_),V(Ql,I),V(Gl,T),V(Xl,W),V(nc,B),V(tc,k),V(ec,O),V(Vi,D),V(Xn,g),V(Zl,E),K(M))if(M.length){const X=e.exposed||(e.exposed={});M.forEach(j=>{Object.defineProperty(X,j,{get:()=>n[j],set:ee=>n[j]=ee,enumerable:!0})})}else e.exposed||(e.exposed={});R&&e.render===qe&&(e.render=R),C!=null&&(e.inheritAttrs=C),y&&(e.components=y),N&&(e.directives=N),E&&ji(e)}function oc(e,t,n=qe){K(e)&&(e=Os(e));for(const s in e){const r=e[s];let i;Q(r)?"default"in r?i=_t(r.from||s,r.default,!0):i=_t(r.from||s):i=_t(r),fe(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:l=>i.value=l}):t[s]=i}}function vr(e,t,n){je(K(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ki(e,t,n,s){let r=s.includes(".")?Mi(n,s):()=>n[s];if(le(e)){const i=t[e];G(i)&&Ne(r,i)}else if(G(e))Ne(r,e.bind(n));else if(Q(e))if(K(e))e.forEach(i=>Ki(i,t,n,s));else{const i=G(e.handler)?e.handler.bind(n):t[e.handler];G(i)&&Ne(r,i,e)}}function qi(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:l}}=e.appContext,o=i.get(t);let c;return o?c=o:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(f=>Pn(c,f,l,!0)),Pn(c,t,l)),Q(t)&&i.set(t,c),c}function Pn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Pn(e,i,n,!0),r&&r.forEach(l=>Pn(e,l,n,!0));for(const l in t)if(!(s&&l==="expose")){const o=lc[l]||n&&n[l];e[l]=o?o(e[l],t[l]):t[l]}return e}const lc={data:yr,props:_r,emits:_r,methods:Wt,computed:Wt,beforeCreate:_e,created:_e,beforeMount:_e,mounted:_e,beforeUpdate:_e,updated:_e,beforeDestroy:_e,beforeUnmount:_e,destroyed:_e,unmounted:_e,activated:_e,deactivated:_e,errorCaptured:_e,serverPrefetch:_e,components:Wt,directives:Wt,watch:ac,provide:yr,inject:cc};function yr(e,t){return t?e?function(){return he(G(e)?e.call(this,this):e,G(t)?t.call(this,this):t)}:t:e}function cc(e,t){return Wt(Os(e),Os(t))}function Os(e){if(K(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${xe(t)}Modifiers`]||e[`${at(t)}Modifiers`];function hc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||re;let r=n;const i=t.startsWith("update:"),l=i&&dc(s,t.slice(7));l&&(l.trim&&(r=n.map(a=>le(a)?a.trim():a)),l.number&&(r=n.map(ko)));let o,c=s[o=wn(t)]||s[o=wn(xe(t))];!c&&i&&(c=s[o=wn(at(t))]),c&&je(c,e,6,r);const f=s[o+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[o])return;e.emitted[o]=!0,je(f,e,6,r)}}const pc=new WeakMap;function Xi(e,t,n=!1){const s=n?pc:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let l={},o=!1;if(!G(e)){const c=f=>{const a=Xi(f,t,!0);a&&(o=!0,he(l,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!o?(Q(e)&&s.set(e,null),null):(K(i)?i.forEach(c=>l[c]=null):he(l,i),Q(e)&&s.set(e,l),l)}function Yn(e,t){return!e||!rn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,at(t))||Z(e,t))}function ls(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:l,attrs:o,emit:c,render:f,renderCache:a,props:h,data:v,setupState:_,ctx:I,inheritAttrs:T}=e,W=On(e);let H,D;try{if(n.shapeFlag&4){const g=r||s,R=g;H=Ie(f.call(R,g,a,h,_,v,I)),D=o}else{const g=t;H=Ie(g.length>1?g(h,{attrs:o,slots:l,emit:c}):g(h,null)),D=t.props?o:gc(o)}}catch(g){Xt.length=0,Un(g,e,1),H=ge(pe)}let p=H;if(D&&T!==!1){const g=Object.keys(D),{shapeFlag:R}=p;g.length&&R&7&&(i&&g.some(Nn)&&(D=mc(D,i)),p=ct(p,D,!1,!0))}return n.dirs&&(p=ct(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&Zt(p,n.transition),H=p,On(W),H}const gc=e=>{let t;for(const n in e)(n==="class"||n==="style"||rn(n))&&((t||(t={}))[n]=e[n]);return t},mc=(e,t)=>{const n={};for(const s in e)(!Nn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function vc(e,t,n){const{props:s,children:r,component:i}=e,{props:l,children:o,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?br(s,l,f):!!l;if(c&8){const a=t.dynamicProps;for(let h=0;hObject.create(zi),Zi=e=>Object.getPrototypeOf(e)===zi;function yc(e,t,n,s=!1){const r={},i=Qi();e.propsDefaults=Object.create(null),eo(e,t,r,i);for(const l in e.propsOptions[0])l in r||(r[l]=void 0);n?e.props=s?r:yl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function _c(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:l}}=e,o=z(r),[c]=e.propsOptions;let f=!1;if((s||l>0)&&!(l&16)){if(l&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[v,_]=to(h,t,!0);he(l,v),_&&o.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return Q(e)&&s.set(e,Mt),Mt;if(K(i))for(let a=0;ae==="_"||e==="_ctx"||e==="$stable",Xs=e=>K(e)?e.map(Ie):[Ie(e)],wc=(e,t,n)=>{if(t._n)return t;const s=Nl((...r)=>Xs(t(...r)),n);return s._c=!1,s},no=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Gs(r))continue;const i=e[r];if(G(i))t[r]=wc(r,i,s);else if(i!=null){const l=Xs(i);t[r]=()=>l}}},so=(e,t)=>{const n=Xs(t);e.slots.default=()=>n},ro=(e,t,n)=>{for(const s in t)(n||!Gs(s))&&(e[s]=t[s])},Sc=(e,t,n)=>{const s=e.slots=Qi();if(e.vnode.shapeFlag&32){const r=t._;r?(ro(s,t,n),n&&si(s,"_",r,!0)):no(t,s)}else t&&so(e,t)},xc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,l=re;if(s.shapeFlag&32){const o=t._;o?n&&o===1?i=!1:ro(r,t,n):(i=!t.$stable,no(t,r)),l=t}else t&&(so(e,t),l={default:1});if(i)for(const o in r)!Gs(o)&&l[o]==null&&delete r[o]},Te=fo;function Tc(e){return Ec(e,Kl)}function Ec(e,t){const n=jn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:l,createText:o,createComment:c,setText:f,setElementText:a,parentNode:h,nextSibling:v,setScopeId:_=qe,insertStaticContent:I}=e,T=(u,d,m,x=null,b=null,w=null,L=void 0,P=null,A=!!d.dynamicChildren)=>{if(u===d)return;u&&!gt(u,d)&&(x=fn(u),$e(u,b,w,!0),u=null),d.patchFlag===-2&&(A=!1,d.dynamicChildren=null);const{type:S,ref:U,shapeFlag:F}=d;switch(S){case St:W(u,d,m,x);break;case pe:H(u,d,m,x);break;case Gt:u==null&&D(d,m,x,L);break;case we:y(u,d,m,x,b,w,L,P,A);break;default:F&1?R(u,d,m,x,b,w,L,P,A):F&6?N(u,d,m,x,b,w,L,P,A):(F&64||F&128)&&S.process(u,d,m,x,b,w,L,P,A,Ct)}U!=null&&b?Lt(U,u&&u.ref,w,d||u,!d):U==null&&u&&u.ref!=null&&Lt(u.ref,null,w,u,!0)},W=(u,d,m,x)=>{if(u==null)s(d.el=o(d.children),m,x);else{const b=d.el=u.el;d.children!==u.children&&f(b,d.children)}},H=(u,d,m,x)=>{u==null?s(d.el=c(d.children||""),m,x):d.el=u.el},D=(u,d,m,x)=>{[u.el,u.anchor]=I(u.children,d,m,x,u.el,u.anchor)},p=({el:u,anchor:d},m,x)=>{let b;for(;u&&u!==d;)b=v(u),s(u,m,x),u=b;s(d,m,x)},g=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=v(u),r(u),u=m;r(d)},R=(u,d,m,x,b,w,L,P,A)=>{if(d.type==="svg"?L="svg":d.type==="math"&&(L="mathml"),u==null)k(d,m,x,b,w,L,P,A);else{const S=u.el&&u.el._isVueCE?u.el:null;try{S&&S._beginPatch(),E(u,d,b,w,L,P,A)}finally{S&&S._endPatch()}}},k=(u,d,m,x,b,w,L,P)=>{let A,S;const{props:U,shapeFlag:F,transition:$,dirs:q}=u;if(A=u.el=l(u.type,w,U&&U.is,U),F&8?a(A,u.children):F&16&&B(u.children,A,null,x,b,cs(u,w),L,P),q&&We(u,null,x,"created"),O(A,u,u.scopeId,L,x),U){for(const te in U)te!=="value"&&!mt(te)&&i(A,te,null,U[te],w,x);"value"in U&&i(A,"value",null,U.value,w),(S=U.onVnodeBeforeMount)&&Pe(S,x,u)}q&&We(u,null,x,"beforeMount");const J=io(b,$);J&&$.beforeEnter(A),s(A,d,m),((S=U&&U.onVnodeMounted)||J||q)&&Te(()=>{try{S&&Pe(S,x,u),J&&$.enter(A),q&&We(u,null,x,"mounted")}finally{}},b)},O=(u,d,m,x,b)=>{if(m&&_(u,m),x)for(let w=0;w{for(let S=A;S{const P=d.el=u.el;let{patchFlag:A,dynamicChildren:S,dirs:U}=d;A|=u.patchFlag&16;const F=u.props||re,$=d.props||re;let q;if(m&&ut(m,!1),(q=$.onVnodeBeforeUpdate)&&Pe(q,m,d,u),U&&We(d,u,m,"beforeUpdate"),m&&ut(m,!0),(F.innerHTML&&$.innerHTML==null||F.textContent&&$.textContent==null)&&a(P,""),S?M(u.dynamicChildren,S,P,m,x,cs(d,b),w):L||j(u,d,P,null,m,x,cs(d,b),w,!1),A>0){if(A&16)C(P,F,$,m,b);else if(A&2&&F.class!==$.class&&i(P,"class",null,$.class,b),A&4&&i(P,"style",F.style,$.style,b),A&8){const J=d.dynamicProps;for(let te=0;te{q&&Pe(q,m,d,u),U&&We(d,u,m,"updated")},x)},M=(u,d,m,x,b,w,L)=>{for(let P=0;P{if(d!==m){if(d!==re)for(const w in d)!mt(w)&&!(w in m)&&i(u,w,d[w],null,b,x);for(const w in m){if(mt(w))continue;const L=m[w],P=d[w];L!==P&&w!=="value"&&i(u,w,P,L,b,x)}"value"in m&&i(u,"value",d.value,m.value,b)}},y=(u,d,m,x,b,w,L,P,A)=>{const S=d.el=u?u.el:o(""),U=d.anchor=u?u.anchor:o("");let{patchFlag:F,dynamicChildren:$,slotScopeIds:q}=d;q&&(P=P?P.concat(q):q),u==null?(s(S,m,x),s(U,m,x),B(d.children||[],m,U,b,w,L,P,A)):F>0&&F&64&&$&&u.dynamicChildren&&u.dynamicChildren.length===$.length?(M(u.dynamicChildren,$,m,b,w,L,P),(d.key!=null||b&&d===b.subTree)&&oo(u,d,!0)):j(u,d,m,U,b,w,L,P,A)},N=(u,d,m,x,b,w,L,P,A)=>{d.slotScopeIds=P,u==null?d.shapeFlag&512?b.ctx.activate(d,m,x,L,A):Y(d,m,x,b,w,L,A):ie(u,d,A)},Y=(u,d,m,x,b,w,L)=>{const P=u.component=Nc(u,x,b);if(qn(u)&&(P.ctx.renderer=Ct),Fc(P,!1,L),P.asyncDep){if(b&&b.registerDep(P,V,L),!u.el){const A=P.subTree=ge(pe);H(null,A,d,m),u.placeholder=A.el}}else V(P,u,d,m,b,w,L)},ie=(u,d,m)=>{const x=d.component=u.component;if(vc(u,d,m))if(x.asyncDep&&!x.asyncResolved){X(x,d,m);return}else x.next=d,x.update();else d.el=u.el,x.vnode=d},V=(u,d,m,x,b,w,L)=>{const P=()=>{if(u.isMounted){let{next:F,bu:$,u:q,parent:J,vnode:te}=u;{const Ee=lo(u);if(Ee){F&&(F.el=te.el,X(u,F,L)),Ee.asyncDep.then(()=>{Te(()=>{u.isUnmounted||S()},b)});return}}let ne=F,ae;ut(u,!1),F?(F.el=te.el,X(u,F,L)):F=te,$&&es($),(ae=F.props&&F.props.onVnodeBeforeUpdate)&&Pe(ae,J,F,te),ut(u,!0);const ue=ls(u),Fe=u.subTree;u.subTree=ue,T(Fe,ue,h(Fe.el),fn(Fe),u,b,w),F.el=ue.el,ne===null&&Ji(u,ue.el),q&&Te(q,b),(ae=F.props&&F.props.onVnodeUpdated)&&Te(()=>Pe(ae,J,F,te),b)}else{let F;const{el:$,props:q}=d,{bm:J,m:te,parent:ne,root:ae,type:ue}=u,Fe=bt(d);if(ut(u,!1),J&&es(J),!Fe&&(F=q&&q.onVnodeBeforeMount)&&Pe(F,ne,d),ut(u,!0),$&&Zn){const Ee=()=>{u.subTree=ls(u),Zn($,u.subTree,u,b,null)};Fe&&ue.__asyncHydrate?ue.__asyncHydrate($,u,Ee):Ee()}else{ae.ce&&ae.ce._hasShadowRoot()&&ae.ce._injectChildStyle(ue,u.parent?u.parent.type:void 0);const Ee=u.subTree=ls(u);T(null,Ee,m,x,u,b,w),d.el=Ee.el}if(te&&Te(te,b),!Fe&&(F=q&&q.onVnodeMounted)){const Ee=d;Te(()=>Pe(F,ne,Ee),b)}(d.shapeFlag&256||ne&&bt(ne.vnode)&&ne.vnode.shapeFlag&256)&&u.a&&Te(u.a,b),u.isMounted=!0,d=m=x=null}};u.scope.on();const A=u.effect=new ci(P);u.scope.off();const S=u.update=A.run.bind(A),U=u.job=A.runIfDirty.bind(A);U.i=u,U.id=u.uid,A.scheduler=()=>qs(U),ut(u,!0),S()},X=(u,d,m)=>{d.component=u;const x=u.vnode.props;u.vnode=d,u.next=null,_c(u,d.props,x,m),xc(u,d.children,m),Qe(),ar(u),Ze()},j=(u,d,m,x,b,w,L,P,A=!1)=>{const S=u&&u.children,U=u?u.shapeFlag:0,F=d.children,{patchFlag:$,shapeFlag:q}=d;if($>0){if($&128){an(S,F,m,x,b,w,L,P,A);return}else if($&256){ee(S,F,m,x,b,w,L,P,A);return}}q&8?(U&16&&Dt(S,b,w),F!==S&&a(m,F)):U&16?q&16?an(S,F,m,x,b,w,L,P,A):Dt(S,b,w,!0):(U&8&&a(m,""),q&16&&B(F,m,x,b,w,L,P,A))},ee=(u,d,m,x,b,w,L,P,A)=>{u=u||Mt,d=d||Mt;const S=u.length,U=d.length,F=Math.min(S,U);let $;for($=0;$U?Dt(u,b,w,!0,!1,F):B(d,m,x,b,w,L,P,A,F)},an=(u,d,m,x,b,w,L,P,A)=>{let S=0;const U=d.length;let F=u.length-1,$=U-1;for(;S<=F&&S<=$;){const q=u[S],J=d[S]=A?Je(d[S]):Ie(d[S]);if(gt(q,J))T(q,J,m,null,b,w,L,P,A);else break;S++}for(;S<=F&&S<=$;){const q=u[F],J=d[$]=A?Je(d[$]):Ie(d[$]);if(gt(q,J))T(q,J,m,null,b,w,L,P,A);else break;F--,$--}if(S>F){if(S<=$){const q=$+1,J=q$)for(;S<=F;)$e(u[S],b,w,!0),S++;else{const q=S,J=S,te=new Map;for(S=J;S<=$;S++){const Ce=d[S]=A?Je(d[S]):Ie(d[S]);Ce.key!=null&&te.set(Ce.key,S)}let ne,ae=0;const ue=$-J+1;let Fe=!1,Ee=0;const jt=new Array(ue);for(S=0;S=ue){$e(Ce,b,w,!0);continue}let Ve;if(Ce.key!=null)Ve=te.get(Ce.key);else for(ne=J;ne<=$;ne++)if(jt[ne-J]===0&>(Ce,d[ne])){Ve=ne;break}Ve===void 0?$e(Ce,b,w,!0):(jt[Ve-J]=S+1,Ve>=Ee?Ee=Ve:Fe=!0,T(Ce,d[Ve],m,null,b,w,L,P,A),ae++)}const nr=Fe?Cc(jt):Mt;for(ne=nr.length-1,S=ue-1;S>=0;S--){const Ce=J+S,Ve=d[Ce],sr=d[Ce+1],rr=Ce+1{const{el:w,type:L,transition:P,children:A,shapeFlag:S}=u;if(S&6){ft(u.component.subTree,d,m,x);return}if(S&128){u.suspense.move(d,m,x);return}if(S&64){L.move(u,d,m,Ct);return}if(L===we){s(w,d,m);for(let F=0;FP.enter(w),b);else{const{leave:F,delayLeave:$,afterLeave:q}=P,J=()=>{u.ctx.isUnmounted?r(w):s(w,d,m)},te=()=>{w._isLeaving&&w[Ue](!0),F(w,()=>{J(),q&&q()})};$?$(w,J,te):te()}else s(w,d,m)},$e=(u,d,m,x=!1,b=!1)=>{const{type:w,props:L,ref:P,children:A,dynamicChildren:S,shapeFlag:U,patchFlag:F,dirs:$,cacheIndex:q,memo:J}=u;if(F===-2&&(b=!1),P!=null&&(Qe(),Lt(P,null,m,u,!0),Ze()),q!=null&&(d.renderCache[q]=void 0),U&256){d.ctx.deactivate(u);return}const te=U&1&&$,ne=!bt(u);let ae;if(ne&&(ae=L&&L.onVnodeBeforeUnmount)&&Pe(ae,d,u),U&6)Ho(u.component,m,x);else{if(U&128){u.suspense.unmount(m,x);return}te&&We(u,null,d,"beforeUnmount"),U&64?u.type.remove(u,d,m,Ct,x):S&&!S.hasOnce&&(w!==we||F>0&&F&64)?Dt(S,d,m,!1,!0):(w===we&&F&384||!b&&U&16)&&Dt(A,d,m),x&&er(u)}const ue=J!=null&&q==null;(ne&&(ae=L&&L.onVnodeUnmounted)||te||ue)&&Te(()=>{ae&&Pe(ae,d,u),te&&We(u,null,d,"unmounted"),ue&&(u.el=null)},m)},er=u=>{const{type:d,el:m,anchor:x,transition:b}=u;if(d===we){Fo(m,x);return}if(d===Gt){g(u);return}const w=()=>{r(m),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(u.shapeFlag&1&&b&&!b.persisted){const{leave:L,delayLeave:P}=b,A=()=>L(m,w);P?P(u.el,w,A):A()}else w()},Fo=(u,d)=>{let m;for(;u!==d;)m=v(u),r(u),u=m;r(d)},Ho=(u,d,m)=>{const{bum:x,scope:b,job:w,subTree:L,um:P,m:A,a:S}=u;Sr(A),Sr(S),x&&es(x),b.stop(),w&&(w.flags|=8,$e(L,u,d,m)),P&&Te(P,d),Te(()=>{u.isUnmounted=!0},d)},Dt=(u,d,m,x=!1,b=!1,w=0)=>{for(let L=w;L{if(u.shapeFlag&6)return fn(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=v(u.anchor||u.el),m=d&&d[$l];return m?v(m):d};let zn=!1;const tr=(u,d,m)=>{let x;u==null?d._vnode&&($e(d._vnode,null,null,!0),x=d._vnode.component):T(d._vnode||null,u,d,null,null,null,m),d._vnode=u,zn||(zn=!0,ar(x),Rn(),zn=!1)},Ct={p:T,um:$e,m:ft,r:er,mt:Y,mc:B,pc:j,pbc:M,n:fn,o:e};let Qn,Zn;return t&&([Qn,Zn]=t(Ct)),{render:tr,hydrate:Qn,createApp:uc(tr,Qn)}}function cs({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function ut({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function io(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function oo(e,t,n=!1){const s=e.children,r=t.children;if(K(s)&&K(r))for(let i=0;i>1,e[n[o]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,l=n[i-1];i-- >0;)n[i]=l,l=t[l];return n}function lo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:lo(t)}function Sr(e){if(e)for(let t=0;te.__isSuspense;function fo(e,t){t&&t.pendingBranch?K(e)?t.effects.push(...e):t.effects.push(e):Ll(e)}const we=Symbol.for("v-fgt"),St=Symbol.for("v-txt"),pe=Symbol.for("v-cmt"),Gt=Symbol.for("v-stc"),Xt=[];let Ae=null;function Ps(e=!1){Xt.push(Ae=e?null:[])}function Ac(){Xt.pop(),Ae=Xt[Xt.length-1]||null}let en=1;function In(e,t=!1){en+=e,e<0&&Ae&&t&&(Ae.hasOnce=!0)}function uo(e){return e.dynamicChildren=en>0?Ae||Mt:null,Ac(),en>0&&Ae&&Ae.push(e),e}function Pf(e,t,n,s,r,i){return uo(po(e,t,n,s,r,i,!0))}function Is(e,t,n,s,r){return uo(ge(e,t,n,s,r,!0))}function tn(e){return e?e.__v_isVNode===!0:!1}function gt(e,t){return e.type===t.type&&e.key===t.key}const ho=({key:e})=>e??null,xn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?le(e)||fe(e)||G(e)?{i:Se,r:e,k:t,f:!!n}:e:null);function po(e,t=null,n=null,s=0,r=null,i=e===we?0:1,l=!1,o=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ho(t),ref:t&&xn(t),scopeId:Ai,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:Se};return o?(Ys(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=le(n)?8:16),en>0&&!l&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const ge=Rc;function Rc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Wi)&&(e=pe),tn(e)){const o=ct(e,t,!0);return n&&Ys(o,n),en>0&&!i&&Ae&&(o.shapeFlag&6?Ae[Ae.indexOf(e)]=o:Ae.push(o)),o.patchFlag=-2,o}if($c(e)&&(e=e.__vccOpts),t){t=Oc(t);let{class:o,style:c}=t;o&&!le(o)&&(t.class=$s(o)),Q(c)&&(kn(c)&&!K(c)&&(c=he({},c)),t.style=js(c))}const l=le(e)?1:ao(e)?128:Pi(e)?64:Q(e)?4:G(e)?2:0;return po(e,t,n,s,r,l,i,!0)}function Oc(e){return e?kn(e)||Zi(e)?he({},e):e:null}function ct(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:l,children:o,transition:c}=e,f=t?Pc(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&ho(f),ref:t&&t.ref?n&&i?K(i)?i.concat(xn(t)):[i,xn(t)]:xn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==we?l===-1?16:l|16:l,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ct(e.ssContent),ssFallback:e.ssFallback&&ct(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Zt(a,c.clone(a)),a}function go(e=" ",t=0){return ge(St,null,e,t)}function If(e,t){const n=ge(Gt,null,e);return n.staticCount=t,n}function Mc(e="",t=!1){return t?(Ps(),Is(pe,null,e)):ge(pe,null,e)}function Ie(e){return e==null||typeof e=="boolean"?ge(pe):K(e)?ge(we,null,e.slice()):tn(e)?Je(e):ge(St,null,String(e))}function Je(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ct(e)}function Ys(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(K(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Ys(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!Zi(t)?t._ctx=Se:r===3&&Se&&(Se.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else G(t)?(t={default:t,_ctx:Se},n=32):(t=String(t),s&64?(n=16,t=[go(t)]):n=8);e.children=t,e.shapeFlag|=n}function Pc(...e){const t={};for(let n=0;nye||Se;let Ln,Ls;{const e=jn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(l=>l(i)):r[0](i)}};Ln=t("__VUE_INSTANCE_SETTERS__",n=>ye=n),Ls=t("__VUE_SSR_SETTERS__",n=>nn=n)}const cn=e=>{const t=ye;return Ln(e),e.scope.on(),()=>{e.scope.off(),Ln(t)}},xr=()=>{ye&&ye.scope.off(),Ln(null)};function mo(e){return e.vnode.shapeFlag&4}let nn=!1;function Fc(e,t=!1,n=!1){t&&Ls(t);const{props:s,children:r}=e.vnode,i=mo(e);yc(e,s,i,t),Sc(e,r,n||t);const l=i?Hc(e,t):void 0;return t&&Ls(!1),l}function Hc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,sc);const{setup:s}=n;if(s){Qe();const r=e.setupContext=s.length>1?yo(e):null,i=cn(e),l=ln(s,e,0,[e.props,r]),o=ei(l);if(Ze(),i(),(o||e.sp)&&!bt(e)&&ji(e),o){if(l.then(xr,xr),t)return l.then(c=>{Tr(e,c)}).catch(c=>{Un(c,e,0)});e.asyncDep=l}else Tr(e,l)}else vo(e)}function Tr(e,t,n){G(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Q(t)&&(e.setupState=xi(t)),vo(e)}function vo(e,t,n){const s=e.type;e.render||(e.render=s.render||qe);{const r=cn(e);Qe();try{ic(e)}finally{Ze(),r()}}}const Dc={get(e,t){return ve(e,"get",""),e[t]}};function yo(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Dc),slots:e.slots,emit:e.emit,expose:t}}function Js(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(xi(Sn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in qt)return qt[n](e)},has(t,n){return n in t||n in qt}})):e.proxy}function jc(e,t=!0){return G(e)?e.displayName||e.name:e.name||t&&e.__name}function $c(e){return G(e)&&"__vccOpts"in e}const oe=(e,t)=>Rl(e,t,nn);function Ns(e,t,n){try{In(-1);const s=arguments.length;return s===2?Q(t)&&!K(t)?tn(t)?ge(e,null,[t]):ge(e,t):ge(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&tn(n)&&(n=[n]),ge(e,t,n))}finally{In(1)}}const Vc="3.5.34";/** -* @vue/runtime-dom v3.5.34 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Fs;const Er=typeof window<"u"&&window.trustedTypes;if(Er)try{Fs=Er.createPolicy("vue",{createHTML:e=>e})}catch{}const _o=Fs?e=>Fs.createHTML(e):e=>e,kc="http://www.w3.org/2000/svg",Wc="http://www.w3.org/1998/Math/MathML",Ye=typeof document<"u"?document:null,Cr=Ye&&Ye.createElement("template"),Uc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Ye.createElementNS(kc,e):t==="mathml"?Ye.createElementNS(Wc,e):n?Ye.createElement(e,{is:n}):Ye.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Ye.createTextNode(e),createComment:e=>Ye.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ye.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const l=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Cr.innerHTML=_o(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const o=Cr.content;if(s==="svg"||s==="mathml"){const c=o.firstChild;for(;c.firstChild;)o.appendChild(c.firstChild);o.removeChild(c)}t.insertBefore(o,n)}return[l?l.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},rt="transition",kt="animation",sn=Symbol("_vtc"),bo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Bc=he({},Ii,bo),Kc=e=>(e.displayName="Transition",e.props=Bc,e),Lf=Kc((e,{slots:t})=>Ns(Wl,qc(e),t)),dt=(e,t=[])=>{K(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ar=e=>e?K(e)?e.some(t=>t.length>1):e.length>1:!1;function qc(e){const t={};for(const y in e)y in bo||(t[y]=e[y]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:l=`${n}-enter-active`,enterToClass:o=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=l,appearToClass:a=o,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:v=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,I=Gc(r),T=I&&I[0],W=I&&I[1],{onBeforeEnter:H,onEnter:D,onEnterCancelled:p,onLeave:g,onLeaveCancelled:R,onBeforeAppear:k=H,onAppear:O=D,onAppearCancelled:B=p}=t,E=(y,N,Y,ie)=>{y._enterCancelled=ie,ht(y,N?a:o),ht(y,N?f:l),Y&&Y()},M=(y,N)=>{y._isLeaving=!1,ht(y,h),ht(y,_),ht(y,v),N&&N()},C=y=>(N,Y)=>{const ie=y?O:D,V=()=>E(N,y,Y);dt(ie,[N,V]),Rr(()=>{ht(N,y?c:i),Xe(N,y?a:o),Ar(ie)||Or(N,s,T,V)})};return he(t,{onBeforeEnter(y){dt(H,[y]),Xe(y,i),Xe(y,l)},onBeforeAppear(y){dt(k,[y]),Xe(y,c),Xe(y,f)},onEnter:C(!1),onAppear:C(!0),onLeave(y,N){y._isLeaving=!0;const Y=()=>M(y,N);Xe(y,h),y._enterCancelled?(Xe(y,v),Ir(y)):(Ir(y),Xe(y,v)),Rr(()=>{y._isLeaving&&(ht(y,h),Xe(y,_),Ar(g)||Or(y,s,W,Y))}),dt(g,[y,Y])},onEnterCancelled(y){E(y,!1,void 0,!0),dt(p,[y])},onAppearCancelled(y){E(y,!0,void 0,!0),dt(B,[y])},onLeaveCancelled(y){M(y),dt(R,[y])}})}function Gc(e){if(e==null)return null;if(Q(e))return[as(e.enter),as(e.leave)];{const t=as(e);return[t,t]}}function as(e){return Wo(e)}function Xe(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[sn]||(e[sn]=new Set)).add(t)}function ht(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[sn];n&&(n.delete(t),n.size||(e[sn]=void 0))}function Rr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Xc=0;function Or(e,t,n,s){const r=e._endId=++Xc,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:l,timeout:o,propCount:c}=Yc(e,t);if(!l)return s();const f=l+"end";let a=0;const h=()=>{e.removeEventListener(f,v),i()},v=_=>{_.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[I]||"").split(", "),r=s(`${rt}Delay`),i=s(`${rt}Duration`),l=Mr(r,i),o=s(`${kt}Delay`),c=s(`${kt}Duration`),f=Mr(o,c);let a=null,h=0,v=0;t===rt?l>0&&(a=rt,h=l,v=i.length):t===kt?f>0&&(a=kt,h=f,v=c.length):(h=Math.max(l,f),a=h>0?l>f?rt:kt:null,v=a?a===rt?i.length:c.length:0);const _=a===rt&&/\b(?:transform|all)(?:,|$)/.test(s(`${rt}Property`).toString());return{type:a,timeout:h,propCount:v,hasTransform:_}}function Mr(e,t){for(;e.lengthPr(n)+Pr(e[s])))}function Pr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Ir(e){return(e?e.ownerDocument:document).body.offsetHeight}function Jc(e,t,n){const s=e[sn];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Lr=Symbol("_vod"),zc=Symbol("_vsh"),Qc=Symbol(""),Zc=/(?:^|;)\s*display\s*:/;function ea(e,t,n){const s=e.style,r=le(n);let i=!1;if(n&&!r){if(t)if(le(t))for(const l of t.split(";")){const o=l.slice(0,l.indexOf(":")).trim();n[o]==null&&Ut(s,o,"")}else for(const l in t)n[l]==null&&Ut(s,l,"");for(const l in n){l==="display"&&(i=!0);const o=n[l];o!=null?na(e,l,!le(t)&&t?t[l]:void 0,o)||Ut(s,l,o):Ut(s,l,"")}}else if(r){if(t!==n){const l=s[Qc];l&&(n+=";"+l),s.cssText=n,i=Zc.test(n)}}else t&&e.removeAttribute("style");Lr in e&&(e[Lr]=i?s.display:"",e[zc]&&(s.display="none"))}const Nr=/\s*!important$/;function Ut(e,t,n){if(K(n))n.forEach(s=>Ut(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=ta(e,t);Nr.test(n)?e.setProperty(at(s),n.replace(Nr,""),"important"):e[s]=n}}const Fr=["Webkit","Moz","ms"],fs={};function ta(e,t){const n=fs[t];if(n)return n;let s=xe(t);if(s!=="filter"&&s in e)return fs[t]=s;s=Dn(s);for(let r=0;rus||(la.then(()=>us=0),us=Date.now());function aa(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;je(fa(s,n.value),t,5,[s])};return n.value=e,n.attached=ca(),n}function fa(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const kr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ua=(e,t,n,s,r,i)=>{const l=r==="svg";t==="class"?Jc(e,s,l):t==="style"?ea(e,n,s):rn(t)?Nn(t)||ia(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):da(e,t,s,l))?(jr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Dr(e,t,s,l,i,t!=="value")):e._isVueCE&&(ha(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!le(s)))?jr(e,xe(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Dr(e,t,s,l))};function da(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&kr(t)&&G(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return kr(t)&&le(n)?!1:t in e}function ha(e,t){const n=e._def.props;if(!n)return!1;const s=xe(t);return Array.isArray(n)?n.some(r=>xe(r)===s):Object.keys(n).some(r=>xe(r)===s)}const pa=["ctrl","shift","alt","meta"],ga={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>pa.some(n=>e[`${n}Key`]&&!t.includes(n))},Nf=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let l=0;l{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=at(r.key);if(t.some(l=>l===i||ma[l]===i))return e(r)})},va=he({patchProp:ua},Uc);let ds,Wr=!1;function ya(){return ds=Wr?ds:Tc(va),Wr=!0,ds}const Hf=(...e)=>{const t=ya().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=ba(s);if(r)return n(r,!0,_a(r))},t};function _a(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ba(e){return le(e)?document.querySelector(e):e}const wa=window.__VP_SITE_DATA__;function wo(e){return li()?(Qo(e),!0):!1}const hs=new WeakMap,Sa=(...e)=>{var t;const n=e[0],s=(t=Et())==null?void 0:t.proxy;if(s==null&&!Ri())throw new Error("injectLocal must be called in setup");return s&&hs.has(s)&&n in hs.get(s)?hs.get(s)[n]:_t(...e)},So=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const xa=Object.prototype.toString,Ta=e=>xa.call(e)==="[object Object]",Tt=()=>{},Ur=Ea();function Ea(){var e,t;return So&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function zs(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const xo=e=>e();function Ca(e,t={}){let n,s,r=Tt;const i=c=>{clearTimeout(c),r(),r=Tt};let l;return c=>{const f=ce(e),a=ce(t.maxWait);return n&&i(n),f<=0||a!==void 0&&a<=0?(s&&(i(s),s=null),Promise.resolve(c())):new Promise((h,v)=>{r=t.rejectOnCancel?v:h,l=c,a&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,h(l())},a)),n=setTimeout(()=>{s&&i(s),s=null,h(c())},f)})}}function Aa(...e){let t=0,n,s=!0,r=Tt,i,l,o,c,f;!fe(e[0])&&typeof e[0]=="object"?{delay:l,trailing:o=!0,leading:c=!0,rejectOnCancel:f=!1}=e[0]:[l,o=!0,c=!0,f=!1]=e;const a=()=>{n&&(clearTimeout(n),n=void 0,r(),r=Tt)};return v=>{const _=ce(l),I=Date.now()-t,T=()=>i=v();return a(),_<=0?(t=Date.now(),T()):(I>_&&(c||!s)?(t=Date.now(),T()):o&&(i=new Promise((W,H)=>{r=f?H:W,n=setTimeout(()=>{t=Date.now(),s=!0,W(T()),a()},Math.max(0,_-I))})),!c&&!n&&(n=setTimeout(()=>s=!0,_)),s=!1,i)}}function Ra(e=xo,t={}){const{initialState:n="active"}=t,s=Qs(n==="active");function r(){s.value=!1}function i(){s.value=!0}return{isActive:zt(s),pause:r,resume:i,eventFilter:(...o)=>{s.value&&e(...o)}}}function Br(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Oa(e){return Et()}function ps(e){return Array.isArray(e)?e:[e]}function Qs(...e){if(e.length!==1)return El(...e);const t=e[0];return typeof t=="function"?zt(Sl(()=>({get:t,set:Tt}))):yt(t)}function Ma(e,t=200,n={}){return zs(Ca(t,n),e)}function Pa(e,t=200,n=!1,s=!0,r=!1){return zs(Aa(t,n,s,r),e)}function Ia(e,t,n={}){const{eventFilter:s=xo,...r}=n;return Ne(e,zs(s,t),r)}function La(e,t,n={}){const{eventFilter:s,initialState:r="active",...i}=n,{eventFilter:l,pause:o,resume:c,isActive:f}=Ra(s,{initialState:r});return{stop:Ia(e,t,{...i,eventFilter:l}),pause:o,resume:c,isActive:f}}function Jn(e,t=!0,n){Oa()?Ht(e,n):t?e():Bn(e)}function Na(e,t,n){return Ne(e,t,{...n,immediate:!0})}const tt=So?window:void 0;function Zs(e){var t;const n=ce(e);return(t=n==null?void 0:n.$el)!=null?t:n}function nt(...e){const t=[],n=()=>{t.forEach(o=>o()),t.length=0},s=(o,c,f,a)=>(o.addEventListener(c,f,a),()=>o.removeEventListener(c,f,a)),r=oe(()=>{const o=ps(ce(e[0])).filter(c=>c!=null);return o.every(c=>typeof c!="string")?o:void 0}),i=Na(()=>{var o,c;return[(c=(o=r.value)==null?void 0:o.map(f=>Zs(f)))!=null?c:[tt].filter(f=>f!=null),ps(ce(r.value?e[1]:e[0])),ps(Wn(r.value?e[2]:e[1])),ce(r.value?e[3]:e[2])]},([o,c,f,a])=>{if(n(),!(o!=null&&o.length)||!(c!=null&&c.length)||!(f!=null&&f.length))return;const h=Ta(a)?{...a}:a;t.push(...o.flatMap(v=>c.flatMap(_=>f.map(I=>s(v,_,I,h)))))},{flush:"post"}),l=()=>{i(),n()};return wo(n),l}function Fa(){const e=Le(!1),t=Et();return t&&Ht(()=>{e.value=!0},t),e}function Ha(e){const t=Fa();return oe(()=>(t.value,!!e()))}function Da(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Df(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=tt,eventName:i="keydown",passive:l=!1,dedupe:o=!1}=s,c=Da(t);return nt(r,i,a=>{a.repeat&&ce(o)||c(a)&&n(a)},l)}const ja=Symbol("vueuse-ssr-width");function $a(){const e=Ri()?Sa(ja,null):null;return typeof e=="number"?e:void 0}function To(e,t={}){const{window:n=tt,ssrWidth:s=$a()}=t,r=Ha(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),i=Le(typeof s=="number"),l=Le(),o=Le(!1),c=f=>{o.value=f.matches};return Oi(()=>{if(i.value){i.value=!r.value;const f=ce(e).split(",");o.value=f.some(a=>{const h=a.includes("not all"),v=a.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),_=a.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let I=!!(v||_);return v&&I&&(I=s>=Br(v[1])),_&&I&&(I=s<=Br(_[1])),h?!I:I});return}r.value&&(l.value=n.matchMedia(ce(e)),o.value=l.value.matches)}),nt(l,"change",c,{passive:!0}),oe(()=>o.value)}const vn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},yn="__vueuse_ssr_handlers__",Va=ka();function ka(){return yn in vn||(vn[yn]=vn[yn]||{}),vn[yn]}function Eo(e,t){return Va[e]||t}function Co(e){return To("(prefers-color-scheme: dark)",e)}function Wa(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Ua={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Kr="vueuse-storage";function Ba(e,t,n,s={}){var r;const{flush:i="pre",deep:l=!0,listenToStorageChanges:o=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:h=tt,eventFilter:v,onError:_=C=>{console.error(C)},initOnMounted:I}=s,T=(a?Le:yt)(typeof t=="function"?t():t),W=oe(()=>ce(e));if(!n)try{n=Eo("getDefaultStorage",()=>{var C;return(C=tt)==null?void 0:C.localStorage})()}catch(C){_(C)}if(!n)return T;const H=ce(t),D=Wa(H),p=(r=s.serializer)!=null?r:Ua[D],{pause:g,resume:R}=La(T,()=>O(T.value),{flush:i,deep:l,eventFilter:v});Ne(W,()=>E(),{flush:i}),h&&o&&Jn(()=>{n instanceof Storage?nt(h,"storage",E,{passive:!0}):nt(h,Kr,M),I&&E()}),I||E();function k(C,y){if(h){const N={key:W.value,oldValue:C,newValue:y,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",N):new CustomEvent(Kr,{detail:N}))}}function O(C){try{const y=n.getItem(W.value);if(C==null)k(y,null),n.removeItem(W.value);else{const N=p.write(C);y!==N&&(n.setItem(W.value,N),k(y,N))}}catch(y){_(y)}}function B(C){const y=C?C.newValue:n.getItem(W.value);if(y==null)return c&&H!=null&&n.setItem(W.value,p.write(H)),H;if(!C&&f){const N=p.read(y);return typeof f=="function"?f(N,H):D==="object"&&!Array.isArray(N)?{...H,...N}:N}else return typeof y!="string"?y:p.read(y)}function E(C){if(!(C&&C.storageArea!==n)){if(C&&C.key==null){T.value=H;return}if(!(C&&C.key!==W.value)){g();try{(C==null?void 0:C.newValue)!==p.write(T.value)&&(T.value=B(C))}catch(y){_(y)}finally{C?Bn(R):R()}}}}function M(C){E(C.detail)}return T}const Ka="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function qa(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=tt,storage:i,storageKey:l="vueuse-color-scheme",listenToStorageChanges:o=!0,storageRef:c,emitAuto:f,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},v=Co({window:r}),_=oe(()=>v.value?"dark":"light"),I=c||(l==null?Qs(s):Ba(l,s,i,{window:r,listenToStorageChanges:o})),T=oe(()=>I.value==="auto"?_.value:I.value),W=Eo("updateHTMLAttrs",(g,R,k)=>{const O=typeof g=="string"?r==null?void 0:r.document.querySelector(g):Zs(g);if(!O)return;const B=new Set,E=new Set;let M=null;if(R==="class"){const y=k.split(/\s/g);Object.values(h).flatMap(N=>(N||"").split(/\s/g)).filter(Boolean).forEach(N=>{y.includes(N)?B.add(N):E.add(N)})}else M={key:R,value:k};if(B.size===0&&E.size===0&&M===null)return;let C;a&&(C=r.document.createElement("style"),C.appendChild(document.createTextNode(Ka)),r.document.head.appendChild(C));for(const y of B)O.classList.add(y);for(const y of E)O.classList.remove(y);M&&O.setAttribute(M.key,M.value),a&&(r.getComputedStyle(C).opacity,document.head.removeChild(C))});function H(g){var R;W(t,n,(R=h[g])!=null?R:g)}function D(g){e.onChanged?e.onChanged(g,H):H(g)}Ne(T,D,{flush:"post",immediate:!0}),Jn(()=>D(T.value));const p=oe({get(){return f?I.value:T.value},set(g){I.value=g}});return Object.assign(p,{store:I,system:_,state:T})}function Ga(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=qa({...e,onChanged:(l,o)=>{var c;e.onChanged?(c=e.onChanged)==null||c.call(e,l==="dark",o,l):o(l)},modes:{dark:t,light:n}}),r=oe(()=>s.system.value);return oe({get(){return s.value==="dark"},set(l){const o=l?"dark":"light";r.value===o?s.value="auto":s.value=o}})}function gs(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const qr=1;function Xa(e,t={}){const{throttle:n=0,idle:s=200,onStop:r=Tt,onScroll:i=Tt,offset:l={left:0,right:0,top:0,bottom:0},eventListenerOptions:o={capture:!1,passive:!0},behavior:c="auto",window:f=tt,onError:a=O=>{console.error(O)}}=t,h=Le(0),v=Le(0),_=oe({get(){return h.value},set(O){T(O,void 0)}}),I=oe({get(){return v.value},set(O){T(void 0,O)}});function T(O,B){var E,M,C,y;if(!f)return;const N=ce(e);if(!N)return;(C=N instanceof Document?f.document.body:N)==null||C.scrollTo({top:(E=ce(B))!=null?E:I.value,left:(M=ce(O))!=null?M:_.value,behavior:ce(c)});const Y=((y=N==null?void 0:N.document)==null?void 0:y.documentElement)||(N==null?void 0:N.documentElement)||N;_!=null&&(h.value=Y.scrollLeft),I!=null&&(v.value=Y.scrollTop)}const W=Le(!1),H=Nt({left:!0,right:!1,top:!0,bottom:!1}),D=Nt({left:!1,right:!1,top:!1,bottom:!1}),p=O=>{W.value&&(W.value=!1,D.left=!1,D.right=!1,D.top=!1,D.bottom=!1,r(O))},g=Ma(p,n+s),R=O=>{var B;if(!f)return;const E=((B=O==null?void 0:O.document)==null?void 0:B.documentElement)||(O==null?void 0:O.documentElement)||Zs(O),{display:M,flexDirection:C,direction:y}=getComputedStyle(E),N=y==="rtl"?-1:1,Y=E.scrollLeft;D.left=Yh.value;const ie=Math.abs(Y*N)<=(l.left||0),V=Math.abs(Y*N)+E.clientWidth>=E.scrollWidth-(l.right||0)-qr;M==="flex"&&C==="row-reverse"?(H.left=V,H.right=ie):(H.left=ie,H.right=V),h.value=Y;let X=E.scrollTop;O===f.document&&!X&&(X=f.document.body.scrollTop),D.top=Xv.value;const j=Math.abs(X)<=(l.top||0),ee=Math.abs(X)+E.clientHeight>=E.scrollHeight-(l.bottom||0)-qr;M==="flex"&&C==="column-reverse"?(H.top=ee,H.bottom=j):(H.top=j,H.bottom=ee),v.value=X},k=O=>{var B;if(!f)return;const E=(B=O.target.documentElement)!=null?B:O.target;R(E),W.value=!0,g(O),i(O)};return nt(e,"scroll",n?Pa(k,n,!0,!1):k,o),Jn(()=>{try{const O=ce(e);if(!O)return;R(O)}catch(O){a(O)}}),nt(e,"scrollend",p,o),{x:_,y:I,isScrolling:W,arrivedState:H,directions:D,measure(){const O=ce(e);f&&O&&R(O)}}}function Ao(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const ms=new WeakMap;function jf(e,t=!1){const n=Le(t);let s=null,r="";Ne(Qs(e),o=>{const c=gs(ce(o));if(c){const f=c;if(ms.get(f)||ms.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(r=f.style.overflow),f.style.overflow==="hidden")return n.value=!0;if(n.value)return f.style.overflow="hidden"}},{immediate:!0});const i=()=>{const o=gs(ce(e));!o||n.value||(Ur&&(s=nt(o,"touchmove",c=>{Ya(c)},{passive:!1})),o.style.overflow="hidden",n.value=!0)},l=()=>{const o=gs(ce(e));!o||!n.value||(Ur&&(s==null||s()),o.style.overflow=r,ms.delete(o),n.value=!1)};return wo(l),oe({get(){return n.value},set(o){o?i():l()}})}function $f(e={}){const{window:t=tt,...n}=e;return Xa(t,n)}function Vf(e={}){const{window:t=tt,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:l="inner"}=e,o=Le(n),c=Le(s),f=()=>{if(t)if(l==="outer")o.value=t.outerWidth,c.value=t.outerHeight;else if(l==="visual"&&t.visualViewport){const{width:h,height:v,scale:_}=t.visualViewport;o.value=Math.round(h*_),c.value=Math.round(v*_)}else i?(o.value=t.innerWidth,c.value=t.innerHeight):(o.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};f(),Jn(f);const a={passive:!0};if(nt("resize",f,a),t&&l==="visual"&&t.visualViewport&&nt(t.visualViewport,"resize",f,a),r){const h=To("(orientation: portrait)");Ne(h,()=>f())}return{width:o,height:c}}const vs={};var ys={};const Ro=/^(?:[a-z]+:|\/\/)/i,Ja="vitepress-theme-appearance",za=/#.*$/,Qa=/[?#].*$/,Za=/(?:(^|\/)index)?\.(?:md|html)$/,me=typeof document<"u",Oo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function ef(e,t,n=!1){if(t===void 0)return!1;if(e=Gr(`/${e}`),n)return new RegExp(t).test(e);if(Gr(t)!==e)return!1;const s=t.match(za);return s?(me?location.hash:"")===s[0]:!0}function Gr(e){return decodeURI(e).replace(Qa,"").replace(Za,"$1")}function tf(e){return Ro.test(e)}function nf(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!tf(n)&&ef(t,`/${n}/`,!0))||"root"}function sf(e,t){var s,r,i,l,o,c,f;const n=nf(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((l=e.locales[n])==null?void 0:l.titleTemplate)??e.titleTemplate,description:((o=e.locales[n])==null?void 0:o.description)??e.description,head:Po(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Mo(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=rf(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function rf(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function of(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,l])=>i===n&&l[r[0]]===r[1])}function Po(e,t){return[...e.filter(n=>!of(t,n)),...t]}const lf=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,cf=/^[a-z]:/i;function Xr(e){const t=cf.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(lf,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const _s=new Set;function af(e){if(_s.size===0){const n=typeof process=="object"&&(ys==null?void 0:ys.VITE_EXTRA_EXTENSIONS)||(vs==null?void 0:vs.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>_s.add(s))}const t=e.split(".").pop();return t==null||!_s.has(t.toLowerCase())}const ff=Symbol(),xt=Le(wa);function kf(e){const t=oe(()=>sf(xt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?yt(!0):n==="force-auto"?Co():n?Ga({storageKey:Ja,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):yt(!1),r=yt(me?location.hash:"");return me&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Ne(()=>e.data,()=>{r.value=me?location.hash:""}),{site:t,theme:oe(()=>t.value.themeConfig),page:oe(()=>e.data),frontmatter:oe(()=>e.data.frontmatter),params:oe(()=>e.data.params),lang:oe(()=>t.value.lang),dir:oe(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:oe(()=>t.value.localeIndex||"root"),title:oe(()=>Mo(t.value,e.data)),description:oe(()=>e.data.description||t.value.description),isDark:s,hash:oe(()=>r.value)}}function uf(){const e=_t(ff);if(!e)throw new Error("vitepress data not properly injected in app");return e}function df(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Yr(e){return Ro.test(e)||!e.startsWith("/")?e:df(xt.value.base,e)}function hf(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),me){const n="/template-sync-strategy/";t=Xr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${Xr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Tn=[];function Wf(e){Tn.push(e),Xn(()=>{Tn=Tn.filter(t=>t!==e)})}function pf(){let e=xt.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=Jr(e,n);else if(Array.isArray(e))for(const s of e){const r=Jr(s,n);if(r){t=r;break}}return t}function Jr(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const gf=Symbol(),Io="http://a.com",mf=()=>({path:"/",component:null,data:Oo});function Uf(e,t){const n=Nt(mf()),s={route:n,go:r};async function r(o=me?location.href:"/"){var c,f;o=bs(o),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,o))!==!1&&(me&&o!==bs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",o)),await l(o),await((f=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:f(o)))}let i=null;async function l(o,c=0,f=!1){var v,_;if(await((v=s.onBeforePageLoad)==null?void 0:v.call(s,o))===!1)return;const a=new URL(o,Io),h=i=a.pathname;try{let I=await e(h);if(!I)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:T,__pageData:W}=I;if(!T)throw new Error(`Invalid route component: ${T}`);await((_=s.onAfterPageLoad)==null?void 0:_.call(s,o)),n.path=me?h:Yr(h),n.component=Sn(T),n.data=Sn(W),me&&Bn(()=>{let H=xt.value.base+W.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!xt.value.cleanUrls&&!H.endsWith("/")&&(H+=".html"),H!==a.pathname&&(a.pathname=H,o=H+a.search+a.hash,history.replaceState({},"",o)),a.hash&&!c){let D=null;try{D=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(D){zr(D,a.hash);return}}window.scrollTo(0,c)})}}catch(I){if(!/fetch|Page not found/.test(I.message)&&!/^\/404(\.html|\/)?$/.test(o)&&console.error(I),!f)try{const T=await fetch(xt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await T.json(),await l(o,c,!0);return}catch{}if(i===h){i=null,n.path=me?h:Yr(h),n.component=t?Sn(t):null;const T=me?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Oo,relativePath:T}}}}return me&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",o=>{if(o.defaultPrevented||!(o.target instanceof Element)||o.target.closest("button")||o.button!==0||o.ctrlKey||o.shiftKey||o.altKey||o.metaKey)return;const c=o.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const f=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(f==null)return;const{href:a,origin:h,pathname:v,hash:_,search:I}=new URL(f,c.baseURI),T=new URL(location.href);h===T.origin&&af(v)&&(o.preventDefault(),v===T.pathname&&I===T.search?(_!==T.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:T.href,newURL:a}))),_?zr(c,_,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async o=>{var f;if(o.state===null)return;const c=bs(location.href);await l(c,o.state&&o.state.scrollPosition||0),await((f=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:f(c))}),window.addEventListener("hashchange",o=>{o.preventDefault()})),s}function vf(){const e=_t(gf);if(!e)throw new Error("useRouter() is called without provider.");return e}function Lo(){return vf().route}function zr(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(l-window.scrollY)>window.innerHeight?window.scrollTo(0,l):window.scrollTo({left:0,top:l,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),l=window.scrollY+s.getBoundingClientRect().top-pf()+i;requestAnimationFrame(r)}}function bs(e){const t=new URL(e,Io);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),xt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const _n=()=>Tn.forEach(e=>e()),Bf=Di({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Lo(),{frontmatter:n,site:s}=uf();return Ne(n,_n,{deep:!0,flush:"post"}),()=>Ns(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Ns(t.component,{onVnodeMounted:_n,onVnodeUpdated:_n,onVnodeUnmounted:_n}):"404 Page Not Found"])}}),Kf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},qf=Di({setup(e,{slots:t}){const n=yt(!1);return Ht(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Gf(){me&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const l=Array.from(i.children).find(f=>f.classList.contains("active"));if(!l)return;const o=i.children[r];if(!o||l===o)return;l.classList.remove("active"),o.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Xf(){if(me){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const l=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),o=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(o.join(",")).forEach(a=>a.remove());let f=c.textContent||"";l&&(f=f.replace(/^ *(\$|>) /gm,"").trim()),yf(f).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function yf(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Yf(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(o=>{const c=ws(o);for(const f of document.head.children)if(f.isEqualNode(c)){s.push(f);return}});return}const l=i.map(ws);s.forEach((o,c)=>{const f=l.findIndex(a=>a==null?void 0:a.isEqualNode(o??null));f!==-1?delete l[f]:(o==null||o.remove(),delete s[c])}),l.forEach(o=>o&&document.head.appendChild(o)),s=[...s,...l].filter(Boolean)};Oi(()=>{const i=e.data,l=t.value,o=i&&i.description,c=i&&i.frontmatter.head||[],f=Mo(l,i);f!==document.title&&(document.title=f);const a=o||l.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==a&&h.setAttribute("content",a):ws(["meta",{name:"description",content:a}]),r(Po(l.head,bf(c)))})}function ws([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function _f(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function bf(e){return e.filter(t=>!_f(t))}const Ss=new Set,No=()=>document.createElement("link"),wf=e=>{const t=No();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Sf=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let bn;const xf=me&&(bn=No())&&bn.relList&&bn.relList.supports&&bn.relList.supports("prefetch")?wf:Sf;function Jf(){if(!me||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(l=>{if(l.isIntersecting){const o=l.target;n.unobserve(o);const{pathname:c}=o;if(!Ss.has(c)){Ss.add(c);const f=hf(c);f&&xf(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:l,pathname:o}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=o.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&l===location.hostname&&(o!==location.pathname?n.observe(i):Ss.add(o))})})};Ht(s);const r=Lo();Ne(()=>r.path,s),Xn(()=>{n&&n.disconnect()})}export{Mf as $,pf as A,Af as B,Ef as C,Wf as D,ge as E,we as F,Le as G,Cf as H,Ro as I,Lo as J,Pc as K,_t as L,Vf as M,js as N,Df as O,Bn as P,$f as Q,me as R,zt as S,Lf as T,jf as U,Fl as V,Of as W,Ff as X,Vi as Y,Nf as Z,Kf as _,go as a,Ns as a0,Yf as a1,gf as a2,kf as a3,ff as a4,Bf as a5,qf as a6,xt as a7,Uf as a8,hf as a9,Hf as aa,Jf as ab,Xf as ac,Gf as ad,If as ae,Is as b,Pf as c,Di as d,Mc as e,af as f,Yr as g,oe as h,tf as i,po as j,Wn as k,ef as l,To as m,$s as n,Ps as o,yt as p,Ne as q,Rf as r,Oi as s,Jo as t,uf as u,Ht as v,Nl as w,Xn as x,Tf as y,Ql as z}; diff --git a/public/template-sync-strategy/assets/chunks/theme.CloMnL7i.js b/public/template-sync-strategy/assets/chunks/theme.CloMnL7i.js deleted file mode 100644 index f85e074..0000000 --- a/public/template-sync-strategy/assets/chunks/theme.CloMnL7i.js +++ /dev/null @@ -1 +0,0 @@ -import{d as p,c as u,r as c,n as T,o as s,a as U,t as N,b as _,w as h,T as de,e as m,_ as b,u as Ee,i as Fe,f as De,g as ve,h as g,j as d,k as r,l as z,m as ie,p as S,q as F,s as Q,v as j,x as fe,y as he,z as Oe,A as Ge,F as M,B,C as W,D as X,E as k,G as Le,H as C,I as Ve,J as Z,K as G,L as ee,M as Ue,N as Se,O as je,P as Te,Q as Ne,R as te,S as ze,U as xe,V as Me,W as We,X as qe,Y as Re,Z as Ke,$ as Je,a0 as K}from"./framework.B1nRs-GM.js";const Ye=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(s(),u("span",{class:T(["VPBadge",e.type])},[c(t.$slots,"default",{},()=>[U(N(e.text),1)])],2))}}),Qe={key:0,class:"VPBackdrop"},Xe=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(de,{name:"fade"},{default:h(()=>[e.show?(s(),u("div",Qe)):m("",!0)]),_:1}))}}),Ze=b(Xe,[["__scopeId","data-v-b2600058"]]),P=Ee;function et(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function le(e){return e.startsWith("/")?e:`/${e}`}function me(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(Fe(e)||e.startsWith("#")||!o.startsWith("http")||!De(t))return e;const{site:i}=P(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${n}${a}`);return ve(l)}function R({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:i}=P(),l=g(()=>{var v,y;return{label:(v=t.value.locales[n.value])==null?void 0:v.label,link:((y=t.value.locales[n.value])==null?void 0:y.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:g(()=>Object.entries(t.value.locales).flatMap(([v,y])=>l.value.label===y.label?[]:{text:y.label,link:tt(y.link||(v==="root"?"/":`/${v}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+i.value})),currentLang:l}}function tt(e,t,n,a){return t?e.replace(/\/$/,"")+le(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const nt={class:"NotFound"},at={class:"code"},ot={class:"title"},st={class:"quote"},rt={class:"action"},it=["href","aria-label"],lt=p({__name:"NotFound",setup(e){const{theme:t}=P(),{currentLang:n}=R();return(a,o)=>{var i,l,f,v,y;return s(),u("div",nt,[d("p",at,N(((i=r(t).notFound)==null?void 0:i.code)??"404"),1),d("h1",ot,N(((l=r(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",st,N(((f=r(t).notFound)==null?void 0:f.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",rt,[d("a",{class:"link",href:r(ve)(r(n).link),"aria-label":((v=r(t).notFound)==null?void 0:v.linkLabel)??"go to home"},N(((y=r(t).notFound)==null?void 0:y.linkText)??"Take me home"),9,it)])])}}}),ct=b(lt,[["__scopeId","data-v-93fd8736"]]);function Ie(e,t){if(Array.isArray(e))return J(e);if(e==null)return[];t=le(t);const n=Object.keys(e).sort((o,i)=>i.split("/").length-o.split("/").length).find(o=>t.startsWith(le(o))),a=n?e[n]:[];return Array.isArray(a)?J(a):J(a.items,a.base)}function ut(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function dt(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function ce(e,t){return Array.isArray(t)?t.some(n=>ce(e,n)):z(e,t.link)?!0:t.items?ce(e,t.items):!1}function J(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=J(a.items,o)),a})}function D(){const{frontmatter:e,page:t,theme:n}=P(),a=ie("(min-width: 960px)"),o=S(!1),i=g(()=>{const w=n.value.sidebar,H=t.value.relativePath;return w?Ie(w,H):[]}),l=S(i.value);F(i,(w,H)=>{JSON.stringify(w)!==JSON.stringify(H)&&(l.value=i.value)});const f=g(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),v=g(()=>y?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),y=g(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),L=g(()=>f.value&&a.value),$=g(()=>f.value?ut(l.value):[]);function V(){o.value=!0}function x(){o.value=!1}function I(){o.value?x():V()}return{isOpen:o,sidebar:l,sidebarGroups:$,hasSidebar:f,hasAside:y,leftAside:v,isSidebarEnabled:L,open:V,close:x,toggle:I}}function vt(e,t){let n;Q(()=>{n=e.value?document.activeElement:void 0}),j(()=>{window.addEventListener("keyup",a)}),fe(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function ft(e){const{page:t,hash:n}=P(),a=S(!1),o=g(()=>e.value.collapsed!=null),i=g(()=>!!e.value.link),l=S(!1),f=()=>{l.value=z(t.value.relativePath,e.value.link)};F([t,e,n],f),j(f);const v=g(()=>l.value?!0:e.value.items?ce(t.value.relativePath,e.value.items):!1),y=g(()=>!!(e.value.items&&e.value.items.length));Q(()=>{a.value=!!(o.value&&e.value.collapsed)}),he(()=>{(l.value||v.value)&&(a.value=!1)});function L(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:i,isActiveLink:l,hasActiveLink:v,hasChildren:y,toggle:L}}function ht(){const{hasSidebar:e}=D(),t=ie("(min-width: 960px)"),n=ie("(min-width: 1280px)");return{isAsideEnabled:g(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const mt=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ue=[];function we(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function pe(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:pt(n),link:"#"+n.id,level:a}});return kt(t,e)}function pt(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(mt.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function kt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return gt(e,a,o)}function _t(e,t){const{isAsideEnabled:n}=ht(),a=et(i,100);let o=null;j(()=>{requestAnimationFrame(i),window.addEventListener("scroll",a)}),Oe(()=>{l(location.hash)}),fe(()=>{window.removeEventListener("scroll",a)});function i(){if(!n.value)return;const f=window.scrollY,v=window.innerHeight,y=document.body.offsetHeight,L=Math.abs(f+v-y)<1,$=ue.map(({element:x,link:I})=>({link:I,top:bt(x)})).filter(({top:x})=>!Number.isNaN(x)).sort((x,I)=>x.top-I.top);if(!$.length){l(null);return}if(f<1){l(null);return}if(L){l($[$.length-1].link);return}let V=null;for(const{link:x,top:I}of $){if(I>f+Ge()+4)break;V=x}l(V)}function l(f){o&&o.classList.remove("active"),f==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(f)}"]`);const v=o;v?(v.classList.add("active"),t.value.style.top=v.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function bt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function gt(e,t,n){ue.length=0;const a=[],o=[];return e.forEach(i=>{const l={...i,children:[]};let f=o[o.length-1];for(;f&&f.level>=l.level;)o.pop(),f=o[o.length-1];if(l.element.classList.contains("ignore-header")||f&&"shouldIgnore"in f){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=W("VPDocOutlineItem",!0);return s(),u("ul",{class:T(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(M,null,B(e.headers,({children:i,link:l,title:f})=>(s(),u("li",null,[d("a",{class:"outline-link",href:l,onClick:t,title:f},N(f),9,$t),i!=null&&i.length?(s(),_(o,{key:0,headers:i},null,8,["headers"])):m("",!0)]))),256))],2)}}}),Be=b(yt,[["__scopeId","data-v-da421f78"]]),Pt={class:"content"},Lt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Vt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=P(),a=Le([]);X(()=>{a.value=pe(t.value.outline??n.value.outline)});const o=S(),i=S();return _t(o,i),(l,f)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:T(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[d("div",Pt,[d("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),d("div",Lt,N(r(we)(r(n))),1),k(Be,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),St=b(Vt,[["__scopeId","data-v-dfbd9fb8"]]),Tt={class:"VPDocAsideCarbonAds"},Nt=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Tt,[k(r(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),xt={class:"VPDocAside"},Mt=p({__name:"VPDocAside",setup(e){const{theme:t}=P();return(n,a)=>(s(),u("div",xt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(St),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=d("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),r(t).carbonAds?(s(),_(Nt,{key:0,"carbon-ads":r(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),It=b(Mt,[["__scopeId","data-v-79cae1a0"]]);function wt(){const{theme:e,page:t}=P();return g(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function Bt(){const{page:e,theme:t,frontmatter:n}=P();return g(()=>{var y,L,$,V,x,I,w,H;const a=Ie(t.value.sidebar,e.value.relativePath),o=dt(a),i=Ht(o,A=>A.link.replace(/[?#].*$/,"")),l=i.findIndex(A=>z(e.value.relativePath,A.link)),f=((y=t.value.docFooter)==null?void 0:y.prev)===!1&&!n.value.prev||n.value.prev===!1,v=((L=t.value.docFooter)==null?void 0:L.next)===!1&&!n.value.next||n.value.next===!1;return{prev:f?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??(($=i[l-1])==null?void 0:$.docFooterText)??((V=i[l-1])==null?void 0:V.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((x=i[l-1])==null?void 0:x.link)},next:v?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((I=i[l+1])==null?void 0:I.docFooterText)??((w=i[l+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((H=i[l+1])==null?void 0:H.link)}}})}function Ht(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=g(()=>t.tag??(t.href?"a":"span")),a=g(()=>t.href&&Ve.test(t.href)||t.target==="_blank");return(o,i)=>(s(),_(C(n.value),{class:T(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?r(me)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:h(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Ct=["datetime"],Et=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=P(),o=g(()=>new Date(n.value.lastUpdated)),i=g(()=>o.value.toISOString()),l=S("");return j(()=>{Q(()=>{var f,v,y;l.value=new Intl.DateTimeFormat((v=(f=t.value.lastUpdated)==null?void 0:f.formatOptions)!=null&&v.forceLocale?a.value:void 0,((y=t.value.lastUpdated)==null?void 0:y.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(f,v)=>{var y;return s(),u("p",At,[U(N(((y=r(t).lastUpdated)==null?void 0:y.text)||r(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:i.value},N(l.value),9,Ct)])}}}),Ft=b(Et,[["__scopeId","data-v-e95db471"]]),Dt={key:0,class:"VPDocFooter"},Ot={key:0,class:"edit-info"},Gt={key:0,class:"edit-link"},Ut={key:1,class:"last-updated"},jt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},zt={class:"pager"},Wt=["innerHTML"],qt=["innerHTML"],Rt={class:"pager"},Kt=["innerHTML"],Jt=["innerHTML"],Yt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=P(),o=wt(),i=Bt(),l=g(()=>t.value.editLink&&a.value.editLink!==!1),f=g(()=>n.value.lastUpdated),v=g(()=>l.value||f.value||i.value.prev||i.value.next);return(y,L)=>{var $,V,x,I;return v.value?(s(),u("footer",Dt,[c(y.$slots,"doc-footer-before",{},void 0,!0),l.value||f.value?(s(),u("div",Ot,[l.value?(s(),u("div",Gt,[k(E,{class:"edit-link-button",href:r(o).url,"no-icon":!0},{default:h(()=>[L[0]||(L[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),U(" "+N(r(o).text),1)]),_:1},8,["href"])])):m("",!0),f.value?(s(),u("div",Ut,[k(Ft)])):m("",!0)])):m("",!0),($=r(i).prev)!=null&&$.link||(V=r(i).next)!=null&&V.link?(s(),u("nav",jt,[L[1]||(L[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",zt,[(x=r(i).prev)!=null&&x.link?(s(),_(E,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=r(t).docFooter)==null?void 0:w.prev)||"Previous page"},null,8,Wt),d("span",{class:"title",innerHTML:r(i).prev.text},null,8,qt)]}),_:1},8,["href"])):m("",!0)]),d("div",Rt,[(I=r(i).next)!=null&&I.link?(s(),_(E,{key:0,class:"pager-link next",href:r(i).next.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=r(t).docFooter)==null?void 0:w.next)||"Next page"},null,8,Kt),d("span",{class:"title",innerHTML:r(i).next.text},null,8,Jt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Qt=b(Yt,[["__scopeId","data-v-07d71ff1"]]),Xt={class:"container"},Zt={class:"aside-container"},en={class:"aside-content"},tn={class:"content"},nn={class:"content-container"},an={class:"main"},on=p({__name:"VPDoc",setup(e){const{theme:t}=P(),n=Z(),{hasSidebar:a,hasAside:o,leftAside:i}=D(),l=g(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(f,v)=>{const y=W("Content");return s(),u("div",{class:T(["VPDoc",{"has-sidebar":r(a),"has-aside":r(o)}])},[c(f.$slots,"doc-top",{},void 0,!0),d("div",Xt,[r(o)?(s(),u("div",{key:0,class:T(["aside",{"left-aside":r(i)}])},[v[0]||(v[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Zt,[d("div",en,[k(It,null,{"aside-top":h(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),d("div",tn,[d("div",nn,[c(f.$slots,"doc-before",{},void 0,!0),d("main",an,[k(y,{class:T(["vp-doc",[l.value,r(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Qt,null,{"doc-footer-before":h(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(f.$slots,"doc-after",{},void 0,!0)])])]),c(f.$slots,"doc-bottom",{},void 0,!0)],2)}}}),sn=b(on,[["__scopeId","data-v-ef3a4dda"]]),rn=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=g(()=>t.href&&Ve.test(t.href)),a=g(()=>t.tag||(t.href?"a":"button"));return(o,i)=>(s(),_(C(a.value),{class:T(["VPButton",[e.size,e.theme]]),href:e.href?r(me)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:h(()=>[U(N(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),ln=b(rn,[["__scopeId","data-v-b20c43c2"]]),cn=["src","alt"],un=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(s(),u(M,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:r(ve)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,cn)):(s(),u(M,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),Y=b(un,[["__scopeId","data-v-4d414b82"]]),dn={class:"container"},vn={class:"main"},fn={class:"heading"},hn=["innerHTML"],mn=["innerHTML"],pn=["innerHTML"],kn={key:0,class:"actions"},_n={key:0,class:"image"},bn={class:"image-container"},gn=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=ee("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:T(["VPHero",{"has-image":e.image||r(t)}])},[d("div",dn,[d("div",vn,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[d("h1",fn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,hn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,mn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,pn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",kn,[(s(!0),u(M,null,B(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(ln,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||r(t)?(s(),u("div",_n,[d("div",bn,[a[0]||(a[0]=d("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(Y,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),$n=b(gn,[["__scopeId","data-v-d266baba"]]),yn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=P();return(n,a)=>r(t).hero?(s(),_($n,{key:0,class:"VPHomeHero",name:r(t).hero.name,text:r(t).hero.text,tagline:r(t).hero.tagline,image:r(t).hero.image,actions:r(t).hero.actions},{"home-hero-info-before":h(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),Pn={class:"box"},Ln={key:0,class:"icon"},Vn=["innerHTML"],Sn=["innerHTML"],Tn=["innerHTML"],Nn={key:4,class:"link-text"},xn={class:"link-text-value"},Mn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[d("article",Pn,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",Ln,[k(Y,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(Y,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Vn)):m("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Sn),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Tn)):m("",!0),e.linkText?(s(),u("div",Nn,[d("p",xn,[U(N(e.linkText)+" ",1),n[0]||(n[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),In=b(Mn,[["__scopeId","data-v-95001937"]]),wn={key:0,class:"VPFeatures"},Bn={class:"container"},Hn={class:"items"},An=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=g(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",wn,[d("div",Bn,[d("div",Hn,[(s(!0),u(M,null,B(e.features,i=>(s(),u("div",{key:i.title,class:T(["item",[n.value]])},[k(In,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),Cn=b(An,[["__scopeId","data-v-1da4ff3d"]]),En=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=P();return(n,a)=>r(t).features?(s(),_(Cn,{key:0,class:"VPHomeFeatures",features:r(t).features},null,8,["features"])):m("",!0)}}),Fn=p({__name:"VPHomeContent",setup(e){const{width:t}=Ue({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Se(r(t)?{"--vp-offset":`calc(50% - ${r(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),Dn=b(Fn,[["__scopeId","data-v-2498cc33"]]),On=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=P();return(a,o)=>{const i=W("Content");return s(),u("div",{class:T(["VPHome",{"external-link-icon-enabled":r(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(yn,null,{"home-hero-info-before":h(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(En),c(a.$slots,"home-features-after",{},void 0,!0),r(t).markdownStyles!==!1?(s(),_(Dn,{key:0},{default:h(()=>[k(i)]),_:1})):(s(),_(i,{key:1}))],2)}}}),Gn=b(On,[["__scopeId","data-v-8b59c434"]]),Un={},jn={class:"VPPage"};function zn(e,t){const n=W("Content");return s(),u("div",jn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const Wn=b(Un,[["render",zn]]),qn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=P(),{hasSidebar:a}=D();return(o,i)=>(s(),u("div",{class:T(["VPContent",{"has-sidebar":r(a),"is-home":r(n).layout==="home"}]),id:"VPContent"},[r(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(ct)],!0):r(n).layout==="page"?(s(),_(Wn,{key:1},{"page-top":h(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(n).layout==="home"?(s(),_(Gn,{key:2},{"home-hero-before":h(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(n).layout&&r(n).layout!=="doc"?(s(),_(C(r(n).layout),{key:3})):(s(),_(sn,{key:4},{"doc-top":h(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Rn=b(qn,[["__scopeId","data-v-d2aef184"]]),Kn={class:"container"},Jn=["innerHTML"],Yn=["innerHTML"],Qn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=P(),{hasSidebar:a}=D();return(o,i)=>r(t).footer&&r(n).footer!==!1?(s(),u("footer",{key:0,class:T(["VPFooter",{"has-sidebar":r(a)}])},[d("div",Kn,[r(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:r(t).footer.message},null,8,Jn)):m("",!0),r(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:r(t).footer.copyright},null,8,Yn)):m("",!0)])],2)):m("",!0)}}),Xn=b(Qn,[["__scopeId","data-v-e3157d6d"]]);function Zn(){const{theme:e,frontmatter:t}=P(),n=Le([]),a=g(()=>n.value.length>0);return X(()=>{n.value=pe(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const ea={class:"menu-text"},ta={class:"header"},na={class:"outline"},aa=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=P(),a=S(!1),o=S(0),i=S(),l=S();function f($){var V;(V=i.value)!=null&&V.contains($.target)||(a.value=!1)}F(a,$=>{if($){document.addEventListener("click",f);return}document.removeEventListener("click",f)}),je("Escape",()=>{a.value=!1}),X(()=>{a.value=!1});function v(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function y($){$.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Te(()=>{a.value=!1}))}function L(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return($,V)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Se({"--vp-vh":o.value+"px"}),ref_key:"main",ref:i},[e.headers.length>0?(s(),u("button",{key:0,onClick:v,class:T({open:a.value})},[d("span",ea,N(r(we)(r(n))),1),V[0]||(V[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:L},N(r(n).returnToTopLabel||"Return to top"),1)),k(de,{name:"flyout"},{default:h(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:y},[d("div",ta,[d("a",{class:"top-link",href:"#",onClick:L},N(r(n).returnToTopLabel||"Return to top"),1)]),d("div",na,[k(Be,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),oa=b(aa,[["__scopeId","data-v-d61422fe"]]),sa={class:"container"},ra=["aria-expanded"],ia={class:"menu-text"},la=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=P(),{hasSidebar:a}=D(),{headers:o}=Zn(),{y:i}=Ne(),l=S(0);j(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),X(()=>{o.value=pe(n.value.outline??t.value.outline)});const f=g(()=>o.value.length===0),v=g(()=>f.value&&!a.value),y=g(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:f.value,fixed:v.value}));return(L,$)=>r(n).layout!=="home"&&(!v.value||r(i)>=l.value)?(s(),u("div",{key:0,class:T(y.value)},[d("div",sa,[r(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:$[0]||($[0]=V=>L.$emit("open-menu"))},[$[1]||($[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",ia,N(r(t).sidebarMenuLabel||"Menu"),1)],8,ra)):m("",!0),k(oa,{headers:r(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ca=b(la,[["__scopeId","data-v-9d8129cc"]]);function ua(){const e=S(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const i=Z();return F(()=>i.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const da={},va={class:"VPSwitch",type:"button",role:"switch"},fa={class:"check"},ha={key:0,class:"icon"};function ma(e,t){return s(),u("button",va,[d("span",fa,[e.$slots.default?(s(),u("span",ha,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const pa=b(da,[["render",ma],["__scopeId","data-v-7012e5dd"]]),ka=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=P(),a=ee("toggle-appearance",()=>{t.value=!t.value}),o=S("");return he(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(s(),_(pa,{title:o.value,class:"VPSwitchAppearance","aria-checked":r(t),onClick:r(a)},{default:h(()=>[...l[0]||(l[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),ke=b(ka,[["__scopeId","data-v-fa1daf57"]]),_a={key:0,class:"VPNavBarAppearance"},ba=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=P();return(n,a)=>r(t).appearance&&r(t).appearance!=="force-dark"&&r(t).appearance!=="force-auto"?(s(),u("div",_a,[k(ke)])):m("",!0)}}),ga=b(ba,[["__scopeId","data-v-123fcb2f"]]),_e=S();let He=!1,se=0;function $a(e){const t=S(!1);if(te){!He&&ya(),se++;const n=F(_e,a=>{var o,i,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(i=e.onFocus)==null||i.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});fe(()=>{n(),se--,se||Pa()})}return ze(t)}function ya(){document.addEventListener("focusin",Ae),He=!0,_e.value=document.activeElement}function Pa(){document.removeEventListener("focusin",Ae)}function Ae(){_e.value=document.activeElement}const La={class:"VPMenuLink"},Va=["innerHTML"],Sa=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=P();return(n,a)=>(s(),u("div",La,[k(E,{class:T({active:r(z)(r(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Va)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ne=b(Sa,[["__scopeId","data-v-65e4a6b1"]]),Ta={class:"VPMenuGroup"},Na={key:0,class:"title"},xa=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ta,[e.text?(s(),u("p",Na,N(e.text),1)):m("",!0),(s(!0),u(M,null,B(e.items,a=>(s(),u(M,null,["link"in a?(s(),_(ne,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),Ma=b(xa,[["__scopeId","data-v-2bec9359"]]),Ia={class:"VPMenu"},wa={key:0,class:"items"},Ba=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Ia,[e.items?(s(),u("div",wa,[(s(!0),u(M,null,B(e.items,a=>(s(),u(M,{key:JSON.stringify(a)},["link"in a?(s(),_(ne,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(C(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(Ma,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),Ha=b(Ba,[["__scopeId","data-v-39eca401"]]),Aa=["aria-expanded","aria-label"],Ca={key:0,class:"text"},Ea=["innerHTML"],Fa={key:1,class:"vpi-more-horizontal icon"},Da={class:"menu"},Oa=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=S(!1),n=S();$a({el:n,onBlur:a});function a(){t.value=!1}return(o,i)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:i[1]||(i[1]=l=>t.value=!0),onMouseleave:i[2]||(i[2]=l=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:i[0]||(i[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Ca,[e.icon?(s(),u("span",{key:0,class:T([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ea)):m("",!0),i[3]||(i[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Fa))],8,Aa),d("div",Da,[k(Ha,{items:e.items},{default:h(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),be=b(Oa,[["__scopeId","data-v-40e55da0"]]),Ga=["href","aria-label","innerHTML"],Ua=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=S();j(async()=>{var i;await Te();const o=(i=n.value)==null?void 0:i.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=g(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,i)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Ga))}}),ja=b(Ua,[["__scopeId","data-v-fbf39218"]]),za={class:"VPSocialLinks"},Wa=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",za,[(s(!0),u(M,null,B(e.links,({link:a,icon:o,ariaLabel:i})=>(s(),_(ja,{key:a,icon:o,link:a,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),ge=b(Wa,[["__scopeId","data-v-f2234a39"]]),qa={key:0,class:"group translations"},Ra={class:"trans-title"},Ka={key:1,class:"group"},Ja={class:"item appearance"},Ya={class:"label"},Qa={class:"appearance-action"},Xa={key:2,class:"group"},Za={class:"item social-links"},eo=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=P(),{localeLinks:a,currentLang:o}=R({correspondingLink:!0}),i=g(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,f)=>i.value?(s(),_(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[r(a).length&&r(o).label?(s(),u("div",qa,[d("p",Ra,N(r(o).label),1),(s(!0),u(M,null,B(r(a),v=>(s(),_(ne,{key:v.link,item:v},null,8,["item"]))),128))])):m("",!0),r(t).appearance&&r(t).appearance!=="force-dark"&&r(t).appearance!=="force-auto"?(s(),u("div",Ka,[d("div",Ja,[d("p",Ya,N(r(n).darkModeSwitchLabel||"Appearance"),1),d("div",Qa,[k(ke)])])])):m("",!0),r(n).socialLinks?(s(),u("div",Xa,[d("div",Za,[k(ge,{class:"social-links-list",links:r(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),to=b(eo,[["__scopeId","data-v-0c845e5d"]]),no=["aria-expanded"],ao=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:T(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)])],10,no))}}),oo=b(ao,[["__scopeId","data-v-670493dd"]]),so=["innerHTML"],ro=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=P();return(n,a)=>(s(),_(E,{class:T({VPNavBarMenuLink:!0,active:r(z)(r(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,so)]),_:1},8,["class","href","target","rel","no-icon"]))}}),io=b(ro,[["__scopeId","data-v-8dbce4d0"]]),lo=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=P(),a=i=>"component"in i?!1:"link"in i?z(n.value.relativePath,i.link,!!t.item.activeMatch):i.items.some(a),o=g(()=>a(t.item));return(i,l)=>(s(),_(be,{class:T({VPNavBarMenuGroup:!0,active:r(z)(r(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),co={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},uo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=P();return(n,a)=>r(t).nav?(s(),u("nav",co,[a[0]||(a[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(M,null,B(r(t).nav,o=>(s(),u(M,{key:JSON.stringify(o)},["link"in o?(s(),_(io,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(C(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(lo,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),vo=b(uo,[["__scopeId","data-v-5bacfe89"]]);function fo(e){const{localeIndex:t,theme:n}=P();function a(o){var I,w,H;const i=o.split("."),l=(I=n.value.search)==null?void 0:I.options,f=l&&typeof l=="object",v=f&&((H=(w=l.locales)==null?void 0:w[t.value])==null?void 0:H.translations)||null,y=f&&l.translations||null;let L=v,$=y,V=e;const x=i.pop();for(const A of i){let O=null;const q=V==null?void 0:V[A];q&&(O=V=q);const ae=$==null?void 0:$[A];ae&&(O=$=ae);const oe=L==null?void 0:L[A];oe&&(O=L=oe),q||(V=O),ae||($=O),oe||(L=O)}return(L==null?void 0:L[x])??($==null?void 0:$[x])??(V==null?void 0:V[x])??""}return a}const ho=["aria-label"],mo={class:"DocSearch-Button-Container"},po={class:"DocSearch-Button-Placeholder"},$e=p({__name:"VPNavBarSearchButton",setup(e){const n=fo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(n)("button.buttonAriaLabel")},[d("span",mo,[o[0]||(o[0]=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),d("span",po,N(r(n)("button.buttonText")),1)]),o[1]||(o[1]=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,ho))}}),ko={class:"VPNavBarSearch"},_o={id:"local-search"},bo={key:1,id:"docsearch"},go=p({__name:"VPNavBarSearch",setup(e){const t=()=>null,n=()=>null,{theme:a}=P(),o=S(!1),i=S(!1);j(()=>{});function l(){o.value||(o.value=!0,setTimeout(f,16))}function f(){const L=new Event("keydown");L.key="k",L.metaKey=!0,window.dispatchEvent(L),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}const v=S(!1),y="";return(L,$)=>{var V;return s(),u("div",ko,[r(y)==="local"?(s(),u(M,{key:0},[v.value?(s(),_(r(t),{key:0,onClose:$[0]||($[0]=x=>v.value=!1)})):m("",!0),d("div",_o,[k($e,{onClick:$[1]||($[1]=x=>v.value=!0)})])],64)):r(y)==="algolia"?(s(),u(M,{key:1},[o.value?(s(),_(r(n),{key:0,algolia:((V=r(a).search)==null?void 0:V.options)??r(a).algolia,onVnodeBeforeMount:$[2]||($[2]=x=>i.value=!0)},null,8,["algolia"])):m("",!0),i.value?m("",!0):(s(),u("div",bo,[k($e,{onClick:l})]))],64)):m("",!0)])}}}),$o=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=P();return(n,a)=>r(t).socialLinks?(s(),_(ge,{key:0,class:"VPNavBarSocialLinks",links:r(t).socialLinks},null,8,["links"])):m("",!0)}}),yo=b($o,[["__scopeId","data-v-08b35e6f"]]),Po=["href","rel","target"],Lo=["innerHTML"],Vo={key:2},So=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=P(),{hasSidebar:a}=D(),{currentLang:o}=R(),i=g(()=>{var v;return typeof n.value.logoLink=="string"?n.value.logoLink:(v=n.value.logoLink)==null?void 0:v.link}),l=g(()=>{var v;return typeof n.value.logoLink=="string"||(v=n.value.logoLink)==null?void 0:v.rel}),f=g(()=>{var v;return typeof n.value.logoLink=="string"||(v=n.value.logoLink)==null?void 0:v.target});return(v,y)=>(s(),u("div",{class:T(["VPNavBarTitle",{"has-sidebar":r(a)}])},[d("a",{class:"title",href:i.value??r(me)(r(o).link),rel:l.value,target:f.value},[c(v.$slots,"nav-bar-title-before",{},void 0,!0),r(n).logo?(s(),_(Y,{key:0,class:"logo",image:r(n).logo},null,8,["image"])):m("",!0),r(n).siteTitle?(s(),u("span",{key:1,innerHTML:r(n).siteTitle},null,8,Lo)):r(n).siteTitle===void 0?(s(),u("span",Vo,N(r(t).title),1)):m("",!0),c(v.$slots,"nav-bar-title-after",{},void 0,!0)],8,Po)],2))}}),To=b(So,[["__scopeId","data-v-5622a072"]]),No={class:"items"},xo={class:"title"},Mo=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=P(),{localeLinks:n,currentLang:a}=R({correspondingLink:!0});return(o,i)=>r(n).length&&r(a).label?(s(),_(be,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(t).langMenuLabel||"Change language"},{default:h(()=>[d("div",No,[d("p",xo,N(r(a).label),1),(s(!0),u(M,null,B(r(n),l=>(s(),_(ne,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),Io=b(Mo,[["__scopeId","data-v-dac637f3"]]),wo={class:"wrapper"},Bo={class:"container"},Ho={class:"title"},Ao={class:"content"},Co={class:"content-body"},Eo=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Ne(),{hasSidebar:a}=D(),{frontmatter:o}=P(),i=S({});return he(()=>{i.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,f)=>(s(),u("div",{class:T(["VPNavBar",i.value])},[d("div",wo,[d("div",Bo,[d("div",Ho,[k(To,null,{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ao,[d("div",Co,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(go,{class:"search"}),k(vo,{class:"menu"}),k(Io,{class:"translations"}),k(ga,{class:"appearance"}),k(yo,{class:"social-links"}),k(to,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(oo,{class:"hamburger",active:e.isScreenOpen,onClick:f[0]||(f[0]=v=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),f[1]||(f[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),Fo=b(Eo,[["__scopeId","data-v-bb7529ee"]]),Do={key:0,class:"VPNavScreenAppearance"},Oo={class:"text"},Go=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=P();return(a,o)=>r(t).appearance&&r(t).appearance!=="force-dark"&&r(t).appearance!=="force-auto"?(s(),u("div",Do,[d("p",Oo,N(r(n).darkModeSwitchLabel||"Appearance"),1),k(ke)])):m("",!0)}}),Uo=b(Go,[["__scopeId","data-v-774971f8"]]),jo=["innerHTML"],zo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=ee("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:r(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,jo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Wo=b(zo,[["__scopeId","data-v-29871565"]]),qo=["innerHTML"],Ro=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=ee("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:r(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,qo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ce=b(Ro,[["__scopeId","data-v-581896e9"]]),Ko={class:"VPNavScreenMenuGroupSection"},Jo={key:0,class:"title"},Yo=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",Jo,N(e.text),1)):m("",!0),(s(!0),u(M,null,B(e.items,a=>(s(),_(Ce,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Qo=b(Yo,[["__scopeId","data-v-836cddb8"]]),Xo=["aria-controls","aria-expanded"],Zo=["innerHTML"],es=["id"],ts={key:0,class:"item"},ns={key:1,class:"item"},as={key:2,class:"group"},os=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=S(!1),a=g(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(i,l)=>(s(),u("div",{class:T(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[d("span",{class:"button-text",innerHTML:e.text},null,8,Zo),l[0]||(l[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,Xo),d("div",{id:a.value,class:"items"},[(s(!0),u(M,null,B(e.items,f=>(s(),u(M,{key:JSON.stringify(f)},["link"in f?(s(),u("div",ts,[k(Ce,{item:f},null,8,["item"])])):"component"in f?(s(),u("div",ns,[(s(),_(C(f.component),G({ref_for:!0},f.props,{"screen-menu":""}),null,16))])):(s(),u("div",as,[k(Qo,{text:f.text,items:f.items},null,8,["text","items"])]))],64))),128))],8,es)],2))}}),ss=b(os,[["__scopeId","data-v-a8d3502a"]]),rs={key:0,class:"VPNavScreenMenu"},is=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=P();return(n,a)=>r(t).nav?(s(),u("nav",rs,[(s(!0),u(M,null,B(r(t).nav,o=>(s(),u(M,{key:JSON.stringify(o)},["link"in o?(s(),_(Wo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(C(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(ss,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),ls=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=P();return(n,a)=>r(t).socialLinks?(s(),_(ge,{key:0,class:"VPNavScreenSocialLinks",links:r(t).socialLinks},null,8,["links"])):m("",!0)}}),cs={class:"list"},us=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=R({correspondingLink:!0}),a=S(!1);function o(){a.value=!a.value}return(i,l)=>r(t).length&&r(n).label?(s(),u("div",{key:0,class:T(["VPNavScreenTranslations",{open:a.value}])},[d("button",{class:"title",onClick:o},[l[0]||(l[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),U(" "+N(r(n).label)+" ",1),l[1]||(l[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",cs,[(s(!0),u(M,null,B(r(t),f=>(s(),u("li",{key:f.link,class:"item"},[k(E,{class:"link",href:f.link},{default:h(()=>[U(N(f.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),ds=b(us,[["__scopeId","data-v-0d43316b"]]),vs={class:"container"},fs=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=S(null),n=xe(te?document.body:null);return(a,o)=>(s(),_(de,{name:"fade",onEnter:o[0]||(o[0]=i=>n.value=!0),onAfterLeave:o[1]||(o[1]=i=>n.value=!1)},{default:h(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",vs,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(is,{class:"menu"}),k(ds,{class:"translations"}),k(Uo,{class:"appearance"}),k(ls,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),hs=b(fs,[["__scopeId","data-v-34fa79a7"]]),ms={key:0,class:"VPNav"},ps=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=ua(),{frontmatter:o}=P(),i=g(()=>o.value.navbar!==!1);return Me("close-screen",n),Q(()=>{te&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,f)=>i.value?(s(),u("header",ms,[k(Fo,{"is-screen-open":r(t),onToggleScreen:r(a)},{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(hs,{open:r(t)},{"nav-screen-content-before":h(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ks=b(ps,[["__scopeId","data-v-a46e73f0"]]),_s=["role","tabindex"],bs={key:1,class:"items"},gs=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:i,hasActiveLink:l,hasChildren:f,toggle:v}=ft(g(()=>t.item)),y=g(()=>f.value?"section":"div"),L=g(()=>o.value?"a":"div"),$=g(()=>f.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),V=g(()=>o.value?void 0:"button"),x=g(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":i.value},{"has-active":l.value}]);function I(H){"key"in H&&H.key!=="Enter"||!t.item.link&&v()}function w(){t.item.link&&v()}return(H,A)=>{const O=W("VPSidebarItem",!0);return s(),_(C(y.value),{class:T(["VPSidebarItem",x.value])},{default:h(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:V.value},We(e.item.items?{click:I,keydown:I}:{},!0),{tabindex:e.item.items&&0}),[A[1]||(A[1]=d("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:L.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:h(()=>[(s(),_(C($.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(C($.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:w,onKeydown:qe(w,["enter"]),tabindex:"0"},[...A[0]||(A[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,_s)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",bs,[e.depth<5?(s(!0),u(M,{key:0},B(e.item.items,q=>(s(),_(O,{key:q.text,item:q,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),$s=b(gs,[["__scopeId","data-v-2e0476bc"]]),ys=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=S(!0);let n=null;return j(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),Re(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(M,null,B(e.items,i=>(s(),u("div",{key:i.text,class:T(["group",{"no-transition":t.value}])},[k($s,{item:i,depth:0},null,8,["item"])],2))),128))}}),Ps=b(ys,[["__scopeId","data-v-ec086cd5"]]),Ls={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Vs=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=D(),a=e,o=S(null),i=xe(te?document.body:null);F([a,o],()=>{var f;a.open?(i.value=!0,(f=o.value)==null||f.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=S(0);return F(t,()=>{l.value+=1},{deep:!0}),(f,v)=>r(n)?(s(),u("aside",{key:0,class:T(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:v[0]||(v[0]=Ke(()=>{},["stop"]))},[v[2]||(v[2]=d("div",{class:"curtain"},null,-1)),d("nav",Ls,[v[1]||(v[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(f.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_(Ps,{items:r(t),key:l.value},null,8,["items"])),c(f.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ss=b(Vs,[["__scopeId","data-v-12a40e3d"]]),Ts=p({__name:"VPSkipLink",setup(e){const{theme:t}=P(),n=Z(),a=S();F(()=>n.path,()=>a.value.focus());function o({target:i}){const l=document.getElementById(decodeURIComponent(i.hash).slice(1));if(l){const f=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",f)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",f),l.focus(),window.scrollTo(0,0)}}return(i,l)=>(s(),u(M,null,[d("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},N(r(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ns=b(Ts,[["__scopeId","data-v-17ad389b"]]),xs=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=D(),o=Z();F(()=>o.path,a),vt(t,a);const{frontmatter:i}=P(),l=Je(),f=g(()=>!!l["home-hero-image"]);return Me("hero-image-slot-exists",f),(v,y)=>{const L=W("Content");return r(i).layout!==!1?(s(),u("div",{key:0,class:T(["Layout",r(i).pageClass])},[c(v.$slots,"layout-top",{},void 0,!0),k(Ns),k(Ze,{class:"backdrop",show:r(t),onClick:r(a)},null,8,["show","onClick"]),k(ks,null,{"nav-bar-title-before":h(()=>[c(v.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(v.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(v.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(v.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[c(v.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(v.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ca,{open:r(t),onOpenMenu:r(n)},null,8,["open","onOpenMenu"]),k(Ss,{open:r(t)},{"sidebar-nav-before":h(()=>[c(v.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[c(v.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Rn,null,{"page-top":h(()=>[c(v.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(v.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[c(v.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[c(v.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(v.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(v.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(v.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(v.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(v.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(v.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(v.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(v.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(v.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(v.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[c(v.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(v.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Xn),c(v.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(L,{key:1}))}}}),Ms=b(xs,[["__scopeId","data-v-c4daae71"]]),ye={Layout:Ms,enhanceApp:({app:e})=>{e.component("Badge",Ye)}},Is={key:0,class:"docsNavLink docsBackLink",href:"/",target:"_self","aria-label":"Вернуться к списку документаций"},ws={key:2,class:"docsNavLinks","aria-label":"Навигация документации"},Pe="https://gromlab.ru/gromov/docs",Bs=p({__name:"HomeLink",props:{variant:{default:"back"}},setup(e){return(t,n)=>e.variant==="back"?(s(),u("a",Is,[...n[0]||(n[0]=[d("span",{class:"docsBackIcon","aria-hidden":"true"},"←",-1),d("span",null,"К списку документаций",-1)])])):e.variant==="repo"?(s(),u("a",{key:1,class:"docsRepoLink",href:Pe,target:"_blank",rel:"noopener noreferrer","aria-label":"Открыть репозиторий",title:"Репозиторий"},[...n[1]||(n[1]=[d("svg",{"aria-hidden":"true",viewBox:"0 0 24 24"},[d("path",{d:"M12 .5a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57l-.02-2.04c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1.01-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .5Z"})],-1)])])):(s(),u("nav",ws,[n[3]||(n[3]=d("a",{class:"docsNavLink",href:"/",target:"_self","aria-label":"Вернуться к списку документаций"},[d("span",{class:"docsBackIcon","aria-hidden":"true"},"←"),d("span",null,"К списку документаций")],-1)),d("a",{class:"docsNavLink",href:Pe,target:"_blank",rel:"noopener noreferrer","aria-label":"Открыть репозиторий документации"},[...n[2]||(n[2]=[d("svg",{class:"docsScreenRepoIcon","aria-hidden":"true",viewBox:"0 0 24 24"},[d("path",{d:"M12 .5a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57l-.02-2.04c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1.01-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .5Z"})],-1),U(" Репозиторий ",-1)])])]))}}),re=b(Bs,[["__scopeId","data-v-6cf40780"]]),As={extends:ye,Layout(){return K(ye.Layout,null,{"nav-bar-content-before":()=>K(re,{variant:"back"}),"nav-bar-content-after":()=>K(re,{variant:"repo"}),"nav-screen-content-before":()=>K(re,{variant:"screen"})})}};export{As as R}; diff --git a/public/template-sync-strategy/assets/concepts_model.md.C805A9As.js b/public/template-sync-strategy/assets/concepts_model.md.C805A9As.js deleted file mode 100644 index 210b736..0000000 --- a/public/template-sync-strategy/assets/concepts_model.md.C805A9As.js +++ /dev/null @@ -1,4 +0,0 @@ -import{_ as a,o as s,c as t,ae as i}from"./chunks/framework.B1nRs-GM.js";const k=JSON.parse('{"title":"Модель веток","description":"Роли веток и remote в стратегии обновления проекта от шаблона.","frontmatter":{"title":"Модель веток","description":"Роли веток и remote в стратегии обновления проекта от шаблона."},"headers":[],"relativePath":"concepts/model.md","filePath":"concepts/model.md"}'),p={name:"concepts/model.md"};function l(n,e,d,o,h,r){return s(),t("div",null,[...e[0]||(e[0]=[i(`

Модель веток

Целевая схема:

text
templates/master -> template -> sync/* -> master

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

templates/master

templates/master — это master из репозитория шаблона.

В репозитории приложения он доступен через remote templates:

bash
git remote add templates <template-repo-url>
-git fetch templates

Этот remote считается источником обновлений шаблона.

template

template — чистый слепок шаблона внутри репозитория приложения.

Его задача — показать, какая версия шаблонной базы сейчас доступна приложению.

В template нельзя коммитить руками изменения приложения. Эта ветка обновляется только из templates/master.

master

master — основная ветка приложения.

Она содержит:

  • базу шаблона;
  • продуктовый код;
  • локальные настройки приложения;
  • историю применения обновлений шаблона.

master не используется как место ручного решения конфликтов при обновлении шаблона.

sync/*

sync/* — временная ветка для обновления приложения от шаблона.

Она создаётся от актуального origin/master, после чего в неё вливается origin/template.

Пример:

bash
git fetch origin
-git switch -c sync/update-template-v2 origin/master
-git merge origin/template

Если появляются конфликты, они решаются именно в этой ветке.

Почему нужен отдельный sync-слой

Нельзя безопасно использовать template как source branch для прямого PR/MR в master: если возникнет конфликт, решение может попасть в template.

После этого template перестанет быть чистым слепком шаблона. Git начнёт видеть в ней не только шаблон, но и локальные решения конкретного приложения.

sync/* можно пачкать conflict resolve-коммитами, проверками и правками совместимости. Эта ветка временная и удаляется после merge.

`,29)])])}const m=a(p,[["render",l]]);export{k as __pageData,m as default}; diff --git a/public/template-sync-strategy/assets/concepts_model.md.C805A9As.lean.js b/public/template-sync-strategy/assets/concepts_model.md.C805A9As.lean.js deleted file mode 100644 index d6d4eaa..0000000 --- a/public/template-sync-strategy/assets/concepts_model.md.C805A9As.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as s,c as t,ae as i}from"./chunks/framework.B1nRs-GM.js";const k=JSON.parse('{"title":"Модель веток","description":"Роли веток и remote в стратегии обновления проекта от шаблона.","frontmatter":{"title":"Модель веток","description":"Роли веток и remote в стратегии обновления проекта от шаблона."},"headers":[],"relativePath":"concepts/model.md","filePath":"concepts/model.md"}'),p={name:"concepts/model.md"};function l(n,e,d,o,h,r){return s(),t("div",null,[...e[0]||(e[0]=[i("",29)])])}const m=a(p,[["render",l]]);export{k as __pageData,m as default}; diff --git a/public/template-sync-strategy/assets/concepts_rules.md.QraT4IhZ.js b/public/template-sync-strategy/assets/concepts_rules.md.QraT4IhZ.js deleted file mode 100644 index a430a72..0000000 --- a/public/template-sync-strategy/assets/concepts_rules.md.QraT4IhZ.js +++ /dev/null @@ -1,3 +0,0 @@ -import{_ as a,o as t,c as s,ae as o}from"./chunks/framework.B1nRs-GM.js";const h=JSON.parse('{"title":"Правила процесса","description":"Набор правил, который удерживает template чистой, а обновления шаблона контролируемыми.","frontmatter":{"title":"Правила процесса","description":"Набор правил, который удерживает template чистой, а обновления шаблона контролируемыми."},"headers":[],"relativePath":"concepts/rules.md","filePath":"concepts/rules.md"}'),l={name:"concepts/rules.md"};function c(i,e,d,n,r,p){return t(),s("div",null,[...e[0]||(e[0]=[o(`

Правила процесса

Небольшой набор правил удерживает схему чистой.

Делаем

  • template обновляем только из templates/master.
  • sync/* создаём от origin/master.
  • origin/template вливаем в sync/*, а не напрямую в master.
  • Конфликты решаем только в sync/*.
  • sync/* -> master вливаем через PR/MR.
  • Для sync-PR/MR отключаем squash.

Не делаем

  • Не правим template руками.
  • Не коммитим изменения приложения в template.
  • Не мержим template -> master напрямую.
  • Не решаем конфликты в master.
  • Не включаем squash для sync/* -> master.

Почему squash нельзя

Squash может уничтожить нормальную связь истории master с историей template.

Git использует историю, чтобы понимать, какие изменения шаблона уже были доставлены в приложение. Если результат обновления шаблона превратить в один squash-коммит, связь с исходными коммитами шаблона станет хуже или исчезнет.

Для sync-PR/MR допустимы:

text
fast-forward merge = хорошо
-merge commit       = допустимо
-squash merge       = нельзя

Почему template нельзя пачкать

template — эталонный слепок оригинального шаблона.

Если в неё попадает локальное решение конфликта или изменение приложения, она перестаёт отвечать на вопрос: “какая версия шаблона сейчас подключена к приложению?”.

После этого ломается главная граница ответственности: шаблон отдельно, приложение отдельно, конфликтная зона отдельно.

`,16)])])}const u=a(l,[["render",c]]);export{h as __pageData,u as default}; diff --git a/public/template-sync-strategy/assets/concepts_rules.md.QraT4IhZ.lean.js b/public/template-sync-strategy/assets/concepts_rules.md.QraT4IhZ.lean.js deleted file mode 100644 index c0aa4ab..0000000 --- a/public/template-sync-strategy/assets/concepts_rules.md.QraT4IhZ.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as s,ae as o}from"./chunks/framework.B1nRs-GM.js";const h=JSON.parse('{"title":"Правила процесса","description":"Набор правил, который удерживает template чистой, а обновления шаблона контролируемыми.","frontmatter":{"title":"Правила процесса","description":"Набор правил, который удерживает template чистой, а обновления шаблона контролируемыми."},"headers":[],"relativePath":"concepts/rules.md","filePath":"concepts/rules.md"}'),l={name:"concepts/rules.md"};function c(i,e,d,n,r,p){return t(),s("div",null,[...e[0]||(e[0]=[o("",16)])])}const u=a(l,[["render",c]]);export{h as __pageData,u as default}; diff --git a/public/template-sync-strategy/assets/concepts_why.md.akfw90Fj.js b/public/template-sync-strategy/assets/concepts_why.md.akfw90Fj.js deleted file mode 100644 index b73b657..0000000 --- a/public/template-sync-strategy/assets/concepts_why.md.akfw90Fj.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as i,ae as l}from"./chunks/framework.B1nRs-GM.js";const u=JSON.parse('{"title":"Зачем это нужно","description":"Почему шаблону нужен процесс обновления, а не только быстрый старт нового проекта.","frontmatter":{"title":"Зачем это нужно","description":"Почему шаблону нужен процесс обновления, а не только быстрый старт нового проекта."},"headers":[],"relativePath":"concepts/why.md","filePath":"concepts/why.md"}'),o={name:"concepts/why.md"};function r(n,e,p,c,d,s){return t(),i("div",null,[...e[0]||(e[0]=[l('

Зачем это нужно

Шаблон закрывает повторяющуюся техническую базу проекта: CI/CD, Dockerfile, зависимости, lint, build, структуру каталогов и базовую документацию.

Это снимает рутину на старте. Команде не нужно каждый раз заново собирать одинаковый технический каркас.

Проблема после старта

Создать проект легко. Поддерживать 10-20 проектов сложнее.

Сначала проекты похожи. Потом они начинают расходиться:

  • В одном проекте обновили CI, в другом забыли.
  • В одном проекте Dockerfile остался из шаблона, в другом его локально поправили.
  • В одном проекте зависимости уже свежие, в другом остались старые версии.
  • В одном проекте изменения шаблона перенесли руками, в другом потеряли.

Без процесса обновления шаблон перестаёт быть общей основой. Он остаётся только способом быстро создать первый коммит.

Что ломается без стратегии

Когда шаблон нельзя нормально обновлять:

  • проекты начинают жить своей жизнью;
  • граница между шаблоном и приложением теряется;
  • обновления превращаются в ручное копирование;
  • конфликты решаются прямо в рабочих ветках;
  • становится непонятно, какой проект на какой версии шаблона;
  • Git-история перестаёт быть источником правды.

Это особенно больно, когда приложений много. Для одного проекта ручной перенос ещё можно пережить. Для набора проектов нужен единый маршрут обновления.

Цель стратегии

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

Главная формулировка:

Шаблон должен обновляться так же контролируемо, как обычная фича: через ветку, проверку и PR/MR.

',17)])])}const _=a(o,[["render",r]]);export{u as __pageData,_ as default}; diff --git a/public/template-sync-strategy/assets/concepts_why.md.akfw90Fj.lean.js b/public/template-sync-strategy/assets/concepts_why.md.akfw90Fj.lean.js deleted file mode 100644 index 97944dc..0000000 --- a/public/template-sync-strategy/assets/concepts_why.md.akfw90Fj.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as i,ae as l}from"./chunks/framework.B1nRs-GM.js";const u=JSON.parse('{"title":"Зачем это нужно","description":"Почему шаблону нужен процесс обновления, а не только быстрый старт нового проекта.","frontmatter":{"title":"Зачем это нужно","description":"Почему шаблону нужен процесс обновления, а не только быстрый старт нового проекта."},"headers":[],"relativePath":"concepts/why.md","filePath":"concepts/why.md"}'),o={name:"concepts/why.md"};function r(n,e,p,c,d,s){return t(),i("div",null,[...e[0]||(e[0]=[l("",17)])])}const _=a(o,[["render",r]]);export{u as __pageData,_ as default}; diff --git a/public/template-sync-strategy/assets/index.md.C5Q_ZnE3.js b/public/template-sync-strategy/assets/index.md.C5Q_ZnE3.js deleted file mode 100644 index 2081487..0000000 --- a/public/template-sync-strategy/assets/index.md.C5Q_ZnE3.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as a,c as l,ae as r}from"./chunks/framework.B1nRs-GM.js";const h=JSON.parse('{"title":"Template Sync Strategy","description":"Управляемое обновление проектов от шаблона через чистую ветку template, временные sync-ветки и PR/MR.","frontmatter":{"title":"Template Sync Strategy","description":"Управляемое обновление проектов от шаблона через чистую ветку template, временные sync-ветки и PR/MR.","keywords":["template sync","шаблон проекта","обновление шаблона","git template","sync branch","template branch"]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),o={name:"index.md"};function i(s,e,c,n,d,p){return a(),l("div",null,[...e[0]||(e[0]=[r('

Template Sync Strategy

Template Sync Strategy описывает процесс, при котором приложение создаётся от шаблона и дальше регулярно получает обновления шаблона без ручного копирования файлов.

Основной маршрут:

text
templates/master -> template -> sync/* -> master

Где:

  • templates/master — основная ветка внешнего репозитория шаблона.
  • template — чистый слепок шаблона внутри репозитория приложения.
  • sync/* — временная ветка, где шаблон накладывается на приложение.
  • master — основная ветка приложения.

Задача

Шаблон хорошо решает старт проекта: приносит CI/CD, Dockerfile, зависимости, линтер, сборку, структуру и базовую документацию. Но после старта приложения расходятся: где-то обновили CI, где-то забыли, где-то сделали локальную кастомизацию.

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

Главный принцип

Ветка template должна оставаться чистым слепком оригинального шаблона.

В неё нельзя коммитить изменения приложения и нельзя решать конфликты. Все конфликтные решения выполняются только во временных ветках sync/*.

Состав документации

',15)])])}const u=t(o,[["render",i]]);export{h as __pageData,u as default}; diff --git a/public/template-sync-strategy/assets/index.md.C5Q_ZnE3.lean.js b/public/template-sync-strategy/assets/index.md.C5Q_ZnE3.lean.js deleted file mode 100644 index d684d3b..0000000 --- a/public/template-sync-strategy/assets/index.md.C5Q_ZnE3.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as a,c as l,ae as r}from"./chunks/framework.B1nRs-GM.js";const h=JSON.parse('{"title":"Template Sync Strategy","description":"Управляемое обновление проектов от шаблона через чистую ветку template, временные sync-ветки и PR/MR.","frontmatter":{"title":"Template Sync Strategy","description":"Управляемое обновление проектов от шаблона через чистую ветку template, временные sync-ветки и PR/MR.","keywords":["template sync","шаблон проекта","обновление шаблона","git template","sync branch","template branch"]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),o={name:"index.md"};function i(s,e,c,n,d,p){return a(),l("div",null,[...e[0]||(e[0]=[r("",15)])])}const u=t(o,[["render",i]]);export{h as __pageData,u as default}; diff --git a/public/template-sync-strategy/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/public/template-sync-strategy/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 deleted file mode 100644 index b6b603d..0000000 Binary files a/public/template-sync-strategy/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/public/template-sync-strategy/assets/inter-italic-cyrillic.By2_1cv3.woff2 deleted file mode 100644 index def40a4..0000000 Binary files a/public/template-sync-strategy/assets/inter-italic-cyrillic.By2_1cv3.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/public/template-sync-strategy/assets/inter-italic-greek-ext.1u6EdAuj.woff2 deleted file mode 100644 index e070c3d..0000000 Binary files a/public/template-sync-strategy/assets/inter-italic-greek-ext.1u6EdAuj.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/public/template-sync-strategy/assets/inter-italic-greek.DJ8dCoTZ.woff2 deleted file mode 100644 index a3c16ca..0000000 Binary files a/public/template-sync-strategy/assets/inter-italic-greek.DJ8dCoTZ.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/public/template-sync-strategy/assets/inter-italic-latin-ext.CN1xVJS-.woff2 deleted file mode 100644 index 2210a89..0000000 Binary files a/public/template-sync-strategy/assets/inter-italic-latin-ext.CN1xVJS-.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-italic-latin.C2AdPX0b.woff2 b/public/template-sync-strategy/assets/inter-italic-latin.C2AdPX0b.woff2 deleted file mode 100644 index 790d62d..0000000 Binary files a/public/template-sync-strategy/assets/inter-italic-latin.C2AdPX0b.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/public/template-sync-strategy/assets/inter-italic-vietnamese.BSbpV94h.woff2 deleted file mode 100644 index 1eec077..0000000 Binary files a/public/template-sync-strategy/assets/inter-italic-vietnamese.BSbpV94h.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/public/template-sync-strategy/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 deleted file mode 100644 index 2cfe615..0000000 Binary files a/public/template-sync-strategy/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/public/template-sync-strategy/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 deleted file mode 100644 index e3886dd..0000000 Binary files a/public/template-sync-strategy/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/public/template-sync-strategy/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 deleted file mode 100644 index 36d6748..0000000 Binary files a/public/template-sync-strategy/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-roman-greek.BBVDIX6e.woff2 b/public/template-sync-strategy/assets/inter-roman-greek.BBVDIX6e.woff2 deleted file mode 100644 index 2bed1e8..0000000 Binary files a/public/template-sync-strategy/assets/inter-roman-greek.BBVDIX6e.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/public/template-sync-strategy/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 deleted file mode 100644 index 9a8d1e2..0000000 Binary files a/public/template-sync-strategy/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-roman-latin.Di8DUHzh.woff2 b/public/template-sync-strategy/assets/inter-roman-latin.Di8DUHzh.woff2 deleted file mode 100644 index 07d3c53..0000000 Binary files a/public/template-sync-strategy/assets/inter-roman-latin.Di8DUHzh.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/public/template-sync-strategy/assets/inter-roman-vietnamese.BjW4sHH5.woff2 deleted file mode 100644 index 57bdc22..0000000 Binary files a/public/template-sync-strategy/assets/inter-roman-vietnamese.BjW4sHH5.woff2 and /dev/null differ diff --git a/public/template-sync-strategy/assets/overview.md.DOeHHuHO.js b/public/template-sync-strategy/assets/overview.md.DOeHHuHO.js deleted file mode 100644 index d1f8079..0000000 --- a/public/template-sync-strategy/assets/overview.md.DOeHHuHO.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as r,ae as l}from"./chunks/framework.B1nRs-GM.js";const h=JSON.parse('{"title":"Template Sync Strategy","description":"Управляемое обновление проектов от шаблона через чистую ветку template, временные sync-ветки и PR/MR.","frontmatter":{"title":"Template Sync Strategy","description":"Управляемое обновление проектов от шаблона через чистую ветку template, временные sync-ветки и PR/MR.","keywords":["template sync","шаблон проекта","обновление шаблона","git template","sync branch","template branch"]},"headers":[],"relativePath":"overview.md","filePath":"overview.md"}'),o={name:"overview.md"};function i(s,e,c,n,d,p){return t(),r("div",null,[...e[0]||(e[0]=[l('

Template Sync Strategy

Template Sync Strategy описывает процесс, при котором приложение создаётся от шаблона и дальше регулярно получает обновления шаблона без ручного копирования файлов.

Основной маршрут:

text
templates/master -> template -> sync/* -> master

Где:

  • templates/master — основная ветка внешнего репозитория шаблона.
  • template — чистый слепок шаблона внутри репозитория приложения.
  • sync/* — временная ветка, где шаблон накладывается на приложение.
  • master — основная ветка приложения.

Задача

Шаблон хорошо решает старт проекта: приносит CI/CD, Dockerfile, зависимости, линтер, сборку, структуру и базовую документацию. Но после старта приложения расходятся: где-то обновили CI, где-то забыли, где-то сделали локальную кастомизацию.

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

Главный принцип

Ветка template должна оставаться чистым слепком оригинального шаблона.

В неё нельзя коммитить изменения приложения и нельзя решать конфликты. Все конфликтные решения выполняются только во временных ветках sync/*.

Состав документации

',15)])])}const f=a(o,[["render",i]]);export{h as __pageData,f as default}; diff --git a/public/template-sync-strategy/assets/overview.md.DOeHHuHO.lean.js b/public/template-sync-strategy/assets/overview.md.DOeHHuHO.lean.js deleted file mode 100644 index 2e39c4c..0000000 --- a/public/template-sync-strategy/assets/overview.md.DOeHHuHO.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as r,ae as l}from"./chunks/framework.B1nRs-GM.js";const h=JSON.parse('{"title":"Template Sync Strategy","description":"Управляемое обновление проектов от шаблона через чистую ветку template, временные sync-ветки и PR/MR.","frontmatter":{"title":"Template Sync Strategy","description":"Управляемое обновление проектов от шаблона через чистую ветку template, временные sync-ветки и PR/MR.","keywords":["template sync","шаблон проекта","обновление шаблона","git template","sync branch","template branch"]},"headers":[],"relativePath":"overview.md","filePath":"overview.md"}'),o={name:"overview.md"};function i(s,e,c,n,d,p){return t(),r("div",null,[...e[0]||(e[0]=[l("",15)])])}const f=a(o,[["render",i]]);export{h as __pageData,f as default}; diff --git a/public/template-sync-strategy/assets/reference_cheatsheet.md.0TzKSaSb.js b/public/template-sync-strategy/assets/reference_cheatsheet.md.0TzKSaSb.js deleted file mode 100644 index bc5896b..0000000 --- a/public/template-sync-strategy/assets/reference_cheatsheet.md.0TzKSaSb.js +++ /dev/null @@ -1,7 +0,0 @@ -import{_ as a,o as i,c as e,ae as t}from"./chunks/framework.B1nRs-GM.js";const k=JSON.parse('{"title":"Памятка","description":"Короткий набор команд для регулярного обновления приложения от шаблона.","frontmatter":{"title":"Памятка","description":"Короткий набор команд для регулярного обновления приложения от шаблона."},"headers":[],"relativePath":"reference/cheatsheet.md","filePath":"reference/cheatsheet.md"}'),n={name:"reference/cheatsheet.md"};function l(h,s,p,d,c,o){return i(),e("div",null,[...s[0]||(s[0]=[t(`

Памятка

Рабочая схема:

text
templates/master -> template -> sync/* -> master

Обновить template

В репозитории приложения:

bash
git switch template
-git pull --ff-only
-git push

Это подтягивает свежий шаблон из templates/master и пушит его в origin/template.

Создать ветку обновления

bash
git fetch origin
-git switch -c sync/update-template-vX origin/master
-git merge origin/template

Если есть конфликты, решить их в этой же ветке:

bash
git add .
-git commit

Запушить sync-ветку

bash
git push -u origin sync/update-template-vX

Влить через UI

Создать PR/MR:

text
source: sync/update-template-vX
-target: master

Важно:

text
squash = off

Проверка

bash
git --no-pager log --oneline --graph --decorate --all --max-count=30

Суть процесса

  1. Обновить template из templates/master.
  2. Создать sync/* от origin/master.
  3. Влить origin/template в sync/*.
  4. Решить конфликты, если есть.
  5. Запушить sync/*.
  6. Через UI влить sync/* -> master.
`,23)])])}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/public/template-sync-strategy/assets/reference_cheatsheet.md.0TzKSaSb.lean.js b/public/template-sync-strategy/assets/reference_cheatsheet.md.0TzKSaSb.lean.js deleted file mode 100644 index d8aa863..0000000 --- a/public/template-sync-strategy/assets/reference_cheatsheet.md.0TzKSaSb.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as i,c as e,ae as t}from"./chunks/framework.B1nRs-GM.js";const k=JSON.parse('{"title":"Памятка","description":"Короткий набор команд для регулярного обновления приложения от шаблона.","frontmatter":{"title":"Памятка","description":"Короткий набор команд для регулярного обновления приложения от шаблона."},"headers":[],"relativePath":"reference/cheatsheet.md","filePath":"reference/cheatsheet.md"}'),n={name:"reference/cheatsheet.md"};function l(h,s,p,d,c,o){return i(),e("div",null,[...s[0]||(s[0]=[t("",23)])])}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/public/template-sync-strategy/assets/reference_glossary.md.DLD-b2Ke.js b/public/template-sync-strategy/assets/reference_glossary.md.DLD-b2Ke.js deleted file mode 100644 index 90bf8f2..0000000 --- a/public/template-sync-strategy/assets/reference_glossary.md.DLD-b2Ke.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as r,ae as s}from"./chunks/framework.B1nRs-GM.js";const m=JSON.parse('{"title":"Глоссарий","description":"Термины, которые используются в Template Sync Strategy.","frontmatter":{"title":"Глоссарий","description":"Термины, которые используются в Template Sync Strategy."},"headers":[],"relativePath":"reference/glossary.md","filePath":"reference/glossary.md"}'),i={name:"reference/glossary.md"};function o(l,e,p,n,d,h){return t(),r("div",null,[...e[0]||(e[0]=[s('

Глоссарий

Template repo

Репозиторий шаблона. В нём живёт общая техническая база: CI/CD, Dockerfile, зависимости, линтер, сборка, структура и документация.

App repo

Репозиторий приложения. В нём живёт продуктовый код и локальные настройки конкретного приложения.

templates

Git remote внутри репозитория приложения, который указывает на репозиторий шаблона.

Пример:

bash
git remote add templates <template-repo-url>

templates/master

Ветка master из репозитория шаблона, доступная в приложении через remote templates.

template

Ветка внутри репозитория приложения, которая должна быть чистым слепком templates/master.

master

Основная ветка приложения. Содержит шаблонную базу плюс продуктовый слой.

sync/*

Временные ветки для обновления приложения от шаблона. Создаются от origin/master, получают merge из origin/template, проходят review и затем вливаются в master.

Fast-forward

Обновление ветки без merge-коммита, когда текущая ветка может быть просто передвинута вперёд по истории.

Merge commit

Коммит слияния, который сохраняет связь двух историй. Допустим для sync/* -> master.

Squash

Способ merge, при котором все изменения source branch превращаются в один новый коммит. Для sync-PR/MR запрещён, потому что может разрушить полезную связь истории master с историей template.

',24)])])}const u=a(i,[["render",o]]);export{m as __pageData,u as default}; diff --git a/public/template-sync-strategy/assets/reference_glossary.md.DLD-b2Ke.lean.js b/public/template-sync-strategy/assets/reference_glossary.md.DLD-b2Ke.lean.js deleted file mode 100644 index d1f198e..0000000 --- a/public/template-sync-strategy/assets/reference_glossary.md.DLD-b2Ke.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as r,ae as s}from"./chunks/framework.B1nRs-GM.js";const m=JSON.parse('{"title":"Глоссарий","description":"Термины, которые используются в Template Sync Strategy.","frontmatter":{"title":"Глоссарий","description":"Термины, которые используются в Template Sync Strategy."},"headers":[],"relativePath":"reference/glossary.md","filePath":"reference/glossary.md"}'),i={name:"reference/glossary.md"};function o(l,e,p,n,d,h){return t(),r("div",null,[...e[0]||(e[0]=[s("",24)])])}const u=a(i,[["render",o]]);export{m as __pageData,u as default}; diff --git a/public/template-sync-strategy/assets/reference_troubleshooting.md.BrYSpYuW.js b/public/template-sync-strategy/assets/reference_troubleshooting.md.BrYSpYuW.js deleted file mode 100644 index e5481e9..0000000 --- a/public/template-sync-strategy/assets/reference_troubleshooting.md.BrYSpYuW.js +++ /dev/null @@ -1,9 +0,0 @@ -import{_ as i,o as a,c as t,ae as e}from"./chunks/framework.B1nRs-GM.js";const g=JSON.parse('{"title":"Troubleshooting","description":"Типовые ошибки при обновлении проекта от шаблона и способы диагностики.","frontmatter":{"title":"Troubleshooting","description":"Типовые ошибки при обновлении проекта от шаблона и способы диагностики."},"headers":[],"relativePath":"reference/troubleshooting.md","filePath":"reference/troubleshooting.md"}'),n={name:"reference/troubleshooting.md"};function l(h,s,p,k,r,o){return a(),t("div",null,[...s[0]||(s[0]=[e(`

Troubleshooting

fatal: отказ слияния несвязанных историй изменений

Ошибка:

text
fatal: отказ слияния несвязанных историй изменений

Причина: master приложения не был создан от template, поэтому у веток нет общего предка.

Решение: выполнить одноразовую миграцию через sync/bootstrap-template по инструкции Миграция существующего master.

Коротко:

bash
git switch -c sync/bootstrap-template origin/master
-git merge --allow-unrelated-histories origin/template
-git push -u origin sync/bootstrap-template

--ff-only падает на template

Ошибка возникает при команде:

bash
git merge --ff-only templates/master

Причина: в template появились коммиты, которых нет в шаблоне. Значит ветка перестала быть чистым слепком.

Что проверить:

bash
git fetch templates
-git --no-pager log --oneline --graph --decorate templates/master..template

Решение зависит от причины. Не продолжайте обновление, пока не станет понятно, какие локальные коммиты попали в template.

Пустой diff в sync-ветке

Симптом:

bash
git --no-pager diff --stat origin/master...HEAD

не показывает изменений.

Возможные причины:

  • в шаблоне нет новых изменений;
  • origin/template не был обновлён;
  • origin/template не был влит в sync/*;
  • sync-ветка создана не от актуального origin/master.

Что проверить:

bash
git fetch origin
-git fetch templates
-git --no-pager log --oneline -1 origin/template
-git --no-pager log --oneline -1 templates/master
-git --no-pager log --oneline --graph --decorate --all --max-count=50

Случайно включили squash

Если sync-PR/MR уже влит squash-merge, история шаблона могла не сохраниться как нормальная merge-связь.

Что сделать:

  • зафиксировать факт в описании проекта;
  • проверить, видит ли Git последующие обновления шаблона без повторного применения старых изменений;
  • при следующем обновлении внимательно смотреть diff и конфликты;
  • для будущих sync-PR/MR отключить squash.

Если ситуация стала неуправляемой, может потребоваться отдельная техническая миграция истории.

cannot run less

Ошибка:

text
cannot run less

Причина: Git пытается открыть pager less, которого нет в системе.

Решение: использовать git --no-pager:

bash
git --no-pager log --oneline --graph --decorate --all --max-count=50
-git --no-pager diff template...master
`,35)])])}const F=i(n,[["render",l]]);export{g as __pageData,F as default}; diff --git a/public/template-sync-strategy/assets/reference_troubleshooting.md.BrYSpYuW.lean.js b/public/template-sync-strategy/assets/reference_troubleshooting.md.BrYSpYuW.lean.js deleted file mode 100644 index d66c29c..0000000 --- a/public/template-sync-strategy/assets/reference_troubleshooting.md.BrYSpYuW.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,o as a,c as t,ae as e}from"./chunks/framework.B1nRs-GM.js";const g=JSON.parse('{"title":"Troubleshooting","description":"Типовые ошибки при обновлении проекта от шаблона и способы диагностики.","frontmatter":{"title":"Troubleshooting","description":"Типовые ошибки при обновлении проекта от шаблона и способы диагностики."},"headers":[],"relativePath":"reference/troubleshooting.md","filePath":"reference/troubleshooting.md"}'),n={name:"reference/troubleshooting.md"};function l(h,s,p,k,r,o){return a(),t("div",null,[...s[0]||(s[0]=[e("",35)])])}const F=i(n,[["render",l]]);export{g as __pageData,F as default}; diff --git a/public/template-sync-strategy/assets/setup_clean-repository.md.CPqmBfph.js b/public/template-sync-strategy/assets/setup_clean-repository.md.CPqmBfph.js deleted file mode 100644 index bf2a177..0000000 --- a/public/template-sync-strategy/assets/setup_clean-repository.md.CPqmBfph.js +++ /dev/null @@ -1,18 +0,0 @@ -import{_ as a,o as i,c as t,ae as e}from"./chunks/framework.B1nRs-GM.js";const F=JSON.parse('{"title":"Новый проект от шаблона","description":"Старт нового приложения от шаблонного репозитория с правильной историей веток.","frontmatter":{"title":"Новый проект от шаблона","description":"Старт нового приложения от шаблонного репозитория с правильной историей веток."},"headers":[],"relativePath":"setup/clean-repository.md","filePath":"setup/clean-repository.md"}'),p={name:"setup/clean-repository.md"};function n(l,s,h,k,d,r){return i(),t("div",null,[...s[0]||(s[0]=[e(`

Новый проект от шаблона

Этот сценарий подходит, когда репозиторий приложения ещё пустой или его можно безопасно пересоздать от шаблона.

Целевая модель:

text
templates/master -> template -> sync/* -> master

Условия

Есть два репозитория:

text
template repo = репозиторий шаблона
-app repo      = репозиторий приложения

В обоих репозиториях основная ветка называется master.

Подготовить шаблон

В репозитории шаблона:

bash
cd /path/to/template-repo
-git switch master

Если это пустой репозиторий, добавьте первый файл и запушьте master:

bash
printf "# Template Repository\\n\\nBase template version: v1\\n" > README.md
-git add README.md
-git commit -m "docs: добавить базовый шаблон"
-git push -u origin master

Подключить шаблон в приложении

В репозитории приложения:

bash
cd /path/to/app-repo
-git remote add templates <template-repo-url>
-git fetch templates

Создайте ветку template от шаблона:

bash
git switch -c template templates/master
-git push -u origin template

Создайте ветку приложения master от template:

bash
git switch -c master template

Добавьте слой приложения:

bash
mkdir -p app
-printf "Application code v1\\n" > app/app.txt
-git add app/app.txt
-git commit -m "feat: добавить слой приложения"
-git push -u origin master

После этого история выглядит так:

text
template: T1
-master:   T1---A1

Где T1 — коммит шаблона, а A1 — коммит приложения.

Настроить pull и push для template

Можно сделать так, чтобы на ветке template:

text
git pull тянул из templates/master
-git push пушил в origin/template

Команды:

bash
git config branch.template.remote templates
-git config branch.template.merge refs/heads/master
-git config branch.template.pushRemote origin

Дополнительно можно запретить случайный push в репозиторий шаблона:

bash
git remote set-url --push templates DISABLED

Дальше

После первичной настройки постоянные ветки такие:

text
template = чистый шаблон
-master   = приложение

Обновления шаблона выполняются через временные ветки sync/* по инструкции Обычное обновление шаблона.

`,37)])])}const c=a(p,[["render",n]]);export{F as __pageData,c as default}; diff --git a/public/template-sync-strategy/assets/setup_clean-repository.md.CPqmBfph.lean.js b/public/template-sync-strategy/assets/setup_clean-repository.md.CPqmBfph.lean.js deleted file mode 100644 index 74d3122..0000000 --- a/public/template-sync-strategy/assets/setup_clean-repository.md.CPqmBfph.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as i,c as t,ae as e}from"./chunks/framework.B1nRs-GM.js";const F=JSON.parse('{"title":"Новый проект от шаблона","description":"Старт нового приложения от шаблонного репозитория с правильной историей веток.","frontmatter":{"title":"Новый проект от шаблона","description":"Старт нового приложения от шаблонного репозитория с правильной историей веток."},"headers":[],"relativePath":"setup/clean-repository.md","filePath":"setup/clean-repository.md"}'),p={name:"setup/clean-repository.md"};function n(l,s,h,k,d,r){return i(),t("div",null,[...s[0]||(s[0]=[e("",37)])])}const c=a(p,[["render",n]]);export{F as __pageData,c as default}; diff --git a/public/template-sync-strategy/assets/setup_existing-master-migration.md.BQ5VImS9.js b/public/template-sync-strategy/assets/setup_existing-master-migration.md.BQ5VImS9.js deleted file mode 100644 index 2786393..0000000 --- a/public/template-sync-strategy/assets/setup_existing-master-migration.md.BQ5VImS9.js +++ /dev/null @@ -1,17 +0,0 @@ -import{_ as a,o as i,c as t,ae as e}from"./chunks/framework.B1nRs-GM.js";const g=JSON.parse('{"title":"Миграция существующего master","description":"Как одноразово связать master приложения с историей шаблона, если проект был создан отдельно.","frontmatter":{"title":"Миграция существующего master","description":"Как одноразово связать master приложения с историей шаблона, если проект был создан отдельно."},"headers":[],"relativePath":"setup/existing-master-migration.md","filePath":"setup/existing-master-migration.md"}'),p={name:"setup/existing-master-migration.md"};function n(h,s,l,k,d,r){return i(),t("div",null,[...s[0]||(s[0]=[e(`

Миграция существующего master

Этот сценарий нужен, если в репозитории приложения уже есть master, но он был создан не от шаблона.

Проблема

Если master приложения и template имеют разные корневые коммиты, Git видит две несвязанные истории.

Плохое состояние:

text
template: T1---T2---T3
-
-master:   A1---A2

При попытке выполнить обычный merge Git может ответить:

text
fatal: отказ слияния несвязанных историй изменений

Это означает, что у веток нет общего предка.

Цель миграции

Нужно один раз связать истории, чтобы дальше обновления шаблона шли обычным merge-процессом.

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

text
template: T1---T2---T3
-                     \\
-master:   A1---A2-----M

Где M — одноразовый merge-коммит, который связал историю приложения с историей шаблона.

Подключить репозиторий шаблона

В репозитории приложения:

bash
cd /path/to/app-repo
-git remote add templates <template-repo-url>
-git fetch templates
-git fetch origin

Если remote templates уже существует:

bash
git fetch templates
-git fetch origin

Создать или обновить template

Если ветки template ещё нет:

bash
git switch -c template templates/master
-git push -u origin template

Если ветка template уже есть:

bash
git switch template
-git merge --ff-only templates/master
-git push origin template

Опционально настройте удобное поведение pull и push:

bash
git config branch.template.remote templates
-git config branch.template.merge refs/heads/master
-git config branch.template.pushRemote origin
-git remote set-url --push templates DISABLED

Связать master с template

Создайте временную ветку от текущего приложения:

bash
git fetch origin
-git switch -c sync/bootstrap-template origin/master

Слейте шаблон с разрешением несвязанных историй:

bash
git merge --allow-unrelated-histories origin/template

Если есть конфликты, решите их в ветке sync/bootstrap-template:

bash
git add .
-git commit

Если конфликтов не было, Git сам создаст merge-коммит.

Запушьте ветку:

bash
git push -u origin sync/bootstrap-template

Дальше через UI или локально смержите:

text
sync/bootstrap-template -> master

Что проверить перед merge

Посмотрите граф истории:

bash
git --no-pager log --oneline --graph --decorate --all --max-count=50

Убедитесь, что sync/bootstrap-template содержит и историю приложения, и историю шаблона.

Посмотрите итоговый diff:

bash
git --no-pager diff origin/master...sync/bootstrap-template

Когда миграцию делать не стоит

Не стоит связывать истории, если приложение только что создано и его можно безопасно пересоздать от шаблона.

Для нового проекта лучше сделать чистый старт по инструкции Новый проект от шаблона.

`,48)])])}const F=a(p,[["render",n]]);export{g as __pageData,F as default}; diff --git a/public/template-sync-strategy/assets/setup_existing-master-migration.md.BQ5VImS9.lean.js b/public/template-sync-strategy/assets/setup_existing-master-migration.md.BQ5VImS9.lean.js deleted file mode 100644 index 0ced6be..0000000 --- a/public/template-sync-strategy/assets/setup_existing-master-migration.md.BQ5VImS9.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as i,c as t,ae as e}from"./chunks/framework.B1nRs-GM.js";const g=JSON.parse('{"title":"Миграция существующего master","description":"Как одноразово связать master приложения с историей шаблона, если проект был создан отдельно.","frontmatter":{"title":"Миграция существующего master","description":"Как одноразово связать master приложения с историей шаблона, если проект был создан отдельно."},"headers":[],"relativePath":"setup/existing-master-migration.md","filePath":"setup/existing-master-migration.md"}'),p={name:"setup/existing-master-migration.md"};function n(h,s,l,k,d,r){return i(),t("div",null,[...s[0]||(s[0]=[e("",48)])])}const F=a(p,[["render",n]]);export{g as __pageData,F as default}; diff --git a/public/template-sync-strategy/assets/style.CSIvdBoa.css b/public/template-sync-strategy/assets/style.CSIvdBoa.css deleted file mode 100644 index f7beca8..0000000 --- a/public/template-sync-strategy/assets/style.CSIvdBoa.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/template-sync-strategy/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-b2600058]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-b2600058],.VPBackdrop.fade-leave-to[data-v-b2600058]{opacity:0}.VPBackdrop.fade-leave-active[data-v-b2600058]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-b2600058]{display:none}}.NotFound[data-v-93fd8736]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-93fd8736]{padding:96px 32px 168px}}.code[data-v-93fd8736]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-93fd8736]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-93fd8736]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-93fd8736]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-93fd8736]{padding-top:20px}.link[data-v-93fd8736]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-93fd8736]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-da421f78]{position:relative;z-index:1}.nested[data-v-da421f78]{padding-right:16px;padding-left:16px}.outline-link[data-v-da421f78]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-da421f78]:hover,.outline-link.active[data-v-da421f78]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-da421f78]{padding-left:13px}.VPDocAsideOutline[data-v-dfbd9fb8]{display:none}.VPDocAsideOutline.has-outline[data-v-dfbd9fb8]{display:block}.content[data-v-dfbd9fb8]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-dfbd9fb8]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-dfbd9fb8]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-79cae1a0]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-79cae1a0]{flex-grow:1}.VPDocAside[data-v-79cae1a0] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-79cae1a0] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-79cae1a0] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-e95db471]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-e95db471]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-07d71ff1]{margin-top:64px}.edit-info[data-v-07d71ff1]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-07d71ff1]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-07d71ff1]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-07d71ff1]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-07d71ff1]{margin-right:8px}.prev-next[data-v-07d71ff1]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-07d71ff1]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-07d71ff1]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-07d71ff1]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-07d71ff1]{margin-left:auto;text-align:right}.desc[data-v-07d71ff1]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-07d71ff1]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-ef3a4dda]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-ef3a4dda]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-ef3a4dda]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-ef3a4dda]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-ef3a4dda]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-ef3a4dda]{display:flex;justify-content:center}.VPDoc .aside[data-v-ef3a4dda]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-ef3a4dda]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-ef3a4dda]{max-width:1104px}}.container[data-v-ef3a4dda]{margin:0 auto;width:100%}.aside[data-v-ef3a4dda]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-ef3a4dda]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-ef3a4dda]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-ef3a4dda]::-webkit-scrollbar{display:none}.aside-curtain[data-v-ef3a4dda]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-ef3a4dda]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-ef3a4dda]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-ef3a4dda]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-ef3a4dda]{order:1;margin:0;min-width:640px}}.content-container[data-v-ef3a4dda]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-ef3a4dda]{max-width:688px}.VPButton[data-v-b20c43c2]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-b20c43c2]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-b20c43c2]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-b20c43c2]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-b20c43c2]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-b20c43c2]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-b20c43c2]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-b20c43c2]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-b20c43c2]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-b20c43c2]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-b20c43c2]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-b20c43c2]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-b20c43c2]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-4d414b82]{display:none}.dark .VPImage.light[data-v-4d414b82]{display:none}.VPHero[data-v-d266baba]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-d266baba]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-d266baba]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-d266baba]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-d266baba]{flex-direction:row}}.main[data-v-d266baba]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-d266baba]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-d266baba]{text-align:left}}@media (min-width: 960px){.main[data-v-d266baba]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-d266baba]{max-width:592px}}.heading[data-v-d266baba]{display:flex;flex-direction:column}.name[data-v-d266baba],.text[data-v-d266baba]{width:fit-content;max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-d266baba],.VPHero.has-image .text[data-v-d266baba]{margin:0 auto}.name[data-v-d266baba]{color:var(--vp-home-hero-name-color)}.clip[data-v-d266baba]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-d266baba],.text[data-v-d266baba]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-d266baba],.text[data-v-d266baba]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-d266baba],.VPHero.has-image .text[data-v-d266baba]{margin:0}}.tagline[data-v-d266baba]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-d266baba]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-d266baba]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-d266baba]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-d266baba]{margin:0}}.actions[data-v-d266baba]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-d266baba]{justify-content:center}@media (min-width: 640px){.actions[data-v-d266baba]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-d266baba]{justify-content:flex-start}}.action[data-v-d266baba]{flex-shrink:0;padding:6px}.image[data-v-d266baba]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-d266baba]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-d266baba]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-d266baba]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-d266baba]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-d266baba]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-d266baba]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-d266baba]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-d266baba]{width:320px;height:320px}}[data-v-d266baba] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-d266baba] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-d266baba] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-95001937]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-95001937]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-95001937]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-95001937]>.VPImage{margin-bottom:20px}.icon[data-v-95001937]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-95001937]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-95001937]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-95001937]{padding-top:8px}.link-text-value[data-v-95001937]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-95001937]{margin-left:6px}.VPFeatures[data-v-1da4ff3d]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-1da4ff3d]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-1da4ff3d]{padding:0 64px}}.container[data-v-1da4ff3d]{margin:0 auto;max-width:1152px}.items[data-v-1da4ff3d]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-1da4ff3d]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-1da4ff3d],.item.grid-4[data-v-1da4ff3d],.item.grid-6[data-v-1da4ff3d]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-1da4ff3d],.item.grid-4[data-v-1da4ff3d]{width:50%}.item.grid-3[data-v-1da4ff3d],.item.grid-6[data-v-1da4ff3d]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-1da4ff3d]{width:25%}}.container[data-v-2498cc33]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-2498cc33]{padding:0 48px}}@media (min-width: 960px){.container[data-v-2498cc33]{width:100%;padding:0 64px}}.vp-doc[data-v-2498cc33] .VPHomeSponsors,.vp-doc[data-v-2498cc33] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-2498cc33] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-2498cc33] .VPHomeSponsors a,.vp-doc[data-v-2498cc33] .VPTeamPage a{text-decoration:none}.VPHome[data-v-8b59c434]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-8b59c434]{margin-bottom:128px}}.VPContent[data-v-d2aef184]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-d2aef184]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-d2aef184]{margin:0}@media (min-width: 960px){.VPContent[data-v-d2aef184]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-d2aef184]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-d2aef184]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-e3157d6d]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-e3157d6d]{display:none}.VPFooter[data-v-e3157d6d] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-e3157d6d] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-e3157d6d]{padding:32px}}.container[data-v-e3157d6d]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-e3157d6d],.copyright[data-v-e3157d6d]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-d61422fe]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-d61422fe]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-d61422fe]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-d61422fe]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-d61422fe]{color:var(--vp-c-text-1)}.icon[data-v-d61422fe]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-d61422fe]{font-size:14px}.icon[data-v-d61422fe]{font-size:16px}}.open>.icon[data-v-d61422fe]{transform:rotate(90deg)}.items[data-v-d61422fe]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-d61422fe]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-d61422fe]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-d61422fe]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-d61422fe]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-d61422fe]{transition:all .2s ease-out}.flyout-leave-active[data-v-d61422fe]{transition:all .15s ease-in}.flyout-enter-from[data-v-d61422fe],.flyout-leave-to[data-v-d61422fe]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-9d8129cc]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-9d8129cc]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-9d8129cc]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-9d8129cc]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-9d8129cc]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-9d8129cc]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-9d8129cc]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-9d8129cc]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-9d8129cc]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-9d8129cc]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-9d8129cc]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-9d8129cc]{display:none}}.menu-icon[data-v-9d8129cc]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-9d8129cc]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-9d8129cc]{padding:12px 32px 11px}}.VPSwitch[data-v-7012e5dd]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-7012e5dd]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-7012e5dd]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-7012e5dd]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-7012e5dd] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-7012e5dd] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-fa1daf57]{opacity:1}.moon[data-v-fa1daf57],.dark .sun[data-v-fa1daf57]{opacity:0}.dark .moon[data-v-fa1daf57]{opacity:1}.dark .VPSwitchAppearance[data-v-fa1daf57] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-123fcb2f]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-123fcb2f]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-65e4a6b1]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-65e4a6b1]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-65e4a6b1]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-65e4a6b1]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-2bec9359]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-2bec9359]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-2bec9359]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-2bec9359]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-39eca401]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-39eca401] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-39eca401] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-39eca401] .group:last-child{padding-bottom:0}.VPMenu[data-v-39eca401] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-39eca401] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-39eca401] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-39eca401] .action{padding-left:24px}.VPFlyout[data-v-40e55da0]{position:relative}.VPFlyout[data-v-40e55da0]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-40e55da0]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-40e55da0]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-40e55da0]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-40e55da0]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-40e55da0]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-40e55da0],.button[aria-expanded=true]+.menu[data-v-40e55da0]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-40e55da0]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-40e55da0]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-40e55da0]{margin-right:0;font-size:16px}.text-icon[data-v-40e55da0]{margin-left:4px;font-size:14px}.icon[data-v-40e55da0]{font-size:20px;transition:fill .25s}.menu[data-v-40e55da0]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-fbf39218]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-fbf39218]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-fbf39218]>svg,.VPSocialLink[data-v-fbf39218]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-f2234a39]{display:flex;justify-content:center}.VPNavBarExtra[data-v-0c845e5d]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-0c845e5d]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-0c845e5d]{display:none}}.trans-title[data-v-0c845e5d]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-0c845e5d],.item.social-links[data-v-0c845e5d]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-0c845e5d]{min-width:176px}.appearance-action[data-v-0c845e5d]{margin-right:-2px}.social-links-list[data-v-0c845e5d]{margin:-4px -8px}.VPNavBarHamburger[data-v-670493dd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-670493dd]{display:none}}.container[data-v-670493dd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-670493dd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-670493dd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-670493dd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-670493dd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-670493dd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-670493dd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-670493dd],.VPNavBarHamburger.active:hover .middle[data-v-670493dd],.VPNavBarHamburger.active:hover .bottom[data-v-670493dd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-670493dd],.middle[data-v-670493dd],.bottom[data-v-670493dd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-670493dd]{top:0;left:0;transform:translate(0)}.middle[data-v-670493dd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-670493dd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-8dbce4d0]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-8dbce4d0],.VPNavBarMenuLink[data-v-8dbce4d0]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-5bacfe89]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-5bacfe89]{display:flex}}/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-08b35e6f]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-08b35e6f]{display:flex;align-items:center}}.title[data-v-5622a072]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-5622a072]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-5622a072]{border-bottom-color:var(--vp-c-divider)}}[data-v-5622a072] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-dac637f3]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-dac637f3]{display:flex;align-items:center}}.title[data-v-dac637f3]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-bb7529ee]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-bb7529ee]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-bb7529ee]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-bb7529ee]:not(.home){background-color:transparent}.VPNavBar[data-v-bb7529ee]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-bb7529ee]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-bb7529ee]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-bb7529ee]{padding:0}}.container[data-v-bb7529ee]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-bb7529ee],.container>.content[data-v-bb7529ee]{pointer-events:none}.container[data-v-bb7529ee] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-bb7529ee]{max-width:100%}}.title[data-v-bb7529ee]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-bb7529ee]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-bb7529ee]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-bb7529ee]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-bb7529ee]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-bb7529ee]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-bb7529ee]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-bb7529ee]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-bb7529ee]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-bb7529ee]{column-gap:.5rem}}.menu+.translations[data-v-bb7529ee]:before,.menu+.appearance[data-v-bb7529ee]:before,.menu+.social-links[data-v-bb7529ee]:before,.translations+.appearance[data-v-bb7529ee]:before,.appearance+.social-links[data-v-bb7529ee]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-bb7529ee]:before,.translations+.appearance[data-v-bb7529ee]:before{margin-right:16px}.appearance+.social-links[data-v-bb7529ee]:before{margin-left:16px}.social-links[data-v-bb7529ee]{margin-right:-8px}.divider[data-v-bb7529ee]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-bb7529ee]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-bb7529ee]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-bb7529ee]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-bb7529ee]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-bb7529ee]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-bb7529ee]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-774971f8]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-774971f8]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-29871565]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-29871565]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-581896e9]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-581896e9]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-836cddb8]{display:block}.title[data-v-836cddb8]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-a8d3502a]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-a8d3502a]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-a8d3502a]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-a8d3502a]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-a8d3502a]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-a8d3502a]{transform:rotate(45deg)}.button[data-v-a8d3502a]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-a8d3502a]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-a8d3502a]{transition:transform .25s}.group[data-v-a8d3502a]:first-child{padding-top:0}.group+.group[data-v-a8d3502a],.group+.item[data-v-a8d3502a]{padding-top:4px}.VPNavScreenTranslations[data-v-0d43316b]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-0d43316b]{height:auto}.title[data-v-0d43316b]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-0d43316b]{font-size:16px}.icon.lang[data-v-0d43316b]{margin-right:8px}.icon.chevron[data-v-0d43316b]{margin-left:4px}.list[data-v-0d43316b]{padding:4px 0 0 24px}.link[data-v-0d43316b]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-34fa79a7]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-34fa79a7],.VPNavScreen.fade-leave-active[data-v-34fa79a7]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-34fa79a7],.VPNavScreen.fade-leave-active .container[data-v-34fa79a7]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-34fa79a7],.VPNavScreen.fade-leave-to[data-v-34fa79a7]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-34fa79a7],.VPNavScreen.fade-leave-to .container[data-v-34fa79a7]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-34fa79a7]{display:none}}.container[data-v-34fa79a7]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-34fa79a7],.menu+.appearance[data-v-34fa79a7],.translations+.appearance[data-v-34fa79a7]{margin-top:24px}.menu+.social-links[data-v-34fa79a7]{margin-top:16px}.appearance+.social-links[data-v-34fa79a7]{margin-top:16px}.VPNav[data-v-a46e73f0]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-a46e73f0]{position:fixed}}.VPSidebarItem.level-0[data-v-2e0476bc]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-2e0476bc]{padding-bottom:10px}.item[data-v-2e0476bc]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-2e0476bc]{cursor:pointer}.indicator[data-v-2e0476bc]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-2e0476bc],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-2e0476bc],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-2e0476bc],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-2e0476bc]{background-color:var(--vp-c-brand-1)}.link[data-v-2e0476bc]{display:flex;align-items:center;flex-grow:1}.text[data-v-2e0476bc]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-2e0476bc]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-2e0476bc],.VPSidebarItem.level-2 .text[data-v-2e0476bc],.VPSidebarItem.level-3 .text[data-v-2e0476bc],.VPSidebarItem.level-4 .text[data-v-2e0476bc],.VPSidebarItem.level-5 .text[data-v-2e0476bc]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-2e0476bc],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-2e0476bc],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-2e0476bc],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-2e0476bc],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-2e0476bc],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-2e0476bc]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-2e0476bc],.VPSidebarItem.level-1.has-active>.item>.text[data-v-2e0476bc],.VPSidebarItem.level-2.has-active>.item>.text[data-v-2e0476bc],.VPSidebarItem.level-3.has-active>.item>.text[data-v-2e0476bc],.VPSidebarItem.level-4.has-active>.item>.text[data-v-2e0476bc],.VPSidebarItem.level-5.has-active>.item>.text[data-v-2e0476bc],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-2e0476bc],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-2e0476bc],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-2e0476bc],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-2e0476bc],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-2e0476bc],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-2e0476bc]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-2e0476bc],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-2e0476bc],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-2e0476bc],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-2e0476bc],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-2e0476bc],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-2e0476bc]{color:var(--vp-c-brand-1)}.caret[data-v-2e0476bc]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-2e0476bc]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-2e0476bc]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-2e0476bc]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-2e0476bc]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-2e0476bc],.VPSidebarItem.level-2 .items[data-v-2e0476bc],.VPSidebarItem.level-3 .items[data-v-2e0476bc],.VPSidebarItem.level-4 .items[data-v-2e0476bc],.VPSidebarItem.level-5 .items[data-v-2e0476bc]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-2e0476bc]{display:none}.no-transition[data-v-ec086cd5] .caret-icon{transition:none}.group+.group[data-v-ec086cd5]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-ec086cd5]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-12a40e3d]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-12a40e3d]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-12a40e3d]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-12a40e3d]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-12a40e3d]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-12a40e3d]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-12a40e3d]{outline:0}.VPSkipLink[data-v-17ad389b]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-17ad389b]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-17ad389b]{top:14px;left:16px}}.Layout[data-v-c4daae71]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-b272d7e5]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-b272d7e5]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-b272d7e5]{margin:128px 0}}.VPHomeSponsors[data-v-b272d7e5]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-b272d7e5]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-b272d7e5]{padding:0 64px}}.container[data-v-b272d7e5]{margin:0 auto;max-width:1152px}.love[data-v-b272d7e5]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-b272d7e5]{display:inline-block}.message[data-v-b272d7e5]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-b272d7e5]{padding-top:32px}.action[data-v-b272d7e5]{padding-top:40px;text-align:center}.VPTeamMembersItem[data-v-af8dff8e]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-af8dff8e]{padding:32px}.VPTeamMembersItem.small .data[data-v-af8dff8e]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-af8dff8e]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-af8dff8e]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-af8dff8e]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-af8dff8e]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-af8dff8e]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-af8dff8e]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-af8dff8e]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-af8dff8e]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-af8dff8e]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-af8dff8e]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-af8dff8e]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-af8dff8e]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-af8dff8e]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-af8dff8e]{text-align:center}.avatar[data-v-af8dff8e]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-af8dff8e]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-af8dff8e]{margin:0;font-weight:600}.affiliation[data-v-af8dff8e]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-af8dff8e]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-af8dff8e]:hover{color:var(--vp-c-brand-1)}.desc[data-v-af8dff8e]{margin:0 auto}.desc[data-v-af8dff8e] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-af8dff8e]{display:flex;justify-content:center;height:56px}.sp-link[data-v-af8dff8e]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-af8dff8e]:hover,.sp .sp-link.link[data-v-af8dff8e]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-af8dff8e]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-3ca0e3f5]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-3ca0e3f5]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-3ca0e3f5]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-3ca0e3f5]{max-width:876px}.VPTeamMembers.medium .container[data-v-3ca0e3f5]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-3ca0e3f5]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-3ca0e3f5]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-3ca0e3f5]{max-width:760px}.container[data-v-3ca0e3f5]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPTeamPage[data-v-de6c58d7]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-de6c58d7]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-de6c58d7-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-de6c58d7-s],.VPTeamMembers+.VPTeamPageSection[data-v-de6c58d7-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-de6c58d7-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-de6c58d7-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-de6c58d7-s],.VPTeamMembers+.VPTeamPageSection[data-v-de6c58d7-s]{margin-top:96px}}.VPTeamMembers[data-v-de6c58d7-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-de6c58d7-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-de6c58d7-s]{padding:0 64px}}.VPTeamPageSection[data-v-1ac32f26]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-1ac32f26]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-1ac32f26]{padding:0 64px}}.title[data-v-1ac32f26]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-1ac32f26]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-1ac32f26]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-1ac32f26]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-1ac32f26]{padding-top:40px}.VPTeamPageTitle[data-v-6ce551d6]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-6ce551d6]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-6ce551d6]{padding:80px 64px 48px}}.title[data-v-6ce551d6]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-6ce551d6]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-6ce551d6]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-6ce551d6]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.docsBackLink[data-v-6cf40780]{margin-left:16px;margin-right:16px}.docsNavLinks[data-v-6cf40780]{display:inline-flex;align-items:center}.docsNavLink[data-v-6cf40780]{display:inline-flex;align-items:center;gap:6px;color:var(--vp-c-text-2);font-size:13px;font-weight:600;line-height:var(--vp-nav-height);text-decoration:none;transition:color .2s}.docsBackIcon[data-v-6cf40780]{color:var(--vp-c-text-3);font-size:15px;transition:color .2s}.docsNavLink[data-v-6cf40780]:hover,.docsNavLink:hover .docsBackIcon[data-v-6cf40780]{color:var(--vp-c-brand-1)}.docsNavLink[data-v-6cf40780]:focus-visible{border-radius:4px;outline:2px solid var(--vp-c-brand-1);outline-offset:2px}.docsRepoLink[data-v-6cf40780]{display:inline-flex;align-items:center;justify-content:center;width:32px;height:var(--vp-nav-height);margin-left:12px;color:var(--vp-c-text-2);transition:color .2s}.docsRepoLink[data-v-6cf40780]:hover{color:var(--vp-c-brand-1)}.docsRepoLink[data-v-6cf40780]:focus-visible{border-radius:6px;outline:2px solid var(--vp-c-brand-1);outline-offset:2px}.docsRepoLink svg[data-v-6cf40780],.docsScreenRepoIcon[data-v-6cf40780]{width:18px;height:18px;fill:currentColor}.docsNavLinks[data-v-6cf40780]{align-items:stretch;flex-direction:column;gap:0;margin:0;padding:8px 0 12px;border-bottom:1px solid var(--vp-c-divider)}.docsNavLinks .docsNavLink[data-v-6cf40780]{display:inline-flex;align-items:center;gap:8px;padding:12px 0;color:var(--vp-c-text-1);font-size:14px;line-height:20px}.docsScreenRepoIcon[data-v-6cf40780]{flex:0 0 auto}@media (max-width: 767px){.docsBackLink[data-v-6cf40780],.docsRepoLink[data-v-6cf40780]{display:none}}@media (min-width: 768px){.docsNavLinks[data-v-6cf40780]{display:none}}@media (min-width: 960px){.docsBackLink[data-v-6cf40780]{margin-left:24px}} diff --git a/public/template-sync-strategy/assets/workflows_resolve-conflicts.md.CujNWdsi.js b/public/template-sync-strategy/assets/workflows_resolve-conflicts.md.CujNWdsi.js deleted file mode 100644 index 5b5ba13..0000000 --- a/public/template-sync-strategy/assets/workflows_resolve-conflicts.md.CujNWdsi.js +++ /dev/null @@ -1,7 +0,0 @@ -import{_ as a,o as e,c as i,ae as t}from"./chunks/framework.B1nRs-GM.js";const k=JSON.parse('{"title":"Решение конфликтов","description":"Почему конфликты при обновлении шаблона должны решаться только в sync-ветках.","frontmatter":{"title":"Решение конфликтов","description":"Почему конфликты при обновлении шаблона должны решаться только в sync-ветках."},"headers":[],"relativePath":"workflows/resolve-conflicts.md","filePath":"workflows/resolve-conflicts.md"}'),n={name:"workflows/resolve-conflicts.md"};function l(p,s,o,h,d,c){return e(),i("div",null,[...s[0]||(s[0]=[t(`

Решение конфликтов

Конфликт при обновлении шаблона — нормальная ситуация. Важно не то, что конфликт возник, а где он возник.

Правильное место для конфликтов — временная ветка sync/*.

Пример

Шаблон поменял строку в README.md:

text
Base template version: template-conflict-v10

Приложение поменяло ту же строку иначе:

text
Base template version: application-conflict-v10

При merge origin/template в sync/update-template-v10 появится конфликт:

text
<<<<<<< HEAD
-Base template version: application-conflict-v10
-=======
-Base template version: template-conflict-v10
->>>>>>> origin/template

Это правильное место конфликта: master ещё не изменён, template остаётся чистой, а итоговое решение можно проверить в PR/MR.

Как решать

  1. Оставайтесь в ветке sync/*.
  2. Разберите конфликт по смыслу: что должно остаться в приложении после обновления шаблона.
  3. Удалите conflict markers.
  4. Проверьте проект локально.
  5. Закоммитьте результат.
bash
git status
-git add .
-git commit

Что нельзя делать

Нельзя переносить conflict resolve в template.

template должна совпадать с шаблоном. Если решение конфликта попадёт туда, она перестанет быть эталоном и дальнейшие обновления станут менее предсказуемыми.

Нельзя решать конфликт прямо в master, потому что основная ветка приложения должна получать только проверенный результат через PR/MR.

Что проверить после resolve

Посмотрите статус:

bash
git status

Посмотрите diff относительно текущего приложения:

bash
git --no-pager diff origin/master...HEAD

Посмотрите граф:

bash
git --no-pager log --oneline --graph --decorate --all --max-count=50
`,26)])])}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/public/template-sync-strategy/assets/workflows_resolve-conflicts.md.CujNWdsi.lean.js b/public/template-sync-strategy/assets/workflows_resolve-conflicts.md.CujNWdsi.lean.js deleted file mode 100644 index 258940a..0000000 --- a/public/template-sync-strategy/assets/workflows_resolve-conflicts.md.CujNWdsi.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as i,ae as t}from"./chunks/framework.B1nRs-GM.js";const k=JSON.parse('{"title":"Решение конфликтов","description":"Почему конфликты при обновлении шаблона должны решаться только в sync-ветках.","frontmatter":{"title":"Решение конфликтов","description":"Почему конфликты при обновлении шаблона должны решаться только в sync-ветках."},"headers":[],"relativePath":"workflows/resolve-conflicts.md","filePath":"workflows/resolve-conflicts.md"}'),n={name:"workflows/resolve-conflicts.md"};function l(p,s,o,h,d,c){return e(),i("div",null,[...s[0]||(s[0]=[t("",26)])])}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/public/template-sync-strategy/assets/workflows_review-and-merge.md.D5KhlAbu.js b/public/template-sync-strategy/assets/workflows_review-and-merge.md.D5KhlAbu.js deleted file mode 100644 index d17f2a3..0000000 --- a/public/template-sync-strategy/assets/workflows_review-and-merge.md.D5KhlAbu.js +++ /dev/null @@ -1,9 +0,0 @@ -import{_ as a,o as i,c as e,ae as t}from"./chunks/framework.B1nRs-GM.js";const g=JSON.parse('{"title":"Review и merge","description":"Как проверять и вливать sync-ветку с обновлением шаблона в master приложения.","frontmatter":{"title":"Review и merge","description":"Как проверять и вливать sync-ветку с обновлением шаблона в master приложения."},"headers":[],"relativePath":"workflows/review-and-merge.md","filePath":"workflows/review-and-merge.md"}'),n={name:"workflows/review-and-merge.md"};function p(l,s,h,r,d,o){return i(),e("div",null,[...s[0]||(s[0]=[t(`

Review и merge

После подготовки sync/* ветки обновление шаблона должно попасть в master через PR/MR.

Создать PR/MR

Параметры:

text
source: sync/update-template-vX
-target: master

Цель review — увидеть:

  • какие изменения пришли из шаблона;
  • какие конфликтные решения были сделаны в sync/*;
  • не попали ли в обновление лишние изменения приложения;
  • проходят ли проверки проекта.

Настройки merge

Для sync-PR/MR важно:

text
squash = off
-fast-forward merge = хорошо
-merge commit       = допустимо
-squash merge       = нельзя

Squash нельзя использовать, потому что он может уничтожить связь истории master с историей template. Особенно это критично после миграционного sync/bootstrap-template.

Проверки перед merge

Проверьте граф истории:

bash
git --no-pager log --oneline --graph --decorate --all --max-count=50

Проверьте итоговый diff:

bash
git --no-pager diff origin/master...sync/update-template-vX

Проверьте проект обычными командами конкретного приложения, например:

bash
npm run lint
-npm run build

После merge

После успешного merge в master можно удалить временную ветку:

bash
git branch -d sync/update-template-vX
-git push origin --delete sync/update-template-vX

Проверьте, что master теперь содержит обновление шаблона:

bash
git fetch origin
-git --no-pager log origin/template..origin/master --oneline
-git --no-pager diff origin/template...origin/master
`,24)])])}const c=a(n,[["render",p]]);export{g as __pageData,c as default}; diff --git a/public/template-sync-strategy/assets/workflows_review-and-merge.md.D5KhlAbu.lean.js b/public/template-sync-strategy/assets/workflows_review-and-merge.md.D5KhlAbu.lean.js deleted file mode 100644 index 532ed8d..0000000 --- a/public/template-sync-strategy/assets/workflows_review-and-merge.md.D5KhlAbu.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as i,c as e,ae as t}from"./chunks/framework.B1nRs-GM.js";const g=JSON.parse('{"title":"Review и merge","description":"Как проверять и вливать sync-ветку с обновлением шаблона в master приложения.","frontmatter":{"title":"Review и merge","description":"Как проверять и вливать sync-ветку с обновлением шаблона в master приложения."},"headers":[],"relativePath":"workflows/review-and-merge.md","filePath":"workflows/review-and-merge.md"}'),n={name:"workflows/review-and-merge.md"};function p(l,s,h,r,d,o){return i(),e("div",null,[...s[0]||(s[0]=[t("",24)])])}const c=a(n,[["render",p]]);export{g as __pageData,c as default}; diff --git a/public/template-sync-strategy/assets/workflows_update-template.md.C8s1FFCq.js b/public/template-sync-strategy/assets/workflows_update-template.md.C8s1FFCq.js deleted file mode 100644 index d136845..0000000 --- a/public/template-sync-strategy/assets/workflows_update-template.md.C8s1FFCq.js +++ /dev/null @@ -1,17 +0,0 @@ -import{_ as a,o as i,c as t,ae as e}from"./chunks/framework.B1nRs-GM.js";const c=JSON.parse('{"title":"Обычное обновление шаблона","description":"Повторяемый процесс доставки изменений шаблона в приложение после первичной настройки.","frontmatter":{"title":"Обычное обновление шаблона","description":"Повторяемый процесс доставки изменений шаблона в приложение после первичной настройки."},"headers":[],"relativePath":"workflows/update-template.md","filePath":"workflows/update-template.md"}'),p={name:"workflows/update-template.md"};function n(l,s,h,k,d,r){return i(),t("div",null,[...s[0]||(s[0]=[e(`

Обычное обновление шаблона

Эта инструкция подходит после любого стартового сценария:

Целевой маршрут:

text
templates/master -> template -> sync/* -> master

1. Обновить слепок шаблона

В репозитории приложения:

bash
cd /path/to/app-repo
-git switch template
-git pull --ff-only
-git push

Этот вариант работает, если для ветки template настроено:

text
pull из templates/master
-push в origin/template

Явная форма без зависимости от tracking-настроек:

bash
git fetch templates
-git switch template
-git merge --ff-only templates/master
-git push origin template

Если --ff-only падает, значит template перестал быть чистым слепком шаблона. Остановитесь и разберите причину до продолжения.

Проверьте, что origin/template обновился до шаблона:

bash
git fetch origin
-git fetch templates
-git --no-pager log --oneline -1 origin/template
-git --no-pager log --oneline -1 templates/master

Оба коммита должны совпадать.

2. Создать ветку обновления приложения

После обновления template создайте временную ветку от текущего приложения:

bash
git fetch origin
-git switch -c sync/update-template-v2 origin/master
-git merge origin/template

Имя ветки можно менять под версию или дату:

text
sync/update-template-v2
-sync/update-template-2026-05-09
-sync/update-template-1.8.0

Проверьте, что временная ветка реально отличается от origin/master изменениями шаблона:

bash
git --no-pager diff --stat origin/master...HEAD

Если diff пустой, значит обновлённый origin/template не был влит в sync/* ветку или в шаблоне нет новых изменений.

3. Решить конфликты

Если есть конфликты, решайте их именно в sync/*.

После решения конфликтов:

bash
git add .
-git commit

Если конфликтов не было, Git сам создаст merge-коммит или выполнит fast-forward, в зависимости от истории.

4. Запушить sync-ветку

bash
git push -u origin sync/update-template-v2

Дальше откройте PR/MR:

text
source: sync/update-template-v2
-target: master

Правила merge описаны в Review и merge.

`,35)])])}const g=a(p,[["render",n]]);export{c as __pageData,g as default}; diff --git a/public/template-sync-strategy/assets/workflows_update-template.md.C8s1FFCq.lean.js b/public/template-sync-strategy/assets/workflows_update-template.md.C8s1FFCq.lean.js deleted file mode 100644 index ccac31b..0000000 --- a/public/template-sync-strategy/assets/workflows_update-template.md.C8s1FFCq.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as i,c as t,ae as e}from"./chunks/framework.B1nRs-GM.js";const c=JSON.parse('{"title":"Обычное обновление шаблона","description":"Повторяемый процесс доставки изменений шаблона в приложение после первичной настройки.","frontmatter":{"title":"Обычное обновление шаблона","description":"Повторяемый процесс доставки изменений шаблона в приложение после первичной настройки."},"headers":[],"relativePath":"workflows/update-template.md","filePath":"workflows/update-template.md"}'),p={name:"workflows/update-template.md"};function n(l,s,h,k,d,r){return i(),t("div",null,[...s[0]||(s[0]=[e("",35)])])}const g=a(p,[["render",n]]);export{c as __pageData,g as default}; diff --git a/public/template-sync-strategy/concepts/model.html b/public/template-sync-strategy/concepts/model.html deleted file mode 100644 index 63a4bd5..0000000 --- a/public/template-sync-strategy/concepts/model.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Модель веток | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Модель веток

Целевая схема:

text
templates/master -> template -> sync/* -> master

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

templates/master

templates/master — это master из репозитория шаблона.

В репозитории приложения он доступен через remote templates:

bash
git remote add templates <template-repo-url>
-git fetch templates

Этот remote считается источником обновлений шаблона.

template

template — чистый слепок шаблона внутри репозитория приложения.

Его задача — показать, какая версия шаблонной базы сейчас доступна приложению.

В template нельзя коммитить руками изменения приложения. Эта ветка обновляется только из templates/master.

master

master — основная ветка приложения.

Она содержит:

  • базу шаблона;
  • продуктовый код;
  • локальные настройки приложения;
  • историю применения обновлений шаблона.

master не используется как место ручного решения конфликтов при обновлении шаблона.

sync/*

sync/* — временная ветка для обновления приложения от шаблона.

Она создаётся от актуального origin/master, после чего в неё вливается origin/template.

Пример:

bash
git fetch origin
-git switch -c sync/update-template-v2 origin/master
-git merge origin/template

Если появляются конфликты, они решаются именно в этой ветке.

Почему нужен отдельный sync-слой

Нельзя безопасно использовать template как source branch для прямого PR/MR в master: если возникнет конфликт, решение может попасть в template.

После этого template перестанет быть чистым слепком шаблона. Git начнёт видеть в ней не только шаблон, но и локальные решения конкретного приложения.

sync/* можно пачкать conflict resolve-коммитами, проверками и правками совместимости. Эта ветка временная и удаляется после merge.

- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/concepts/model.md b/public/template-sync-strategy/concepts/model.md deleted file mode 100644 index 3280691..0000000 --- a/public/template-sync-strategy/concepts/model.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -url: /template-sync-strategy/concepts/model.md -description: Роли веток и remote в стратегии обновления проекта от шаблона. ---- - -# Модель веток - -Целевая схема: - -```text -templates/master -> template -> sync/* -> master -``` - -Это логическая модель ответственности. Она не требует физически разделять файлы шаблона и приложения по папкам. - -## templates/master - -`templates/master` — это `master` из репозитория шаблона. - -В репозитории приложения он доступен через remote `templates`: - -```bash -git remote add templates -git fetch templates -``` - -Этот remote считается источником обновлений шаблона. - -## template - -`template` — чистый слепок шаблона внутри репозитория приложения. - -Его задача — показать, какая версия шаблонной базы сейчас доступна приложению. - -В `template` нельзя коммитить руками изменения приложения. Эта ветка обновляется только из `templates/master`. - -## master - -`master` — основная ветка приложения. - -Она содержит: - -* базу шаблона; -* продуктовый код; -* локальные настройки приложения; -* историю применения обновлений шаблона. - -`master` не используется как место ручного решения конфликтов при обновлении шаблона. - -## sync/\* - -`sync/*` — временная ветка для обновления приложения от шаблона. - -Она создаётся от актуального `origin/master`, после чего в неё вливается `origin/template`. - -Пример: - -```bash -git fetch origin -git switch -c sync/update-template-v2 origin/master -git merge origin/template -``` - -Если появляются конфликты, они решаются именно в этой ветке. - -## Почему нужен отдельный sync-слой - -Нельзя безопасно использовать `template` как source branch для прямого PR/MR в `master`: если возникнет конфликт, решение может попасть в `template`. - -После этого `template` перестанет быть чистым слепком шаблона. Git начнёт видеть в ней не только шаблон, но и локальные решения конкретного приложения. - -`sync/*` можно пачкать conflict resolve-коммитами, проверками и правками совместимости. Эта ветка временная и удаляется после merge. diff --git a/public/template-sync-strategy/concepts/rules.html b/public/template-sync-strategy/concepts/rules.html deleted file mode 100644 index e4e3343..0000000 --- a/public/template-sync-strategy/concepts/rules.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - Правила процесса | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Правила процесса

Небольшой набор правил удерживает схему чистой.

Делаем

  • template обновляем только из templates/master.
  • sync/* создаём от origin/master.
  • origin/template вливаем в sync/*, а не напрямую в master.
  • Конфликты решаем только в sync/*.
  • sync/* -> master вливаем через PR/MR.
  • Для sync-PR/MR отключаем squash.

Не делаем

  • Не правим template руками.
  • Не коммитим изменения приложения в template.
  • Не мержим template -> master напрямую.
  • Не решаем конфликты в master.
  • Не включаем squash для sync/* -> master.

Почему squash нельзя

Squash может уничтожить нормальную связь истории master с историей template.

Git использует историю, чтобы понимать, какие изменения шаблона уже были доставлены в приложение. Если результат обновления шаблона превратить в один squash-коммит, связь с исходными коммитами шаблона станет хуже или исчезнет.

Для sync-PR/MR допустимы:

text
fast-forward merge = хорошо
-merge commit       = допустимо
-squash merge       = нельзя

Почему template нельзя пачкать

template — эталонный слепок оригинального шаблона.

Если в неё попадает локальное решение конфликта или изменение приложения, она перестаёт отвечать на вопрос: “какая версия шаблона сейчас подключена к приложению?”.

После этого ломается главная граница ответственности: шаблон отдельно, приложение отдельно, конфликтная зона отдельно.

- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/concepts/rules.md b/public/template-sync-strategy/concepts/rules.md deleted file mode 100644 index 5042903..0000000 --- a/public/template-sync-strategy/concepts/rules.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -url: /template-sync-strategy/concepts/rules.md -description: >- - Набор правил, который удерживает template чистой, а обновления шаблона - контролируемыми. ---- - -# Правила процесса - -Небольшой набор правил удерживает схему чистой. - -## Делаем - -* `template` обновляем только из `templates/master`. -* `sync/*` создаём от `origin/master`. -* `origin/template` вливаем в `sync/*`, а не напрямую в `master`. -* Конфликты решаем только в `sync/*`. -* `sync/* -> master` вливаем через PR/MR. -* Для sync-PR/MR отключаем squash. - -## Не делаем - -* Не правим `template` руками. -* Не коммитим изменения приложения в `template`. -* Не мержим `template -> master` напрямую. -* Не решаем конфликты в `master`. -* Не включаем squash для `sync/* -> master`. - -## Почему squash нельзя - -Squash может уничтожить нормальную связь истории `master` с историей `template`. - -Git использует историю, чтобы понимать, какие изменения шаблона уже были доставлены в приложение. Если результат обновления шаблона превратить в один squash-коммит, связь с исходными коммитами шаблона станет хуже или исчезнет. - -Для sync-PR/MR допустимы: - -```text -fast-forward merge = хорошо -merge commit = допустимо -squash merge = нельзя -``` - -## Почему template нельзя пачкать - -`template` — эталонный слепок оригинального шаблона. - -Если в неё попадает локальное решение конфликта или изменение приложения, она перестаёт отвечать на вопрос: “какая версия шаблона сейчас подключена к приложению?”. - -После этого ломается главная граница ответственности: шаблон отдельно, приложение отдельно, конфликтная зона отдельно. diff --git a/public/template-sync-strategy/concepts/why.html b/public/template-sync-strategy/concepts/why.html deleted file mode 100644 index 4428143..0000000 --- a/public/template-sync-strategy/concepts/why.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Зачем это нужно | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Зачем это нужно

Шаблон закрывает повторяющуюся техническую базу проекта: CI/CD, Dockerfile, зависимости, lint, build, структуру каталогов и базовую документацию.

Это снимает рутину на старте. Команде не нужно каждый раз заново собирать одинаковый технический каркас.

Проблема после старта

Создать проект легко. Поддерживать 10-20 проектов сложнее.

Сначала проекты похожи. Потом они начинают расходиться:

  • В одном проекте обновили CI, в другом забыли.
  • В одном проекте Dockerfile остался из шаблона, в другом его локально поправили.
  • В одном проекте зависимости уже свежие, в другом остались старые версии.
  • В одном проекте изменения шаблона перенесли руками, в другом потеряли.

Без процесса обновления шаблон перестаёт быть общей основой. Он остаётся только способом быстро создать первый коммит.

Что ломается без стратегии

Когда шаблон нельзя нормально обновлять:

  • проекты начинают жить своей жизнью;
  • граница между шаблоном и приложением теряется;
  • обновления превращаются в ручное копирование;
  • конфликты решаются прямо в рабочих ветках;
  • становится непонятно, какой проект на какой версии шаблона;
  • Git-история перестаёт быть источником правды.

Это особенно больно, когда приложений много. Для одного проекта ручной перенос ещё можно пережить. Для набора проектов нужен единый маршрут обновления.

Цель стратегии

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

Главная формулировка:

Шаблон должен обновляться так же контролируемо, как обычная фича: через ветку, проверку и PR/MR.

- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/concepts/why.md b/public/template-sync-strategy/concepts/why.md deleted file mode 100644 index fe510b8..0000000 --- a/public/template-sync-strategy/concepts/why.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -url: /template-sync-strategy/concepts/why.md -description: >- - Почему шаблону нужен процесс обновления, а не только быстрый старт нового - проекта. ---- - -# Зачем это нужно - -Шаблон закрывает повторяющуюся техническую базу проекта: CI/CD, Dockerfile, зависимости, lint, build, структуру каталогов и базовую документацию. - -Это снимает рутину на старте. Команде не нужно каждый раз заново собирать одинаковый технический каркас. - -## Проблема после старта - -Создать проект легко. Поддерживать 10-20 проектов сложнее. - -Сначала проекты похожи. Потом они начинают расходиться: - -* В одном проекте обновили CI, в другом забыли. -* В одном проекте Dockerfile остался из шаблона, в другом его локально поправили. -* В одном проекте зависимости уже свежие, в другом остались старые версии. -* В одном проекте изменения шаблона перенесли руками, в другом потеряли. - -Без процесса обновления шаблон перестаёт быть общей основой. Он остаётся только способом быстро создать первый коммит. - -## Что ломается без стратегии - -Когда шаблон нельзя нормально обновлять: - -* проекты начинают жить своей жизнью; -* граница между шаблоном и приложением теряется; -* обновления превращаются в ручное копирование; -* конфликты решаются прямо в рабочих ветках; -* становится непонятно, какой проект на какой версии шаблона; -* Git-история перестаёт быть источником правды. - -Это особенно больно, когда приложений много. Для одного проекта ручной перенос ещё можно пережить. Для набора проектов нужен единый маршрут обновления. - -## Цель стратегии - -Стратегия не пытается убрать конфликты полностью. Она делает так, чтобы конфликты возникали в предсказуемом месте, проходили review и не ломали чистую ветку шаблона. - -Главная формулировка: - -> Шаблон должен обновляться так же контролируемо, как обычная фича: через ветку, проверку и PR/MR. diff --git a/public/template-sync-strategy/hashmap.json b/public/template-sync-strategy/hashmap.json deleted file mode 100644 index ec158b7..0000000 --- a/public/template-sync-strategy/hashmap.json +++ /dev/null @@ -1 +0,0 @@ -{"concepts_model.md":"C805A9As","concepts_rules.md":"QraT4IhZ","concepts_why.md":"akfw90Fj","index.md":"C5Q_ZnE3","overview.md":"DOeHHuHO","reference_cheatsheet.md":"0TzKSaSb","reference_glossary.md":"DLD-b2Ke","reference_troubleshooting.md":"BrYSpYuW","setup_clean-repository.md":"CPqmBfph","setup_existing-master-migration.md":"BQ5VImS9","workflows_resolve-conflicts.md":"CujNWdsi","workflows_review-and-merge.md":"D5KhlAbu","workflows_update-template.md":"C8s1FFCq"} diff --git a/public/template-sync-strategy/index.html b/public/template-sync-strategy/index.html deleted file mode 100644 index fe365f3..0000000 --- a/public/template-sync-strategy/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Template Sync Strategy

Template Sync Strategy описывает процесс, при котором приложение создаётся от шаблона и дальше регулярно получает обновления шаблона без ручного копирования файлов.

Основной маршрут:

text
templates/master -> template -> sync/* -> master

Где:

  • templates/master — основная ветка внешнего репозитория шаблона.
  • template — чистый слепок шаблона внутри репозитория приложения.
  • sync/* — временная ветка, где шаблон накладывается на приложение.
  • master — основная ветка приложения.

Задача

Шаблон хорошо решает старт проекта: приносит CI/CD, Dockerfile, зависимости, линтер, сборку, структуру и базовую документацию. Но после старта приложения расходятся: где-то обновили CI, где-то забыли, где-то сделали локальную кастомизацию.

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

Главный принцип

Ветка template должна оставаться чистым слепком оригинального шаблона.

В неё нельзя коммитить изменения приложения и нельзя решать конфликты. Все конфликтные решения выполняются только во временных ветках sync/*.

Состав документации

- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/llms-full.txt b/public/template-sync-strategy/llms-full.txt deleted file mode 100644 index 52e00b7..0000000 --- a/public/template-sync-strategy/llms-full.txt +++ /dev/null @@ -1,1009 +0,0 @@ ---- -url: /template-sync-strategy/overview.md -description: >- - Управляемое обновление проектов от шаблона через чистую ветку template, - временные sync-ветки и PR/MR. ---- - -# Template Sync Strategy - -Template Sync Strategy описывает процесс, при котором приложение создаётся от шаблона и дальше регулярно получает обновления шаблона без ручного копирования файлов. - -Основной маршрут: - -```text -templates/master -> template -> sync/* -> master -``` - -Где: - -* `templates/master` — основная ветка внешнего репозитория шаблона. -* `template` — чистый слепок шаблона внутри репозитория приложения. -* `sync/*` — временная ветка, где шаблон накладывается на приложение. -* `master` — основная ветка приложения. - -## Задача - -Шаблон хорошо решает старт проекта: приносит CI/CD, Dockerfile, зависимости, линтер, сборку, структуру и базовую документацию. Но после старта приложения расходятся: где-то обновили CI, где-то забыли, где-то сделали локальную кастомизацию. - -Стратегия нужна, чтобы шаблон оставался общей технической базой не только в первый день проекта, но и на всём жизненном цикле приложения. - -## Главный принцип - -Ветка `template` должна оставаться чистым слепком оригинального шаблона. - -В неё нельзя коммитить изменения приложения и нельзя решать конфликты. Все конфликтные решения выполняются только во временных ветках `sync/*`. - -## Состав документации - -* [Зачем это нужно](./concepts/why.md) — какие проблемы появляются без update-flow. -* [Модель веток](./concepts/model.md) — роли `templates/master`, `template`, `sync/*` и `master`. -* [Правила процесса](./concepts/rules.md) — ограничения, которые удерживают схему чистой. -* [Новый проект от шаблона](./setup/clean-repository.md) — старт приложения с правильной историей. -* [Миграция существующего master](./setup/existing-master-migration.md) — одноразовое связывание несвязанных историй. -* [Обычное обновление шаблона](./workflows/update-template.md) — регулярный рабочий процесс. -* [Решение конфликтов](./workflows/resolve-conflicts.md) — где и как совместить шаблон с приложением. -* [Review и merge](./workflows/review-and-merge.md) — как доставлять sync-ветку в `master`. -* [Памятка](./reference/cheatsheet.md) — короткий набор команд. -* [Troubleshooting](./reference/troubleshooting.md) — типовые ошибки и диагностика. -* [Глоссарий](./reference/glossary.md) — основные термины. - ---- - ---- -url: /template-sync-strategy/concepts/why.md -description: >- - Почему шаблону нужен процесс обновления, а не только быстрый старт нового - проекта. ---- - -# Зачем это нужно - -Шаблон закрывает повторяющуюся техническую базу проекта: CI/CD, Dockerfile, зависимости, lint, build, структуру каталогов и базовую документацию. - -Это снимает рутину на старте. Команде не нужно каждый раз заново собирать одинаковый технический каркас. - -## Проблема после старта - -Создать проект легко. Поддерживать 10-20 проектов сложнее. - -Сначала проекты похожи. Потом они начинают расходиться: - -* В одном проекте обновили CI, в другом забыли. -* В одном проекте Dockerfile остался из шаблона, в другом его локально поправили. -* В одном проекте зависимости уже свежие, в другом остались старые версии. -* В одном проекте изменения шаблона перенесли руками, в другом потеряли. - -Без процесса обновления шаблон перестаёт быть общей основой. Он остаётся только способом быстро создать первый коммит. - -## Что ломается без стратегии - -Когда шаблон нельзя нормально обновлять: - -* проекты начинают жить своей жизнью; -* граница между шаблоном и приложением теряется; -* обновления превращаются в ручное копирование; -* конфликты решаются прямо в рабочих ветках; -* становится непонятно, какой проект на какой версии шаблона; -* Git-история перестаёт быть источником правды. - -Это особенно больно, когда приложений много. Для одного проекта ручной перенос ещё можно пережить. Для набора проектов нужен единый маршрут обновления. - -## Цель стратегии - -Стратегия не пытается убрать конфликты полностью. Она делает так, чтобы конфликты возникали в предсказуемом месте, проходили review и не ломали чистую ветку шаблона. - -Главная формулировка: - -> Шаблон должен обновляться так же контролируемо, как обычная фича: через ветку, проверку и PR/MR. - ---- - ---- -url: /template-sync-strategy/concepts/model.md -description: Роли веток и remote в стратегии обновления проекта от шаблона. ---- - -# Модель веток - -Целевая схема: - -```text -templates/master -> template -> sync/* -> master -``` - -Это логическая модель ответственности. Она не требует физически разделять файлы шаблона и приложения по папкам. - -## templates/master - -`templates/master` — это `master` из репозитория шаблона. - -В репозитории приложения он доступен через remote `templates`: - -```bash -git remote add templates -git fetch templates -``` - -Этот remote считается источником обновлений шаблона. - -## template - -`template` — чистый слепок шаблона внутри репозитория приложения. - -Его задача — показать, какая версия шаблонной базы сейчас доступна приложению. - -В `template` нельзя коммитить руками изменения приложения. Эта ветка обновляется только из `templates/master`. - -## master - -`master` — основная ветка приложения. - -Она содержит: - -* базу шаблона; -* продуктовый код; -* локальные настройки приложения; -* историю применения обновлений шаблона. - -`master` не используется как место ручного решения конфликтов при обновлении шаблона. - -## sync/\* - -`sync/*` — временная ветка для обновления приложения от шаблона. - -Она создаётся от актуального `origin/master`, после чего в неё вливается `origin/template`. - -Пример: - -```bash -git fetch origin -git switch -c sync/update-template-v2 origin/master -git merge origin/template -``` - -Если появляются конфликты, они решаются именно в этой ветке. - -## Почему нужен отдельный sync-слой - -Нельзя безопасно использовать `template` как source branch для прямого PR/MR в `master`: если возникнет конфликт, решение может попасть в `template`. - -После этого `template` перестанет быть чистым слепком шаблона. Git начнёт видеть в ней не только шаблон, но и локальные решения конкретного приложения. - -`sync/*` можно пачкать conflict resolve-коммитами, проверками и правками совместимости. Эта ветка временная и удаляется после merge. - ---- - ---- -url: /template-sync-strategy/concepts/rules.md -description: >- - Набор правил, который удерживает template чистой, а обновления шаблона - контролируемыми. ---- - -# Правила процесса - -Небольшой набор правил удерживает схему чистой. - -## Делаем - -* `template` обновляем только из `templates/master`. -* `sync/*` создаём от `origin/master`. -* `origin/template` вливаем в `sync/*`, а не напрямую в `master`. -* Конфликты решаем только в `sync/*`. -* `sync/* -> master` вливаем через PR/MR. -* Для sync-PR/MR отключаем squash. - -## Не делаем - -* Не правим `template` руками. -* Не коммитим изменения приложения в `template`. -* Не мержим `template -> master` напрямую. -* Не решаем конфликты в `master`. -* Не включаем squash для `sync/* -> master`. - -## Почему squash нельзя - -Squash может уничтожить нормальную связь истории `master` с историей `template`. - -Git использует историю, чтобы понимать, какие изменения шаблона уже были доставлены в приложение. Если результат обновления шаблона превратить в один squash-коммит, связь с исходными коммитами шаблона станет хуже или исчезнет. - -Для sync-PR/MR допустимы: - -```text -fast-forward merge = хорошо -merge commit = допустимо -squash merge = нельзя -``` - -## Почему template нельзя пачкать - -`template` — эталонный слепок оригинального шаблона. - -Если в неё попадает локальное решение конфликта или изменение приложения, она перестаёт отвечать на вопрос: “какая версия шаблона сейчас подключена к приложению?”. - -После этого ломается главная граница ответственности: шаблон отдельно, приложение отдельно, конфликтная зона отдельно. - ---- - ---- -url: /template-sync-strategy/setup/clean-repository.md -description: Старт нового приложения от шаблонного репозитория с правильной историей веток. ---- - -# Новый проект от шаблона - -Этот сценарий подходит, когда репозиторий приложения ещё пустой или его можно безопасно пересоздать от шаблона. - -Целевая модель: - -```text -templates/master -> template -> sync/* -> master -``` - -## Условия - -Есть два репозитория: - -```text -template repo = репозиторий шаблона -app repo = репозиторий приложения -``` - -В обоих репозиториях основная ветка называется `master`. - -## Подготовить шаблон - -В репозитории шаблона: - -```bash -cd /path/to/template-repo -git switch master -``` - -Если это пустой репозиторий, добавьте первый файл и запушьте `master`: - -```bash -printf "# Template Repository\n\nBase template version: v1\n" > README.md -git add README.md -git commit -m "docs: добавить базовый шаблон" -git push -u origin master -``` - -## Подключить шаблон в приложении - -В репозитории приложения: - -```bash -cd /path/to/app-repo -git remote add templates -git fetch templates -``` - -Создайте ветку `template` от шаблона: - -```bash -git switch -c template templates/master -git push -u origin template -``` - -Создайте ветку приложения `master` от `template`: - -```bash -git switch -c master template -``` - -Добавьте слой приложения: - -```bash -mkdir -p app -printf "Application code v1\n" > app/app.txt -git add app/app.txt -git commit -m "feat: добавить слой приложения" -git push -u origin master -``` - -После этого история выглядит так: - -```text -template: T1 -master: T1---A1 -``` - -Где `T1` — коммит шаблона, а `A1` — коммит приложения. - -## Настроить pull и push для template - -Можно сделать так, чтобы на ветке `template`: - -```text -git pull тянул из templates/master -git push пушил в origin/template -``` - -Команды: - -```bash -git config branch.template.remote templates -git config branch.template.merge refs/heads/master -git config branch.template.pushRemote origin -``` - -Дополнительно можно запретить случайный push в репозиторий шаблона: - -```bash -git remote set-url --push templates DISABLED -``` - -## Дальше - -После первичной настройки постоянные ветки такие: - -```text -template = чистый шаблон -master = приложение -``` - -Обновления шаблона выполняются через временные ветки `sync/*` по инструкции [Обычное обновление шаблона](../workflows/update-template.md). - ---- - ---- -url: /template-sync-strategy/setup/existing-master-migration.md -description: >- - Как одноразово связать master приложения с историей шаблона, если проект был - создан отдельно. ---- - -# Миграция существующего master - -Этот сценарий нужен, если в репозитории приложения уже есть `master`, но он был создан не от шаблона. - -## Проблема - -Если `master` приложения и `template` имеют разные корневые коммиты, Git видит две несвязанные истории. - -Плохое состояние: - -```text -template: T1---T2---T3 - -master: A1---A2 -``` - -При попытке выполнить обычный merge Git может ответить: - -```text -fatal: отказ слияния несвязанных историй изменений -``` - -Это означает, что у веток нет общего предка. - -## Цель миграции - -Нужно один раз связать истории, чтобы дальше обновления шаблона шли обычным merge-процессом. - -После миграции история будет выглядеть примерно так: - -```text -template: T1---T2---T3 - \ -master: A1---A2-----M -``` - -Где `M` — одноразовый merge-коммит, который связал историю приложения с историей шаблона. - -## Подключить репозиторий шаблона - -В репозитории приложения: - -```bash -cd /path/to/app-repo -git remote add templates -git fetch templates -git fetch origin -``` - -Если remote `templates` уже существует: - -```bash -git fetch templates -git fetch origin -``` - -## Создать или обновить template - -Если ветки `template` ещё нет: - -```bash -git switch -c template templates/master -git push -u origin template -``` - -Если ветка `template` уже есть: - -```bash -git switch template -git merge --ff-only templates/master -git push origin template -``` - -Опционально настройте удобное поведение `pull` и `push`: - -```bash -git config branch.template.remote templates -git config branch.template.merge refs/heads/master -git config branch.template.pushRemote origin -git remote set-url --push templates DISABLED -``` - -## Связать master с template - -Создайте временную ветку от текущего приложения: - -```bash -git fetch origin -git switch -c sync/bootstrap-template origin/master -``` - -Слейте шаблон с разрешением несвязанных историй: - -```bash -git merge --allow-unrelated-histories origin/template -``` - -Если есть конфликты, решите их в ветке `sync/bootstrap-template`: - -```bash -git add . -git commit -``` - -Если конфликтов не было, Git сам создаст merge-коммит. - -Запушьте ветку: - -```bash -git push -u origin sync/bootstrap-template -``` - -Дальше через UI или локально смержите: - -```text -sync/bootstrap-template -> master -``` - -## Что проверить перед merge - -Посмотрите граф истории: - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=50 -``` - -Убедитесь, что `sync/bootstrap-template` содержит и историю приложения, и историю шаблона. - -Посмотрите итоговый diff: - -```bash -git --no-pager diff origin/master...sync/bootstrap-template -``` - -## Когда миграцию делать не стоит - -Не стоит связывать истории, если приложение только что создано и его можно безопасно пересоздать от шаблона. - -Для нового проекта лучше сделать чистый старт по инструкции [Новый проект от шаблона](./clean-repository.md). - ---- - ---- -url: /template-sync-strategy/workflows/update-template.md -description: >- - Повторяемый процесс доставки изменений шаблона в приложение после первичной - настройки. ---- - -# Обычное обновление шаблона - -Эта инструкция подходит после любого стартового сценария: - -* [Новый проект от шаблона](../setup/clean-repository.md). -* [Миграция существующего master](../setup/existing-master-migration.md). - -Целевой маршрут: - -```text -templates/master -> template -> sync/* -> master -``` - -## 1. Обновить слепок шаблона - -В репозитории приложения: - -```bash -cd /path/to/app-repo -git switch template -git pull --ff-only -git push -``` - -Этот вариант работает, если для ветки `template` настроено: - -```text -pull из templates/master -push в origin/template -``` - -Явная форма без зависимости от tracking-настроек: - -```bash -git fetch templates -git switch template -git merge --ff-only templates/master -git push origin template -``` - -Если `--ff-only` падает, значит `template` перестал быть чистым слепком шаблона. Остановитесь и разберите причину до продолжения. - -Проверьте, что `origin/template` обновился до шаблона: - -```bash -git fetch origin -git fetch templates -git --no-pager log --oneline -1 origin/template -git --no-pager log --oneline -1 templates/master -``` - -Оба коммита должны совпадать. - -## 2. Создать ветку обновления приложения - -После обновления `template` создайте временную ветку от текущего приложения: - -```bash -git fetch origin -git switch -c sync/update-template-v2 origin/master -git merge origin/template -``` - -Имя ветки можно менять под версию или дату: - -```text -sync/update-template-v2 -sync/update-template-2026-05-09 -sync/update-template-1.8.0 -``` - -Проверьте, что временная ветка реально отличается от `origin/master` изменениями шаблона: - -```bash -git --no-pager diff --stat origin/master...HEAD -``` - -Если diff пустой, значит обновлённый `origin/template` не был влит в `sync/*` ветку или в шаблоне нет новых изменений. - -## 3. Решить конфликты - -Если есть конфликты, решайте их именно в `sync/*`. - -После решения конфликтов: - -```bash -git add . -git commit -``` - -Если конфликтов не было, Git сам создаст merge-коммит или выполнит fast-forward, в зависимости от истории. - -## 4. Запушить sync-ветку - -```bash -git push -u origin sync/update-template-v2 -``` - -Дальше откройте PR/MR: - -```text -source: sync/update-template-v2 -target: master -``` - -Правила merge описаны в [Review и merge](./review-and-merge.md). - ---- - ---- -url: /template-sync-strategy/workflows/resolve-conflicts.md -description: Почему конфликты при обновлении шаблона должны решаться только в sync-ветках. ---- - -# Решение конфликтов - -Конфликт при обновлении шаблона — нормальная ситуация. Важно не то, что конфликт возник, а где он возник. - -Правильное место для конфликтов — временная ветка `sync/*`. - -## Пример - -Шаблон поменял строку в `README.md`: - -```text -Base template version: template-conflict-v10 -``` - -Приложение поменяло ту же строку иначе: - -```text -Base template version: application-conflict-v10 -``` - -При merge `origin/template` в `sync/update-template-v10` появится конфликт: - -```text -<<<<<<< HEAD -Base template version: application-conflict-v10 -======= -Base template version: template-conflict-v10 ->>>>>>> origin/template -``` - -Это правильное место конфликта: `master` ещё не изменён, `template` остаётся чистой, а итоговое решение можно проверить в PR/MR. - -## Как решать - -1. Оставайтесь в ветке `sync/*`. -2. Разберите конфликт по смыслу: что должно остаться в приложении после обновления шаблона. -3. Удалите conflict markers. -4. Проверьте проект локально. -5. Закоммитьте результат. - -```bash -git status -git add . -git commit -``` - -## Что нельзя делать - -Нельзя переносить conflict resolve в `template`. - -`template` должна совпадать с шаблоном. Если решение конфликта попадёт туда, она перестанет быть эталоном и дальнейшие обновления станут менее предсказуемыми. - -Нельзя решать конфликт прямо в `master`, потому что основная ветка приложения должна получать только проверенный результат через PR/MR. - -## Что проверить после resolve - -Посмотрите статус: - -```bash -git status -``` - -Посмотрите diff относительно текущего приложения: - -```bash -git --no-pager diff origin/master...HEAD -``` - -Посмотрите граф: - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=50 -``` - ---- - ---- -url: /template-sync-strategy/workflows/review-and-merge.md -description: Как проверять и вливать sync-ветку с обновлением шаблона в master приложения. ---- - -# Review и merge - -После подготовки `sync/*` ветки обновление шаблона должно попасть в `master` через PR/MR. - -## Создать PR/MR - -Параметры: - -```text -source: sync/update-template-vX -target: master -``` - -Цель review — увидеть: - -* какие изменения пришли из шаблона; -* какие конфликтные решения были сделаны в `sync/*`; -* не попали ли в обновление лишние изменения приложения; -* проходят ли проверки проекта. - -## Настройки merge - -Для sync-PR/MR важно: - -```text -squash = off -fast-forward merge = хорошо -merge commit = допустимо -squash merge = нельзя -``` - -Squash нельзя использовать, потому что он может уничтожить связь истории `master` с историей `template`. Особенно это критично после миграционного `sync/bootstrap-template`. - -## Проверки перед merge - -Проверьте граф истории: - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=50 -``` - -Проверьте итоговый diff: - -```bash -git --no-pager diff origin/master...sync/update-template-vX -``` - -Проверьте проект обычными командами конкретного приложения, например: - -```bash -npm run lint -npm run build -``` - -## После merge - -После успешного merge в `master` можно удалить временную ветку: - -```bash -git branch -d sync/update-template-vX -git push origin --delete sync/update-template-vX -``` - -Проверьте, что `master` теперь содержит обновление шаблона: - -```bash -git fetch origin -git --no-pager log origin/template..origin/master --oneline -git --no-pager diff origin/template...origin/master -``` - ---- - ---- -url: /template-sync-strategy/reference/cheatsheet.md -description: Короткий набор команд для регулярного обновления приложения от шаблона. ---- - -# Памятка - -Рабочая схема: - -```text -templates/master -> template -> sync/* -> master -``` - -## Обновить template - -В репозитории приложения: - -```bash -git switch template -git pull --ff-only -git push -``` - -Это подтягивает свежий шаблон из `templates/master` и пушит его в `origin/template`. - -## Создать ветку обновления - -```bash -git fetch origin -git switch -c sync/update-template-vX origin/master -git merge origin/template -``` - -Если есть конфликты, решить их в этой же ветке: - -```bash -git add . -git commit -``` - -## Запушить sync-ветку - -```bash -git push -u origin sync/update-template-vX -``` - -## Влить через UI - -Создать PR/MR: - -```text -source: sync/update-template-vX -target: master -``` - -Важно: - -```text -squash = off -``` - -## Проверка - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=30 -``` - -## Суть процесса - -1. Обновить `template` из `templates/master`. -2. Создать `sync/*` от `origin/master`. -3. Влить `origin/template` в `sync/*`. -4. Решить конфликты, если есть. -5. Запушить `sync/*`. -6. Через UI влить `sync/* -> master`. - ---- - ---- -url: /template-sync-strategy/reference/troubleshooting.md -description: Типовые ошибки при обновлении проекта от шаблона и способы диагностики. ---- - -# Troubleshooting - -## fatal: отказ слияния несвязанных историй изменений - -Ошибка: - -```text -fatal: отказ слияния несвязанных историй изменений -``` - -Причина: `master` приложения не был создан от `template`, поэтому у веток нет общего предка. - -Решение: выполнить одноразовую миграцию через `sync/bootstrap-template` по инструкции [Миграция существующего master](../setup/existing-master-migration.md). - -Коротко: - -```bash -git switch -c sync/bootstrap-template origin/master -git merge --allow-unrelated-histories origin/template -git push -u origin sync/bootstrap-template -``` - -## --ff-only падает на template - -Ошибка возникает при команде: - -```bash -git merge --ff-only templates/master -``` - -Причина: в `template` появились коммиты, которых нет в шаблоне. Значит ветка перестала быть чистым слепком. - -Что проверить: - -```bash -git fetch templates -git --no-pager log --oneline --graph --decorate templates/master..template -``` - -Решение зависит от причины. Не продолжайте обновление, пока не станет понятно, какие локальные коммиты попали в `template`. - -## Пустой diff в sync-ветке - -Симптом: - -```bash -git --no-pager diff --stat origin/master...HEAD -``` - -не показывает изменений. - -Возможные причины: - -* в шаблоне нет новых изменений; -* `origin/template` не был обновлён; -* `origin/template` не был влит в `sync/*`; -* sync-ветка создана не от актуального `origin/master`. - -Что проверить: - -```bash -git fetch origin -git fetch templates -git --no-pager log --oneline -1 origin/template -git --no-pager log --oneline -1 templates/master -git --no-pager log --oneline --graph --decorate --all --max-count=50 -``` - -## Случайно включили squash - -Если sync-PR/MR уже влит squash-merge, история шаблона могла не сохраниться как нормальная merge-связь. - -Что сделать: - -* зафиксировать факт в описании проекта; -* проверить, видит ли Git последующие обновления шаблона без повторного применения старых изменений; -* при следующем обновлении внимательно смотреть diff и конфликты; -* для будущих sync-PR/MR отключить squash. - -Если ситуация стала неуправляемой, может потребоваться отдельная техническая миграция истории. - -## cannot run less - -Ошибка: - -```text -cannot run less -``` - -Причина: Git пытается открыть pager `less`, которого нет в системе. - -Решение: использовать `git --no-pager`: - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=50 -git --no-pager diff template...master -``` - ---- - ---- -url: /template-sync-strategy/reference/glossary.md -description: 'Термины, которые используются в Template Sync Strategy.' ---- - -# Глоссарий - -## Template repo - -Репозиторий шаблона. В нём живёт общая техническая база: CI/CD, Dockerfile, зависимости, линтер, сборка, структура и документация. - -## App repo - -Репозиторий приложения. В нём живёт продуктовый код и локальные настройки конкретного приложения. - -## templates - -Git remote внутри репозитория приложения, который указывает на репозиторий шаблона. - -Пример: - -```bash -git remote add templates -``` - -## templates/master - -Ветка `master` из репозитория шаблона, доступная в приложении через remote `templates`. - -## template - -Ветка внутри репозитория приложения, которая должна быть чистым слепком `templates/master`. - -## master - -Основная ветка приложения. Содержит шаблонную базу плюс продуктовый слой. - -## sync/\* - -Временные ветки для обновления приложения от шаблона. Создаются от `origin/master`, получают merge из `origin/template`, проходят review и затем вливаются в `master`. - -## Fast-forward - -Обновление ветки без merge-коммита, когда текущая ветка может быть просто передвинута вперёд по истории. - -## Merge commit - -Коммит слияния, который сохраняет связь двух историй. Допустим для `sync/* -> master`. - -## Squash - -Способ merge, при котором все изменения source branch превращаются в один новый коммит. Для sync-PR/MR запрещён, потому что может разрушить полезную связь истории `master` с историей `template`. diff --git a/public/template-sync-strategy/llms.txt b/public/template-sync-strategy/llms.txt deleted file mode 100644 index 75c5900..0000000 --- a/public/template-sync-strategy/llms.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Template Sync Strategy - -> Управляемое обновление проектов от шаблона - -## Table of Contents - -### Введение - -- [Template Sync Strategy](/template-sync-strategy/overview.md): Управляемое обновление проектов от шаблона через чистую ветку template, временные sync-ветки и PR/MR. -- [Зачем это нужно](/template-sync-strategy/concepts/why.md): Почему шаблону нужен процесс обновления, а не только быстрый старт нового проекта. -- [Модель веток](/template-sync-strategy/concepts/model.md): Роли веток и remote в стратегии обновления проекта от шаблона. -- [Правила процесса](/template-sync-strategy/concepts/rules.md): Набор правил, который удерживает template чистой, а обновления шаблона контролируемыми. - -### Настройка - -- [Новый проект от шаблона](/template-sync-strategy/setup/clean-repository.md): Старт нового приложения от шаблонного репозитория с правильной историей веток. -- [Миграция существующего master](/template-sync-strategy/setup/existing-master-migration.md): Как одноразово связать master приложения с историей шаблона, если проект был создан отдельно. - -### Рабочие процессы - -- [Обычное обновление шаблона](/template-sync-strategy/workflows/update-template.md): Повторяемый процесс доставки изменений шаблона в приложение после первичной настройки. -- [Решение конфликтов](/template-sync-strategy/workflows/resolve-conflicts.md): Почему конфликты при обновлении шаблона должны решаться только в sync-ветках. -- [Review и merge](/template-sync-strategy/workflows/review-and-merge.md): Как проверять и вливать sync-ветку с обновлением шаблона в master приложения. - -### Справочник - -- [Памятка](/template-sync-strategy/reference/cheatsheet.md): Короткий набор команд для регулярного обновления приложения от шаблона. -- [Troubleshooting](/template-sync-strategy/reference/troubleshooting.md): Типовые ошибки при обновлении проекта от шаблона и способы диагностики. -- [Глоссарий](/template-sync-strategy/reference/glossary.md): Термины, которые используются в Template Sync Strategy. - diff --git a/public/template-sync-strategy/overview.html b/public/template-sync-strategy/overview.html deleted file mode 100644 index ddc8bcc..0000000 --- a/public/template-sync-strategy/overview.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Template Sync Strategy

Template Sync Strategy описывает процесс, при котором приложение создаётся от шаблона и дальше регулярно получает обновления шаблона без ручного копирования файлов.

Основной маршрут:

text
templates/master -> template -> sync/* -> master

Где:

  • templates/master — основная ветка внешнего репозитория шаблона.
  • template — чистый слепок шаблона внутри репозитория приложения.
  • sync/* — временная ветка, где шаблон накладывается на приложение.
  • master — основная ветка приложения.

Задача

Шаблон хорошо решает старт проекта: приносит CI/CD, Dockerfile, зависимости, линтер, сборку, структуру и базовую документацию. Но после старта приложения расходятся: где-то обновили CI, где-то забыли, где-то сделали локальную кастомизацию.

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

Главный принцип

Ветка template должна оставаться чистым слепком оригинального шаблона.

В неё нельзя коммитить изменения приложения и нельзя решать конфликты. Все конфликтные решения выполняются только во временных ветках sync/*.

Состав документации

- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/overview.md b/public/template-sync-strategy/overview.md deleted file mode 100644 index f8583f0..0000000 --- a/public/template-sync-strategy/overview.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -url: /template-sync-strategy/overview.md -description: >- - Управляемое обновление проектов от шаблона через чистую ветку template, - временные sync-ветки и PR/MR. ---- - -# Template Sync Strategy - -Template Sync Strategy описывает процесс, при котором приложение создаётся от шаблона и дальше регулярно получает обновления шаблона без ручного копирования файлов. - -Основной маршрут: - -```text -templates/master -> template -> sync/* -> master -``` - -Где: - -* `templates/master` — основная ветка внешнего репозитория шаблона. -* `template` — чистый слепок шаблона внутри репозитория приложения. -* `sync/*` — временная ветка, где шаблон накладывается на приложение. -* `master` — основная ветка приложения. - -## Задача - -Шаблон хорошо решает старт проекта: приносит CI/CD, Dockerfile, зависимости, линтер, сборку, структуру и базовую документацию. Но после старта приложения расходятся: где-то обновили CI, где-то забыли, где-то сделали локальную кастомизацию. - -Стратегия нужна, чтобы шаблон оставался общей технической базой не только в первый день проекта, но и на всём жизненном цикле приложения. - -## Главный принцип - -Ветка `template` должна оставаться чистым слепком оригинального шаблона. - -В неё нельзя коммитить изменения приложения и нельзя решать конфликты. Все конфликтные решения выполняются только во временных ветках `sync/*`. - -## Состав документации - -* [Зачем это нужно](./concepts/why.md) — какие проблемы появляются без update-flow. -* [Модель веток](./concepts/model.md) — роли `templates/master`, `template`, `sync/*` и `master`. -* [Правила процесса](./concepts/rules.md) — ограничения, которые удерживают схему чистой. -* [Новый проект от шаблона](./setup/clean-repository.md) — старт приложения с правильной историей. -* [Миграция существующего master](./setup/existing-master-migration.md) — одноразовое связывание несвязанных историй. -* [Обычное обновление шаблона](./workflows/update-template.md) — регулярный рабочий процесс. -* [Решение конфликтов](./workflows/resolve-conflicts.md) — где и как совместить шаблон с приложением. -* [Review и merge](./workflows/review-and-merge.md) — как доставлять sync-ветку в `master`. -* [Памятка](./reference/cheatsheet.md) — короткий набор команд. -* [Troubleshooting](./reference/troubleshooting.md) — типовые ошибки и диагностика. -* [Глоссарий](./reference/glossary.md) — основные термины. diff --git a/public/template-sync-strategy/reference/cheatsheet.html b/public/template-sync-strategy/reference/cheatsheet.html deleted file mode 100644 index 097e8d6..0000000 --- a/public/template-sync-strategy/reference/cheatsheet.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Памятка | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Памятка

Рабочая схема:

text
templates/master -> template -> sync/* -> master

Обновить template

В репозитории приложения:

bash
git switch template
-git pull --ff-only
-git push

Это подтягивает свежий шаблон из templates/master и пушит его в origin/template.

Создать ветку обновления

bash
git fetch origin
-git switch -c sync/update-template-vX origin/master
-git merge origin/template

Если есть конфликты, решить их в этой же ветке:

bash
git add .
-git commit

Запушить sync-ветку

bash
git push -u origin sync/update-template-vX

Влить через UI

Создать PR/MR:

text
source: sync/update-template-vX
-target: master

Важно:

text
squash = off

Проверка

bash
git --no-pager log --oneline --graph --decorate --all --max-count=30

Суть процесса

  1. Обновить template из templates/master.
  2. Создать sync/* от origin/master.
  3. Влить origin/template в sync/*.
  4. Решить конфликты, если есть.
  5. Запушить sync/*.
  6. Через UI влить sync/* -> master.
- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/reference/cheatsheet.md b/public/template-sync-strategy/reference/cheatsheet.md deleted file mode 100644 index 5d0a1d5..0000000 --- a/public/template-sync-strategy/reference/cheatsheet.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -url: /template-sync-strategy/reference/cheatsheet.md -description: Короткий набор команд для регулярного обновления приложения от шаблона. ---- - -# Памятка - -Рабочая схема: - -```text -templates/master -> template -> sync/* -> master -``` - -## Обновить template - -В репозитории приложения: - -```bash -git switch template -git pull --ff-only -git push -``` - -Это подтягивает свежий шаблон из `templates/master` и пушит его в `origin/template`. - -## Создать ветку обновления - -```bash -git fetch origin -git switch -c sync/update-template-vX origin/master -git merge origin/template -``` - -Если есть конфликты, решить их в этой же ветке: - -```bash -git add . -git commit -``` - -## Запушить sync-ветку - -```bash -git push -u origin sync/update-template-vX -``` - -## Влить через UI - -Создать PR/MR: - -```text -source: sync/update-template-vX -target: master -``` - -Важно: - -```text -squash = off -``` - -## Проверка - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=30 -``` - -## Суть процесса - -1. Обновить `template` из `templates/master`. -2. Создать `sync/*` от `origin/master`. -3. Влить `origin/template` в `sync/*`. -4. Решить конфликты, если есть. -5. Запушить `sync/*`. -6. Через UI влить `sync/* -> master`. diff --git a/public/template-sync-strategy/reference/glossary.html b/public/template-sync-strategy/reference/glossary.html deleted file mode 100644 index 19d39cb..0000000 --- a/public/template-sync-strategy/reference/glossary.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Глоссарий | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Глоссарий

Template repo

Репозиторий шаблона. В нём живёт общая техническая база: CI/CD, Dockerfile, зависимости, линтер, сборка, структура и документация.

App repo

Репозиторий приложения. В нём живёт продуктовый код и локальные настройки конкретного приложения.

templates

Git remote внутри репозитория приложения, который указывает на репозиторий шаблона.

Пример:

bash
git remote add templates <template-repo-url>

templates/master

Ветка master из репозитория шаблона, доступная в приложении через remote templates.

template

Ветка внутри репозитория приложения, которая должна быть чистым слепком templates/master.

master

Основная ветка приложения. Содержит шаблонную базу плюс продуктовый слой.

sync/*

Временные ветки для обновления приложения от шаблона. Создаются от origin/master, получают merge из origin/template, проходят review и затем вливаются в master.

Fast-forward

Обновление ветки без merge-коммита, когда текущая ветка может быть просто передвинута вперёд по истории.

Merge commit

Коммит слияния, который сохраняет связь двух историй. Допустим для sync/* -> master.

Squash

Способ merge, при котором все изменения source branch превращаются в один новый коммит. Для sync-PR/MR запрещён, потому что может разрушить полезную связь истории master с историей template.

- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/reference/glossary.md b/public/template-sync-strategy/reference/glossary.md deleted file mode 100644 index c15cb7d..0000000 --- a/public/template-sync-strategy/reference/glossary.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -url: /template-sync-strategy/reference/glossary.md -description: 'Термины, которые используются в Template Sync Strategy.' ---- - -# Глоссарий - -## Template repo - -Репозиторий шаблона. В нём живёт общая техническая база: CI/CD, Dockerfile, зависимости, линтер, сборка, структура и документация. - -## App repo - -Репозиторий приложения. В нём живёт продуктовый код и локальные настройки конкретного приложения. - -## templates - -Git remote внутри репозитория приложения, который указывает на репозиторий шаблона. - -Пример: - -```bash -git remote add templates -``` - -## templates/master - -Ветка `master` из репозитория шаблона, доступная в приложении через remote `templates`. - -## template - -Ветка внутри репозитория приложения, которая должна быть чистым слепком `templates/master`. - -## master - -Основная ветка приложения. Содержит шаблонную базу плюс продуктовый слой. - -## sync/\* - -Временные ветки для обновления приложения от шаблона. Создаются от `origin/master`, получают merge из `origin/template`, проходят review и затем вливаются в `master`. - -## Fast-forward - -Обновление ветки без merge-коммита, когда текущая ветка может быть просто передвинута вперёд по истории. - -## Merge commit - -Коммит слияния, который сохраняет связь двух историй. Допустим для `sync/* -> master`. - -## Squash - -Способ merge, при котором все изменения source branch превращаются в один новый коммит. Для sync-PR/MR запрещён, потому что может разрушить полезную связь истории `master` с историей `template`. diff --git a/public/template-sync-strategy/reference/troubleshooting.html b/public/template-sync-strategy/reference/troubleshooting.html deleted file mode 100644 index 2eac635..0000000 --- a/public/template-sync-strategy/reference/troubleshooting.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Troubleshooting | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Troubleshooting

fatal: отказ слияния несвязанных историй изменений

Ошибка:

text
fatal: отказ слияния несвязанных историй изменений

Причина: master приложения не был создан от template, поэтому у веток нет общего предка.

Решение: выполнить одноразовую миграцию через sync/bootstrap-template по инструкции Миграция существующего master.

Коротко:

bash
git switch -c sync/bootstrap-template origin/master
-git merge --allow-unrelated-histories origin/template
-git push -u origin sync/bootstrap-template

--ff-only падает на template

Ошибка возникает при команде:

bash
git merge --ff-only templates/master

Причина: в template появились коммиты, которых нет в шаблоне. Значит ветка перестала быть чистым слепком.

Что проверить:

bash
git fetch templates
-git --no-pager log --oneline --graph --decorate templates/master..template

Решение зависит от причины. Не продолжайте обновление, пока не станет понятно, какие локальные коммиты попали в template.

Пустой diff в sync-ветке

Симптом:

bash
git --no-pager diff --stat origin/master...HEAD

не показывает изменений.

Возможные причины:

  • в шаблоне нет новых изменений;
  • origin/template не был обновлён;
  • origin/template не был влит в sync/*;
  • sync-ветка создана не от актуального origin/master.

Что проверить:

bash
git fetch origin
-git fetch templates
-git --no-pager log --oneline -1 origin/template
-git --no-pager log --oneline -1 templates/master
-git --no-pager log --oneline --graph --decorate --all --max-count=50

Случайно включили squash

Если sync-PR/MR уже влит squash-merge, история шаблона могла не сохраниться как нормальная merge-связь.

Что сделать:

  • зафиксировать факт в описании проекта;
  • проверить, видит ли Git последующие обновления шаблона без повторного применения старых изменений;
  • при следующем обновлении внимательно смотреть diff и конфликты;
  • для будущих sync-PR/MR отключить squash.

Если ситуация стала неуправляемой, может потребоваться отдельная техническая миграция истории.

cannot run less

Ошибка:

text
cannot run less

Причина: Git пытается открыть pager less, которого нет в системе.

Решение: использовать git --no-pager:

bash
git --no-pager log --oneline --graph --decorate --all --max-count=50
-git --no-pager diff template...master
- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/reference/troubleshooting.md b/public/template-sync-strategy/reference/troubleshooting.md deleted file mode 100644 index 11a92fb..0000000 --- a/public/template-sync-strategy/reference/troubleshooting.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -url: /template-sync-strategy/reference/troubleshooting.md -description: Типовые ошибки при обновлении проекта от шаблона и способы диагностики. ---- - -# Troubleshooting - -## fatal: отказ слияния несвязанных историй изменений - -Ошибка: - -```text -fatal: отказ слияния несвязанных историй изменений -``` - -Причина: `master` приложения не был создан от `template`, поэтому у веток нет общего предка. - -Решение: выполнить одноразовую миграцию через `sync/bootstrap-template` по инструкции [Миграция существующего master](../setup/existing-master-migration.md). - -Коротко: - -```bash -git switch -c sync/bootstrap-template origin/master -git merge --allow-unrelated-histories origin/template -git push -u origin sync/bootstrap-template -``` - -## --ff-only падает на template - -Ошибка возникает при команде: - -```bash -git merge --ff-only templates/master -``` - -Причина: в `template` появились коммиты, которых нет в шаблоне. Значит ветка перестала быть чистым слепком. - -Что проверить: - -```bash -git fetch templates -git --no-pager log --oneline --graph --decorate templates/master..template -``` - -Решение зависит от причины. Не продолжайте обновление, пока не станет понятно, какие локальные коммиты попали в `template`. - -## Пустой diff в sync-ветке - -Симптом: - -```bash -git --no-pager diff --stat origin/master...HEAD -``` - -не показывает изменений. - -Возможные причины: - -* в шаблоне нет новых изменений; -* `origin/template` не был обновлён; -* `origin/template` не был влит в `sync/*`; -* sync-ветка создана не от актуального `origin/master`. - -Что проверить: - -```bash -git fetch origin -git fetch templates -git --no-pager log --oneline -1 origin/template -git --no-pager log --oneline -1 templates/master -git --no-pager log --oneline --graph --decorate --all --max-count=50 -``` - -## Случайно включили squash - -Если sync-PR/MR уже влит squash-merge, история шаблона могла не сохраниться как нормальная merge-связь. - -Что сделать: - -* зафиксировать факт в описании проекта; -* проверить, видит ли Git последующие обновления шаблона без повторного применения старых изменений; -* при следующем обновлении внимательно смотреть diff и конфликты; -* для будущих sync-PR/MR отключить squash. - -Если ситуация стала неуправляемой, может потребоваться отдельная техническая миграция истории. - -## cannot run less - -Ошибка: - -```text -cannot run less -``` - -Причина: Git пытается открыть pager `less`, которого нет в системе. - -Решение: использовать `git --no-pager`: - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=50 -git --no-pager diff template...master -``` diff --git a/public/template-sync-strategy/setup/clean-repository.html b/public/template-sync-strategy/setup/clean-repository.html deleted file mode 100644 index 054a937..0000000 --- a/public/template-sync-strategy/setup/clean-repository.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - Новый проект от шаблона | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Новый проект от шаблона

Этот сценарий подходит, когда репозиторий приложения ещё пустой или его можно безопасно пересоздать от шаблона.

Целевая модель:

text
templates/master -> template -> sync/* -> master

Условия

Есть два репозитория:

text
template repo = репозиторий шаблона
-app repo      = репозиторий приложения

В обоих репозиториях основная ветка называется master.

Подготовить шаблон

В репозитории шаблона:

bash
cd /path/to/template-repo
-git switch master

Если это пустой репозиторий, добавьте первый файл и запушьте master:

bash
printf "# Template Repository\n\nBase template version: v1\n" > README.md
-git add README.md
-git commit -m "docs: добавить базовый шаблон"
-git push -u origin master

Подключить шаблон в приложении

В репозитории приложения:

bash
cd /path/to/app-repo
-git remote add templates <template-repo-url>
-git fetch templates

Создайте ветку template от шаблона:

bash
git switch -c template templates/master
-git push -u origin template

Создайте ветку приложения master от template:

bash
git switch -c master template

Добавьте слой приложения:

bash
mkdir -p app
-printf "Application code v1\n" > app/app.txt
-git add app/app.txt
-git commit -m "feat: добавить слой приложения"
-git push -u origin master

После этого история выглядит так:

text
template: T1
-master:   T1---A1

Где T1 — коммит шаблона, а A1 — коммит приложения.

Настроить pull и push для template

Можно сделать так, чтобы на ветке template:

text
git pull тянул из templates/master
-git push пушил в origin/template

Команды:

bash
git config branch.template.remote templates
-git config branch.template.merge refs/heads/master
-git config branch.template.pushRemote origin

Дополнительно можно запретить случайный push в репозиторий шаблона:

bash
git remote set-url --push templates DISABLED

Дальше

После первичной настройки постоянные ветки такие:

text
template = чистый шаблон
-master   = приложение

Обновления шаблона выполняются через временные ветки sync/* по инструкции Обычное обновление шаблона.

- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/setup/clean-repository.md b/public/template-sync-strategy/setup/clean-repository.md deleted file mode 100644 index 09cfeac..0000000 --- a/public/template-sync-strategy/setup/clean-repository.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -url: /template-sync-strategy/setup/clean-repository.md -description: Старт нового приложения от шаблонного репозитория с правильной историей веток. ---- - -# Новый проект от шаблона - -Этот сценарий подходит, когда репозиторий приложения ещё пустой или его можно безопасно пересоздать от шаблона. - -Целевая модель: - -```text -templates/master -> template -> sync/* -> master -``` - -## Условия - -Есть два репозитория: - -```text -template repo = репозиторий шаблона -app repo = репозиторий приложения -``` - -В обоих репозиториях основная ветка называется `master`. - -## Подготовить шаблон - -В репозитории шаблона: - -```bash -cd /path/to/template-repo -git switch master -``` - -Если это пустой репозиторий, добавьте первый файл и запушьте `master`: - -```bash -printf "# Template Repository\n\nBase template version: v1\n" > README.md -git add README.md -git commit -m "docs: добавить базовый шаблон" -git push -u origin master -``` - -## Подключить шаблон в приложении - -В репозитории приложения: - -```bash -cd /path/to/app-repo -git remote add templates -git fetch templates -``` - -Создайте ветку `template` от шаблона: - -```bash -git switch -c template templates/master -git push -u origin template -``` - -Создайте ветку приложения `master` от `template`: - -```bash -git switch -c master template -``` - -Добавьте слой приложения: - -```bash -mkdir -p app -printf "Application code v1\n" > app/app.txt -git add app/app.txt -git commit -m "feat: добавить слой приложения" -git push -u origin master -``` - -После этого история выглядит так: - -```text -template: T1 -master: T1---A1 -``` - -Где `T1` — коммит шаблона, а `A1` — коммит приложения. - -## Настроить pull и push для template - -Можно сделать так, чтобы на ветке `template`: - -```text -git pull тянул из templates/master -git push пушил в origin/template -``` - -Команды: - -```bash -git config branch.template.remote templates -git config branch.template.merge refs/heads/master -git config branch.template.pushRemote origin -``` - -Дополнительно можно запретить случайный push в репозиторий шаблона: - -```bash -git remote set-url --push templates DISABLED -``` - -## Дальше - -После первичной настройки постоянные ветки такие: - -```text -template = чистый шаблон -master = приложение -``` - -Обновления шаблона выполняются через временные ветки `sync/*` по инструкции [Обычное обновление шаблона](../workflows/update-template.md). diff --git a/public/template-sync-strategy/setup/existing-master-migration.html b/public/template-sync-strategy/setup/existing-master-migration.html deleted file mode 100644 index ab54c6c..0000000 --- a/public/template-sync-strategy/setup/existing-master-migration.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Миграция существующего master | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Миграция существующего master

Этот сценарий нужен, если в репозитории приложения уже есть master, но он был создан не от шаблона.

Проблема

Если master приложения и template имеют разные корневые коммиты, Git видит две несвязанные истории.

Плохое состояние:

text
template: T1---T2---T3
-
-master:   A1---A2

При попытке выполнить обычный merge Git может ответить:

text
fatal: отказ слияния несвязанных историй изменений

Это означает, что у веток нет общего предка.

Цель миграции

Нужно один раз связать истории, чтобы дальше обновления шаблона шли обычным merge-процессом.

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

text
template: T1---T2---T3
-                     \
-master:   A1---A2-----M

Где M — одноразовый merge-коммит, который связал историю приложения с историей шаблона.

Подключить репозиторий шаблона

В репозитории приложения:

bash
cd /path/to/app-repo
-git remote add templates <template-repo-url>
-git fetch templates
-git fetch origin

Если remote templates уже существует:

bash
git fetch templates
-git fetch origin

Создать или обновить template

Если ветки template ещё нет:

bash
git switch -c template templates/master
-git push -u origin template

Если ветка template уже есть:

bash
git switch template
-git merge --ff-only templates/master
-git push origin template

Опционально настройте удобное поведение pull и push:

bash
git config branch.template.remote templates
-git config branch.template.merge refs/heads/master
-git config branch.template.pushRemote origin
-git remote set-url --push templates DISABLED

Связать master с template

Создайте временную ветку от текущего приложения:

bash
git fetch origin
-git switch -c sync/bootstrap-template origin/master

Слейте шаблон с разрешением несвязанных историй:

bash
git merge --allow-unrelated-histories origin/template

Если есть конфликты, решите их в ветке sync/bootstrap-template:

bash
git add .
-git commit

Если конфликтов не было, Git сам создаст merge-коммит.

Запушьте ветку:

bash
git push -u origin sync/bootstrap-template

Дальше через UI или локально смержите:

text
sync/bootstrap-template -> master

Что проверить перед merge

Посмотрите граф истории:

bash
git --no-pager log --oneline --graph --decorate --all --max-count=50

Убедитесь, что sync/bootstrap-template содержит и историю приложения, и историю шаблона.

Посмотрите итоговый diff:

bash
git --no-pager diff origin/master...sync/bootstrap-template

Когда миграцию делать не стоит

Не стоит связывать истории, если приложение только что создано и его можно безопасно пересоздать от шаблона.

Для нового проекта лучше сделать чистый старт по инструкции Новый проект от шаблона.

- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/setup/existing-master-migration.md b/public/template-sync-strategy/setup/existing-master-migration.md deleted file mode 100644 index 9fdddd1..0000000 --- a/public/template-sync-strategy/setup/existing-master-migration.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -url: /template-sync-strategy/setup/existing-master-migration.md -description: >- - Как одноразово связать master приложения с историей шаблона, если проект был - создан отдельно. ---- - -# Миграция существующего master - -Этот сценарий нужен, если в репозитории приложения уже есть `master`, но он был создан не от шаблона. - -## Проблема - -Если `master` приложения и `template` имеют разные корневые коммиты, Git видит две несвязанные истории. - -Плохое состояние: - -```text -template: T1---T2---T3 - -master: A1---A2 -``` - -При попытке выполнить обычный merge Git может ответить: - -```text -fatal: отказ слияния несвязанных историй изменений -``` - -Это означает, что у веток нет общего предка. - -## Цель миграции - -Нужно один раз связать истории, чтобы дальше обновления шаблона шли обычным merge-процессом. - -После миграции история будет выглядеть примерно так: - -```text -template: T1---T2---T3 - \ -master: A1---A2-----M -``` - -Где `M` — одноразовый merge-коммит, который связал историю приложения с историей шаблона. - -## Подключить репозиторий шаблона - -В репозитории приложения: - -```bash -cd /path/to/app-repo -git remote add templates -git fetch templates -git fetch origin -``` - -Если remote `templates` уже существует: - -```bash -git fetch templates -git fetch origin -``` - -## Создать или обновить template - -Если ветки `template` ещё нет: - -```bash -git switch -c template templates/master -git push -u origin template -``` - -Если ветка `template` уже есть: - -```bash -git switch template -git merge --ff-only templates/master -git push origin template -``` - -Опционально настройте удобное поведение `pull` и `push`: - -```bash -git config branch.template.remote templates -git config branch.template.merge refs/heads/master -git config branch.template.pushRemote origin -git remote set-url --push templates DISABLED -``` - -## Связать master с template - -Создайте временную ветку от текущего приложения: - -```bash -git fetch origin -git switch -c sync/bootstrap-template origin/master -``` - -Слейте шаблон с разрешением несвязанных историй: - -```bash -git merge --allow-unrelated-histories origin/template -``` - -Если есть конфликты, решите их в ветке `sync/bootstrap-template`: - -```bash -git add . -git commit -``` - -Если конфликтов не было, Git сам создаст merge-коммит. - -Запушьте ветку: - -```bash -git push -u origin sync/bootstrap-template -``` - -Дальше через UI или локально смержите: - -```text -sync/bootstrap-template -> master -``` - -## Что проверить перед merge - -Посмотрите граф истории: - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=50 -``` - -Убедитесь, что `sync/bootstrap-template` содержит и историю приложения, и историю шаблона. - -Посмотрите итоговый diff: - -```bash -git --no-pager diff origin/master...sync/bootstrap-template -``` - -## Когда миграцию делать не стоит - -Не стоит связывать истории, если приложение только что создано и его можно безопасно пересоздать от шаблона. - -Для нового проекта лучше сделать чистый старт по инструкции [Новый проект от шаблона](./clean-repository.md). diff --git a/public/template-sync-strategy/vp-icons.css b/public/template-sync-strategy/vp-icons.css deleted file mode 100644 index e69de29..0000000 diff --git a/public/template-sync-strategy/workflows/resolve-conflicts.html b/public/template-sync-strategy/workflows/resolve-conflicts.html deleted file mode 100644 index 1c53ccb..0000000 --- a/public/template-sync-strategy/workflows/resolve-conflicts.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Решение конфликтов | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Решение конфликтов

Конфликт при обновлении шаблона — нормальная ситуация. Важно не то, что конфликт возник, а где он возник.

Правильное место для конфликтов — временная ветка sync/*.

Пример

Шаблон поменял строку в README.md:

text
Base template version: template-conflict-v10

Приложение поменяло ту же строку иначе:

text
Base template version: application-conflict-v10

При merge origin/template в sync/update-template-v10 появится конфликт:

text
<<<<<<< HEAD
-Base template version: application-conflict-v10
-=======
-Base template version: template-conflict-v10
->>>>>>> origin/template

Это правильное место конфликта: master ещё не изменён, template остаётся чистой, а итоговое решение можно проверить в PR/MR.

Как решать

  1. Оставайтесь в ветке sync/*.
  2. Разберите конфликт по смыслу: что должно остаться в приложении после обновления шаблона.
  3. Удалите conflict markers.
  4. Проверьте проект локально.
  5. Закоммитьте результат.
bash
git status
-git add .
-git commit

Что нельзя делать

Нельзя переносить conflict resolve в template.

template должна совпадать с шаблоном. Если решение конфликта попадёт туда, она перестанет быть эталоном и дальнейшие обновления станут менее предсказуемыми.

Нельзя решать конфликт прямо в master, потому что основная ветка приложения должна получать только проверенный результат через PR/MR.

Что проверить после resolve

Посмотрите статус:

bash
git status

Посмотрите diff относительно текущего приложения:

bash
git --no-pager diff origin/master...HEAD

Посмотрите граф:

bash
git --no-pager log --oneline --graph --decorate --all --max-count=50
- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/workflows/resolve-conflicts.md b/public/template-sync-strategy/workflows/resolve-conflicts.md deleted file mode 100644 index d92ecdc..0000000 --- a/public/template-sync-strategy/workflows/resolve-conflicts.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -url: /template-sync-strategy/workflows/resolve-conflicts.md -description: Почему конфликты при обновлении шаблона должны решаться только в sync-ветках. ---- - -# Решение конфликтов - -Конфликт при обновлении шаблона — нормальная ситуация. Важно не то, что конфликт возник, а где он возник. - -Правильное место для конфликтов — временная ветка `sync/*`. - -## Пример - -Шаблон поменял строку в `README.md`: - -```text -Base template version: template-conflict-v10 -``` - -Приложение поменяло ту же строку иначе: - -```text -Base template version: application-conflict-v10 -``` - -При merge `origin/template` в `sync/update-template-v10` появится конфликт: - -```text -<<<<<<< HEAD -Base template version: application-conflict-v10 -======= -Base template version: template-conflict-v10 ->>>>>>> origin/template -``` - -Это правильное место конфликта: `master` ещё не изменён, `template` остаётся чистой, а итоговое решение можно проверить в PR/MR. - -## Как решать - -1. Оставайтесь в ветке `sync/*`. -2. Разберите конфликт по смыслу: что должно остаться в приложении после обновления шаблона. -3. Удалите conflict markers. -4. Проверьте проект локально. -5. Закоммитьте результат. - -```bash -git status -git add . -git commit -``` - -## Что нельзя делать - -Нельзя переносить conflict resolve в `template`. - -`template` должна совпадать с шаблоном. Если решение конфликта попадёт туда, она перестанет быть эталоном и дальнейшие обновления станут менее предсказуемыми. - -Нельзя решать конфликт прямо в `master`, потому что основная ветка приложения должна получать только проверенный результат через PR/MR. - -## Что проверить после resolve - -Посмотрите статус: - -```bash -git status -``` - -Посмотрите diff относительно текущего приложения: - -```bash -git --no-pager diff origin/master...HEAD -``` - -Посмотрите граф: - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=50 -``` diff --git a/public/template-sync-strategy/workflows/review-and-merge.html b/public/template-sync-strategy/workflows/review-and-merge.html deleted file mode 100644 index 827aec9..0000000 --- a/public/template-sync-strategy/workflows/review-and-merge.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Review и merge | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Review и merge

После подготовки sync/* ветки обновление шаблона должно попасть в master через PR/MR.

Создать PR/MR

Параметры:

text
source: sync/update-template-vX
-target: master

Цель review — увидеть:

  • какие изменения пришли из шаблона;
  • какие конфликтные решения были сделаны в sync/*;
  • не попали ли в обновление лишние изменения приложения;
  • проходят ли проверки проекта.

Настройки merge

Для sync-PR/MR важно:

text
squash = off
-fast-forward merge = хорошо
-merge commit       = допустимо
-squash merge       = нельзя

Squash нельзя использовать, потому что он может уничтожить связь истории master с историей template. Особенно это критично после миграционного sync/bootstrap-template.

Проверки перед merge

Проверьте граф истории:

bash
git --no-pager log --oneline --graph --decorate --all --max-count=50

Проверьте итоговый diff:

bash
git --no-pager diff origin/master...sync/update-template-vX

Проверьте проект обычными командами конкретного приложения, например:

bash
npm run lint
-npm run build

После merge

После успешного merge в master можно удалить временную ветку:

bash
git branch -d sync/update-template-vX
-git push origin --delete sync/update-template-vX

Проверьте, что master теперь содержит обновление шаблона:

bash
git fetch origin
-git --no-pager log origin/template..origin/master --oneline
-git --no-pager diff origin/template...origin/master
- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/workflows/review-and-merge.md b/public/template-sync-strategy/workflows/review-and-merge.md deleted file mode 100644 index 4da4b1d..0000000 --- a/public/template-sync-strategy/workflows/review-and-merge.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -url: /template-sync-strategy/workflows/review-and-merge.md -description: Как проверять и вливать sync-ветку с обновлением шаблона в master приложения. ---- - -# Review и merge - -После подготовки `sync/*` ветки обновление шаблона должно попасть в `master` через PR/MR. - -## Создать PR/MR - -Параметры: - -```text -source: sync/update-template-vX -target: master -``` - -Цель review — увидеть: - -* какие изменения пришли из шаблона; -* какие конфликтные решения были сделаны в `sync/*`; -* не попали ли в обновление лишние изменения приложения; -* проходят ли проверки проекта. - -## Настройки merge - -Для sync-PR/MR важно: - -```text -squash = off -fast-forward merge = хорошо -merge commit = допустимо -squash merge = нельзя -``` - -Squash нельзя использовать, потому что он может уничтожить связь истории `master` с историей `template`. Особенно это критично после миграционного `sync/bootstrap-template`. - -## Проверки перед merge - -Проверьте граф истории: - -```bash -git --no-pager log --oneline --graph --decorate --all --max-count=50 -``` - -Проверьте итоговый diff: - -```bash -git --no-pager diff origin/master...sync/update-template-vX -``` - -Проверьте проект обычными командами конкретного приложения, например: - -```bash -npm run lint -npm run build -``` - -## После merge - -После успешного merge в `master` можно удалить временную ветку: - -```bash -git branch -d sync/update-template-vX -git push origin --delete sync/update-template-vX -``` - -Проверьте, что `master` теперь содержит обновление шаблона: - -```bash -git fetch origin -git --no-pager log origin/template..origin/master --oneline -git --no-pager diff origin/template...origin/master -``` diff --git a/public/template-sync-strategy/workflows/update-template.html b/public/template-sync-strategy/workflows/update-template.html deleted file mode 100644 index 2394a1a..0000000 --- a/public/template-sync-strategy/workflows/update-template.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Обычное обновление шаблона | Template Sync Strategy - - - - - - - - - - - - - - - -
Skip to content

Обычное обновление шаблона

Эта инструкция подходит после любого стартового сценария:

Целевой маршрут:

text
templates/master -> template -> sync/* -> master

1. Обновить слепок шаблона

В репозитории приложения:

bash
cd /path/to/app-repo
-git switch template
-git pull --ff-only
-git push

Этот вариант работает, если для ветки template настроено:

text
pull из templates/master
-push в origin/template

Явная форма без зависимости от tracking-настроек:

bash
git fetch templates
-git switch template
-git merge --ff-only templates/master
-git push origin template

Если --ff-only падает, значит template перестал быть чистым слепком шаблона. Остановитесь и разберите причину до продолжения.

Проверьте, что origin/template обновился до шаблона:

bash
git fetch origin
-git fetch templates
-git --no-pager log --oneline -1 origin/template
-git --no-pager log --oneline -1 templates/master

Оба коммита должны совпадать.

2. Создать ветку обновления приложения

После обновления template создайте временную ветку от текущего приложения:

bash
git fetch origin
-git switch -c sync/update-template-v2 origin/master
-git merge origin/template

Имя ветки можно менять под версию или дату:

text
sync/update-template-v2
-sync/update-template-2026-05-09
-sync/update-template-1.8.0

Проверьте, что временная ветка реально отличается от origin/master изменениями шаблона:

bash
git --no-pager diff --stat origin/master...HEAD

Если diff пустой, значит обновлённый origin/template не был влит в sync/* ветку или в шаблоне нет новых изменений.

3. Решить конфликты

Если есть конфликты, решайте их именно в sync/*.

После решения конфликтов:

bash
git add .
-git commit

Если конфликтов не было, Git сам создаст merge-коммит или выполнит fast-forward, в зависимости от истории.

4. Запушить sync-ветку

bash
git push -u origin sync/update-template-v2

Дальше откройте PR/MR:

text
source: sync/update-template-v2
-target: master

Правила merge описаны в Review и merge.

- - - - \ No newline at end of file diff --git a/public/template-sync-strategy/workflows/update-template.md b/public/template-sync-strategy/workflows/update-template.md deleted file mode 100644 index c69d9fe..0000000 --- a/public/template-sync-strategy/workflows/update-template.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -url: /template-sync-strategy/workflows/update-template.md -description: >- - Повторяемый процесс доставки изменений шаблона в приложение после первичной - настройки. ---- - -# Обычное обновление шаблона - -Эта инструкция подходит после любого стартового сценария: - -* [Новый проект от шаблона](../setup/clean-repository.md). -* [Миграция существующего master](../setup/existing-master-migration.md). - -Целевой маршрут: - -```text -templates/master -> template -> sync/* -> master -``` - -## 1. Обновить слепок шаблона - -В репозитории приложения: - -```bash -cd /path/to/app-repo -git switch template -git pull --ff-only -git push -``` - -Этот вариант работает, если для ветки `template` настроено: - -```text -pull из templates/master -push в origin/template -``` - -Явная форма без зависимости от tracking-настроек: - -```bash -git fetch templates -git switch template -git merge --ff-only templates/master -git push origin template -``` - -Если `--ff-only` падает, значит `template` перестал быть чистым слепком шаблона. Остановитесь и разберите причину до продолжения. - -Проверьте, что `origin/template` обновился до шаблона: - -```bash -git fetch origin -git fetch templates -git --no-pager log --oneline -1 origin/template -git --no-pager log --oneline -1 templates/master -``` - -Оба коммита должны совпадать. - -## 2. Создать ветку обновления приложения - -После обновления `template` создайте временную ветку от текущего приложения: - -```bash -git fetch origin -git switch -c sync/update-template-v2 origin/master -git merge origin/template -``` - -Имя ветки можно менять под версию или дату: - -```text -sync/update-template-v2 -sync/update-template-2026-05-09 -sync/update-template-1.8.0 -``` - -Проверьте, что временная ветка реально отличается от `origin/master` изменениями шаблона: - -```bash -git --no-pager diff --stat origin/master...HEAD -``` - -Если diff пустой, значит обновлённый `origin/template` не был влит в `sync/*` ветку или в шаблоне нет новых изменений. - -## 3. Решить конфликты - -Если есть конфликты, решайте их именно в `sync/*`. - -После решения конфликтов: - -```bash -git add . -git commit -``` - -Если конфликтов не было, Git сам создаст merge-коммит или выполнит fast-forward, в зависимости от истории. - -## 4. Запушить sync-ветку - -```bash -git push -u origin sync/update-template-v2 -``` - -Дальше откройте PR/MR: - -```text -source: sync/update-template-v2 -target: master -``` - -Правила merge описаны в [Review и merge](./review-and-merge.md).