[{"data":1,"prerenderedAt":2631},["ShallowReactive",2],{"duxt-navigation-docs-docs_pt":3,"i-lucide:puzzle":943,"i-lucide:search":948,"i-simple-icons:meilisearch":950,"docs-pt-BR-\u002Fadd-ons\u002Ftypesense":952,"duxt-preferred-missing-\u002Fadd-ons\u002Ftypesense":946,"i-lucide:rocket":2547,"i-lucide:compass":2549,"i-lucide:book-open":2551,"i-lucide:list":2553,"i-lucide:ruler":2555,"i-lucide:gavel":2557,"i-lucide:copy":2559,"i-lucide:chevron-down":2561,"i-lucide:thumbs-up":2563,"i-lucide:thumbs-down":2565,"i-lucide:star":2567,"i-lucide:circle-alert":2569,"i-simple-icons:discord":2571,"i-lucide:book-open-text":2573,"i-lucide:arrow-up-right":2575,"i-lucide:file-code-2":2577,"duxt-code-ts-export default defineNuxtConfig({\n  extends: ['@kirchdev\u002Fduxt', 'duxt-typesense']\n});\n":13,"i-lucide:info":2579,"i-lucide:lightbulb":2581,"duxt-code-ts-import { defineNuxtModule } from '@nuxt\u002Fkit';\nimport { Client } from 'typesense';\nimport type { DuxtSearchRecord } from '@kirchdev\u002Fduxt\u002Fsearch-records';\nimport { docs } from '..\u002Fserver\u002Ftypesense-schema';\n\nexport default defineNuxtModule({\n  meta: { name: 'typesense-sync' },\n  setup(_options, nuxt) {\n    const key = process.env.TYPESENSE_ADMIN_KEY;\n    \u002F\u002F Sem chave é um build local, não uma falha: pule em vez de quebrá-lo.\n    if (!key) return;\n\n    nuxt.hook('duxt:search:records', async (records) => {\n      const client = new Client({\n        nodes: [{ url: process.env.TYPESENSE_URL! }],\n        apiKey: key\n      });\n\n      await sync(client, records);\n    });\n  }\n});\n":13,"duxt-code-ts-async function sync(client: Client, records: readonly DuxtSearchRecord[]) {\n  const collection = client.collections(docs.name);\n\n  \u002F\u002F O Typesense não cria nada implicitamente: importar para uma coleção\n  \u002F\u002F que não existe falha de imediato, então o primeiro build a cria.\n  if (!(await collection.exists())) await client.collections().create(docs);\n\n  await collection.documents().import(\n    records.map((record) => ({ ...record })),\n    { action: 'upsert' }\n  );\n\n  \u002F\u002F Tudo o que o build não entregou já não está no site.\n  const kept = new Set(records.map((record) => record.id));\n  const live = await collection.documents().export();\n\n  const stale = live\n    .split('\\n')\n    .filter(Boolean)\n    .map((line) => JSON.parse(line).id as string)\n    .filter((id) => !kept.has(id));\n\n  \u002F\u002F Apague em lotes: cada id entra na string do filtro, e uma única\n  \u002F\u002F renomeação grande construiria um que o Typesense rejeita.\n  for (let index = 0; index \u003C stale.length; index += 100) {\n    const batch = stale.slice(index, index + 100).join(',');\n    await collection.documents().delete({ filter_by: `id:[${batch}]` });\n  }\n}\n":13,"duxt-code-ts-\u002F\u002F `locale` é o idioma do CONTEÚDO, não o idioma da interface.\n\u002F\u002F `version` não existe numa fonte sem versões: a cláusula só entra quando\n\u002F\u002F há uma; fixa, filtraria por `undefined`.\nconst filters = [`locale:${locale}`];\nif (version) filters.push(`version:${version}`);\n\nconst results = await client.collections('docs').documents().search({\n  q: query,\n  query_by: 'title,content',\n  filter_by: filters.join(' && ')\n});\n":13,"i-lucide:arrow-left":2583,"i-lucide:arrow-right":2585,"i-lucide:chevron-right":2587,"duxt-version-missing-\u002Fadd-ons\u002Ftypesense":2589,"i-lucide:menu":2598,"i-lucide:keyboard":2600,"i-simple-icons:github":2602,"i-lucide:moon":2604,"package-managers-add @kirchdev\u002Fduxt-typesense":2606,"i-vscode-icons:file-type-light-pnpm":2611,"i-vscode-icons:file-type-pnpm":2614,"i-vscode-icons:file-type-npm":2616,"i-vscode-icons:file-type-yarn":2618,"i-vscode-icons:file-type-bun":2620,"duxt-code-ts-export default defineNuxtConfig({\n  extends: ['@kirchdev\u002Fduxt', '@kirchdev\u002Fduxt-typesense'],\n  duxtTypesense: {\n    endpoint: process.env.TYPESENSE_ENDPOINT,\n    collection: 'docs',\n    adminKey: process.env.TYPESENSE_ADMIN_KEY,\n    searchKey: process.env.TYPESENSE_SEARCH_KEY\n  }\n})\n":13,"package-managers-add -D typesense":2622,"duxt-code-ts-import type { CollectionCreateSchema } from 'typesense';\n\nexport const docs: CollectionCreateSchema = {\n  name: 'docs',\n  fields: [\n    { name: 'url', type: 'string' },\n    { name: 'title', type: 'string' },\n    { name: 'content', type: 'string' },\n    { name: 'source', type: 'string', facet: true },\n    { name: 'version', type: 'string', facet: true, optional: true },\n    { name: 'locale', type: 'string', facet: true }\n  ]\n};\n":13,"i-flag:br-4x3":2627},[4,31,111,183,827,846,854,879],{"title":5,"path":6,"stem":7,"children":8,"description":12},"Introdução","\u002Fgetting-started","1.getting-started",[9,14,20,26],{"title":5,"path":6,"stem":10,"icon":11,"description":12,"subcategory":13},"1.getting-started\u002Findex","lucide:rocket","O que é o duxt, e o que chega com uma única linha de configuração.",null,{"title":15,"path":16,"stem":17,"icon":18,"description":19,"subcategory":13},"Instalação","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","lucide:download","Adicione a camada, estenda-a, escreva Markdown.",{"title":21,"path":22,"stem":23,"icon":24,"description":25,"subcategory":13},"Configuração","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F2.configuration","lucide:settings","Um ficheiro configura o site inteiro — o que lhe pertence e como é combinado.",{"title":27,"path":28,"stem":29,"icon":11,"description":30,"subcategory":13},"Começar com o starter","\u002Fgetting-started\u002Ffrom-starter","1.getting-started\u002F3.from-starter","Cria com o Nuxi um site de documentação duxt pronto a executar.",{"title":32,"path":33,"stem":34,"children":35,"description":39},"Conceitos","\u002Fconcepts","2.concepts",[36,40,46,52,58,64,70,76,81,87,93,99,105],{"title":32,"path":33,"stem":37,"icon":38,"description":39,"subcategory":13},"2.concepts\u002Findex","lucide:compass","Como a camada funciona — o modelo de fontes, o esquema de URL, as coleções e as verificações.",{"title":41,"path":42,"stem":43,"icon":44,"description":45,"subcategory":13},"Camadas e substituição","\u002Fconcepts\u002Flayers","2.concepts\u002F1.layers","lucide:layers","O que uma camada Nuxt te dá, o que te tira, e que caminhos não resolvem como se leem.",{"title":47,"path":48,"stem":49,"icon":50,"description":51,"subcategory":13},"Tematização","\u002Fconcepts\u002Ftheming","2.concepts\u002F10.theming","lucide:palette","Como o tema está montado — componentes próprios, uma camada de tokens e um modo escuro que comuta por classe.",{"title":53,"path":54,"stem":55,"icon":56,"description":57,"subcategory":13},"Bases de dados","\u002Fconcepts\u002Fdatabases","2.concepts\u002F11.databases","lucide:database","Em que adaptadores de base de dados do Content um site duxt pode ser implementado, quais foram verificados e a única regra que mantém a camada fora do caminho.",{"title":59,"path":60,"stem":61,"icon":62,"description":63,"subcategory":13},"Atalhos de teclado","\u002Fconcepts\u002Fkeyboard-shortcuts","2.concepts\u002F12.keyboard-shortcuts","lucide:keyboard","As quatro teclas que o tema vincula, onde cada uma se aplica e onde quem lê fica a saber.",{"title":65,"path":66,"stem":67,"icon":68,"description":69,"subcategory":13},"Fontes","\u002Fconcepts\u002Fsources","2.concepts\u002F2.sources","lucide:git-branch","Uma lista de fontes torna-se cada coleção, prefixo e versão que o site serve.",{"title":71,"path":72,"stem":73,"icon":74,"description":75,"subcategory":13},"URL e versões","\u002Fconcepts\u002Furls-and-versions","2.concepts\u002F3.urls-and-versions","lucide:git-compare","Como aparecem os segmentos de repositório e versão, e o que é dito a quem lê uma versão antiga.",{"title":77,"path":78,"stem":79,"icon":56,"description":80,"subcategory":13},"Coleções","\u002Fconcepts\u002Fcollections","2.concepts\u002F4.collections","O que o Content constrói a partir das fontes, e as quatro coisas que o esquema acrescenta.",{"title":82,"path":83,"stem":84,"icon":85,"description":86,"subcategory":13},"Secções geradas","\u002Fconcepts\u002Fgenerated-sections","2.concepts\u002F5.generated-sections","lucide:file-cog","Um artefacto mais um tipo, publicados como páginas — o que é o registo, e as duas políticas que um tipo responde.",{"title":88,"path":89,"stem":90,"icon":91,"description":92,"subcategory":13},"O que a compilação verifica","\u002Fconcepts\u002Fbuild-checks","2.concepts\u002F6.build-checks","lucide:shield-check","As falhas silenciosas que esta camada teve, transformadas em mensagens.",{"title":94,"path":95,"stem":96,"icon":97,"description":98,"subcategory":13},"Leitores automáticos","\u002Fconcepts\u002Fmachine-readers","2.concepts\u002F7.machine-readers","lucide:bot","O que um modelo recebe — llms.txt, o Markdown em bruto de qualquer página e um verdadeiro servidor MCP.",{"title":100,"path":101,"stem":102,"icon":103,"description":104,"subcategory":13},"SEO","\u002Fconcepts\u002Fseo","2.concepts\u002F8.seo","lucide:search","O que cada página emite para rastreadores e cartões sociais, que módulo o escreve, e o único valor que a camada não consegue adivinhar.",{"title":106,"path":107,"stem":108,"icon":109,"description":110,"subcategory":13},"Localização","\u002Fconcepts\u002Flocalisation","2.concepts\u002F9.localisation","lucide:languages","A camada traz sete locales, e cada texto configurado assume três formas.",{"title":112,"path":113,"stem":114,"children":115,"description":119},"Guias","\u002Fguides","3.guides",[116,120,126,132,138,143,148,153,159,165,171,177],{"title":112,"path":113,"stem":117,"icon":118,"description":119,"subcategory":13},"3.guides\u002Findex","lucide:book-open","Uma tarefa por página, do início ao fim — vários repositórios, várias versões, vários idiomas e uma implementação.",{"title":121,"path":122,"stem":123,"icon":124,"description":125,"subcategory":13},"Vários repositórios","\u002Fguides\u002Fseveral-repositories","3.guides\u002F1.several-repositories","lucide:folder-git","Servir a documentação de vários projetos a partir de um só site.",{"title":127,"path":128,"stem":129,"icon":130,"description":131,"subcategory":13},"Publicar documentação de um provider Terraform","\u002Fguides\u002Fpublish-terraform-provider-docs","3.guides\u002F10.publish-terraform-provider-docs","simple-icons:terraform","Transformar uma árvore Markdown do tfplugindocs numa referência versionada com navegação própria do provider.",{"title":133,"path":134,"stem":135,"icon":136,"description":137,"subcategory":13},"Guardar fontes remotas e imagens OG em cache","\u002Fguides\u002Fcache-build-work","3.guides\u002F11.cache-build-work","lucide:database-zap","Reutilizar downloads de repositórios públicos e cartões sociais renderizados entre builds de CI.",{"title":139,"path":140,"stem":141,"icon":74,"description":142,"subcategory":13},"Várias versões","\u002Fguides\u002Fseveral-versions","3.guides\u002F2.several-versions","Servir a mesma documentação em várias refs, com seletor e aviso.",{"title":144,"path":145,"stem":146,"icon":109,"description":147,"subcategory":13},"Vários idiomas","\u002Fguides\u002Fseveral-languages","3.guides\u002F3.several-languages","Servir a interface em vários idiomas, e traduzir também as páginas.",{"title":149,"path":150,"stem":151,"icon":50,"description":152,"subcategory":13},"Substituir o tema","\u002Fguides\u002Foverride-the-theme","3.guides\u002F4.override-the-theme","Mudar uma cor, substituir um componente, acrescentar uma primitiva shadcn-vue.",{"title":154,"path":155,"stem":156,"icon":157,"description":158,"subcategory":13},"Mover uma página","\u002Fguides\u002Fmove-a-page","3.guides\u002F5.move-a-page","lucide:signpost","redirectFrom no frontmatter, transformado em regras de rota sob todos os prefixos.",{"title":160,"path":161,"stem":162,"icon":163,"description":164,"subcategory":13},"Implementar um site","\u002Fguides\u002Fdeploy-a-site","3.guides\u002F6.deploy-a-site","lucide:cloud-upload","Onde um site duxt pode correr, do que precisa lá, e porque o conteúdo não é atualizado em execução.",{"title":166,"path":167,"stem":168,"icon":169,"description":170,"subcategory":13},"Recolher opiniões da página","\u002Fguides\u002Fcollect-page-feedback","3.guides\u002F7.collect-page-feedback","lucide:thumbs-up","Envolve o DuxtPageFeedback e guarda a resposta onde a tua analítica já vive.",{"title":172,"path":173,"stem":174,"icon":175,"description":176,"subcategory":13},"Dá identidade ao teu site","\u002Fguides\u002Fbrand-your-site","3.guides\u002F8.brand-your-site","lucide:badge-check","Define o nome, o logótipo e os ícones, para que o site se leia como teu e não como o da camada.",{"title":178,"path":179,"stem":180,"icon":181,"description":182,"subcategory":13},"Enviar eventos de analítica","\u002Fguides\u002Fsend-analytics-events","3.guides\u002F9.send-analytics-events","lucide:chart-line","Um callback, cinco eventos, nenhum fornecedor — liga as interações dos leitores do duxt à analítica que já tens a correr.",{"title":184,"path":185,"stem":186,"children":187,"description":191},"Referência","\u002Freference","4.reference",[188,192,196,228,258,264,268,273,413,570,696,741,802],{"title":184,"path":185,"stem":189,"icon":190,"description":191,"subcategory":13},"4.reference\u002Findex","lucide:list","A superfície pública da camada — chaves de configuração, frontmatter, componentes, composables e endpoints.",{"title":21,"path":193,"stem":194,"icon":24,"description":195,"subcategory":13},"\u002Freference\u002Fconfiguration","4.reference\u002F1.configuration","Cada chave sob duxt em app.config.ts — o que controla e quando é lida.",{"title":197,"path":198,"stem":199,"children":200,"icon":202,"description":203,"subcategory":13},"Registo de alterações","\u002Freference\u002Fchangelog","4.reference\u002F10.changelog\u002Findex",[201,204,210,216,222],{"title":197,"path":198,"stem":199,"icon":202,"description":203,"subcategory":13},"lucide:tag","Um registo de versões, publicado como páginas — uma cronologia, uma página por versão, e um feed.",{"title":205,"path":206,"stem":207,"icon":208,"description":209,"subcategory":13},"Declarar a secção","\u002Freference\u002Fchangelog\u002Fsection","4.reference\u002F10.changelog\u002F1.section","lucide:file-clock","O tipo de secção `changelog` — onde vive o ficheiro, e as duas políticas que responde.",{"title":211,"path":212,"stem":213,"icon":214,"description":215,"subcategory":13},"Granularidade","\u002Freference\u002Fchangelog\u002Fgranularity","4.reference\u002F10.changelog\u002F2.granularity","lucide:split","Uma página por versão, ou o ficheiro como a única página que foi escrito.",{"title":217,"path":218,"stem":219,"icon":220,"description":221,"subcategory":13},"O que é lido","\u002Freference\u002Fchangelog\u002Fwhat-is-read","4.reference\u002F10.changelog\u002F3.what-is-read","lucide:scan-text","Que títulos passam a versões, quais a grupos, e o que acontece ao resto.",{"title":223,"path":224,"stem":225,"icon":226,"description":227,"subcategory":13},"Esquema e componentes","\u002Freference\u002Fchangelog\u002Fcomponents","4.reference\u002F10.changelog\u002F4.components","lucide:box","O esquema em que um histórico dividido renderiza, e os dois componentes MDC de que as suas páginas são feitas.",{"title":229,"path":230,"stem":231,"children":232,"icon":234,"description":235,"subcategory":13},"Coleções Bruno","\u002Freference\u002Fbruno","4.reference\u002F11.bruno\u002Findex",[233,236,241,247,253],{"title":229,"path":230,"stem":231,"icon":234,"description":235,"subcategory":13},"lucide:send","Uma coleção Bruno publicada como referência centrada em pedidos, com um arquivo descarregável.",{"title":205,"path":237,"stem":238,"icon":239,"description":240,"subcategory":13},"\u002Freference\u002Fbruno\u002Fsection","4.reference\u002F11.bruno\u002F1.section","lucide:file-code","Onde vive uma coleção Bruno, que páginas produz e que opções aceita.",{"title":242,"path":243,"stem":244,"icon":245,"description":246,"subcategory":13},"O que é publicado","\u002Freference\u002Fbruno\u002Fwhat-is-published","4.reference\u002F11.bruno\u002F2.what-is-published","lucide:shield","Environments, credenciais, scripts e testes nunca chegam a uma página.",{"title":248,"path":249,"stem":250,"icon":251,"description":252,"subcategory":13},"O cliente de pedidos","\u002Freference\u002Fbruno\u002Ftry-it","4.reference\u002F11.bruno\u002F3.try-it","lucide:send-horizontal","Desligado por omissão e dirigido apenas a destinos declarados públicos.",{"title":254,"path":255,"stem":256,"icon":18,"description":257,"subcategory":13},"Obter a coleção","\u002Freference\u002Fbruno\u002Fgetting-the-collection","4.reference\u002F11.bruno\u002F4.getting-the-collection","O arquivo está ligado à versão e idioma visíveis; a ligação Bruno não.",{"title":259,"path":260,"stem":261,"icon":262,"description":263,"subcategory":13},"Hooks","\u002Freference\u002Fhooks","4.reference\u002F12.hooks","lucide:plug","O único hook de build que o duxt emite, o que ele entrega e por que existe apenas um.",{"title":65,"path":265,"stem":266,"icon":68,"description":267,"subcategory":13},"\u002Freference\u002Fsources","4.reference\u002F2.sources","Os campos de uma entrada de fonte, as suas refs, e as opções que moldam os URL.",{"title":269,"path":270,"stem":271,"icon":239,"description":272,"subcategory":13},"Frontmatter","\u002Freference\u002Ffrontmatter","4.reference\u002F3.frontmatter","Os campos que uma página pode ter além do título e da descrição, e os dois que a compilação preenche.",{"title":274,"path":275,"stem":276,"children":277,"icon":279,"description":280,"subcategory":13},"Componentes MDC","\u002Freference\u002Fmdc-components","4.reference\u002F4.mdc-components\u002Findex",[278,281,287,293,299,305,311,317,323,329,367,373,378,384,390,396,402,408],{"title":274,"path":275,"stem":276,"icon":279,"description":280,"subcategory":13},"lucide:blocks","Os blocos que uma página Markdown pode invocar, uma página cada, com as suas props.",{"title":282,"path":283,"stem":284,"icon":285,"description":286,"subcategory":13},"Callout","\u002Freference\u002Fmdc-components\u002Fcallout","4.reference\u002F4.mdc-components\u002F1.callout","lucide:message-square-warning","Um aparte em que o leitor deve parar — uma dica, um aviso, um perigo.",{"title":288,"path":289,"stem":290,"icon":291,"description":292,"subcategory":13},"Gestores de pacotes","\u002Freference\u002Fmdc-components\u002Fpackage-managers","4.reference\u002F4.mdc-components\u002F10.package-managers","lucide:package","Um comando, um separador por gestor de pacotes, memorizado de página em página.",{"title":294,"path":295,"stem":296,"icon":297,"description":298,"subcategory":13},"Árvore de ficheiros","\u002Freference\u002Fmdc-components\u002Ffile-tree","4.reference\u002F4.mdc-components\u002F11.file-tree","lucide:folder-tree","Uma estrutura de pastas, com ícones por tipo de ficheiro.",{"title":300,"path":301,"stem":302,"icon":303,"description":304,"subcategory":13},"Pré-visualização","\u002Freference\u002Fmdc-components\u002Fpreview","4.reference\u002F4.mdc-components\u002F12.preview","lucide:eye","Um componente desenhado tal como a página o desenha, com o seu código-fonte ao lado.",{"title":306,"path":307,"stem":308,"icon":309,"description":310,"subcategory":13},"Cartões de página","\u002Freference\u002Fmdc-components\u002Fpage-cards","4.reference\u002F4.mdc-components\u002F13.page-cards","lucide:layout-grid","Os filhos de uma secção, como cartões.",{"title":312,"path":313,"stem":314,"icon":315,"description":316,"subcategory":13},"Partial","\u002Freference\u002Fmdc-components\u002Fpartial","4.reference\u002F4.mdc-components\u002F14.partial","lucide:puzzle","Um bloco escrito uma vez e apresentado em todas as fontes que dele precisam.",{"title":318,"path":319,"stem":320,"icon":321,"description":322,"subcategory":13},"Since","\u002Freference\u002Fmdc-components\u002Fsince","4.reference\u002F4.mdc-components\u002F15.since","lucide:milestone","A versão em que algo apareceu, ao lado de um cabeçalho.",{"title":324,"path":325,"stem":326,"icon":327,"description":328,"subcategory":13},"Mermaid","\u002Freference\u002Fmdc-components\u002Fmermaid","4.reference\u002F4.mdc-components\u002F16.mermaid","lucide:workflow","Um diagrama a partir de um bloco de código ou de uma prop.",{"title":330,"path":331,"stem":332,"children":333,"icon":335,"description":336,"subcategory":13},"Substituições de prosa","\u002Freference\u002Fmdc-components\u002Fprose","4.reference\u002F4.mdc-components\u002F17.prose\u002Findex",[334,337,343,349,355,361],{"title":330,"path":331,"stem":332,"icon":335,"description":336,"subcategory":13},"lucide:type","O que a camada muda no Markdown simples — ligações, cabeçalhos, imagens, código e tabelas.",{"title":338,"path":339,"stem":340,"icon":341,"description":342,"subcategory":13},"ProseA","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-a","4.reference\u002F4.mdc-components\u002F17.prose\u002F1.prose-a","lucide:link","Uma ligação, resolvida em função da fonte em que foi escrita.",{"title":344,"path":345,"stem":346,"icon":347,"description":348,"subcategory":13},"ProseH2, ProseH3, ProseH4","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-headings","4.reference\u002F4.mdc-components\u002F17.prose\u002F2.prose-headings","lucide:heading","Cabeçalhos, cada um com a sua âncora permanente.",{"title":350,"path":351,"stem":352,"icon":353,"description":354,"subcategory":13},"ProseImg","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-img","4.reference\u002F4.mdc-components\u002F17.prose\u002F3.prose-img","lucide:image","Uma imagem: consciente do tema, adaptável e ampliável.",{"title":356,"path":357,"stem":358,"icon":359,"description":360,"subcategory":13},"ProsePre","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-pre","4.reference\u002F4.mdc-components\u002F17.prose\u002F4.prose-pre","lucide:terminal","O bloco de código: nome do ficheiro, ícone da linguagem, botão de copiar.",{"title":362,"path":363,"stem":364,"icon":365,"description":366,"subcategory":13},"ProseTable","\u002Freference\u002Fmdc-components\u002Fprose\u002Fprose-table","4.reference\u002F4.mdc-components\u002F17.prose\u002F5.prose-table","lucide:table","Uma tabela que se desloca em vez da página.",{"title":368,"path":369,"stem":370,"icon":371,"description":372,"subcategory":13},"Passos","\u002Freference\u002Fmdc-components\u002Fsteps","4.reference\u002F4.mdc-components\u002F2.steps","lucide:list-ordered","Uma lista ordenada desenhada como passos numerados sobre uma calha.",{"title":374,"path":375,"stem":376,"icon":239,"description":377,"subcategory":13},"Grupo de código","\u002Freference\u002Fmdc-components\u002Fcode-group","4.reference\u002F4.mdc-components\u002F3.code-group","Vários blocos de código como um só bloco com separadores, rotulados pelo nome do ficheiro.",{"title":379,"path":380,"stem":381,"icon":382,"description":383,"subcategory":13},"Grupo de separadores","\u002Freference\u002Fmdc-components\u002Ftab-group","4.reference\u002F4.mdc-components\u002F4.tab-group","lucide:panels-top-left","Separadores para tudo o que não seja código.",{"title":385,"path":386,"stem":387,"icon":388,"description":389,"subcategory":13},"Tab","\u002Freference\u002Fmdc-components\u002Ftab","4.reference\u002F4.mdc-components\u002F5.tab","lucide:square","Um painel de um grupo de separadores.",{"title":391,"path":392,"stem":393,"icon":394,"description":395,"subcategory":13},"Accordion","\u002Freference\u002Fmdc-components\u002Faccordion","4.reference\u002F4.mdc-components\u002F6.accordion","lucide:chevrons-up-down","Secções recolhíveis — um FAQ, ou respostas que o leitor escolhe.",{"title":397,"path":398,"stem":399,"icon":400,"description":401,"subcategory":13},"Item de accordion","\u002Freference\u002Fmdc-components\u002Faccordion-item","4.reference\u002F4.mdc-components\u002F7.accordion-item","lucide:chevron-down","Uma secção recolhível.",{"title":403,"path":404,"stem":405,"icon":406,"description":407,"subcategory":13},"Grupo de campos","\u002Freference\u002Fmdc-components\u002Ffield-group","4.reference\u002F4.mdc-components\u002F8.field-group","lucide:list-tree","Uma lista de campos como um só bloco.",{"title":409,"path":410,"stem":411,"icon":202,"description":412,"subcategory":13},"Campo","\u002Freference\u002Fmdc-components\u002Ffield","4.reference\u002F4.mdc-components\u002F9.field","Um parâmetro, propriedade ou opção, com o seu tipo e valor por omissão.",{"title":414,"path":415,"stem":416,"children":417,"icon":419,"description":420,"subcategory":13},"Componentes","\u002Freference\u002Fcomponents","4.reference\u002F5.components\u002Findex",[418,421,447,488,539],{"title":414,"path":415,"stem":416,"icon":419,"description":420,"subcategory":13},"lucide:component","Os componentes da própria camada, uma página cada — para que serve cada um e o que recebe.",{"title":422,"path":423,"stem":424,"children":425,"icon":427,"description":428,"subcategory":13},"Layout","\u002Freference\u002Fcomponents\u002Flayout","4.reference\u002F5.components\u002F1.layout\u002Findex",[426,429,435,441],{"title":422,"path":423,"stem":424,"icon":427,"description":428,"subcategory":13},"lucide:layout-panel-top","Os dois componentes que emolduram uma página — a barra de navegação e o rodapé.",{"title":430,"path":431,"stem":432,"icon":433,"description":434,"subcategory":13},"DuxtHeader","\u002Freference\u002Fcomponents\u002Flayout\u002Fduxt-header","4.reference\u002F5.components\u002F1.layout\u002F1.duxt-header","lucide:panel-top","A barra de navegação: título, navegação, pesquisa e as ligações de ícone.",{"title":436,"path":437,"stem":438,"icon":439,"description":440,"subcategory":13},"DuxtFooter","\u002Freference\u002Fcomponents\u002Flayout\u002Fduxt-footer","4.reference\u002F5.components\u002F1.layout\u002F2.duxt-footer","lucide:panel-bottom","O rodapé: o nome do site, as suas ligações legais e a linha da própria camada.",{"title":442,"path":443,"stem":444,"icon":445,"description":446,"subcategory":13},"DuxtAnnouncements","\u002Freference\u002Fcomponents\u002Flayout\u002Fduxt-announcements","4.reference\u002F5.components\u002F1.layout\u002F3.duxt-announcements","lucide:megaphone","Avisos do próprio site, desenhados por posição apenas quando existe algo a anunciar.",{"title":448,"path":449,"stem":450,"children":451,"icon":38,"description":453,"subcategory":13},"Navegação","\u002Freference\u002Fcomponents\u002Fnavigation","4.reference\u002F5.components\u002F2.navigation\u002Findex",[452,454,460,465,471,477,482],{"title":448,"path":449,"stem":450,"icon":38,"description":453,"subcategory":13},"Circular pela documentação — a linha de secções, a barra lateral, o trilho, o índice e anterior\u002Fseguinte.",{"title":455,"path":456,"stem":457,"icon":458,"description":459,"subcategory":13},"DuxtSections","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-sections","4.reference\u002F5.components\u002F2.navigation\u002F1.duxt-sections","lucide:rows-3","A segunda linha da barra de navegação — as partes de topo da documentação.",{"title":461,"path":462,"stem":463,"icon":406,"description":464,"subcategory":13},"DuxtNavigation","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-navigation","4.reference\u002F5.components\u002F2.navigation\u002F2.duxt-navigation","A árvore da barra lateral.",{"title":466,"path":467,"stem":468,"icon":469,"description":470,"subcategory":13},"DuxtNavigationLink","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-navigation-link","4.reference\u002F5.components\u002F2.navigation\u002F3.duxt-navigation-link","lucide:link-2","Uma entrada da barra lateral.",{"title":472,"path":473,"stem":474,"icon":475,"description":476,"subcategory":13},"DuxtBreadcrumb","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-breadcrumb","4.reference\u002F5.components\u002F2.navigation\u002F4.duxt-breadcrumb","lucide:chevrons-right","O trilho por cima do título da página.",{"title":478,"path":479,"stem":480,"icon":190,"description":481,"subcategory":13},"DuxtToc","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-toc","4.reference\u002F5.components\u002F2.navigation\u002F5.duxt-toc","O índice, e o aside por baixo dele.",{"title":483,"path":484,"stem":485,"icon":486,"description":487,"subcategory":13},"DuxtPageNav","\u002Freference\u002Fcomponents\u002Fnavigation\u002Fduxt-page-nav","4.reference\u002F5.components\u002F2.navigation\u002F6.duxt-page-nav","lucide:arrow-left-right","Anterior e seguinte, limitados pela secção.",{"title":489,"path":490,"stem":491,"children":492,"icon":494,"description":495,"subcategory":13},"Controlos","\u002Freference\u002Fcomponents\u002Fcontrols","4.reference\u002F5.components\u002F3.controls\u002Findex",[493,496,501,506,512,517,523,528,534],{"title":489,"path":490,"stem":491,"icon":494,"description":495,"subcategory":13},"lucide:sliders-horizontal","O que o leitor opera — a pesquisa, os seletores, a folha de atalhos e dois indicadores.",{"title":497,"path":498,"stem":499,"icon":103,"description":500,"subcategory":13},"DuxtSearch","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-search","4.reference\u002F5.components\u002F3.controls\u002F1.duxt-search","Pesquisa cada fonte ativa e intercala os seus resultados ordenados localmente.",{"title":502,"path":503,"stem":504,"icon":44,"description":505,"subcategory":13},"DuxtVersion","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-version","4.reference\u002F5.components\u002F3.controls\u002F2.duxt-version","O distintivo de versão, e o seletor quando há mais do que uma.",{"title":507,"path":508,"stem":509,"icon":510,"description":511,"subcategory":13},"DuxtVersionBanner","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-version-banner","4.reference\u002F5.components\u002F3.controls\u002F3.duxt-version-banner","lucide:triangle-alert","A barra que diz ao leitor que esta versão não é a atual.",{"title":513,"path":514,"stem":515,"icon":109,"description":516,"subcategory":13},"DuxtLocale","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-locale","4.reference\u002F5.components\u002F3.controls\u002F4.duxt-locale","O seletor de idioma.",{"title":518,"path":519,"stem":520,"icon":521,"description":522,"subcategory":13},"DuxtProgress","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-progress","4.reference\u002F5.components\u002F3.controls\u002F5.duxt-progress","lucide:loader","Até onde o leitor já desceu na página.",{"title":524,"path":525,"stem":526,"icon":62,"description":527,"subcategory":13},"DuxtShortcuts","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-shortcuts","4.reference\u002F5.components\u002F3.controls\u002F6.duxt-shortcuts","A folha de atalhos de teclado, na tecla ?.",{"title":529,"path":530,"stem":531,"icon":532,"description":533,"subcategory":13},"DuxtSkipLink","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-skip-link","4.reference\u002F5.components\u002F3.controls\u002F7.duxt-skip-link","lucide:skip-forward","O primeiro elemento focável da página.",{"title":535,"path":536,"stem":537,"icon":62,"description":538,"subcategory":13},"DuxtShortcutsTrigger","\u002Freference\u002Fcomponents\u002Fcontrols\u002Fduxt-shortcuts-trigger","4.reference\u002F5.components\u002F3.controls\u002F8.duxt-shortcuts-trigger","O botão que abre a folha de atalhos.",{"title":540,"path":541,"stem":542,"children":543,"icon":545,"description":546,"subcategory":13},"Página","\u002Freference\u002Fcomponents\u002Fpage","4.reference\u002F5.components\u002F4.page\u002Findex",[544,547,553,559,564],{"title":540,"path":541,"stem":542,"icon":545,"description":546,"subcategory":13},"lucide:file-text","Os componentes que pertencem à própria página.",{"title":548,"path":549,"stem":550,"icon":551,"description":552,"subcategory":13},"DuxtPageInfo","\u002Freference\u002Fcomponents\u002Fpage\u002Fduxt-page-info","4.reference\u002F5.components\u002F4.page\u002F1.duxt-page-info","lucide:git-commit-horizontal","De onde veio a página: ligação de edição, última atualização, contribuidores.",{"title":554,"path":555,"stem":556,"icon":557,"description":558,"subcategory":13},"DuxtCopyPage","\u002Freference\u002Fcomponents\u002Fpage\u002Fduxt-copy-page","4.reference\u002F5.components\u002F4.page\u002F2.duxt-copy-page","lucide:clipboard-copy","Entrega esta página a um modelo, ou lê o seu código-fonte.",{"title":560,"path":561,"stem":562,"icon":169,"description":563,"subcategory":13},"DuxtPageFeedback","\u002Freference\u002Fcomponents\u002Fpage\u002Fduxt-page-feedback","4.reference\u002F5.components\u002F4.page\u002F3.duxt-page-feedback","«Esta página foi útil?» — um evento, e sem backend.",{"title":565,"path":566,"stem":567,"icon":568,"description":569,"subcategory":13},"DuxtCodeBlock","\u002Freference\u002Fcomponents\u002Fpage\u002Fduxt-code-block","4.reference\u002F5.components\u002F4.page\u002F4.duxt-code-block","lucide:code","O cartão à volta de um bloco de código.",{"title":571,"path":572,"stem":573,"children":574,"icon":576,"description":577,"subcategory":13},"Composables","\u002Freference\u002Fcomposables","4.reference\u002F6.composables\u002Findex",[575,578,612,641],{"title":571,"path":572,"stem":573,"icon":576,"description":577,"subcategory":13},"lucide:function-square","As funções que a camada expõe aos teus próprios componentes, uma página cada.",{"title":579,"path":580,"stem":581,"children":582,"icon":56,"description":584,"subcategory":13},"Configuração e conteúdo","\u002Freference\u002Fcomposables\u002Fconfig-and-content","4.reference\u002F6.composables\u002F1.config-and-content\u002Findex",[583,585,590,596,601,607],{"title":579,"path":580,"stem":581,"icon":56,"description":584,"subcategory":13},"A configuração fundida, e que coleção serve a página que está a ser lida.",{"title":586,"path":587,"stem":588,"icon":24,"description":589,"subcategory":13},"useDuxtConfig()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-config","4.reference\u002F6.composables\u002F1.config-and-content\u002F1.use-duxt-config","A configuração fundida, com todos os campos de texto já resolvidos.",{"title":591,"path":592,"stem":593,"icon":594,"description":595,"subcategory":13},"useDuxtCollection()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-collection","4.reference\u002F6.composables\u002F1.config-and-content\u002F2.use-duxt-collection","lucide:library","Que coleção serve esta rota.",{"title":597,"path":598,"stem":599,"icon":406,"description":600,"subcategory":13},"useDuxtNavigation()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-navigation","4.reference\u002F6.composables\u002F1.config-and-content\u002F3.use-duxt-navigation","A árvore de navegação da coleção que serve esta rota.",{"title":602,"path":603,"stem":604,"icon":605,"description":606,"subcategory":13},"useDuxtSection()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-section","4.reference\u002F6.composables\u002F1.config-and-content\u002F4.use-duxt-section","lucide:folder-open","A parte da documentação em que esta página está.",{"title":608,"path":609,"stem":610,"icon":475,"description":611,"subcategory":13},"useDuxtBreadcrumb()","\u002Freference\u002Fcomposables\u002Fconfig-and-content\u002Fuse-duxt-breadcrumb","4.reference\u002F6.composables\u002F1.config-and-content\u002F5.use-duxt-breadcrumb","O trilho da secção até uma página.",{"title":613,"path":614,"stem":615,"children":616,"icon":618,"description":619,"subcategory":13},"Caminhos e versões","\u002Freference\u002Fcomposables\u002Fpaths-and-versions","4.reference\u002F6.composables\u002F2.paths-and-versions\u002Findex",[617,620,625,630,635],{"title":613,"path":614,"stem":615,"icon":618,"description":619,"subcategory":13},"lucide:route","Ler um URL, escrever outro de volta, e saber que versão está a ser lida.",{"title":621,"path":622,"stem":623,"icon":321,"description":624,"subcategory":13},"useDuxtPath()","\u002Freference\u002Fcomposables\u002Fpaths-and-versions\u002Fuse-duxt-path","4.reference\u002F6.composables\u002F2.paths-and-versions\u002F1.use-duxt-path","O caminho em que a documentação está, com o locale retirado.",{"title":626,"path":627,"stem":628,"icon":341,"description":629,"subcategory":13},"useDuxtLink()","\u002Freference\u002Fcomposables\u002Fpaths-and-versions\u002Fuse-duxt-link","4.reference\u002F6.composables\u002F2.paths-and-versions\u002F2.use-duxt-link","Um caminho de documentação, reescrito como ligação.",{"title":631,"path":632,"stem":633,"icon":44,"description":634,"subcategory":13},"useDuxtVersion()","\u002Freference\u002Fcomposables\u002Fpaths-and-versions\u002Fuse-duxt-version","4.reference\u002F6.composables\u002F2.paths-and-versions\u002F3.use-duxt-version","O que o seletor mostra, o que o aviso diz, se se deve indexar.",{"title":636,"path":637,"stem":638,"icon":639,"description":640,"subcategory":13},"useDuxtSiteUrl()","\u002Freference\u002Fcomposables\u002Fpaths-and-versions\u002Fuse-duxt-site-url","4.reference\u002F6.composables\u002F2.paths-and-versions\u002F4.use-duxt-site-url","lucide:globe","A origem configurada, e caminhos tornados absolutos.",{"title":642,"path":643,"stem":644,"children":645,"icon":118,"description":647,"subcategory":13},"Experiência de leitura","\u002Freference\u002Fcomposables\u002Freading","4.reference\u002F6.composables\u002F3.reading\u002Findex",[646,648,652,658,663,669,675,680,686,691],{"title":642,"path":643,"stem":644,"icon":118,"description":647,"subcategory":13},"Pesquisa, cabeçalhos, foco, histórico e as escolhas que um leitor faz.",{"title":649,"path":650,"stem":651,"icon":103,"description":500,"subcategory":13},"useDuxtSearch()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-duxt-search","4.reference\u002F6.composables\u002F3.reading\u002F1.use-duxt-search",{"title":653,"path":654,"stem":655,"icon":656,"description":657,"subcategory":13},"useFuzzySearch()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-fuzzy-search","4.reference\u002F6.composables\u002F3.reading\u002F2.use-fuzzy-search","lucide:spell-check","Tolerância a gralhas ao lado do índice exato.",{"title":659,"path":660,"stem":661,"icon":347,"description":662,"subcategory":13},"useActiveHeading()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-active-heading","4.reference\u002F6.composables\u002F3.reading\u002F3.use-active-heading","O cabeçalho que está à vista neste momento.",{"title":664,"path":665,"stem":666,"icon":667,"description":668,"subcategory":13},"useDuxtPageFocus()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-duxt-page-focus","4.reference\u002F6.composables\u002F3.reading\u002F4.use-duxt-page-focus","lucide:focus","Move o foco para o cabeçalho depois de uma navegação do lado do cliente.",{"title":670,"path":671,"stem":672,"icon":673,"description":674,"subcategory":13},"useRecentPages()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-recent-pages","4.reference\u002F6.composables\u002F3.reading\u002F5.use-recent-pages","lucide:history","As páginas abertas mais recentemente, até ao limite configurado.",{"title":676,"path":677,"stem":678,"icon":291,"description":679,"subcategory":13},"usePackageManager()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-package-manager","4.reference\u002F6.composables\u002F3.reading\u002F6.use-package-manager","O gestor de pacotes que um leitor escolheu.",{"title":681,"path":682,"stem":683,"icon":684,"description":685,"subcategory":13},"useDuxtToast()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-duxt-toast","4.reference\u002F6.composables\u002F3.reading\u002F7.use-duxt-toast","lucide:bell","Notificações, embrulhadas para que nenhum componente importe a biblioteca.",{"title":687,"path":688,"stem":689,"icon":62,"description":690,"subcategory":13},"useDuxtShortcuts()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-duxt-shortcuts","4.reference\u002F6.composables\u002F3.reading\u002F8.use-duxt-shortcuts","As teclas que o tema escuta.",{"title":692,"path":693,"stem":694,"icon":181,"description":695,"subcategory":13},"useDuxtAnalytics()","\u002Freference\u002Fcomposables\u002Freading\u002Fuse-duxt-analytics","4.reference\u002F6.composables\u002F3.reading\u002F9.use-duxt-analytics","Comunicar uma interação do leitor ao callback do próprio site, ou a ninguém.",{"title":697,"path":698,"stem":699,"children":700,"icon":618,"description":702,"subcategory":13},"Endpoints","\u002Freference\u002Fendpoints","4.reference\u002F7.endpoints\u002Findex",[701,703,708,714,719,724,729,735],{"title":697,"path":698,"stem":699,"icon":618,"description":702,"subcategory":13},"Tudo o que o site serve além das páginas, uma página cada.",{"title":704,"path":705,"stem":706,"icon":545,"description":707,"subcategory":13},"\u002Fllms.txt","\u002Freference\u002Fendpoints\u002Fllms-txt","4.reference\u002F7.endpoints\u002F1.llms-txt","A documentação como índice Markdown, segundo llmstxt.org.",{"title":709,"path":710,"stem":711,"icon":712,"description":713,"subcategory":13},"\u002Fllms-full.txt","\u002Freference\u002Fendpoints\u002Fllms-full-txt","4.reference\u002F7.endpoints\u002F2.llms-full-txt","lucide:file-stack","Uma extensão do duxt com as mesmas páginas num ficheiro Markdown.",{"title":715,"path":716,"stem":717,"icon":239,"description":718,"subcategory":13},"\u003Cpage>.md","\u002Freference\u002Fendpoints\u002Fpage-markdown","4.reference\u002F7.endpoints\u002F3.page-markdown","O código-fonte de qualquer página, no seu próprio URL mais .md.",{"title":720,"path":721,"stem":722,"icon":97,"description":723,"subcategory":13},"\u002Fmcp","\u002Freference\u002Fendpoints\u002Fmcp","4.reference\u002F7.endpoints\u002F4.mcp","Um servidor MCP sobre o mesmo conteúdo.",{"title":725,"path":726,"stem":727,"icon":103,"description":728,"subcategory":13},"\u002Fsitemap.xml e \u002Frobots.txt","\u002Freference\u002Fendpoints\u002Fsitemap-and-robots","4.reference\u002F7.endpoints\u002F5.sitemap-and-robots","Para onde um rastreador é apontado, e aquilo de que é mantido fora.",{"title":730,"path":731,"stem":732,"icon":733,"description":734,"subcategory":13},"\u002Frss.xml","\u002Freference\u002Fendpoints\u002Frss-xml","4.reference\u002F7.endpoints\u002F6.rss-xml","lucide:rss","O feed, assim que uma secção for nomeada.",{"title":736,"path":737,"stem":738,"icon":739,"description":740,"subcategory":13},"\u002F_duxt\u002Fdevtools","\u002Freference\u002Fendpoints\u002Fdevtools","4.reference\u002F7.endpoints\u002F7.devtools","lucide:wrench","A rota a partir da qual o painel das Nuxt Devtools é servido. Apenas em desenvolvimento.",{"title":742,"path":743,"stem":744,"children":745,"icon":739,"description":747,"subcategory":13},"Devtools","\u002Freference\u002Fdevtools","4.reference\u002F8.devtools\u002Findex",[746,748,753,758,763,769,775,781,786,791,796],{"title":742,"path":743,"stem":744,"icon":739,"description":747,"subcategory":13},"Dez painéis que mostram no que as tuas fontes se tornaram. Apenas em desenvolvimento.",{"title":749,"path":750,"stem":751,"icon":594,"description":752,"subcategory":13},"Sources","\u002Freference\u002Fdevtools\u002Fsources","4.reference\u002F8.devtools\u002F1.sources","No que `duxt.sources` se tornou — uma coleção por fonte, versão e idioma.",{"title":754,"path":755,"stem":756,"icon":157,"description":757,"subcategory":13},"Redirects","\u002Freference\u002Fdevtools\u002Fredirects","4.reference\u002F8.devtools\u002F10.redirects","Todos os redireccionamentos que o servidor serve, e quais deles a camada escreveu.",{"title":759,"path":760,"stem":761,"icon":618,"description":762,"subcategory":13},"Paths","\u002Freference\u002Fdevtools\u002Fpaths","4.reference\u002F8.devtools\u002F2.paths","Cola um URL e vê que fonte o reclama e o que encontra lá.",{"title":764,"path":765,"stem":766,"icon":767,"description":768,"subcategory":13},"Pages","\u002Freference\u002Fdevtools\u002Fpages","4.reference\u002F8.devtools\u002F3.pages","lucide:files","Todas as páginas de todas as coleções, com o frontmatter e os metadados de git.",{"title":770,"path":771,"stem":772,"icon":773,"description":774,"subcategory":13},"Versions","\u002Freference\u002Fdevtools\u002Fversions","4.reference\u002F8.devtools\u002F4.versions","lucide:columns-3","Que versão — e que idioma — leva que página.",{"title":776,"path":777,"stem":778,"icon":779,"description":780,"subcategory":13},"Checks","\u002Freference\u002Fdevtools\u002Fchecks","4.reference\u002F8.devtools\u002F5.checks","lucide:check-check","O validador da compilação, aplicado ao que o site está a servir agora.",{"title":782,"path":783,"stem":784,"icon":103,"description":785,"subcategory":13},"Search","\u002Freference\u002Fdevtools\u002Fsearch","4.reference\u002F8.devtools\u002F6.search","O que o índice de pesquisa contém, pela mesma consulta que a caixa de diálogo faz.",{"title":787,"path":788,"stem":789,"icon":494,"description":790,"subcategory":13},"Config","\u002Freference\u002Fdevtools\u002Fconfig","4.reference\u002F8.devtools\u002F7.config","A configuração `duxt` fundida, e de que lado da fusão vem cada valor.",{"title":792,"path":793,"stem":794,"icon":109,"description":795,"subcategory":13},"i18n","\u002Freference\u002Fdevtools\u002Fi18n","4.reference\u002F8.devtools\u002F8.i18n","Chaves de mensagem por idioma, contra o idioma base.",{"title":797,"path":798,"stem":799,"icon":800,"description":801,"subcategory":13},"Cache","\u002Freference\u002Fdevtools\u002Fcache","4.reference\u002F8.devtools\u002F9.cache","lucide:hard-drive","A cache de descargas do Content, e uma forma de deitar fora uma entrada.",{"title":803,"path":804,"stem":805,"children":806,"icon":262,"description":808,"subcategory":13},"Referência da API","\u002Freference\u002Fopenapi","4.reference\u002F9.openapi\u002Findex",[807,809,813,817,822],{"title":803,"path":804,"stem":805,"icon":262,"description":808,"subcategory":13},"Um documento OpenAPI, publicado como páginas de referência com um cliente que envia pedidos reais.",{"title":205,"path":810,"stem":811,"icon":239,"description":812,"subcategory":13},"\u002Freference\u002Fopenapi\u002Fsection","4.reference\u002F9.openapi\u002F1.section","O tipo de secção `openapi` — onde vive o documento, e no que se torna.",{"title":414,"path":814,"stem":815,"icon":226,"description":816,"subcategory":13},"\u002Freference\u002Fopenapi\u002Fcomponents","4.reference\u002F9.openapi\u002F2.components","Os três componentes MDC de que é feita uma página de referência gerada.",{"title":818,"path":819,"stem":820,"icon":234,"description":821,"subcategory":13},"O cliente de ensaio","\u002Freference\u002Fopenapi\u002Ftry-it","4.reference\u002F9.openapi\u002F3.try-it","Um pedido real, enviado pelo próprio navegador do leitor.",{"title":823,"path":824,"stem":825,"icon":568,"description":826,"subcategory":13},"Amostras de pedido","\u002Freference\u002Fopenapi\u002Frequest-samples","4.reference\u002F9.openapi\u002F4.request-samples","O mesmo pedido em doze clientes, e como acrescentar o teu.",{"title":828,"path":829,"stem":830,"children":831,"description":834},"Extensões","\u002Fadd-ons","5.add-ons",[832,835,840],{"title":828,"path":829,"stem":833,"icon":315,"description":834,"subcategory":13},"5.add-ons\u002Findex","Camadas complementares que estendem um site duxt — cada uma é um pacote próprio, adicionado com mais uma entrada em extends.",{"title":836,"path":837,"stem":838,"icon":103,"description":839,"subcategory":13},"Typesense","\u002Fadd-ons\u002Ftypesense","5.add-ons\u002F1.typesense","Consuma o único hook de build do duxt em uma coleção do Typesense — cada fonte, versão e idioma, atualizados por um id estável.",{"title":841,"path":842,"stem":843,"icon":844,"description":845,"subcategory":13},"Meilisearch","\u002Fadd-ons\u002Fmeilisearch","5.add-ons\u002F2.meilisearch","simple-icons:meilisearch","Adicione a camada complementar oficial para indexação atômica durante o build e busca opcional no navegador.",{"title":847,"path":848,"stem":849,"children":850,"icon":852,"description":853,"subcategory":13},"Créditos","\u002Fcredits","6.credits\u002Findex",[851],{"title":847,"path":848,"stem":849,"icon":852,"description":853,"subcategory":13},"lucide:heart","Aquilo em que o duxt assenta, e aquilo de que partiu.",{"title":855,"path":856,"stem":857,"children":858,"description":862},"Convenções","\u002Fconventions","7.conventions",[859,863,869,874],{"title":855,"path":856,"stem":860,"icon":861,"description":862,"subcategory":13},"7.conventions\u002Findex","lucide:ruler","Regras próprias do projeto — as que não se deduzem do código.",{"title":864,"path":865,"stem":866,"icon":867,"description":868,"subcategory":13},"Identidade","\u002Fconventions\u002Fbranding","7.conventions\u002F1.branding","lucide:shapes","A marca [d]uxt — onde é usado cada recurso, por que os parênteses do ícone foram redesenhados, e que cores são fixas.",{"title":870,"path":871,"stem":872,"icon":353,"description":873,"subcategory":13},"Ícones","\u002Fconventions\u002Ficons","7.conventions\u002F2.icons","Quatro conjuntos de ícones, e a única pergunta que decide qual deles desenha uma marca.",{"title":875,"path":876,"stem":877,"icon":91,"description":878,"subcategory":13},"Segurança das dependências","\u002Fconventions\u002Fdependency-security","7.conventions\u002F3.dependency-security","Rever avisos sem esconder os caminhos afetados.",{"title":880,"path":881,"stem":882,"children":883,"description":887},"Decisões de arquitetura","\u002Fadr","99.adr",[884,888,893,898,903,908,913,918,923,928,933,938],{"title":880,"path":881,"stem":885,"icon":886,"description":887,"subcategory":13},"99.adr\u002Findex","lucide:gavel","O registo de decisões — todas as decisões de arquitetura registadas para o duxt.",{"title":889,"path":890,"stem":891,"icon":13,"description":892,"subcategory":13},"Construir o duxt como uma camada que transporta um módulo","\u002Fadr\u002F0001-build-duxt-as-a-layer-carrying-a-module","99.adr\u002F0001-build-duxt-as-a-layer-carrying-a-module","Distribuir o tema como uma camada Nuxt cuja raiz é o pacote, e não como um modelo inicial.",{"title":894,"path":895,"stem":896,"icon":13,"description":897,"subcategory":13},"Gerar as coleções a partir de uma só lista de fontes","\u002Fadr\u002F0002-generate-the-collections-from-one-source-list","99.adr\u002F0002-generate-the-collections-from-one-source-list","Calcular as coleções do Content a partir de uma lista de fontes compacta ao carregar a configuração, em vez de fazer quem a consome declará-las.",{"title":899,"path":900,"stem":901,"icon":13,"description":902,"subcategory":13},"Decidir os prefixos de URL em tempo de compilação","\u002Fadr\u002F0003-decide-the-url-prefixes-at-build-time","99.adr\u002F0003-decide-the-url-prefixes-at-build-time","Se um segmento de repositório ou de versão aparece é decidido pela lista de fontes antes do primeiro pedido, nunca por pedido.",{"title":904,"path":905,"stem":906,"icon":13,"description":907,"subcategory":13},"Desenhar os componentes Markdown com MDC","\u002Fadr\u002F0004-render-markdown-components-with-mdc","99.adr\u002F0004-render-markdown-components-with-mdc","Usar a própria sintaxe MDC do Content para componentes dentro do Markdown, em vez de adotar MDX.",{"title":909,"path":910,"stem":911,"icon":13,"description":912,"subcategory":13},"Entregar a camada sem ligações específicas do proprietário","\u002Fadr\u002F0005-ship-the-layer-without-owner-specific-links","99.adr\u002F0005-ship-the-layer-without-owner-specific-links","Toda a predefinição que nomearia um projeto concreto — repositório, gestor de issues, comunidade, aviso legal — é entregue vazia.",{"title":914,"path":915,"stem":916,"icon":13,"description":917,"subcategory":13},"Recompilar de forma agendada em vez de atualizar em tempo de execução","\u002Fadr\u002F0006-rebuild-on-a-schedule-rather-than-refresh-at-runtime","99.adr\u002F0006-rebuild-on-a-schedule-rather-than-refresh-at-runtime","Um site que lê outro repositório apanha as suas alterações quando compila, e não é oferecida nenhuma atualização em tempo de execução.",{"title":919,"path":920,"stem":921,"icon":13,"description":922,"subcategory":13},"Servir as traduções como coleções próprias","\u002Fadr\u002F0007-serve-translations-as-collections-of-their-own","99.adr\u002F0007-serve-translations-as-collections-of-their-own","Acrescentar uma dimensão de locale a uma fonte, em vez de um segmento de locale ao caminho de conteúdo.",{"title":924,"path":925,"stem":926,"icon":13,"description":927,"subcategory":13},"Construir o tema sobre componentes shadcn-vue próprios","\u002Fadr\u002F0008-build-the-theme-on-owned-shadcn-vue-components","99.adr\u002F0008-build-the-theme-on-owned-shadcn-vue-components","A camada guarda o código-fonte dos seus componentes de interface em vez de os importar de uma biblioteca de componentes ou de um tema de documentação já feito.",{"title":929,"path":930,"stem":931,"icon":13,"description":932,"subcategory":13},"Tirar a base de SEO do pacote Nuxt SEO","\u002Fadr\u002F0009-take-the-seo-stack-from-the-nuxt-seo-bundle","99.adr\u002F0009-take-the-seo-stack-from-the-nuxt-seo-bundle","A camada instala o @nuxtjs\u002Fseo e entrega-lhe as etiquetas de head e os dados estruturados que antes escrevia à mão, guardando apenas as regras que dependem de versões e traduções.",{"title":934,"path":935,"stem":936,"icon":13,"description":937,"subcategory":13},"Manter a pesquisa por coleção do Content como padrão","\u002Fadr\u002F0010-keep-contents-per-collection-search-as-the-default","99.adr\u002F0010-keep-contents-per-collection-search-as-the-default","Um único índice sobre todas as fontes foi medido contra a pesquisa de um índice por coleção do Content e não é o padrão da camada; o hook de compilação transforma-o antes numa camada fornecedora.",{"title":939,"path":940,"stem":941,"icon":13,"description":942,"subcategory":13},"Alojar as camadas fornecedoras num monorepo Turborepo","\u002Fadr\u002F0011-host-the-provider-layers-in-a-turborepo-monorepo","99.adr\u002F0011-host-the-provider-layers-in-a-turborepo-monorepo","A camada passa para packages\u002Fduxt e o site para apps\u002Fwww, cada pacote publicado versiona e marca por si como \u003Cname>@vX.Y.Z, e a decisão de repositórios próprios registada em",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":947},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15.39 4.39a1 1 0 0 0 1.68-.474a2.5 2.5 0 1 1 3.014 3.015a1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474a2.5 2.5 0 1 0-3.014 3.015a1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474a2.5 2.5 0 1 1-3.014-3.015a1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474a2.5 2.5 0 1 0 3.014-3.015a1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":949},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"\u002F>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003C\u002Fg>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":951},"\u003Cpath fill=\"currentColor\" d=\"m6.505 18.998l4.434-11.345a4.17 4.17 0 0 1 3.882-2.651h2.674l-4.434 11.345a4.17 4.17 0 0 1-3.883 2.651zm6.505 0l4.434-11.345a4.17 4.17 0 0 1 3.883-2.651H24l-4.434 11.345a4.17 4.17 0 0 1-3.882 2.651zm-13.01 0L4.434 7.653a4.17 4.17 0 0 1 3.882-2.651h2.674L6.556 16.347a4.17 4.17 0 0 1-3.883 2.651z\"\u002F>",{"page":953,"from":2545,"asked":2546},{"id":954,"title":836,"body":955,"breadcrumb":1183,"category":13,"compare":13,"contributors":13,"copyPage":1183,"date":13,"description":839,"extension":2537,"feedback":1183,"fullWidth":946,"icon":103,"lastUpdated":13,"layout":13,"meta":2538,"navigation":1183,"pageInfo":1183,"page_title":13,"path":837,"prevNext":1183,"rawbody":2539,"redirectFrom":2540,"release":13,"search":1183,"seo":2542,"sitemap":2543,"stem":838,"subcategory":13,"toc":13,"__hash__":2544},"docs_pt\u002F5.add-ons\u002F1.typesense.md",{"type":956,"value":957,"toc":2530},"minimark",[958,971,983,988,996,1000,1111,1122,1125,2329,2333,2340,2403,2410,2414,2425,2458,2464,2468,2526],[959,960,961,962,966,967,970],"p",{},"O duxt emite ",[963,964,965],"a",{"href":260},"um único hook de build",", e ele entrega cada\npágina de cada fonte, versão e idioma como registros planos. Um site que já\nopera o ",[968,969,836],"strong",{}," transforma esses registros em uma coleção própria — sem\nrastrear de novo o site renderizado e sem reimplementar a lógica de fontes,\nversões e locales do duxt.",[972,973,976],"callout",{"title":974,"type":975},"O serviço é seu, não do duxt","info",[959,977,978,979,982],{},"O duxt não traz SDK do Typesense, credenciais nem configuração de serviço. A camada complementar opcional trata da integração; o serviço e as suas chaves são seus. Sem um fornecedor ou listener personalizado, o duxt ",[963,980,981],{"href":260},"não constrói carga alguma",".",[984,985,987],"h2",{"id":986},"usar-a-camada-complementar","Usar a camada complementar",[959,989,990,991,995],{},"Para a integração pronta a usar, instala ",[992,993,994],"code",{},"@kirchdev\u002Fduxt-typesense"," e estende-a depois do duxt. Sincroniza o conjunto completo através de uma coleção temporária e da troca de alias, remove a coleção anterior gerida e liga o diálogo de pesquisa existente com uma chave apenas de pesquisa. Os passos abaixo continuam a ser uma receita para sincronização personalizada.",[997,998],"package-managers",{"command":999},"add @kirchdev\u002Fduxt-typesense",[1001,1002,1008],"pre",{"className":1003,"code":1004,"filename":1005,"language":1006,"meta":1007,"style":1007},"language-ts shiki shiki-themes github-light github-dark","export default defineNuxtConfig({\n  extends: ['@kirchdev\u002Fduxt', '@kirchdev\u002Fduxt-typesense'],\n  duxtTypesense: {\n    endpoint: process.env.TYPESENSE_ENDPOINT,\n    collection: 'docs',\n    adminKey: process.env.TYPESENSE_ADMIN_KEY,\n    searchKey: process.env.TYPESENSE_SEARCH_KEY\n  }\n})\n","nuxt.config.ts","ts","",[992,1009,1010,1030,1049,1055,1068,1079,1090,1099,1105],{"__ignoreMap":1007},[1011,1012,1015,1019,1022,1026],"span",{"class":1013,"line":1014},"line",1,[1011,1016,1018],{"class":1017},"szBVR","export",[1011,1020,1021],{"class":1017}," default",[1011,1023,1025],{"class":1024},"sScJk"," defineNuxtConfig",[1011,1027,1029],{"class":1028},"sVt8B","({\n",[1011,1031,1033,1036,1040,1043,1046],{"class":1013,"line":1032},2,[1011,1034,1035],{"class":1028},"  extends: [",[1011,1037,1039],{"class":1038},"sZZnC","'@kirchdev\u002Fduxt'",[1011,1041,1042],{"class":1028},", ",[1011,1044,1045],{"class":1038},"'@kirchdev\u002Fduxt-typesense'",[1011,1047,1048],{"class":1028},"],\n",[1011,1050,1052],{"class":1013,"line":1051},3,[1011,1053,1054],{"class":1028},"  duxtTypesense: {\n",[1011,1056,1058,1061,1065],{"class":1013,"line":1057},4,[1011,1059,1060],{"class":1028},"    endpoint: process.env.",[1011,1062,1064],{"class":1063},"sj4cs","TYPESENSE_ENDPOINT",[1011,1066,1067],{"class":1028},",\n",[1011,1069,1071,1074,1077],{"class":1013,"line":1070},5,[1011,1072,1073],{"class":1028},"    collection: ",[1011,1075,1076],{"class":1038},"'docs'",[1011,1078,1067],{"class":1028},[1011,1080,1082,1085,1088],{"class":1013,"line":1081},6,[1011,1083,1084],{"class":1028},"    adminKey: process.env.",[1011,1086,1087],{"class":1063},"TYPESENSE_ADMIN_KEY",[1011,1089,1067],{"class":1028},[1011,1091,1093,1096],{"class":1013,"line":1092},7,[1011,1094,1095],{"class":1028},"    searchKey: process.env.",[1011,1097,1098],{"class":1063},"TYPESENSE_SEARCH_KEY\n",[1011,1100,1102],{"class":1013,"line":1101},8,[1011,1103,1104],{"class":1028},"  }\n",[1011,1106,1108],{"class":1013,"line":1107},9,[1011,1109,1110],{"class":1028},"})\n",[959,1112,1113,1114,1117,1118,1121],{},"Mantém a chave de administração exclusivamente na configuração de compilação. ",[992,1115,1116],{},"searchKey"," deve permitir apenas ",[992,1119,1120],{},"documents:search"," para este alias, e o Typesense deve aceitar pedidos do navegador a partir do teu site.",[984,1123,368],{"id":1124},"passos",[1126,1127,1128,1142,1145,1153,1337,1344,1365,1382,1394,1658,1665,1678,2153,2160,2171,2183,2317],"steps",{},[1129,1130,1131],"ol",{},[1132,1133,1134,1137,1138,1141],"li",{},[968,1135,1136],{},"Instale o cliente no seu site."," É uma dependência de build: a\nsincronização roda no Node durante o ",[992,1139,1140],{},"nuxt build",", nunca no navegador.",[997,1143],{"command":1144},"add -D typesense",[1129,1146,1147],{"start":1032},[1132,1148,1149,1152],{},[968,1150,1151],{},"Declare a coleção."," Cada campo de um registro do duxt corresponde a um\ncampo do Typesense, e os dois campos de procedência são aqueles por que um\nleitor filtra:",[1001,1154,1157],{"className":1003,"code":1155,"filename":1156,"language":1006,"meta":1007,"style":1007},"import type { CollectionCreateSchema } from 'typesense';\n\nexport const docs: CollectionCreateSchema = {\n  name: 'docs',\n  fields: [\n    { name: 'url', type: 'string' },\n    { name: 'title', type: 'string' },\n    { name: 'content', type: 'string' },\n    { name: 'source', type: 'string', facet: true },\n    { name: 'version', type: 'string', facet: true, optional: true },\n    { name: 'locale', type: 'string', facet: true }\n  ]\n};\n","server\u002Ftypesense-schema.ts",[992,1158,1159,1179,1185,1207,1216,1221,1238,1251,1264,1283,1306,1325,1331],{"__ignoreMap":1007},[1011,1160,1161,1164,1167,1170,1173,1176],{"class":1013,"line":1014},[1011,1162,1163],{"class":1017},"import",[1011,1165,1166],{"class":1017}," type",[1011,1168,1169],{"class":1028}," { CollectionCreateSchema } ",[1011,1171,1172],{"class":1017},"from",[1011,1174,1175],{"class":1038}," 'typesense'",[1011,1177,1178],{"class":1028},";\n",[1011,1180,1181],{"class":1013,"line":1032},[1011,1182,1184],{"emptyLinePlaceholder":1183},true,"\n",[1011,1186,1187,1189,1192,1195,1198,1201,1204],{"class":1013,"line":1051},[1011,1188,1018],{"class":1017},[1011,1190,1191],{"class":1017}," const",[1011,1193,1194],{"class":1063}," docs",[1011,1196,1197],{"class":1017},":",[1011,1199,1200],{"class":1024}," CollectionCreateSchema",[1011,1202,1203],{"class":1017}," =",[1011,1205,1206],{"class":1028}," {\n",[1011,1208,1209,1212,1214],{"class":1013,"line":1057},[1011,1210,1211],{"class":1028},"  name: ",[1011,1213,1076],{"class":1038},[1011,1215,1067],{"class":1028},[1011,1217,1218],{"class":1013,"line":1070},[1011,1219,1220],{"class":1028},"  fields: [\n",[1011,1222,1223,1226,1229,1232,1235],{"class":1013,"line":1081},[1011,1224,1225],{"class":1028},"    { name: ",[1011,1227,1228],{"class":1038},"'url'",[1011,1230,1231],{"class":1028},", type: ",[1011,1233,1234],{"class":1038},"'string'",[1011,1236,1237],{"class":1028}," },\n",[1011,1239,1240,1242,1245,1247,1249],{"class":1013,"line":1092},[1011,1241,1225],{"class":1028},[1011,1243,1244],{"class":1038},"'title'",[1011,1246,1231],{"class":1028},[1011,1248,1234],{"class":1038},[1011,1250,1237],{"class":1028},[1011,1252,1253,1255,1258,1260,1262],{"class":1013,"line":1101},[1011,1254,1225],{"class":1028},[1011,1256,1257],{"class":1038},"'content'",[1011,1259,1231],{"class":1028},[1011,1261,1234],{"class":1038},[1011,1263,1237],{"class":1028},[1011,1265,1266,1268,1271,1273,1275,1278,1281],{"class":1013,"line":1107},[1011,1267,1225],{"class":1028},[1011,1269,1270],{"class":1038},"'source'",[1011,1272,1231],{"class":1028},[1011,1274,1234],{"class":1038},[1011,1276,1277],{"class":1028},", facet: ",[1011,1279,1280],{"class":1063},"true",[1011,1282,1237],{"class":1028},[1011,1284,1286,1288,1291,1293,1295,1297,1299,1302,1304],{"class":1013,"line":1285},10,[1011,1287,1225],{"class":1028},[1011,1289,1290],{"class":1038},"'version'",[1011,1292,1231],{"class":1028},[1011,1294,1234],{"class":1038},[1011,1296,1277],{"class":1028},[1011,1298,1280],{"class":1063},[1011,1300,1301],{"class":1028},", optional: ",[1011,1303,1280],{"class":1063},[1011,1305,1237],{"class":1028},[1011,1307,1309,1311,1314,1316,1318,1320,1322],{"class":1013,"line":1308},11,[1011,1310,1225],{"class":1028},[1011,1312,1313],{"class":1038},"'locale'",[1011,1315,1231],{"class":1028},[1011,1317,1234],{"class":1038},[1011,1319,1277],{"class":1028},[1011,1321,1280],{"class":1063},[1011,1323,1324],{"class":1028}," }\n",[1011,1326,1328],{"class":1013,"line":1327},12,[1011,1329,1330],{"class":1028},"  ]\n",[1011,1332,1334],{"class":1013,"line":1333},13,[1011,1335,1336],{"class":1028},"};\n",[959,1338,1339,1340,1343],{},"Tipado como ",[992,1341,1342],{},"CollectionCreateSchema",", porque o passo 4 entrega este mesmo\nobjeto ao Typesense para criar a coleção com ele.",[959,1345,1346,1347,1350,1351,1353,1354,1356,1357,1360,1361,1364],{},"O ",[992,1348,1349],{},"id"," não está na lista de propósito: o Typesense já trata ",[992,1352,1349],{}," como a\nchave primária do documento, e o ",[992,1355,1349],{}," do duxt é\n",[963,1358,1359],{"href":260},"um resumo hexadecimal da URL"," — válido como chave, igual\nem qualquer máquina e inalterado enquanto a página permanecer onde está. É\nisso que permite à sincronização fazer ",[968,1362,1363],{},"upsert"," em vez de reconstruir.",[959,1366,1367,1370,1371,1374,1375,1378,1379,1381],{},[992,1368,1369],{},"version"," é ",[992,1372,1373],{},"optional",", porque uma fonte com uma única versão não carrega\nnenhuma. A versão é retirada de ",[992,1376,1377],{},"source"," deliberadamente, para que uma faceta\nconstruída sobre ele sobreviva a um lançamento e ",[992,1380,1369],{}," ao lado seja o que\nestreita para uma só.",[1129,1383,1384],{"start":1051},[1132,1385,1386,1389,1390,1393],{},[968,1387,1388],{},"Escreva o módulo que ouve."," Um módulo Nuxt no seu próprio site é toda a\nintegração — ",[992,1391,1392],{},"defineNuxtModule",", um hook, um import:",[1001,1395,1398],{"className":1003,"code":1396,"filename":1397,"language":1006,"meta":1007,"style":1007},"import { defineNuxtModule } from '@nuxt\u002Fkit';\nimport { Client } from 'typesense';\nimport type { DuxtSearchRecord } from '@kirchdev\u002Fduxt\u002Fsearch-records';\nimport { docs } from '..\u002Fserver\u002Ftypesense-schema';\n\nexport default defineNuxtModule({\n  meta: { name: 'typesense-sync' },\n  setup(_options, nuxt) {\n    const key = process.env.TYPESENSE_ADMIN_KEY;\n    \u002F\u002F Sem chave é um build local, não uma falha: pule em vez de quebrá-lo.\n    if (!key) return;\n\n    nuxt.hook('duxt:search:records', async (records) => {\n      const client = new Client({\n        nodes: [{ url: process.env.TYPESENSE_URL! }],\n        apiKey: key\n      });\n\n      await sync(client, records);\n    });\n  }\n});\n","modules\u002Ftypesense.ts",[992,1399,1400,1414,1427,1443,1457,1461,1472,1482,1502,1519,1525,1544,1548,1579,1598,1612,1618,1624,1629,1641,1647,1652],{"__ignoreMap":1007},[1011,1401,1402,1404,1407,1409,1412],{"class":1013,"line":1014},[1011,1403,1163],{"class":1017},[1011,1405,1406],{"class":1028}," { defineNuxtModule } ",[1011,1408,1172],{"class":1017},[1011,1410,1411],{"class":1038}," '@nuxt\u002Fkit'",[1011,1413,1178],{"class":1028},[1011,1415,1416,1418,1421,1423,1425],{"class":1013,"line":1032},[1011,1417,1163],{"class":1017},[1011,1419,1420],{"class":1028}," { Client } ",[1011,1422,1172],{"class":1017},[1011,1424,1175],{"class":1038},[1011,1426,1178],{"class":1028},[1011,1428,1429,1431,1433,1436,1438,1441],{"class":1013,"line":1051},[1011,1430,1163],{"class":1017},[1011,1432,1166],{"class":1017},[1011,1434,1435],{"class":1028}," { DuxtSearchRecord } ",[1011,1437,1172],{"class":1017},[1011,1439,1440],{"class":1038}," '@kirchdev\u002Fduxt\u002Fsearch-records'",[1011,1442,1178],{"class":1028},[1011,1444,1445,1447,1450,1452,1455],{"class":1013,"line":1057},[1011,1446,1163],{"class":1017},[1011,1448,1449],{"class":1028}," { docs } ",[1011,1451,1172],{"class":1017},[1011,1453,1454],{"class":1038}," '..\u002Fserver\u002Ftypesense-schema'",[1011,1456,1178],{"class":1028},[1011,1458,1459],{"class":1013,"line":1070},[1011,1460,1184],{"emptyLinePlaceholder":1183},[1011,1462,1463,1465,1467,1470],{"class":1013,"line":1081},[1011,1464,1018],{"class":1017},[1011,1466,1021],{"class":1017},[1011,1468,1469],{"class":1024}," defineNuxtModule",[1011,1471,1029],{"class":1028},[1011,1473,1474,1477,1480],{"class":1013,"line":1092},[1011,1475,1476],{"class":1028},"  meta: { name: ",[1011,1478,1479],{"class":1038},"'typesense-sync'",[1011,1481,1237],{"class":1028},[1011,1483,1484,1487,1490,1494,1496,1499],{"class":1013,"line":1101},[1011,1485,1486],{"class":1024},"  setup",[1011,1488,1489],{"class":1028},"(",[1011,1491,1493],{"class":1492},"s4XuR","_options",[1011,1495,1042],{"class":1028},[1011,1497,1498],{"class":1492},"nuxt",[1011,1500,1501],{"class":1028},") {\n",[1011,1503,1504,1507,1510,1512,1515,1517],{"class":1013,"line":1107},[1011,1505,1506],{"class":1017},"    const",[1011,1508,1509],{"class":1063}," key",[1011,1511,1203],{"class":1017},[1011,1513,1514],{"class":1028}," process.env.",[1011,1516,1087],{"class":1063},[1011,1518,1178],{"class":1028},[1011,1520,1521],{"class":1013,"line":1285},[1011,1522,1524],{"class":1523},"sJ8bj","    \u002F\u002F Sem chave é um build local, não uma falha: pule em vez de quebrá-lo.\n",[1011,1526,1527,1530,1533,1536,1539,1542],{"class":1013,"line":1308},[1011,1528,1529],{"class":1017},"    if",[1011,1531,1532],{"class":1028}," (",[1011,1534,1535],{"class":1017},"!",[1011,1537,1538],{"class":1028},"key) ",[1011,1540,1541],{"class":1017},"return",[1011,1543,1178],{"class":1028},[1011,1545,1546],{"class":1013,"line":1327},[1011,1547,1184],{"emptyLinePlaceholder":1183},[1011,1549,1550,1553,1556,1558,1561,1563,1566,1568,1571,1574,1577],{"class":1013,"line":1333},[1011,1551,1552],{"class":1028},"    nuxt.",[1011,1554,1555],{"class":1024},"hook",[1011,1557,1489],{"class":1028},[1011,1559,1560],{"class":1038},"'duxt:search:records'",[1011,1562,1042],{"class":1028},[1011,1564,1565],{"class":1017},"async",[1011,1567,1532],{"class":1028},[1011,1569,1570],{"class":1492},"records",[1011,1572,1573],{"class":1028},") ",[1011,1575,1576],{"class":1017},"=>",[1011,1578,1206],{"class":1028},[1011,1580,1582,1585,1588,1590,1593,1596],{"class":1013,"line":1581},14,[1011,1583,1584],{"class":1017},"      const",[1011,1586,1587],{"class":1063}," client",[1011,1589,1203],{"class":1017},[1011,1591,1592],{"class":1017}," new",[1011,1594,1595],{"class":1024}," Client",[1011,1597,1029],{"class":1028},[1011,1599,1601,1604,1607,1609],{"class":1013,"line":1600},15,[1011,1602,1603],{"class":1028},"        nodes: [{ url: process.env.",[1011,1605,1606],{"class":1063},"TYPESENSE_URL",[1011,1608,1535],{"class":1017},[1011,1610,1611],{"class":1028}," }],\n",[1011,1613,1615],{"class":1013,"line":1614},16,[1011,1616,1617],{"class":1028},"        apiKey: key\n",[1011,1619,1621],{"class":1013,"line":1620},17,[1011,1622,1623],{"class":1028},"      });\n",[1011,1625,1627],{"class":1013,"line":1626},18,[1011,1628,1184],{"emptyLinePlaceholder":1183},[1011,1630,1632,1635,1638],{"class":1013,"line":1631},19,[1011,1633,1634],{"class":1017},"      await",[1011,1636,1637],{"class":1024}," sync",[1011,1639,1640],{"class":1028},"(client, records);\n",[1011,1642,1644],{"class":1013,"line":1643},20,[1011,1645,1646],{"class":1028},"    });\n",[1011,1648,1650],{"class":1013,"line":1649},21,[1011,1651,1104],{"class":1028},[1011,1653,1655],{"class":1013,"line":1654},22,[1011,1656,1657],{"class":1028},"});\n",[959,1659,1660,1661,1664],{},"A carga está ",[968,1662,1663],{},"congelada",". Mapeie-a para documentos seus — nunca reescreva\num registro nem ordene o array no lugar, porque todos os outros ouvintes\nrecebem os mesmos objetos.",[1129,1666,1667],{"start":1057},[1132,1668,1669,1672,1673,1677],{},[968,1670,1671],{},"Sincronize o conjunto inteiro e remova o que se foi."," O hook entrega o\nconjunto ",[1674,1675,1676],"em",{},"completo"," e atual a cada build, então o próprio conjunto é a\ninstrução — tudo o que a coleção guarda e não está nele foi apagado, movido\nou renomeado:",[1001,1679,1681],{"className":1003,"code":1680,"filename":1397,"language":1006,"meta":1007,"style":1007},"async function sync(client: Client, records: readonly DuxtSearchRecord[]) {\n  const collection = client.collections(docs.name);\n\n  \u002F\u002F O Typesense não cria nada implicitamente: importar para uma coleção\n  \u002F\u002F que não existe falha de imediato, então o primeiro build a cria.\n  if (!(await collection.exists())) await client.collections().create(docs);\n\n  await collection.documents().import(\n    records.map((record) => ({ ...record })),\n    { action: 'upsert' }\n  );\n\n  \u002F\u002F Tudo o que o build não entregou já não está no site.\n  const kept = new Set(records.map((record) => record.id));\n  const live = await collection.documents().export();\n\n  const stale = live\n    .split('\\n')\n    .filter(Boolean)\n    .map((line) => JSON.parse(line).id as string)\n    .filter((id) => !kept.has(id));\n\n  \u002F\u002F Apague em lotes: cada id entra na string do filtro, e uma única\n  \u002F\u002F renomeação grande construiria um que o Typesense rejeita.\n  for (let index = 0; index \u003C stale.length; index += 100) {\n    const batch = stale.slice(index, index + 100).join(',');\n    await collection.documents().delete({ filter_by: `id:[${batch}]` });\n  }\n}\n",[992,1682,1683,1716,1735,1739,1744,1749,1787,1791,1808,1835,1845,1850,1854,1859,1889,1912,1916,1928,1949,1959,1992,2018,2022,2028,2033,2075,2112,2142,2147],{"__ignoreMap":1007},[1011,1684,1685,1687,1690,1692,1694,1697,1699,1701,1703,1705,1707,1710,1713],{"class":1013,"line":1014},[1011,1686,1565],{"class":1017},[1011,1688,1689],{"class":1017}," function",[1011,1691,1637],{"class":1024},[1011,1693,1489],{"class":1028},[1011,1695,1696],{"class":1492},"client",[1011,1698,1197],{"class":1017},[1011,1700,1595],{"class":1024},[1011,1702,1042],{"class":1028},[1011,1704,1570],{"class":1492},[1011,1706,1197],{"class":1017},[1011,1708,1709],{"class":1017}," readonly",[1011,1711,1712],{"class":1024}," DuxtSearchRecord",[1011,1714,1715],{"class":1028},"[]) {\n",[1011,1717,1718,1721,1724,1726,1729,1732],{"class":1013,"line":1032},[1011,1719,1720],{"class":1017},"  const",[1011,1722,1723],{"class":1063}," collection",[1011,1725,1203],{"class":1017},[1011,1727,1728],{"class":1028}," client.",[1011,1730,1731],{"class":1024},"collections",[1011,1733,1734],{"class":1028},"(docs.name);\n",[1011,1736,1737],{"class":1013,"line":1051},[1011,1738,1184],{"emptyLinePlaceholder":1183},[1011,1740,1741],{"class":1013,"line":1057},[1011,1742,1743],{"class":1523},"  \u002F\u002F O Typesense não cria nada implicitamente: importar para uma coleção\n",[1011,1745,1746],{"class":1013,"line":1070},[1011,1747,1748],{"class":1523},"  \u002F\u002F que não existe falha de imediato, então o primeiro build a cria.\n",[1011,1750,1751,1754,1756,1758,1760,1763,1766,1769,1772,1774,1776,1778,1781,1784],{"class":1013,"line":1081},[1011,1752,1753],{"class":1017},"  if",[1011,1755,1532],{"class":1028},[1011,1757,1535],{"class":1017},[1011,1759,1489],{"class":1028},[1011,1761,1762],{"class":1017},"await",[1011,1764,1765],{"class":1028}," collection.",[1011,1767,1768],{"class":1024},"exists",[1011,1770,1771],{"class":1028},"())) ",[1011,1773,1762],{"class":1017},[1011,1775,1728],{"class":1028},[1011,1777,1731],{"class":1024},[1011,1779,1780],{"class":1028},"().",[1011,1782,1783],{"class":1024},"create",[1011,1785,1786],{"class":1028},"(docs);\n",[1011,1788,1789],{"class":1013,"line":1092},[1011,1790,1184],{"emptyLinePlaceholder":1183},[1011,1792,1793,1796,1798,1801,1803,1805],{"class":1013,"line":1101},[1011,1794,1795],{"class":1017},"  await",[1011,1797,1765],{"class":1028},[1011,1799,1800],{"class":1024},"documents",[1011,1802,1780],{"class":1028},[1011,1804,1163],{"class":1024},[1011,1806,1807],{"class":1028},"(\n",[1011,1809,1810,1813,1816,1819,1822,1824,1826,1829,1832],{"class":1013,"line":1107},[1011,1811,1812],{"class":1028},"    records.",[1011,1814,1815],{"class":1024},"map",[1011,1817,1818],{"class":1028},"((",[1011,1820,1821],{"class":1492},"record",[1011,1823,1573],{"class":1028},[1011,1825,1576],{"class":1017},[1011,1827,1828],{"class":1028}," ({ ",[1011,1830,1831],{"class":1017},"...",[1011,1833,1834],{"class":1028},"record })),\n",[1011,1836,1837,1840,1843],{"class":1013,"line":1285},[1011,1838,1839],{"class":1028},"    { action: ",[1011,1841,1842],{"class":1038},"'upsert'",[1011,1844,1324],{"class":1028},[1011,1846,1847],{"class":1013,"line":1308},[1011,1848,1849],{"class":1028},"  );\n",[1011,1851,1852],{"class":1013,"line":1327},[1011,1853,1184],{"emptyLinePlaceholder":1183},[1011,1855,1856],{"class":1013,"line":1333},[1011,1857,1858],{"class":1523},"  \u002F\u002F Tudo o que o build não entregou já não está no site.\n",[1011,1860,1861,1863,1866,1868,1870,1873,1876,1878,1880,1882,1884,1886],{"class":1013,"line":1581},[1011,1862,1720],{"class":1017},[1011,1864,1865],{"class":1063}," kept",[1011,1867,1203],{"class":1017},[1011,1869,1592],{"class":1017},[1011,1871,1872],{"class":1024}," Set",[1011,1874,1875],{"class":1028},"(records.",[1011,1877,1815],{"class":1024},[1011,1879,1818],{"class":1028},[1011,1881,1821],{"class":1492},[1011,1883,1573],{"class":1028},[1011,1885,1576],{"class":1017},[1011,1887,1888],{"class":1028}," record.id));\n",[1011,1890,1891,1893,1896,1898,1901,1903,1905,1907,1909],{"class":1013,"line":1600},[1011,1892,1720],{"class":1017},[1011,1894,1895],{"class":1063}," live",[1011,1897,1203],{"class":1017},[1011,1899,1900],{"class":1017}," await",[1011,1902,1765],{"class":1028},[1011,1904,1800],{"class":1024},[1011,1906,1780],{"class":1028},[1011,1908,1018],{"class":1024},[1011,1910,1911],{"class":1028},"();\n",[1011,1913,1914],{"class":1013,"line":1614},[1011,1915,1184],{"emptyLinePlaceholder":1183},[1011,1917,1918,1920,1923,1925],{"class":1013,"line":1620},[1011,1919,1720],{"class":1017},[1011,1921,1922],{"class":1063}," stale",[1011,1924,1203],{"class":1017},[1011,1926,1927],{"class":1028}," live\n",[1011,1929,1930,1933,1936,1938,1941,1944,1946],{"class":1013,"line":1626},[1011,1931,1932],{"class":1028},"    .",[1011,1934,1935],{"class":1024},"split",[1011,1937,1489],{"class":1028},[1011,1939,1940],{"class":1038},"'",[1011,1942,1943],{"class":1063},"\\n",[1011,1945,1940],{"class":1038},[1011,1947,1948],{"class":1028},")\n",[1011,1950,1951,1953,1956],{"class":1013,"line":1631},[1011,1952,1932],{"class":1028},[1011,1954,1955],{"class":1024},"filter",[1011,1957,1958],{"class":1028},"(Boolean)\n",[1011,1960,1961,1963,1965,1967,1969,1971,1973,1976,1978,1981,1984,1987,1990],{"class":1013,"line":1643},[1011,1962,1932],{"class":1028},[1011,1964,1815],{"class":1024},[1011,1966,1818],{"class":1028},[1011,1968,1013],{"class":1492},[1011,1970,1573],{"class":1028},[1011,1972,1576],{"class":1017},[1011,1974,1975],{"class":1063}," JSON",[1011,1977,982],{"class":1028},[1011,1979,1980],{"class":1024},"parse",[1011,1982,1983],{"class":1028},"(line).id ",[1011,1985,1986],{"class":1017},"as",[1011,1988,1989],{"class":1063}," string",[1011,1991,1948],{"class":1028},[1011,1993,1994,1996,1998,2000,2002,2004,2006,2009,2012,2015],{"class":1013,"line":1649},[1011,1995,1932],{"class":1028},[1011,1997,1955],{"class":1024},[1011,1999,1818],{"class":1028},[1011,2001,1349],{"class":1492},[1011,2003,1573],{"class":1028},[1011,2005,1576],{"class":1017},[1011,2007,2008],{"class":1017}," !",[1011,2010,2011],{"class":1028},"kept.",[1011,2013,2014],{"class":1024},"has",[1011,2016,2017],{"class":1028},"(id));\n",[1011,2019,2020],{"class":1013,"line":1654},[1011,2021,1184],{"emptyLinePlaceholder":1183},[1011,2023,2025],{"class":1013,"line":2024},23,[1011,2026,2027],{"class":1523},"  \u002F\u002F Apague em lotes: cada id entra na string do filtro, e uma única\n",[1011,2029,2030],{"class":1013,"line":945},[1011,2031,2032],{"class":1523},"  \u002F\u002F renomeação grande construiria um que o Typesense rejeita.\n",[1011,2034,2036,2039,2041,2044,2047,2050,2053,2056,2059,2062,2065,2067,2070,2073],{"class":1013,"line":2035},25,[1011,2037,2038],{"class":1017},"  for",[1011,2040,1532],{"class":1028},[1011,2042,2043],{"class":1017},"let",[1011,2045,2046],{"class":1028}," index ",[1011,2048,2049],{"class":1017},"=",[1011,2051,2052],{"class":1063}," 0",[1011,2054,2055],{"class":1028},"; index ",[1011,2057,2058],{"class":1017},"\u003C",[1011,2060,2061],{"class":1028}," stale.",[1011,2063,2064],{"class":1063},"length",[1011,2066,2055],{"class":1028},[1011,2068,2069],{"class":1017},"+=",[1011,2071,2072],{"class":1063}," 100",[1011,2074,1501],{"class":1028},[1011,2076,2078,2080,2083,2085,2087,2090,2093,2096,2098,2101,2104,2106,2109],{"class":1013,"line":2077},26,[1011,2079,1506],{"class":1017},[1011,2081,2082],{"class":1063}," batch",[1011,2084,1203],{"class":1017},[1011,2086,2061],{"class":1028},[1011,2088,2089],{"class":1024},"slice",[1011,2091,2092],{"class":1028},"(index, index ",[1011,2094,2095],{"class":1017},"+",[1011,2097,2072],{"class":1063},[1011,2099,2100],{"class":1028},").",[1011,2102,2103],{"class":1024},"join",[1011,2105,1489],{"class":1028},[1011,2107,2108],{"class":1038},"','",[1011,2110,2111],{"class":1028},");\n",[1011,2113,2115,2118,2120,2122,2124,2127,2130,2133,2136,2139],{"class":1013,"line":2114},27,[1011,2116,2117],{"class":1017},"    await",[1011,2119,1765],{"class":1028},[1011,2121,1800],{"class":1024},[1011,2123,1780],{"class":1028},[1011,2125,2126],{"class":1024},"delete",[1011,2128,2129],{"class":1028},"({ filter_by: ",[1011,2131,2132],{"class":1038},"`id:[${",[1011,2134,2135],{"class":1028},"batch",[1011,2137,2138],{"class":1038},"}]`",[1011,2140,2141],{"class":1028}," });\n",[1011,2143,2145],{"class":1013,"line":2144},28,[1011,2146,1104],{"class":1028},[1011,2148,2150],{"class":1013,"line":2149},29,[1011,2151,2152],{"class":1028},"}\n",[959,2154,2155,2156,2159],{},"A coleção é criada na primeira execução e deixada em paz depois, e os ids\nobsoletos são apagados ",[968,2157,2158],{},"em lotes"," — o Typesense toma o filtro como uma\núnica string, e uma renomeação que mova uma fonte inteira construiria um\nque ele rejeita.",[972,2161,2164],{"title":2162,"type":2163},"Ou troque um alias","tip",[959,2165,2166,2167,2170],{},"Importe para uma coleção nomeada pelo build, aponte um ",[968,2168,2169],{},"alias"," do Typesense\npara ela e descarte a anterior. Cada build cria a própria coleção, então nem\na checagem de existência nem a exclusão em lotes são necessárias, e os\nleitores nunca veem um índice escrito pela metade — ao custo de reindexar\ntudo a cada build em vez de apenas o que mudou.",[1129,2172,2173],{"start":1070},[1132,2174,2175,2178,2179,2182],{},[968,2176,2177],{},"Busque do navegador com uma chave só de busca."," A chave de administração\nacima assina escritas e jamais pode chegar a uma página. Emita uma chave\n",[968,2180,2181],{},"com escopo e apenas de busca"," para o cliente, e filtre pelas facetas que o\nesquema declarou:",[1001,2184,2186],{"className":1003,"code":2185,"language":1006,"meta":1007,"style":1007},"\u002F\u002F `locale` é o idioma do CONTEÚDO, não o idioma da interface.\n\u002F\u002F `version` não existe numa fonte sem versões: a cláusula só entra quando\n\u002F\u002F há uma; fixa, filtraria por `undefined`.\nconst filters = [`locale:${locale}`];\nif (version) filters.push(`version:${version}`);\n\nconst results = await client.collections('docs').documents().search({\n  q: query,\n  query_by: 'title,content',\n  filter_by: filters.join(' && ')\n});\n",[992,2187,2188,2193,2198,2203,2228,2250,2254,2284,2289,2299,2313],{"__ignoreMap":1007},[1011,2189,2190],{"class":1013,"line":1014},[1011,2191,2192],{"class":1523},"\u002F\u002F `locale` é o idioma do CONTEÚDO, não o idioma da interface.\n",[1011,2194,2195],{"class":1013,"line":1032},[1011,2196,2197],{"class":1523},"\u002F\u002F `version` não existe numa fonte sem versões: a cláusula só entra quando\n",[1011,2199,2200],{"class":1013,"line":1051},[1011,2201,2202],{"class":1523},"\u002F\u002F há uma; fixa, filtraria por `undefined`.\n",[1011,2204,2205,2208,2211,2213,2216,2219,2222,2225],{"class":1013,"line":1057},[1011,2206,2207],{"class":1017},"const",[1011,2209,2210],{"class":1063}," filters",[1011,2212,1203],{"class":1017},[1011,2214,2215],{"class":1028}," [",[1011,2217,2218],{"class":1038},"`locale:${",[1011,2220,2221],{"class":1028},"locale",[1011,2223,2224],{"class":1038},"}`",[1011,2226,2227],{"class":1028},"];\n",[1011,2229,2230,2233,2236,2239,2241,2244,2246,2248],{"class":1013,"line":1070},[1011,2231,2232],{"class":1017},"if",[1011,2234,2235],{"class":1028}," (version) filters.",[1011,2237,2238],{"class":1024},"push",[1011,2240,1489],{"class":1028},[1011,2242,2243],{"class":1038},"`version:${",[1011,2245,1369],{"class":1028},[1011,2247,2224],{"class":1038},[1011,2249,2111],{"class":1028},[1011,2251,2252],{"class":1013,"line":1081},[1011,2253,1184],{"emptyLinePlaceholder":1183},[1011,2255,2256,2258,2261,2263,2265,2267,2269,2271,2273,2275,2277,2279,2282],{"class":1013,"line":1092},[1011,2257,2207],{"class":1017},[1011,2259,2260],{"class":1063}," results",[1011,2262,1203],{"class":1017},[1011,2264,1900],{"class":1017},[1011,2266,1728],{"class":1028},[1011,2268,1731],{"class":1024},[1011,2270,1489],{"class":1028},[1011,2272,1076],{"class":1038},[1011,2274,2100],{"class":1028},[1011,2276,1800],{"class":1024},[1011,2278,1780],{"class":1028},[1011,2280,2281],{"class":1024},"search",[1011,2283,1029],{"class":1028},[1011,2285,2286],{"class":1013,"line":1101},[1011,2287,2288],{"class":1028},"  q: query,\n",[1011,2290,2291,2294,2297],{"class":1013,"line":1107},[1011,2292,2293],{"class":1028},"  query_by: ",[1011,2295,2296],{"class":1038},"'title,content'",[1011,2298,1067],{"class":1028},[1011,2300,2301,2304,2306,2308,2311],{"class":1013,"line":1285},[1011,2302,2303],{"class":1028},"  filter_by: filters.",[1011,2305,2103],{"class":1024},[1011,2307,1489],{"class":1028},[1011,2309,2310],{"class":1038},"' && '",[1011,2312,1948],{"class":1028},[1011,2314,2315],{"class":1013,"line":1308},[1011,2316,1657],{"class":1028},[1129,2318,2319],{"start":1081},[1132,2320,2321,2324,2325,2328],{},[968,2322,2323],{},"Confira um build de ponta a ponta."," Rode um build com a chave definida e\nconfirme que a coleção guarda um registro de uma página em ",[968,2326,2327],{},"cada"," fonte,\nversão e idioma que o site serve — não apenas no padrão. O primeiro build\ncria a coleção; cada um depois faz upsert na mesma.",[984,2330,2332],{"id":2331},"o-que-os-registros-já-resolvem-por-você","O que os registros já resolvem por você",[959,2334,2335,2336,2339],{},"Quatro propriedades da carga são o que torna correta uma sincronização tão\ncurta, e todas as quatro são ",[963,2337,2338],{"href":260},"o contrato do hook",", não o\nconselho deste guia:",[2341,2342,2343,2357],"table",{},[2344,2345,2346],"thead",{},[2347,2348,2349,2354],"tr",{},[2350,2351,2353],"th",{"align":2352},"left","Propriedade",[2350,2355,2356],{"align":2352},"O que ela dá à sincronização",[2358,2359,2360,2377,2387,2395],"tbody",{},[2347,2361,2362,2371],{},[2363,2364,2365,2367,2368],"td",{"align":2352},[992,2366,1349],{}," deriva de ",[992,2369,2370],{},"url",[2363,2372,2373,2374,2376],{"align":2352},"Uma chave primária estável, então ",[992,2375,1363],{}," basta e reconstruir nunca é preciso",[2347,2378,2379,2384],{},[2363,2380,2381,2382],{"align":2352},"A carga é o conjunto ",[968,2383,1676],{},[2363,2385,2386],{"align":2352},"Remover é comparar com um build, sem rastreio e sem contabilidade",[2347,2388,2389,2392],{},[2363,2390,2391],{"align":2352},"O duxt não dispara com uma análise vazia",[2363,2393,2394],{"align":2352},"Um build que nada analisou nunca pode mandar esvaziar o índice",[2347,2396,2397,2400],{},[2363,2398,2399],{"align":2352},"A ordem é determinística",[2363,2401,2402],{"align":2352},"Dois builds diferem exatamente onde o site diferiu",[959,2404,2405,2406,2409],{},"Uma página que escreveu ",[992,2407,2408],{},"search: false",", e uma tradução em um idioma que o site\nnão roteia, não produzem registros — então nenhuma delas chega ao Typesense.",[984,2411,2413],{"id":2412},"transformar-isso-em-um-pacote","Transformar isso em um pacote",[959,2415,2416,2417,2420,2421,2424],{},"O módulo acima tem ~40 linhas e pertence a um site. Assim que um segundo site\nprecisar dele, a forma de compartilhá-lo é ",[968,2418,2419],{},"uma camada Nuxt",", não um plugin:\numa camada carrega o módulo, seus padrões de ",[992,2422,2423],{},"app.config"," e seus componentes em\num pacote versionado, e um consumidor a adiciona ao lado do duxt.",[1001,2426,2428],{"className":1003,"code":2427,"filename":1005,"language":1006,"meta":1007,"style":1007},"export default defineNuxtConfig({\n  extends: ['@kirchdev\u002Fduxt', 'duxt-typesense']\n});\n",[992,2429,2430,2440,2454],{"__ignoreMap":1007},[1011,2431,2432,2434,2436,2438],{"class":1013,"line":1014},[1011,2433,1018],{"class":1017},[1011,2435,1021],{"class":1017},[1011,2437,1025],{"class":1024},[1011,2439,1029],{"class":1028},[1011,2441,2442,2444,2446,2448,2451],{"class":1013,"line":1032},[1011,2443,1035],{"class":1028},[1011,2445,1039],{"class":1038},[1011,2447,1042],{"class":1028},[1011,2449,2450],{"class":1038},"'duxt-typesense'",[1011,2452,2453],{"class":1028},"]\n",[1011,2455,2456],{"class":1013,"line":1051},[1011,2457,1657],{"class":1028},[959,2459,2460,2461,982],{},"Essa camada é dona das credenciais, da configuração do serviço, da política de\nsincronização e da interface de busca no navegador. O duxt não ganha nenhuma\ndelas — ",[963,2462,2463],{"href":260},"que é toda a razão do formato do hook",[984,2465,2467],{"id":2466},"checklist","Checklist",[2469,2470,2473,2486,2492,2505,2514,2520],"ul",{"className":2471},[2472],"contains-task-list",[1132,2474,2477,2481,2482,2485],{"className":2475},[2476],"task-list-item",[2478,2479],"input",{"disabled":1183,"type":2480},"checkbox"," O cliente é dependência do ",[968,2483,2484],{},"seu"," site, não da camada",[1132,2487,2489,2491],{"className":2488},[2476],[2478,2490],{"disabled":1183,"type":2480}," A chave de administração vive no ambiente de build e nunca chega a uma página",[1132,2493,2495,2497,2498,1042,2500,2502,2503],{"className":2494},[2476],[2478,2496],{"disabled":1183,"type":2480}," A coleção é criada no primeiro build e faceta ",[992,2499,1377],{},[992,2501,1369],{}," e ",[992,2504,2221],{},[1132,2506,2508,2510,2511,2513],{"className":2507},[2476],[2478,2509],{"disabled":1183,"type":2480}," Registros não mais entregues são removidos — por comparação ",[968,2512,2158],{}," ou troca de alias",[1132,2515,2517,2519],{"className":2516},[2476],[2478,2518],{"disabled":1183,"type":2480}," Um build sem a chave pula a sincronização em vez de falhar",[1132,2521,2523,2525],{"className":2522},[2476],[2478,2524],{"disabled":1183,"type":2480}," Cada fonte, versão e idioma está representada na coleção",[2527,2528,2529],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":1007,"searchDepth":1032,"depth":1070,"links":2531},[2532,2533,2534,2535,2536],{"id":986,"depth":1032,"text":987},{"id":1124,"depth":1032,"text":368},{"id":2331,"depth":1032,"text":2332},{"id":2412,"depth":1032,"text":2413},{"id":2466,"depth":1032,"text":2467},"md",{},"---\ntitle: Typesense\ndescription: Consuma o único hook de build do duxt em uma coleção do Typesense — cada fonte, versão e idioma, atualizados por um id estável.\nicon: lucide:search\nredirectFrom:\n  - \u002Fguides\u002Fsend-your-pages-to-typesense\n---\n\nO duxt emite [um único hook de build](\u002Freference\u002Fhooks), e ele entrega cada\npágina de cada fonte, versão e idioma como registros planos. Um site que já\nopera o **Typesense** transforma esses registros em uma coleção própria — sem\nrastrear de novo o site renderizado e sem reimplementar a lógica de fontes,\nversões e locales do duxt.\n\n::callout{type=\"info\" title=\"O serviço é seu, não do duxt\"}\nO duxt não traz SDK do Typesense, credenciais nem configuração de serviço. A camada complementar opcional trata da integração; o serviço e as suas chaves são seus. Sem um fornecedor ou listener personalizado, o duxt [não constrói carga alguma](\u002Freference\u002Fhooks).\n::\n\n## Usar a camada complementar\n\nPara a integração pronta a usar, instala `@kirchdev\u002Fduxt-typesense` e estende-a depois do duxt. Sincroniza o conjunto completo através de uma coleção temporária e da troca de alias, remove a coleção anterior gerida e liga o diálogo de pesquisa existente com uma chave apenas de pesquisa. Os passos abaixo continuam a ser uma receita para sincronização personalizada.\n\n::package-managers{command=\"add @kirchdev\u002Fduxt-typesense\"}\n::\n\n```ts [nuxt.config.ts]\nexport default defineNuxtConfig({\n  extends: ['@kirchdev\u002Fduxt', '@kirchdev\u002Fduxt-typesense'],\n  duxtTypesense: {\n    endpoint: process.env.TYPESENSE_ENDPOINT,\n    collection: 'docs',\n    adminKey: process.env.TYPESENSE_ADMIN_KEY,\n    searchKey: process.env.TYPESENSE_SEARCH_KEY\n  }\n})\n```\n\nMantém a chave de administração exclusivamente na configuração de compilação. `searchKey` deve permitir apenas `documents:search` para este alias, e o Typesense deve aceitar pedidos do navegador a partir do teu site.\n\n## Passos\n\n::steps\n\n1. **Instale o cliente no seu site.** É uma dependência de build: a\n   sincronização roda no Node durante o `nuxt build`, nunca no navegador.\n\n   ::package-managers{command=\"add -D typesense\"}\n   ::\n\n2. **Declare a coleção.** Cada campo de um registro do duxt corresponde a um\n   campo do Typesense, e os dois campos de procedência são aqueles por que um\n   leitor filtra:\n\n   ```ts [server\u002Ftypesense-schema.ts]\n   import type { CollectionCreateSchema } from 'typesense';\n\n   export const docs: CollectionCreateSchema = {\n     name: 'docs',\n     fields: [\n       { name: 'url', type: 'string' },\n       { name: 'title', type: 'string' },\n       { name: 'content', type: 'string' },\n       { name: 'source', type: 'string', facet: true },\n       { name: 'version', type: 'string', facet: true, optional: true },\n       { name: 'locale', type: 'string', facet: true }\n     ]\n   };\n   ```\n\n   Tipado como `CollectionCreateSchema`, porque o passo 4 entrega este mesmo\n   objeto ao Typesense para criar a coleção com ele.\n\n   O `id` não está na lista de propósito: o Typesense já trata `id` como a\n   chave primária do documento, e o `id` do duxt é\n   [um resumo hexadecimal da URL](\u002Freference\u002Fhooks) — válido como chave, igual\n   em qualquer máquina e inalterado enquanto a página permanecer onde está. É\n   isso que permite à sincronização fazer **upsert** em vez de reconstruir.\n\n   `version` é `optional`, porque uma fonte com uma única versão não carrega\n   nenhuma. A versão é retirada de `source` deliberadamente, para que uma faceta\n   construída sobre ele sobreviva a um lançamento e `version` ao lado seja o que\n   estreita para uma só.\n\n3. **Escreva o módulo que ouve.** Um módulo Nuxt no seu próprio site é toda a\n   integração — `defineNuxtModule`, um hook, um import:\n\n   ```ts [modules\u002Ftypesense.ts]\n   import { defineNuxtModule } from '@nuxt\u002Fkit';\n   import { Client } from 'typesense';\n   import type { DuxtSearchRecord } from '@kirchdev\u002Fduxt\u002Fsearch-records';\n   import { docs } from '..\u002Fserver\u002Ftypesense-schema';\n\n   export default defineNuxtModule({\n     meta: { name: 'typesense-sync' },\n     setup(_options, nuxt) {\n       const key = process.env.TYPESENSE_ADMIN_KEY;\n       \u002F\u002F Sem chave é um build local, não uma falha: pule em vez de quebrá-lo.\n       if (!key) return;\n\n       nuxt.hook('duxt:search:records', async (records) => {\n         const client = new Client({\n           nodes: [{ url: process.env.TYPESENSE_URL! }],\n           apiKey: key\n         });\n\n         await sync(client, records);\n       });\n     }\n   });\n   ```\n\n   A carga está **congelada**. Mapeie-a para documentos seus — nunca reescreva\n   um registro nem ordene o array no lugar, porque todos os outros ouvintes\n   recebem os mesmos objetos.\n\n4. **Sincronize o conjunto inteiro e remova o que se foi.** O hook entrega o\n   conjunto *completo* e atual a cada build, então o próprio conjunto é a\n   instrução — tudo o que a coleção guarda e não está nele foi apagado, movido\n   ou renomeado:\n\n   ```ts [modules\u002Ftypesense.ts]\n   async function sync(client: Client, records: readonly DuxtSearchRecord[]) {\n     const collection = client.collections(docs.name);\n\n     \u002F\u002F O Typesense não cria nada implicitamente: importar para uma coleção\n     \u002F\u002F que não existe falha de imediato, então o primeiro build a cria.\n     if (!(await collection.exists())) await client.collections().create(docs);\n\n     await collection.documents().import(\n       records.map((record) => ({ ...record })),\n       { action: 'upsert' }\n     );\n\n     \u002F\u002F Tudo o que o build não entregou já não está no site.\n     const kept = new Set(records.map((record) => record.id));\n     const live = await collection.documents().export();\n\n     const stale = live\n       .split('\\n')\n       .filter(Boolean)\n       .map((line) => JSON.parse(line).id as string)\n       .filter((id) => !kept.has(id));\n\n     \u002F\u002F Apague em lotes: cada id entra na string do filtro, e uma única\n     \u002F\u002F renomeação grande construiria um que o Typesense rejeita.\n     for (let index = 0; index \u003C stale.length; index += 100) {\n       const batch = stale.slice(index, index + 100).join(',');\n       await collection.documents().delete({ filter_by: `id:[${batch}]` });\n     }\n   }\n   ```\n\n   A coleção é criada na primeira execução e deixada em paz depois, e os ids\n   obsoletos são apagados **em lotes** — o Typesense toma o filtro como uma\n   única string, e uma renomeação que mova uma fonte inteira construiria um\n   que ele rejeita.\n\n   ::callout{type=\"tip\" title=\"Ou troque um alias\"}\n   Importe para uma coleção nomeada pelo build, aponte um **alias** do Typesense\n   para ela e descarte a anterior. Cada build cria a própria coleção, então nem\n   a checagem de existência nem a exclusão em lotes são necessárias, e os\n   leitores nunca veem um índice escrito pela metade — ao custo de reindexar\n   tudo a cada build em vez de apenas o que mudou.\n   ::\n\n5. **Busque do navegador com uma chave só de busca.** A chave de administração\n   acima assina escritas e jamais pode chegar a uma página. Emita uma chave\n   **com escopo e apenas de busca** para o cliente, e filtre pelas facetas que o\n   esquema declarou:\n\n   ```ts\n   \u002F\u002F `locale` é o idioma do CONTEÚDO, não o idioma da interface.\n   \u002F\u002F `version` não existe numa fonte sem versões: a cláusula só entra quando\n   \u002F\u002F há uma; fixa, filtraria por `undefined`.\n   const filters = [`locale:${locale}`];\n   if (version) filters.push(`version:${version}`);\n\n   const results = await client.collections('docs').documents().search({\n     q: query,\n     query_by: 'title,content',\n     filter_by: filters.join(' && ')\n   });\n   ```\n\n6. **Confira um build de ponta a ponta.** Rode um build com a chave definida e\n   confirme que a coleção guarda um registro de uma página em **cada** fonte,\n   versão e idioma que o site serve — não apenas no padrão. O primeiro build\n   cria a coleção; cada um depois faz upsert na mesma.\n\n::\n\n## O que os registros já resolvem por você\n\nQuatro propriedades da carga são o que torna correta uma sincronização tão\ncurta, e todas as quatro são [o contrato do hook](\u002Freference\u002Fhooks), não o\nconselho deste guia:\n\n| Propriedade | O que ela dá à sincronização |\n| :--- | :--- |\n| `id` deriva de `url` | Uma chave primária estável, então `upsert` basta e reconstruir nunca é preciso |\n| A carga é o conjunto **completo** | Remover é comparar com um build, sem rastreio e sem contabilidade |\n| O duxt não dispara com uma análise vazia | Um build que nada analisou nunca pode mandar esvaziar o índice |\n| A ordem é determinística | Dois builds diferem exatamente onde o site diferiu |\n\nUma página que escreveu `search: false`, e uma tradução em um idioma que o site\nnão roteia, não produzem registros — então nenhuma delas chega ao Typesense.\n\n## Transformar isso em um pacote\n\nO módulo acima tem ~40 linhas e pertence a um site. Assim que um segundo site\nprecisar dele, a forma de compartilhá-lo é **uma camada Nuxt**, não um plugin:\numa camada carrega o módulo, seus padrões de `app.config` e seus componentes em\num pacote versionado, e um consumidor a adiciona ao lado do duxt.\n\n```ts [nuxt.config.ts]\nexport default defineNuxtConfig({\n  extends: ['@kirchdev\u002Fduxt', 'duxt-typesense']\n});\n```\n\nEssa camada é dona das credenciais, da configuração do serviço, da política de\nsincronização e da interface de busca no navegador. O duxt não ganha nenhuma\ndelas — [que é toda a razão do formato do hook](\u002Freference\u002Fhooks).\n\n## Checklist\n\n- [ ] O cliente é dependência do **seu** site, não da camada\n- [ ] A chave de administração vive no ambiente de build e nunca chega a uma página\n- [ ] A coleção é criada no primeiro build e faceta `source`, `version` e `locale`\n- [ ] Registros não mais entregues são removidos — por comparação **em lotes** ou troca de alias\n- [ ] Um build sem a chave pula a sincronização em vez de falhar\n- [ ] Cada fonte, versão e idioma está representada na coleção\n",[2541],"\u002Fguides\u002Fsend-your-pages-to-typesense",{"title":836,"description":839},{"loc":837},"qkLLO7Bsw9OcS4q9Hem8xPoGm6IsJlkkH2jGQTi51pA","pt","pt-BR",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2548},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09\"\u002F>\u003Cpath d=\"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z\"\u002F>\u003Cpath d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\"\u002F>\u003C\u002Fg>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2550},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m16.24 7.76l-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z\"\u002F>\u003C\u002Fg>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2552},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 5v16m8.001-2A2 2 0 0 0 22 17V5a2 2 0 0 0-1.999-2L16 3.002A5 5 0 0 0 12 5a5 5 0 0 0-4-2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 1.999 2H8a5 5 0 0 1 4 2a5 5 0 0 1 4-2z\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2554},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 5h.01M3 12h.01M3 19h.01M8 5h13M8 12h13M8 19h13\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2556},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Zm-6.8-2.8l2-2m-5-1l2-2m-5-1l2-2m7 11l2-2\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2558},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m14 13l-8.381 8.38a1 1 0 0 1-3.001-3l8.384-8.381M16 16l6-6m-.5.5l-8-8M8 8l6-6M8.5 7.5l8 8\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2560},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fg>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2562},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2564},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 5.88L14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88M7 10v12\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2566},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 18.12L10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88M17 14V2\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2568},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.12 2.12 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.12 2.12 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.12 2.12 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.12 2.12 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.12 2.12 0 0 0 1.597-1.16z\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2570},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 8v4m0 4h.01\"\u002F>\u003C\u002Fg>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2572},"\u003Cpath fill=\"currentColor\" d=\"M20.317 4.37a19.8 19.8 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.3 18.3 0 0 0-5.487 0a13 13 0 0 0-.617-1.25a.08.08 0 0 0-.079-.037A19.7 19.7 0 0 0 3.677 4.37a.1.1 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.08.08 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.08.08 0 0 0 .084-.028a14 14 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13 13 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10 10 0 0 0 .372-.292a.07.07 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.07.07 0 0 1 .078.01q.181.149.373.292a.077.077 0 0 1-.006.127a12.3 12.3 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.08.08 0 0 0 .084.028a19.8 19.8 0 0 0 6.002-3.03a.08.08 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.06.06 0 0 0-.031-.03M8.02 15.33c-1.182 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418m7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2574},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 5v16m4-8h2m-2-4h2m2.001 10A2 2 0 0 0 22 17V5a2 2 0 0 0-1.999-2L16 3.002A5 5 0 0 0 12 5a5 5 0 0 0-4-2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 1.999 2H8a5 5 0 0 1 4 2a5 5 0 0 1 4-2zM6 13h2M6 9h2\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2576},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2578,"hidden":1183},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4\"\u002F>\u003Cpath d=\"M14 2v4a2 2 0 0 0 2 2h4M5 12l-3 3l3 3m4 0l3-3l-3-3\"\u002F>\u003C\u002Fg>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2580},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 16v-4m0-4h.01\"\u002F>\u003C\u002Fg>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2582},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 14c.2-1 .7-1.7 1.5-2.5c1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5c.7.7 1.3 1.5 1.5 2.5m0 4h6m-5 4h4\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2584},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 19l-7-7l7-7m7 7H5\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2586},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2588},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m9 18l6-6l-6-6\"\u002F>",[2590,2591,2592,2593,2594,2595,2596,2597],"\u002Fv0.8.1\u002Fadd-ons\u002Ftypesense","\u002Fv0.7.0\u002Fadd-ons\u002Ftypesense","\u002Fv0.6.0\u002Fadd-ons\u002Ftypesense","\u002Fv0.5.0\u002Fadd-ons\u002Ftypesense","\u002Fv0.4.0\u002Fadd-ons\u002Ftypesense","\u002Fv0.3.4\u002Fadd-ons\u002Ftypesense","\u002Fv0.2.0\u002Fadd-ons\u002Ftypesense","\u002Fv0.1.0\u002Fadd-ons\u002Ftypesense",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2599},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2601},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 8h.01M12 12h.01M14 8h.01M16 12h.01M18 8h.01M6 8h.01M7 16h10m-9-4h.01\"\u002F>\u003Crect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2603},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":944,"top":944,"width":945,"height":945,"rotate":944,"vFlip":946,"hFlip":946,"body":2605},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"pnpm":2607,"npm":2608,"yarn":2609,"bun":2610},"\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">pnpm\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> @kirchdev\u002Fduxt-typesense\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">npm\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> install\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> @kirchdev\u002Fduxt-typesense\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">yarn\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> @kirchdev\u002Fduxt-typesense\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">bun\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> @kirchdev\u002Fduxt-typesense\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"left":944,"top":944,"width":2612,"height":2612,"rotate":944,"vFlip":946,"hFlip":946,"body":2613},32,"\u003Cpath fill=\"#f9ad00\" d=\"M30 10.75h-8.749V2H30Zm-9.626 0h-8.75V2h8.75Zm-9.625 0H2V2h8.749ZM30 20.375h-8.749v-8.75H30Z\"\u002F>\u003Cpath fill=\"#4e4e4e\" d=\"M20.374 20.375h-8.75v-8.75h8.75Zm0 9.625h-8.75v-8.75h8.75ZM30 30h-8.749v-8.75H30Zm-19.251 0H2v-8.75h8.749Z\"\u002F>",{"left":944,"top":944,"width":2612,"height":2612,"rotate":944,"vFlip":946,"hFlip":946,"body":2615},"\u003Cpath fill=\"#f9ad00\" d=\"M30 10.75h-8.749V2H30Zm-9.626 0h-8.75V2h8.75Zm-9.625 0H2V2h8.749ZM30 20.375h-8.749v-8.75H30Z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M20.374 20.375h-8.75v-8.75h8.75Zm0 9.625h-8.75v-8.75h8.75ZM30 30h-8.749v-8.75H30Zm-19.251 0H2v-8.75h8.749Z\"\u002F>",{"left":944,"top":944,"width":2612,"height":2612,"rotate":944,"vFlip":946,"hFlip":946,"body":2617},"\u003Cpath fill=\"#c12127\" d=\"M2 2h28v28H2\"\u002F>\u003Cpath fill=\"#fff\" d=\"M7.25 7.25h17.5v17.5h-3.5v-14H16v14H7.25\"\u002F>",{"left":944,"top":944,"width":2612,"height":2612,"rotate":944,"vFlip":946,"hFlip":946,"body":2619},"\u003Cpath fill=\"#2188b6\" d=\"M28.208 24.409a10.5 10.5 0 0 0-3.959 1.822a23.7 23.7 0 0 1-5.835 2.642a1.63 1.63 0 0 1-.983.55a62 62 0 0 1-6.447.577c-1.163.009-1.876-.3-2.074-.776a1.573 1.573 0 0 1 .866-2.074a4 4 0 0 1-.514-.379c-.171-.171-.352-.514-.406-.388c-.225.55-.343 1.894-.947 2.5c-.83.839-2.4.559-3.328.072c-1.019-.541.072-1.813.072-1.813a.73.73 0 0 1-.992-.343a4.85 4.85 0 0 1-.667-2.949a5.37 5.37 0 0 1 1.749-2.895a9.3 9.3 0 0 1 .658-4.4a10.45 10.45 0 0 1 3.165-3.661S6.628 10.747 7.35 8.817c.469-1.262.658-1.253.812-1.308a3.6 3.6 0 0 0 1.452-.857a5.27 5.27 0 0 1 4.41-1.7S15.2 1.4 16.277 2.09a18.4 18.4 0 0 1 1.533 2.886s1.281-.748 1.425-.469a11.33 11.33 0 0 1 .523 6.132a14 14 0 0 1-2.6 5.411c-.135.225 1.551.938 2.615 3.887c.983 2.7.108 4.96.262 5.212c.027.045.036.063.036.063s1.127.09 3.391-1.308a8.5 8.5 0 0 1 4.277-1.604a1.081 1.081 0 0 1 .469 2.11Z\"\u002F>",{"left":944,"top":944,"width":2612,"height":2612,"rotate":944,"vFlip":946,"hFlip":946,"body":2621},"\u003Cpath fill=\"#fbf0df\" d=\"M29 17c0 5.65-5.82 10.23-13 10.23S3 22.61 3 17c0-3.5 2.24-6.6 5.66-8.44S14.21 4.81 16 4.81s3.32 1.54 7.34 3.71C26.76 10.36 29 13.46 29 17\"\u002F>\u003Cpath fill=\"none\" stroke=\"#000\" d=\"M16 27.65c7.32 0 13.46-4.65 13.46-10.65c0-3.72-2.37-7-5.89-8.85c-1.39-.75-2.46-1.41-3.37-2l-1.13-.69A6.14 6.14 0 0 0 16 4.35a6.9 6.9 0 0 0-3.3 1.23c-.42.24-.86.51-1.32.8c-.87.54-1.83 1.13-3 1.73C4.91 10 2.54 13.24 2.54 17c0 6 6.14 10.65 13.46 10.65Z\"\u002F>\u003Cellipse cx=\"21.65\" cy=\"18.62\" fill=\"#febbd0\" rx=\"2.17\" ry=\"1.28\"\u002F>\u003Cellipse cx=\"10.41\" cy=\"18.62\" fill=\"#febbd0\" rx=\"2.17\" ry=\"1.28\"\u002F>\u003Cpath fill-rule=\"evenodd\" d=\"M11.43 18.11a2 2 0 1 0-2-2.05a2.05 2.05 0 0 0 2 2.05m9.2 0a2 2 0 1 0-2-2.05a2 2 0 0 0 2 2.05\"\u002F>\u003Cpath fill=\"#fff\" fill-rule=\"evenodd\" d=\"M10.79 16.19a.77.77 0 1 0-.76-.77a.76.76 0 0 0 .76.77m9.2 0a.77.77 0 1 0 0-1.53a.77.77 0 0 0 0 1.53\"\u002F>\u003Cpath fill=\"#b71422\" stroke=\"#000\" stroke-width=\".75\" d=\"M18.62 19.67a3.3 3.3 0 0 1-1.09 1.75a2.48 2.48 0 0 1-1.5.69a2.53 2.53 0 0 1-1.5-.69a3.28 3.28 0 0 1-1.08-1.75a.26.26 0 0 1 .29-.3h4.58a.27.27 0 0 1 .3.3Z\"\u002F>\u003Cpath fill=\"#ccbea7\" fill-rule=\"evenodd\" d=\"M14.93 5.75a6.1 6.1 0 0 1-2.09 4.62c-.1.09 0 .27.11.22c1.25-.49 2.94-1.94 2.23-4.88c-.03-.15-.25-.11-.25.04m.85 0a6 6 0 0 1 .57 5c0 .13.12.24.21.13c.83-1 1.54-3.11-.59-5.31c-.1-.11-.27.04-.19.17Zm1-.06a6.1 6.1 0 0 1 2.53 4.38c0 .14.21.17.24 0c.34-1.3.15-3.51-2.66-4.66c-.12-.02-.21.18-.09.27ZM9.94 9.55a6.27 6.27 0 0 0 3.89-3.33c.07-.13.28-.08.25.07c-.64 3-2.79 3.59-4.13 3.51c-.14-.01-.14-.21-.01-.25\"\u002F>",{"pnpm":2623,"npm":2624,"yarn":2625,"bun":2626},"\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">pnpm\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -D\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> typesense\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">npm\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> install\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -D\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> typesense\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">yarn\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -D\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> typesense\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">bun\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -D\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> typesense\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"left":944,"top":944,"width":2628,"height":2629,"rotate":944,"vFlip":946,"hFlip":946,"body":2630},640,480,"\u003Cg stroke-width=\"1pt\">\u003Cpath fill=\"#229e45\" fill-rule=\"evenodd\" d=\"M0 0h640v480H0z\"\u002F>\u003Cpath fill=\"#f8e509\" fill-rule=\"evenodd\" d=\"m321.4 436l301.5-195.7L319.6 44L17.1 240.7z\"\u002F>\u003Cpath fill=\"#2b49a3\" fill-rule=\"evenodd\" d=\"M452.8 240c0 70.3-57.1 127.3-127.6 127.3A127.4 127.4 0 1 1 452.8 240\"\u002F>\u003Cpath fill=\"#ffffef\" fill-rule=\"evenodd\" d=\"m283.3 316.3l-4-2.3l-4 2l.9-4.5l-3.2-3.4l4.5-.5l2.2-4l1.9 4.2l4.4.8l-3.3 3m86 26.3l-3.9-2.3l-4 2l.8-4.5l-3.1-3.3l4.5-.5l2.1-4.1l2 4.2l4.4.8l-3.4 3.1m-36.2-30l-3.4-2l-3.5 1.8l.8-3.9l-2.8-2.9l4-.4l1.8-3.6l1.6 3.7l3.9.7l-3 2.7m87-8.5l-3.4-2l-3.5 1.8l.8-3.9l-2.7-2.8l3.9-.4l1.8-3.5l1.6 3.6l3.8.7l-2.9 2.6m-87.3-22l-4-2.2l-4 2l.8-4.6l-3.1-3.3l4.5-.5l2.1-4.1l2 4.2l4.4.8l-3.4 3.2m-104.6-35l-4-2.2l-4 2l1-4.6l-3.3-3.3l4.6-.5l2-4.1l2 4.2l4.4.8l-3.3 3.1m13.3 57.2l-4-2.3l-4 2l.9-4.5l-3.2-3.3l4.5-.6l2.1-4l2 4.2l4.4.8l-3.3 3.1m132-67.3l-3.6-2l-3.6 1.8l.8-4l-2.8-3l4-.5l1.9-3.6l1.7 3.8l4 .7l-3 2.7m-6.7 38.3l-2.7-1.6l-2.9 1.4l.6-3.2l-2.2-2.3l3.2-.4l1.5-2.8l1.3 3l3 .5l-2.2 2.2m-142.2 50.4l-2.7-1.5l-2.7 1.3l.6-3l-2.1-2.2l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2M419 299.8l-2.2-1.1l-2.2 1l.5-2.3l-1.7-1.6l2.4-.3l1.2-2l1 2l2.5.5l-1.9 1.5\"\u002F>\u003Cpath fill=\"#ffffef\" fill-rule=\"evenodd\" d=\"m219.3 287.6l-2.7-1.5l-2.7 1.3l.6-3l-2.1-2.2l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2\"\u002F>\u003Cpath fill=\"#ffffef\" fill-rule=\"evenodd\" d=\"m219.3 287.6l-2.7-1.5l-2.7 1.3l.6-3l-2.1-2.2l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2m42.3 3l-2.6-1.4l-2.7 1.3l.6-3l-2.1-2.2l3-.4l1.4-2.7l1.3 2.8l3 .5l-2.3 2.1m-4.8 17l-2.6-1.5l-2.7 1.4l.6-3l-2.1-2.3l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2m87.4-22.2l-2.6-1.6l-2.8 1.4l.6-3l-2-2.3l3-.3l1.4-2.7l1.2 2.8l3 .5l-2.2 2.1m-25.1 3l-2.7-1.5l-2.7 1.4l.6-3l-2-2.3l3-.3l1.4-2.8l1.2 2.9l3 .5l-2.2 2.1m-68.8-5.8l-1.7-1l-1.7.8l.4-1.9l-1.3-1.4l1.9-.2l.8-1.7l.8 1.8l1.9.3l-1.4 1.3m167.8 45.4l-2.6-1.5l-2.7 1.4l.6-3l-2.1-2.3l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2m-20.8 6l-2.2-1.4l-2.3 1.2l.5-2.6l-1.7-1.8l2.5-.3l1.2-2.3l1 2.4l2.5.4l-1.9 1.8m10.4 2.3l-2-1.2l-2.1 1l.4-2.3l-1.6-1.7l2.3-.3l1.1-2l1 2l2.3.5l-1.7 1.6m29.1-22.8l-2-1l-2 1l.5-2.3l-1.6-1.7l2.3-.3l1-2l1 2.1l2.1.4l-1.6 1.6m-38.8 41.8l-2.5-1.4l-2.7 1.2l.6-2.8l-2-2l3-.3l1.3-2.5l1.2 2.6l3 .5l-2.3 1.9m.6 14.2l-2.4-1.4l-2.4 1.3l.6-2.8l-1.9-2l2.7-.4l1.2-2.5l1.1 2.6l2.7.5l-2 2m-19-23.1l-1.9-1.2l-2 1l.4-2.2l-1.5-1.7l2.2-.2l1-2l1 2l2.2.4l-1.6 1.6m-17.8 2.3l-2-1.2l-2 1l.5-2.2l-1.6-1.7l2.3-.2l1-2l1 2l2.1.4l-1.6 1.6m-30.4-24.6l-2-1.1l-2 1l.5-2.3l-1.6-1.6l2.2-.3l1-2l1 2l2.2.5l-1.6 1.5m3.7 57l-1.6-.9l-1.8.9l.4-2l-1.3-1.4l1.9-.2l.9-1.7l.8 1.8l1.9.3l-1.4 1.3m-46.2-86.6l-4-2.3l-4 2l.9-4.5l-3.2-3.3l4.5-.6l2.2-4l1.9 4.2l4.4.8l-3.3 3.1\"\u002F>\u003Cpath fill=\"#fff\" fill-rule=\"evenodd\" d=\"M444.4 285.8a125 125 0 0 0 5.8-19.8c-67.8-59.5-143.3-90-238.7-83.7a125 125 0 0 0-8.5 20.9c113-10.8 196 39.2 241.4 82.6\"\u002F>\u003Cpath fill=\"#309e3a\" d=\"m414 252.4l2.3 1.3a3 3 0 0 0-.3 2.2a3 3 0 0 0 1.4 1.7q1 .8 2 .7q.9 0 1.3-.7l.2-.9l-.5-1l-1.5-1.8a8 8 0 0 1-1.8-3a4 4 0 0 1 2-4.4a4 4 0 0 1 2.3-.2a7 7 0 0 1 2.6 1.2q2.1 1.5 2.6 3.2a4 4 0 0 1-.6 3.3l-2.4-1.5q.5-1 .2-1.7q-.2-.8-1.2-1.4a3 3 0 0 0-1.8-.7a1 1 0 0 0-.9.5q-.3.4-.1 1q.2.8 1.6 2.2t2 2.5a4 4 0 0 1-.3 4.2a4 4 0 0 1-1.9 1.5a4 4 0 0 1-2.4.3q-1.3-.3-2.8-1.3q-2.2-1.5-2.7-3.3a5 5 0 0 1 .6-4zm-11.6-7.6l2.5 1.3a3 3 0 0 0-.2 2.2a3 3 0 0 0 1.4 1.6q1.1.8 2 .6q.9 0 1.3-.8l.2-.8q0-.5-.5-1l-1.6-1.8q-1.7-1.6-2-2.8a4 4 0 0 1 .4-3.1a4 4 0 0 1 1.6-1.4a4 4 0 0 1 2.2-.3a7 7 0 0 1 2.6 1q2.3 1.5 2.7 3.1a4 4 0 0 1-.4 3.4l-2.5-1.4q.5-1 .2-1.7q-.4-1-1.3-1.4a3 3 0 0 0-1.9-.6a1 1 0 0 0-.8.5q-.3.4-.1 1q.3.8 1.7 2.2q1.5 1.5 2 2.4a4 4 0 0 1 0 4.2a4 4 0 0 1-1.8 1.6a4 4 0 0 1-2.4.3a8 8 0 0 1-2.9-1.1a6 6 0 0 1-2.8-3.2a5 5 0 0 1 .4-4m-14.2-3.8l7.3-12l8.8 5.5l-1.2 2l-6.4-4l-1.6 2.7l6 3.7l-1.3 2l-6-3.7l-2 3.3l6.7 4l-1.2 2zm-20.7-17l1.1-2l5.4 2.7l-2.5 5q-1.2.3-3 .2a9 9 0 0 1-3.3-1a8 8 0 0 1-3-2.6a6 6 0 0 1-1-3.5a9 9 0 0 1 1-3.7a8 8 0 0 1 2.6-3a6 6 0 0 1 3.6-1.1q1.4 0 3.2 1q2.4 1.1 3.1 2.8a5 5 0 0 1 .3 3.5l-2.7-.8a3 3 0 0 0-.2-2q-.4-.9-1.6-1.4a4 4 0 0 0-3.1-.3q-1.5.5-2.6 2.6t-.7 3.8a4 4 0 0 0 2 2.4q.8.5 1.7.5h1.8l.8-1.6zm-90.2-22.3l2-14l4.2.7l1.1 9.8l3.9-9l4.2.6l-2 13.8l-2.7-.4l1.7-10.9l-4.4 10.5l-2.7-.4l-1.1-11.3l-1.6 11zm-14.1-1.7l1.3-14l10.3 1l-.2 2.4l-7.5-.7l-.3 3l7 .7l-.3 2.4l-7-.7l-.3 3.8l7.8.7l-.2 2.4z\"\u002F>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"M216.5 191.3q0-2.2.7-3.6a7 7 0 0 1 1.4-1.9a5 5 0 0 1 1.8-1.2q1.5-.5 3-.5q3.1.1 5 2a7 7 0 0 1 1.6 5.5q0 3.3-2 5.3a7 7 0 0 1-5 1.7a7 7 0 0 1-4.8-2a7 7 0 0 1-1.7-5.3\"\u002F>\u003Cpath fill=\"#f7ffff\" d=\"M219.4 191.3q0 2.3 1 3.6t2.8 1.3a4 4 0 0 0 2.8-1.1q1-1.2 1.1-3.7q.1-2.4-1-3.6a4 4 0 0 0-2.7-1.3a4 4 0 0 0-2.8 1.2q-1.1 1.2-1.2 3.6\"\u002F>\u003C\u002Fg>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m233 198.5l.2-14h6q2.2 0 3.2.5q1 .3 1.6 1.3c.6 1 .6 1.4.6 2.3a4 4 0 0 1-1 2.6a5 5 0 0 1-2.7 1.2l1.5 1.2q.6.6 1.5 2.3l1.7 2.8h-3.4l-2-3.2l-1.4-2l-.9-.6l-1.4-.2h-.6v5.8z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M236 190.5h2q2.1 0 2.6-.2q.5-.1.8-.5q.4-.6.3-1q0-.9-.4-1.2q-.3-.4-1-.6h-2l-2.3-.1z\"\u002F>\u003C\u002Fg>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m249 185.2l5.2.3q1.7 0 2.6.3a5 5 0 0 1 2 1.4a6 6 0 0 1 1.2 2.4q.4 1.4.3 3.3a9 9 0 0 1-.5 3q-.6 1.5-1.7 2.4a5 5 0 0 1-2 1q-1 .3-2.5.2l-5.3-.3z\"\u002F>\u003Cpath fill=\"#fff\" d=\"m251.7 187.7l-.5 9.3h3.8q.8 0 1.2-.5q.5-.4.8-1.3t.4-2.6l-.1-2.5a3 3 0 0 0-.8-1.4l-1.2-.7l-2.3-.3z\"\u002F>\u003C\u002Fg>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m317.6 210.2l3.3-13.6l4.4 1l3.2 1q1.1.6 1.6 1.9t.2 2.8q-.3 1.2-1 2a4 4 0 0 1-3 1.4q-1 0-3-.5l-1.7-.5l-1.2 5.2z\"\u002F>\u003Cpath fill=\"#fff\" d=\"m323 199.6l-.8 3.8l1.5.4q1.6.4 2.2.3a2 2 0 0 0 1.6-1.5q0-.7-.2-1.3a2 2 0 0 0-1-.9l-1.9-.5l-1.3-.3z\"\u002F>\u003C\u002Fg>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m330.6 214.1l4.7-13.2l5.5 2q2.2.8 3 1.4q.8.7 1 1.8c.2 1.1.2 1.5 0 2.3q-.6 1.5-1.8 2.2q-1.2.6-3 .3q.6.7 1 1.6l.8 2.7l.6 3.1l-3.1-1.1l-1-3.6l-.7-2.4l-.6-.8q-.3-.4-1.3-.7l-.5-.2l-2 5.6z\"\u002F>\u003Cpath fill=\"#fff\" d=\"m336 207.4l1.9.7q2 .7 2.5.7t.9-.3q.5-.3.6-.9q.3-.6 0-1.2l-.8-.9l-2-.7l-2-.7l-1.2 3.3z\"\u002F>\u003C\u002Fg>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"M347 213.6a9 9 0 0 1 1.7-3.2l1.8-1.5l2-.7q1.5-.1 3.1.4a7 7 0 0 1 4.2 3.3q1.2 2.4.2 5.7a7 7 0 0 1-3.4 4.5q-2.3 1.3-5.2.4a7 7 0 0 1-4.2-3.3a7 7 0 0 1-.2-5.6\"\u002F>\u003Cpath fill=\"#fff\" d=\"M349.8 214.4q-.7 2.3 0 3.8c.7 1.5 1.2 1.6 2.3 2q1.5.5 3-.4q1.4-.8 2.1-3.2q.8-2.2 0-3.7a4 4 0 0 0-2.2-2a4 4 0 0 0-3 .3q-1.5.8-2.2 3.2\"\u002F>\u003C\u002Fg>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m374.3 233.1l6.4-12.4l5.3 2.7a10 10 0 0 1 2.7 1.9q.8.7.8 1.9c0 1.2 0 1.5-.4 2.2a4 4 0 0 1-2 2q-1.5.4-3.1-.2q.6 1 .8 1.7q.3.9.4 2.8l.2 3.2l-3-1.5l-.4-3.7l-.3-2.5l-.5-1l-1.2-.7l-.5-.3l-2.7 5.2z\"\u002F>\u003Cpath fill=\"#fff\" d=\"m380.5 227.2l1.9 1q1.8 1 2.3 1t1-.2q.4-.2.7-.8t.2-1.2l-.7-1l-1.8-1l-2-1z\"\u002F>\u003C\u002Fg>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"M426.1 258.7a9 9 0 0 1 2.5-2.6a7 7 0 0 1 2.2-.9a6 6 0 0 1 2.2 0q1.5.3 2.8 1.2a7 7 0 0 1 3 4.4q.4 2.6-1.4 5.5a7 7 0 0 1-4.5 3.3a7 7 0 0 1-5.2-1.1a7 7 0 0 1-3-4.4q-.4-2.7 1.4-5.4\"\u002F>\u003Cpath fill=\"#fff\" d=\"M428.6 260.3q-1.4 2-1.1 3.6a4 4 0 0 0 1.6 2.5q1.5 1 3 .6t2.9-2.4q1.4-2.1 1.1-3.6t-1.6-2.6c-1.4-1.1-2-.8-3-.5q-1.5.3-3 2.4z\"\u002F>\u003C\u002Fg>\u003Cpath fill=\"#309e3a\" d=\"m301.8 204.5l2.3-9.8l7.2 1.7l-.3 1.6l-5.3-1.2l-.5 2.2l4.9 1.1l-.4 1.7l-4.9-1.2l-.6 2.7l5.5 1.3l-.4 1.6z\"\u002F>\u003C\u002Fg>",1792683404142]