@oktis-works/admin 0.23.2 → 0.23.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/_astro/{ActivityWidget.Dzoi-bq3.js → ActivityWidget.C8vh6xAH.js} +1 -1
- package/dist/client/_astro/{AdminBar.eT1ch_B6.js → AdminBar.D4zIDpRx.js} +1 -1
- package/dist/client/_astro/{ApiKeysManager.kbTE1CPk.js → ApiKeysManager.Bkuipo9h.js} +1 -1
- package/dist/client/_astro/{AtGlanceWidget.w23IIv06.js → AtGlanceWidget.BwnpX_nn.js} +1 -1
- package/dist/client/_astro/{CommentsManager.BN7i1RHa.js → CommentsManager.B7eut49M.js} +1 -1
- package/dist/client/_astro/ContentEditor.CTopdn_8.js +1 -0
- package/dist/client/_astro/ContentTypeWorkspace.xXST4b7L.js +1 -0
- package/dist/client/_astro/{DashboardHome.DXzu_IXZ.js → DashboardHome.DD8QG8ZW.js} +1 -1
- package/dist/client/_astro/{DashboardLayout.astro_astro_type_script_index_0_lang.DmNSzErX.js → DashboardLayout.astro_astro_type_script_index_0_lang.DPDlXZ5o.js} +1 -1
- package/dist/client/_astro/{FieldGroupEditor.DsqphEgt.js → FieldGroupEditor.BBEN5r2U.js} +3 -3
- package/dist/client/_astro/{FieldGroupList.pW2Um9om.js → FieldGroupList.BatiQHnf.js} +1 -1
- package/dist/client/_astro/FieldRenderer.BeF5CSJf.js +3 -0
- package/dist/client/_astro/{Footer.5Lcn2VXz.js → Footer.BdwB3qmM.js} +1 -1
- package/dist/client/_astro/{GeneralSettings.B-H8Rzy7.js → GeneralSettings.BCfrxm6Z.js} +1 -1
- package/dist/client/_astro/{LogsManager.Crd8q2te.js → LogsManager.Bs5CSVoj.js} +1 -1
- package/dist/client/_astro/{MediaLibrary.Cv6Ry3u9.js → MediaLibrary.CHn5f4-T.js} +1 -1
- package/dist/client/_astro/{MenuManager.D25ika09.js → MenuManager.C6SrDqdC.js} +1 -1
- package/dist/client/_astro/{Modal.572hmVvb.js → Modal.DdoTYkUe.js} +1 -1
- package/dist/client/_astro/PluginManager.BLpO1lc5.js +112 -0
- package/dist/client/_astro/PluginPageHost.CuXn-tn7.js +1 -0
- package/dist/client/_astro/{PostTypesManager.C3RbmOZT.js → PostTypesManager.B6XdeNQH.js} +1 -1
- package/dist/client/_astro/{QuickDraftWidget.BtSGzhKq.js → QuickDraftWidget.COnmqwEP.js} +1 -1
- package/dist/client/_astro/{ReadingSettings.ZFDaeo5U.js → ReadingSettings.dAD5fTqQ.js} +1 -1
- package/dist/client/_astro/{ResourceHubs.Cx9fbCv1.js → ResourceHubs.B6txFjmO.js} +1 -1
- package/dist/client/_astro/{TaxonomiesManager.BLsvmjaL.js → TaxonomiesManager.CUiXA1--.js} +1 -1
- package/dist/client/_astro/{TaxonomyTermsManager.C_xEh8Ab.js → TaxonomyTermsManager.egxIFsFi.js} +1 -1
- package/dist/client/_astro/{ThemeCustomizer.BrDHVXLk.js → ThemeCustomizer.Bh3Gj0ud.js} +1 -1
- package/dist/client/_astro/{ThemeManager.BpS3m7Qc.js → ThemeManager.UG7ieOYF.js} +1 -1
- package/dist/client/_astro/{UserCreateForm.BYwgAqKk.js → UserCreateForm.CTbVVXjg.js} +1 -1
- package/dist/client/_astro/{UsersManager.DODMr48D.js → UsersManager.Dk2kJsYG.js} +1 -1
- package/dist/client/_astro/{WebhooksManager.DmWIW272.js → WebhooksManager.DTMl6Bm7.js} +1 -1
- package/dist/client/_astro/{api.53l1ob4Z.js → api.fpBzBw4U.js} +1 -1
- package/dist/client/_astro/extensions.DZ7iomLj.js +1 -0
- package/dist/client/_astro/i18n.DQYU1D_P.js +1 -0
- package/dist/client/_astro/{login.astro_astro_type_script_index_0_lang.BLf2Iun3.js → login.astro_astro_type_script_index_0_lang.DA827d72.js} +1 -1
- package/dist/client/_astro/{pt-BR.zZcF2v3X.js → pt-BR.C041vzOT.js} +1 -1
- package/dist/client/_astro/slots.CSARb9TW.js +1 -0
- package/dist/client/_astro/store.CjNcmZUB.js +1 -0
- package/dist/server/chunks/{404_BAOD9OCa.mjs → 404_vQwudBEj.mjs} +1 -1
- package/dist/server/chunks/{BaseLayout_BE8O-LS4.mjs → BaseLayout_CJGULIpb.mjs} +3 -3
- package/dist/server/chunks/{ContentEditor_DPy3I4HM.mjs → ContentEditor_D3hp0Gyo.mjs} +49 -11
- package/dist/server/chunks/{DashboardLayout_D6zphdT0.mjs → DashboardLayout_DvfGK5S9.mjs} +20 -17
- package/dist/server/chunks/{FieldRenderer_D4dcZjgt.mjs → FieldRenderer_hN7BJpMp.mjs} +6 -6
- package/dist/server/chunks/{MediaLibrary_DGmYSSZH.mjs → MediaLibrary_BP42MRyJ.mjs} +2 -2
- package/dist/server/chunks/{Modal_BmuvdwoB.mjs → Modal_Ch2TxBxO.mjs} +1 -1
- package/dist/server/chunks/_.._DuD24v6o.mjs +76 -0
- package/dist/server/chunks/{_id__XEnJ5nS2.mjs → _id__DK_jXL1Q.mjs} +4 -4
- package/dist/server/chunks/{access_B5npG273.mjs → access_pGLFLBaE.mjs} +3 -3
- package/dist/server/chunks/{api-keys_Bs6zIXYm.mjs → api-keys_BPiWCywt.mjs} +3 -3
- package/dist/server/chunks/{comments_zJrnFEjl.mjs → comments_HtxLK4Vu.mjs} +2 -2
- package/dist/server/chunks/{custom-fields_C5EBkR02.mjs → custom-fields_CLqVsj2N.mjs} +2 -2
- package/dist/server/chunks/{customize_CKqMX14y.mjs → customize_C8xbYnPi.mjs} +3 -3
- package/dist/server/chunks/{edit_QKBYgFkJ.mjs → edit_CHln4Kd_.mjs} +2 -2
- package/dist/server/chunks/{i18n_C-sgJSi1.mjs → i18n_BlAR9yiz.mjs} +23 -2
- package/dist/server/chunks/{index_BM_-WBYo.mjs → index_BiKJEUK6.mjs} +2 -2
- package/dist/server/chunks/{index_BletZ9T6.mjs → index_CNk9hfS_.mjs} +3 -3
- package/dist/server/chunks/{index_CDwohy44.mjs → index_COr5MHJ7.mjs} +2 -2
- package/dist/server/chunks/{index_DenKi4a3.mjs → index_DK_fTf2_.mjs} +2 -2
- package/dist/server/chunks/{index_Btvmuytk.mjs → index_T7SwCQJ9.mjs} +2 -2
- package/dist/server/chunks/{login_CtIWLqC2.mjs → login_4_AiN3uA.mjs} +1 -1
- package/dist/server/chunks/{logs_DlTldv5b.mjs → logs_BnmhxL0Y.mjs} +2 -2
- package/dist/server/chunks/{menus_z2d_K44p.mjs → menus_CnlArgBT.mjs} +2 -2
- package/dist/server/chunks/{new_CYvLScge.mjs → new_BLx19-Ni.mjs} +2 -2
- package/dist/server/chunks/{new_Cxp8Mdw4.mjs → new_CtlziJrk.mjs} +2 -2
- package/dist/server/chunks/{plugins_4g6EEkCb.mjs → plugins_CgMxXTGS.mjs} +13 -5
- package/dist/server/chunks/{post-types_7cW4BLBV.mjs → post-types_cQc2Msvm.mjs} +2 -2
- package/dist/server/chunks/{pt-BR_AVNE88MZ.mjs → pt-BR_B8bZo1Id.mjs} +7 -1
- package/dist/server/chunks/{reading_2DqfBhj_.mjs → reading_0A4laJFd.mjs} +2 -2
- package/dist/server/chunks/{taxonomies_D7mMKpNX.mjs → taxonomies_CiAk4uQu.mjs} +2 -2
- package/dist/server/chunks/{taxonomy_64ggDTF9.mjs → taxonomy_C1yrRsga.mjs} +3 -3
- package/dist/server/chunks/{themes_Dscq-5uk.mjs → themes_C8eP1zzS.mjs} +2 -2
- package/dist/server/chunks/{upload_B-DdqpaQ.mjs → upload_BNO83SEC.mjs} +2 -2
- package/dist/server/chunks/{webhooks_D05B4_Rs.mjs → webhooks_BQe0fs4j.mjs} +2 -2
- package/dist/server/entry.mjs +43 -43
- package/dist/server/virtual_astro_middleware.mjs +1 -1
- package/package.json +3 -3
- package/dist/client/_astro/ContentEditor.BlsJ2bwD.js +0 -1
- package/dist/client/_astro/ContentTypeWorkspace.BPVuQgzA.js +0 -1
- package/dist/client/_astro/FieldRenderer.AYtSBfHZ.js +0 -3
- package/dist/client/_astro/PluginManager.DLfgQFPF.js +0 -112
- package/dist/client/_astro/extensions.DzQcQsO9.js +0 -1
- package/dist/client/_astro/i18n.A82w5XQu.js +0 -1
- package/dist/client/_astro/preload-helper.oCYlU9a4.js +0 -1
- package/dist/client/_astro/store.DLCqLxBR.js +0 -1
- package/dist/server/chunks/_slug__BkXrukGe.mjs +0 -34
|
@@ -1 +1 @@
|
|
|
1
|
-
var e={appName:`OkCMS`,admin:`Admin`,nav:{dashboard:`Painel`,content:`Conteúdo`,media:`Mídia`,users:`Usuários`,menus:`Menus`,settings:`Configurações`,plugins:`Plugins`,themes:`Temas`,customize:`Personalizar`,comments:`Comentários`,settings_reading:`Leitura`},actions:{logout:`Sair`,newPost:`Novo Post`,uploadMedia:`Enviar Mídia`,addUser:`Adicionar Usuário`,openSettings:`Configurações`}},t={title:`Painel`,stats:{totalContent:`Total de Conteúdos`,published:`Publicados`,drafts:`Rascunhos`,mediaFiles:`Arquivos de Mídia`,users:`Usuários`},recent:{title:`Conteúdos Recentes`,viewAll:`Ver Todos`,empty:`Nenhum conteúdo ainda — crie o primeiro!`,columns:{title:`Título`,type:`Tipo`,status:`Status`,updated:`Atualizado`}},widgets:{atGlance:`De relance`,posts:`Posts`,postsDesc:`Publicados / Rascunhos / Lixeira`,pages:`Páginas`,pagesDesc:`Publicadas / Rascunhos / Lixeira`,media:`Mídia`,mediaDesc:`Arquivos na biblioteca`,users:`Usuários`,usersDesc:`Total / Ativos / Inativos`,storage:`Armazenamento`,quickDraft:{title:`Rascunho rápido`,heading:`Título`,headingPlaceholder:`Dê um título ao seu rascunho`,content:`Conteúdo`,contentPlaceholder:`O que está pensando?`,save:`Salvar rascunho`,yourDrafts:`Seus rascunhos`,noDrafts:`Nenhum rascunho ainda.`},activity:{title:`Atividade`,empty:`Nenhuma atividade ainda.`}}},n={list:{title:`Conteúdo`,description:`Busque, filtre, edite e publique seu conteúdo.`,typeNotFound:`Este tipo de conteúdo não foi encontrado.`,columns:{title:`Título`,type:`Tipo`,status:`Status`,updated:`Atualizado`},actions:{edit:`Editar`,publish:`Publicar`,unpublish:`Despublicar`,delete:`Excluir`},filters:{search:`Buscar conteúdo…`,allTypes:`Todos os tipos`,allStatus:`Todos os status`},buttons:{new:`+ Novo conteúdo`,addNew:`+ Adicionar novo`,search:`Buscar`},all:`Todo o conteúdo`,empty:`Nenhum conteúdo encontrado.`,statuses:{draft:`Rascunho`,published:`Publicado`,archived:`Arquivado`},confirmDelete:`Excluir "{title}"?`,toasts:{published:`Conteúdo publicado ✓`,unpublished:`Conteúdo despublicado ✓`}},editor:{type:`Tipo`,adding:`Adicionar novo`,editing:`Editar`,backToList:`Voltar para a lista`,saving:`Salvando…`,title:`Título`,titlePlaceholder:`Adicione um título`,slug:`Slug`,slugPlaceholder:`gerado-a-partir-do-titulo`,toolbar:`Barra de ferramentas do editor`,bodyPlaceholder:`Comece a escrever…`,linkPrompt:`Digite a URL:`,excerpt:`Resumo`,featuredImage:`Imagem destacada (ID da mídia)`,mediaIdPlaceholder:`ID da mídia`,featuredImageHint:`Escolha um item na Biblioteca de Mídia.`,pageAttributes:`Atributos da página`,publishPanel:`Publicar`,status:`Status`,statusOptions:{draft:`Rascunho`,published:`Publicado`,archived:`Arquivado`},layout:`Layout`,layoutAuto:`Automático (hierarquia do tema)`,customFields:`Campos personalizados`,inspectTypes:`Inspecionar tipos disponíveis`,save:`Salvar`,saved:`Conteúdo salvo com sucesso.`,format:`Formato`,formatParagraph:`Parágrafo`,formatH1:`Título 1`,formatH2:`Título 2`,formatH3:`Título 3`,formatH4:`Título 4`,formatBlockquote:`Bloco de citação`,formatCode:`Código`,bold:`Negrito`,italic:`Itálico`,underline:`Sublinhado`,bulletList:`Lista com marcadores`,numberedList:`Lista numerada`,link:`Link`},taxonomy:{title:`Termos da taxonomia`,back:`← Voltar para o conteúdo`,choose:`Escolha uma taxonomia no menu de conteúdo.`,notFound:`Taxonomia não encontrada.`,addTerm:`Adicionar novo termo`,editTerm:`Editar termo`,name:`Nome`,slug:`Slug`,description:`Descrição`,descriptionHint:`Gerencie os termos usados por este tipo de conteúdo.`,attachedTo:`Vinculada a`,add:`Adicionar termo`,delete:`Excluir`,empty:`Nenhum termo ainda.`,confirmDelete:`Excluir "{name}"?`,termFields:`Campos do termo`}},r={title:`Biblioteca de Mídia`,description:"Envie e gerencie imagens, vídeos e documentos. Os arquivos ficam em `uploads/` e são servidos publicamente.",upload:{dropzone:`Arraste arquivos aqui ou`,select:`Selecionar arquivos`,uploading:`Enviando…`,hint:`Imagens, vídeos, áudios e documentos · até 25MB por arquivo`},toolbar:{search:`Buscar por nome ou alt…`,allTypes:`Todos os tipos`,searchBtn:`Buscar`},mimeTypes:{png:`PNG`,jpeg:`JPEG`,gif:`GIF`,webp:`WebP`,svg:`SVG`,pdf:`PDF`,mp4:`MP4`,mp3:`MP3`},empty:`Nenhum arquivo ainda. Envie o primeiro!`,details:{title:`Detalhes`,titleField:`Título`,file:`Arquivo`,type:`Tipo`,size:`Tamanho`,dimensions:`Dimensões`,uploaded:`Enviado em`,url:`URL`,copy:`Copiar`,alt:`Texto alternativo (alt)`,caption:`Legenda`,description:`Descrição`,save:`Salvar detalhes`,replace:`Substituir arquivo`,replacing:`Substituindo…`,replaceHint:`Mantém o mesmo item e seus metadados.`,delete:`Excluir`,close:`Fechar`,confirmDelete:`Excluir "{filename}"? O arquivo será removido do disco.`,saved:`Detalhes salvos ✓`,copied:`URL copiada ✓`,copyError:`Não foi possível copiar a URL`,replaced:`Arquivo substituído ✓`},toasts:{uploaded:`{count} arquivo(s) enviado(s) ✓`}},i={title:`Usuários`,description:`Gerencie contas, papéis (roles) e acessos do projeto.`,new:`Novo Usuário`,toolbar:{search:`Buscar por nome ou email…`,allStatus:`Todos os status`,active:`Ativos`,inactive:`Inativos`,newBtn:`+ Novo usuário`,searchBtn:`Buscar`},table:{name:`Nome`,email:`Email`,role:`Papel`,status:`Status`,lastAccess:`Último acesso`,actions:{manage:`Gerenciar`,delete:`Excluir`}},empty:`Nenhum usuário encontrado.`,noRole:`Sem função`,detail:{title:`Gerenciar usuário`,fields:{name:`Nome`,email:`Email`,status:`Status`,role:`Papel`,password:`Senha`},statusOptions:{active:`Ativo`,inactive:`Inativo`},rolePlaceholder:`— sem papel —`,meta:`Criado em {created} · último acesso {lastAccess}`,actions:{save:`Salvar`,resetPassword:`Redefinir senha`,close:`Fechar`},passwordPrompt:`Nova senha para {email} (mínimo 8 caracteres):`,passwordError:`A senha precisa de pelo menos 8 caracteres`,toasts:{roleUpdated:`Papel de {name} atualizado ✓`,passwordChanged:`Senha de {name} alterada ✓`,saved:`Usuário {name} salvo ✓`,deleted:`Usuário {name} excluído ✓`},confirmDelete:`Excluir o usuário {email}?`}},a=JSON.parse(`{"general":{"title":"Geral","description":"Informações básicas exibidas no site.","back":"← Todas as configurações","fields":{"siteTitle":"Título do site","siteTitlePlaceholder":"Meu Site","siteDescription":"Descrição","siteDescriptionPlaceholder":"Um novo site feito com OkCMS","language":"Idioma","timezone":"Fuso horário","timezonePlaceholder":"America/Sao_Paulo"},"saved":"Configurações salvas ✓","loading":"Carregando…","save":"Salvar"},"postTypes":{"title":"Tipos de Conteúdo","description":"Crie tipos de conteúdo personalizados (CPTs) além de Posts e Páginas.","form":{"title":"Criar Tipo de Conteúdo","slug":"Slug (singular, ex.: portfolio)","slugHint":"Apenas letras minúsculas, números e underscore","singular":"Nome no singular","plural":"Nome no plural","supports":"Suporta","supportsOptions":{"title":"Título","editor":"Editor","thumbnail":"Imagem destacada","excerpt":"Resumo","revisions":"Revisões"},"hasArchive":"Possui arquivo público (/slug)","singleton":"Singleton (apenas um conteúdo)","icon":"Ícone do menu lateral","iconHint":"Escolha um ícone Lucide — o nome dele é o que aparece no menu do admin","iconSearchPlaceholder":"Buscar ícones…","iconEmpty":"Nenhum ícone encontrado.","iconCount":"{count} ícones disponíveis","editTitle":"Editar Tipo de Conteúdo","update":"Atualizar","cancel":"Cancelar","create":"Criar"},"table":{"slug":"Slug","singular":"Singular","plural":"Plural","source":"Origem","supports":"Suporta","archive":"Arquivo","mode":"Modo","singleton":"Singleton","collection":"Coleção","icon":"Ícone","actions":{"edit":"Editar","remove":"Remover"}},"sources":{"admin":"Admin","core":"Core"}},"taxonomies":{"title":"Taxonomias","description":"Crie taxonomias personalizadas e vincule-as aos content types.","form":{"title":"Criar Taxonomia","name":"Nome (ex.: Gênero)","slug":"Slug (opcional, gerado do nome)","slugHint":"Apenas letras minúsculas, números e underscore","hierarchical":"Hierárquica (permite termos pai/filho)","attachTo":"Vincular aos content types","create":"Criar"},"table":{"taxonomy":"Taxonomia","hierarchical":"Hierárquica","attachedTypes":"Content types vinculados","actions":{"remove":"Remover"}}},"customFields":{"title":"Campos personalizados","description":"Crie grupos de campos, organize os campos e escolha quais campos padrão ficam visíveis em cada tipo de conteúdo.","contentType":"Tipo de conteúdo","location":{"title":"Regras de localização","description":"Escolha onde este grupo aparece. Regras no mesmo grupo usam E; grupos diferentes usam OU.","parameter":"Parâmetro de localização","operator":"Operador","chooseValue":"Escolha um valor","valuePlaceholder":"Digite um valor ou slug","showIf":"Mostrar se","removeRule":"Remover regra","required":"Adicione um valor a todas as regras de localização.","addRule":"Adicionar condição","addGroup":"Adicionar grupo OU","remove":"Remover","and":"E","or":"OU","params":{"content_type":"Tipo de post","content_slug":"Slug do post","taxonomy":"Taxonomia","term":"Slug do termo","user_role":"Papel do usuário","page_template":"Template da página","post_status":"Status do post","block":"Bloco"},"operators":{"eq":"é","neq":"não é"}},"standard":{"title":"Campos padrão","description":"Título e slug são obrigatórios. Os demais campos padrão podem ser ativados ou desativados.","enabled":"Ativo","locked":"Obrigatório","fields":{"title":"Título","slug":"Slug","content":"Conteúdo","excerpt":"Resumo","featured_image":"Imagem destacada","seo_title":"Título SEO","seo_description":"Descrição SEO","status":"Status","author":"Autor"}},"groups":{"title":"Grupos de campos","new":"Novo grupo de campos","empty":"Ainda não há grupos de campos personalizados.","emptyHint":"Crie seu primeiro grupo para começar a modelar o conteúdo.","search":"Buscar grupos…","groupName":"Grupo","status":"Status","fields":"campos","appliesTo":"Aplicado a","allContentTypes":"Todos os tipos de conteúdo","edit":"Editar","active":"Ativo","inactive":"Inativo"},"form":{"createTitle":"Criar grupo de campos","editTitle":"Editar grupo de campos","title":"Nome do grupo","titlePlaceholder":"Ex.: Detalhes do produto","displayTitle":"Título exibido","active":"Ativo","backToGroups":"Voltar aos grupos","editorEyebrow":"Construtor de campos","groupTitleHint":"O nome identifica este conjunto de campos dentro do editor de conteúdo.","fieldsTitle":"Campos","fieldsDescription":"Adicione, configure e ordene os campos. Use os seis pontos para arrastar sem perder a posição.","noFields":"Este grupo ainda não possui campos.","settingsTitle":"Configurações do grupo","settingsDescription":"Opções de apresentação e visibilidade do painel.","description":"Descrição","labelPlacement":"Posição dos rótulos","instructionPlacement":"Posição das instruções","menuOrder":"Ordem do menu","hideOnScreen":"Ocultar na tela de edição","hide":{"permalink":"Link permanente","content":"Editor de conteúdo","excerpt":"Resumo","featured_image":"Imagem destacada","author":"Autor","revisions":"Revisões","comments":"Comentários"},"assignTitle":"Localização","assignDescription":"Escolha o content type onde este grupo de campos estará disponível.","contentType":"Content type","position":"Posição","positions":{"normal":"Normal","side":"Barra lateral","after_title":"Após o título"},"displayStyle":"Estilo de exibição","displayStyles":{"standard":"Padrão","seamless":"Contínuo","grouped":"Agrupado"},"field":"Campo","fieldName":"Nome/chave","fieldNamePlaceholder":"codigo_produto","fieldLabel":"Rótulo","fieldLabelPlaceholder":"Código do produto","fieldType":"Tipo","instructions":"Instruções","instructionsPlaceholder":"Texto de ajuda opcional para editores","required":"Obrigatório","options":"Opções","optionsHint":"Uma opção por linha: valor|Rótulo","addField":"Adicionar campo","removeField":"Remover","dragHint":"Arraste para reordenar","editField":"Editar","duplicateField":"Duplicar","copySuffix":"(cópia)","selectFieldType":"Selecionar tipo de campo","searchFieldTypes":"Buscar tipos de campo…","popularFields":"Populares","noMatchingFieldTypes":"Nenhum tipo de campo encontrado.","fieldTypeHint":"Escolha o tipo que melhor representa o valor que será editado neste campo.","selectField":"Selecionar campo","save":"Salvar grupo","cancel":"Cancelar","newFieldDefault":"Novo campo","saved":"Grupo de campos salvo.","deleted":"Grupo de campos excluído."},"listEyebrow":"Estrutura de conteúdo","validation":{"titleRequired":"O nome do grupo é obrigatório."},"tabs":{"locationRules":"Regras de localização","presentation":"Apresentação","groupSettings":"Configurações do grupo"},"fieldSettings":{"general":"Geral","fieldLabel":"Rótulo do campo","fieldName":"Nome do campo","instructions":"Instruções","required":"Obrigatório","defaultValue":"Valor padrão","placeholder":"Placeholder","presentation":"Apresentação","wrapperWidth":"Largura do wrapper (%)","labelPlacement":"Rótulo","instructionPlacement":"Instruções","top":"Acima","left":"À esquerda","above":"Antes do campo","below":"Depois do campo","textSettings":"Texto","prepend":"Prefixo","append":"Sufixo","minLength":"Tamanho mínimo","maxLength":"Tamanho máximo","rows":"Linhas","newLines":"Novas linhas","wpautop":"Parágrafos automáticos","none":"Nenhuma","numberSettings":"Número","min":"Mínimo","max":"Máximo","step":"Incremento","choiceSettings":"Escolhas","choices":"Opções","layout":"Layout","vertical":"Vertical","horizontal":"Horizontal","multiple":"Múltipla escolha","allowNull":"Permitir vazio","mediaSettings":"Mídia","returnFormat":"Formato de retorno","array":"Array","id":"ID","previewSize":"Tamanho da prévia","library":"Biblioteca","all":"Todos","uploadedToPost":"Enviados neste conteúdo","allowedTypes":"Tipos permitidos","minWidth":"Largura mínima","maxWidth":"Largura máxima","minHeight":"Altura mínima","maxHeight":"Altura máxima","wysiwygSettings":"Editor visual","tabs":"Abas","toolbar":"Barra de ferramentas","mediaUpload":"Permitir envio de mídia","dateSettings":"Data e hora","displayFormat":"Formato de exibição","firstDay":"Primeiro dia da semana","colorSettings":"Cor","enableOpacity":"Permitir transparência","mapSettings":"Mapa","center":"Centro","zoom":"Zoom","height":"Altura","relationSettings":"Relacionamento","postType":"Tipo de conteúdo","taxonomy":"Taxonomia","booleanSettings":"Verdadeiro/Falso","message":"Mensagem","defaultChecked":"Marcado por padrão","linkSettings":"Link","cloneSettings":"Clone","cloneFields":"Campos para clonar","cloneHint":"Um nome de campo por linha","containerSettings":"Estrutura","buttonLabel":"Texto do botão","collapsed":"Campo usado como título da linha","subFields":"Subcampos","layouts":"Layouts","addLayout":"Adicionar layout","newLayout":"Novo layout","layoutName":"Nome do layout","layoutLabel":"Rótulo do layout","layoutDisplay":"Exibição do layout","conditionalLogic":"Lógica condicional","conditionalHint":"Mostra este campo apenas quando as regras forem atendidas.","chooseField":"Escolha um campo","conditionValue":"Valor","addCondition":"Adicionar condição","addConditionGroup":"Adicionar grupo OU","conditionsAnd":"As condições deste grupo usam E.","choicesHint":"Uma opção por linha no formato valor|Rótulo.","cloneSource":"Grupo ou campo de origem","cloneSourceHint":"Chave do grupo ou nome do campo de onde copiar os campos.","requiredOn":"Obrigatório","requiredOff":"Não obrigatório","pluginConfig":"Configuração do Plugin","mermaid":{"diagramSettings":"Configurações do Diagrama","theme":"Tema","selectTheme":"Selecionar tema","editable":"Permitir edição no editor de conteúdo","defaultCode":"Código Mermaid Padrão","defaultCodeHint":"Código inicial quando o campo for adicionado a um conteúdo. O usuário poderá editar depois.","examples":"Exemplos","exampleFlowchart":"Fluxograma","exampleSequence":"Sequência","exampleClass":"Diagrama de Classes","diagram":"Diagrama Mermaid","copyCode":"Copiar código","rerender":"Re-renderizar","showCode":"Mostrar código fonte","renderError":"Erro ao renderizar","rendering":"Renderizando diagrama..."},"libraryAll":"Toda a biblioteca","libraryUploaded":"Enviados neste conteúdo","ui":"UI aprimorada","uiHint":"Usa estilo aprimorado para o dropdown.","wrapperClass":"Classe do wrapper","wrapperWidthHint":"Largura CSS do wrapper do campo, ex.: 50%.","collapsedHint":"Nome do subcampo usado como título da linha.","conditionalActive":"Ativa","showIf":"Mostrar se","removeRule":"Remover regra","and":"E","or":"OU","noLayouts":"Nenhum layout ainda.","validation":"Validação","advanced":"Avançado","fieldType":"Tipo","fieldNameHint":"Apenas letras, números e sublinhados.","ariaLabel":"Configurações do campo","operators":{"eq":"é igual a","neq":"não é igual a","gt":"é maior que","lt":"é menor que","contains":"contém","hasAny":"tem algum valor","hasNone":"está vazio"}},"actions":{"delete":"Excluir","confirmDelete":"Excluir este grupo de campos?","edit":"Editar","duplicate":"Duplicar","activate":"Ativar","deactivate":"Desativar","export":"Exportar","import":"Importar"},"import":{"description":"Importe grupos de campos a partir de um arquivo JSON. O arquivo deve conter um objeto de grupo de campos ou um array de grupos. Grupos existentes com a mesma chave serão atualizados; novos grupos serão criados.","dropzone":"Clique para selecionar um arquivo .json, ou arraste e solte aqui","hint":"Arquivo selecionado. Clique em Importar para prosseguir."},"loading":"Carregando campos personalizados…","loadError":"Não foi possível carregar os campos personalizados."},"reading":{"title":"Leitura","description":"Configure como sua página inicial e página de posts são exibidas.","frontPageDisplays":"Sua página inicial exibe","frontPageDisplaysOptions":{"latest":"Seus últimos posts","static":"Uma página estática"},"frontPage":"Página inicial","postsPage":"Página de posts","selectPage":"— Selecione uma página —","saved":"Configurações de leitura salvas ✓","save":"Salvar alterações","timezoneString":"Fuso Horário","timezoneStringPlaceholder":"America/Sao_Paulo","gmtOffset":"Deslocamento GMT","gmtOffsetPlaceholder":"-3","timezoneDescription":"O fuso horário em formato IANA (ex: America/Sao_Paulo). Deslocamento GMT é alternativa em horas.","gmtOffsetDescription":"Deslocamento GMT em horas (ex: -3 para UTC-3). Alternativa à string de fuso IANA.","loading":"Carregando…"}}`),o={title:`Menus`,description:`Crie e gerencie os menus de navegação usados pelo seu site.`,hint:`Os menus são independentes dos content types e podem ser renderizados pelo seu tema.`,new:`Novo menu`,create:`Criar menu`,edit:`Editar menu`,name:`Nome`,slug:`Slug`,items:`Itens`,back:`Voltar para menus`,nameRequired:`Informe o nome do menu.`,editor:{eyebrow:`Estrutura de navegação`,addItems:`Adicionar itens ao menu`,search:`Pesquisar…`,addSelected:`Adicionar selecionados`,addToMenu:`Adicionar ao menu`,structure:`Estrutura do menu`,structureHint:`Arraste os itens para reordenar. Use as setas para criar submenus.`,empty:`Adicione itens pelos painéis à esquerda.`,emptyLevel:`Nenhum item neste submenu.`,drag:`Arrastar para reordenar`,untitled:`Item sem título`,noUrl:`Sem URL`,up:`Mover para cima`,down:`Mover para baixo`,indent:`Criar submenu`,outdent:`Mover para o nível anterior`,itemSettings:`Configurações do item`,navigationLabel:`Rótulo de navegação`,url:`URL`,titleAttribute:`Atributo title`,cssClasses:`Classes CSS`,target:`Abrir link em`,sameWindow:`Mesma janela`,newWindow:`Nova janela`,xfn:`Relacionamento do link (XFN)`,description:`Descrição`,remove:`Remover`,settings:`Configurações do menu`,autoAddPages:`Adicionar automaticamente novas páginas de primeiro nível a este menu`,autoAddPagesHint:`Esta configuração é salva com o menu e pode ser usada pelo tema ativo.`},sources:{pages:`Páginas`,posts:`Posts`,custom:`Links personalizados`,customHint:`Adicione qualquer URL interna ou externa.`,home:`Início`,contentTypes:`Itens de content types`,archives:`Arquivos de content types`,taxonomies:`Termos de taxonomias`},saved:`Menu salvo.`,deleted:`Menu excluído.`,empty:`Ainda não há menus.`,confirmDelete:`Excluir o menu "{name}"?`},s={title:`Recursos de conteúdo`,description:`Descrição`,tabs:{category:`Categorias`,tag:`Tags`,menu:`Menus`},new:`Novo recurso`,name:`Nome`,slug:`Slug`,items:`Itens do menu (JSON)`,saved:`Recurso salvo.`,confirmDelete:`Excluir este recurso?`,form:{new:`Criar recurso`,edit:`Editar recurso`},terms:{title:`Termos de taxonomia`,choose:`Escolha uma taxonomia`,new:`Novo termo`}},c={title:`Acesso`,description:`Gerencie papéis, permissões e tenants.`,roles:`Papéis`,tenants:`Tenants`,permissions:`Permissões`,domain:`Domínio`,permissionsPlaceholder:`Nenhuma permissão selecionada`,permissionsSummary:`{resources} recursos · {count} permissões`,permissionSearch:`Filtrar recursos…`,permissionNoMatches:`Nenhum recurso corresponde.`,customPermissions:`Permissões personalizadas`,customPermission:`ação:recurso`,permissionsSelected:`{count} selecionadas`,newRole:`Novo papel`,editRole:`Editar papel`,newTenant:`Novo tenant`,editTenant:`Editar tenant`,resources:{content:`Conteúdo`,media:`Mídia`,category:`Categorias`,tag:`Tags`,menu:`Menus`,user:`Usuários`,roles:`Papéis`,theme:`Temas`,plugin:`Plugins`,setting:`Configurações`,webhook:`Webhooks`,tenants:`Tenants`,audit:`Auditoria`,build:`Builds`,system:`Sistema`}},l={title:`Logs`,description:`Histórico completo das ações realizadas dentro do CMS.`,retentionTitle:`Retenção dos logs`,retentionDescription:`Logs mais antigos que este período serão removidos automaticamente.`,retentionDays:`Manter logs por (dias)`,retentionSaved:`Retenção dos logs atualizada.`,historyTitle:`Histórico de auditoria`,actionFilter:`Filtrar por ação`,resourceFilter:`Filtrar por recurso`,loading:`Carregando logs…`,empty:`Nenhuma ação registrada ainda.`,system:`Sistema`,columns:{date:`Data`,action:`Ação`,resource:`Recurso`,user:`Usuário`,status:`Status`,ip:`IP`}},u={title:`Webhooks`,description:`Envie eventos do CMS para serviços externos com autenticação configurável.`,listTitle:`Webhooks configurados`,new:`Novo webhook`,create:`Criar webhook`,edit:`Editar webhook`,url:`URL do endpoint`,events:`Eventos`,selectEvents:`Selecione um ou mais eventos`,searchEvents:`Pesquisar eventos…`,noEvents:`Nenhum evento encontrado.`,eventsRequired:`Selecione pelo menos um evento.`,authentication:`Autenticação`,active:`Ativo`,token:`Token Bearer`,username:`Usuário`,password:`Senha`,headerName:`Nome do header`,apiKeyValue:`Valor da API key`,secret:`Segredo HMAC`,signatureHeader:`Header da assinatura`,keepExisting:`Deixe em branco para manter o valor atual`,loading:`Carregando webhooks…`,empty:`Nenhum webhook configurado.`,auth:{none:`Nenhuma`,bearer:`Token Bearer`,basic:`Autenticação básica`,apiKey:`API key`,hmac_sha256:`HMAC SHA-256`}},d={title:`API keys`,description:`Emita credenciais para aplicações externas trocarem uma API key por access e refresh JWT e consumirem a API de conteúdo.`,howItWorks:`A key é usada somente uma vez, em POST /api/v1/auth/api-key-login, para obter JWTs. Ela nunca autoriza requests diretamente.`,listTitle:`Keys emitidas`,new:`Nova API key`,create:`Criar API key`,createSubmit:`Criar key`,prefix:`Prefixo`,lastUsed:`Último uso`,neverUsed:`Nunca usada`,revoke:`Revogar`,revoked:`API key revogada.`,loading:`Carregando API keys…`,empty:`Nenhuma API key emitida.`,status:{active:`Ativa`,oneTime:`Uso único`,expired:`Expirada`,revoked:`Revogada`},form:{name:`Nome`,namePlaceholder:`ex.: Backend do app mobile`,user:`Identidade (usuário)`,currentUser:`Usuário atual`,expiresAt:`Expira em (opcional)`,oneTime:`Uso único (revoga automaticamente após o primeiro login)`,oneTimeHint:`Recomendado para integrações que conseguem trocar a key por JWTs imediatamente.`},errors:{nameRequired:`O nome é obrigatório.`},created:{title:`API key criada`,warning:`Copie este valor agora — ele nunca mais será exibido. Se perder, revogue a key e crie outra.`,value:`API key`,howToUse:`Use-a uma vez para obter os JWTs:`,copy:`Copiar`,copied:`Copiado!`}},f={title:`Plugins`,description:`Visualize os plugins instalados.`,directoryHint:`Detectados automaticamente no diretório plugins/ do projeto. Para instalar, atualizar ou ativar um plugin, coloque os arquivos em plugins/ e reinicie o servidor (okcms start, pm2 ou docker).`,columns:{name:`Nome`,version:`Versão`,status:`Status`,enabled:`Ativo no tenant`},status:{active:`Ativo`,installed:`Instalado`,inactive:`Inativo`,quarantined:`Em quarentena`,missing:`Ausente`,loadFailed:`Falha ao carregar`},install:`Instalar plugin`,uninstall:`Desinstalar`,confirmUninstall:`Desinstalar {name}?`,name:`Nome do plugin`,version:`Versão`,manifest:`Manifesto (JSON)`,loadError:`Não foi possível carregar os plugins.`,installError:`Não foi possível instalar o plugin.`,uninstallError:`Não foi possível desinstalar o plugin.`,empty:`Nenhum plugin instalado.`,enabledForTenant:`Ativo para este tenant`,enabledYes:`Sim`,enabledNo:`Não`},p={title:`Temas`,description:`Gerencie os temas instalados.`,directoryHint:`Detectados automaticamente no diretório themes/ do projeto. Use a CLI ou o deploy para adicionar temas.`,version:`Versão`,active:`Ativo`,status:{active:`Ativo`,installed:`Instalado`,inactive:`Inativo`},activate:`Ativar`,deactivate:`Desativar`,customize:`Personalizar`,install:`Instalar tema`,name:`Nome do tema`,manifest:`Manifesto (JSON)`,loadError:`Não foi possível carregar os temas.`,activateError:`Não foi possível ativar o tema.`,deactivateError:`Não foi possível desativar o tema.`,deactivateBlocked:`É necessário manter pelo menos um tema ativo.`,installError:`Não foi possível instalar o tema.`,reload:`Sincronizar`,empty:`Nenhum tema instalado.`},m={title:`Página não encontrada`,description:`O endereço pode estar desatualizado ou a página pode ter sido movida. Confira o endereço ou acesse uma das seções abaixo.`,requestedPath:`Você tentou abrir`,suggestionsLabel:`Ou acesse uma destas seções`,goHome:`Voltar ao início`,goBack:`Voltar`},h={notice:`Limite de requisições atingido — aguarde alguns segundos e tente de novo.`,noticeRetry:`Limite de requisições atingido — nova tentativa automática em {seconds}s.`},g={title:`Login`,subtitle:`Entre na sua conta`,email:`Email`,password:`Senha`,submit:`Entrar`,failed:`Email ou senha inválidos`},_={save:`Salvar`,cancel:`Cancelar`,delete:`Excluir`,edit:`Editar`,close:`Fechar`,confirm:`Confirmar`,loading:`Carregando…`,yes:`Sim`,no:`Não`,search:`Buscar`,filter:`Filtrar`,create:`Criar`,update:`Atualizar`,remove:`Remover`,viewAll:`Ver Todos`,back:`Voltar`,next:`Próximo`,previous:`Anterior`,page:`Página`,of:`de`,items:`itens`,item:`item`,empty:`Nenhum {items} encontrado.`,toast:{success:`✓`,error:`Erro: {message}`},status:{active:`Ativo`,inactive:`Inativo`,draft:`Rascunho`,published:`Publicado`,archived:`Arquivado`,locked:`Bloqueado`},language:`Idioma`,refresh:`Atualizar`,actions:`Ações`,add:`Adicionar`},v={justNow:`agora mesmo`,minAgo:`minutos atrás`,ago:`atrás`,published:`Publicado`,updated:`Atualizado`,newUser:`Novo usuário: {name}`},y={mainMenu:`Menu principal`,notifications:`Notificações`,notificationsEmpty:`Nenhuma atividade recente`,settings:`Configurações`,toggleSidebar:`Alternar barra lateral`,userMenu:`Menu do usuário`},b={copyright:`© 2026 OkCMS. Todos os direitos reservados.`,links:`Links`,website:`Site`,github:`GitHub`,docs:`Documentação`,community:`Comunidade`,poweredBy:`Desenvolvido com Oktis Works`},x={title:`Ajuda`,label:`Ajuda`,tabs:`Tópicos de ajuda`,topics:{overview:{label:`De relance`,content:`<h4>Bem-vindo ao Painel do OkCMS</h4><p>Este painel oferece uma visão geral do conteúdo e da atividade do seu site.</p><h4>Widgets disponíveis</h4><ul><li><strong>De relance:</strong> visão geral de posts, páginas, mídia e usuários</li><li><strong>Rascunho rápido:</strong> salve rascunhos rapidamente pelo painel</li><li><strong>Atividade:</strong> atividade e atualizações recentes do site</li></ul>`},content:{label:`Gestão de conteúdo`,content:`<h4>Gerenciando conteúdo</h4><p>Crie, edite e publique conteúdo na seção Conteúdo.</p><h4>Ações rápidas</h4><ul><li>Clique em "Novo conteúdo" para criar um novo post ou página</li><li>Use filtros para encontrar conteúdo específico</li><li>Ações em lote disponíveis para vários itens</li></ul>`},media:{label:`Biblioteca de mídia`,content:`<h4>Gerenciando mídia</h4><p>Envie e gerencie imagens, vídeos e documentos.</p><h4>Dicas</h4><ul><li>Arraste e solte arquivos para enviar</li><li>Adicione texto alternativo para acessibilidade</li><li>Organize com pastas (em breve)</li></ul>`}}},S={title:`Opções de tela`,label:`Opções de tela`,showOnScreen:`Mostrar na tela`},C={title:`Customizador`,description:`Ajuste as configurações do tema ativo com preview ao vivo. Mudanças aparecem no preview na hora e só persistem ao salvar.`,loadError:`Falha ao carregar os temas.`,saveError:`Falha ao salvar as configurações do tema.`,noTheme:`Nenhum tema ativo para personalizar.`,goToThemes:`Ir para Temas`,noSettings:`Este tema não declara configurações personalizáveis (manifest.settings).`,save:`Salvar`,saving:`Salvando...`,saved:`Salvo.`,reset:`Redefinir`,refreshPreview:`Atualizar preview`,previewHint:`O preview sobrepõe o rascunho às configurações salvas — vale só para a requisição, nunca persiste.`,previewPath:`Caminho do preview`,previewTitle:`Preview do tema`},w={title:`Comentários`,description:`Modere os comentários dos visitantes: aprove, marque como spam, jogue na lixeira ou exclua definitivamente.`,loading:`Carregando comentários...`,empty:`Nenhum comentário nesta fila.`,reload:`Recarregar`,author:`Autor`,comment:`Comentário`,inReplyTo:`Conteúdo`,submitted:`Enviado em`,approve:`Aprovar`,spam:`Spam`,trash:`Lixeira`,delete:`Excluir`,confirmDelete:`Excluir este comentário permanentemente? Não dá para desfazer.`,status:{pending:`Pendentes`,approved:`Aprovados`,spam:`Spam`,trashed:`Lixeira`}},T={layout:e,dashboard:t,content:n,media:r,users:i,settings:a,menus:o,resources:s,access:c,logs:l,webhooks:u,apiKeys:d,plugins:f,themes:p,notFound:m,rateLimit:h,login:g,common:_,activity:v,adminBar:y,footer:b,helpTabs:x,screenOptions:S,customizer:C,comments:w};export{c as access,v as activity,y as adminBar,d as apiKeys,w as comments,_ as common,n as content,C as customizer,t as dashboard,T as default,b as footer,x as helpTabs,e as layout,g as login,l as logs,r as media,o as menus,m as notFound,f as plugins,h as rateLimit,s as resources,S as screenOptions,a as settings,p as themes,i as users,u as webhooks};
|
|
1
|
+
var e={appName:`OkCMS`,admin:`Admin`,nav:{dashboard:`Painel`,content:`Conteúdo`,media:`Mídia`,users:`Usuários`,menus:`Menus`,settings:`Configurações`,plugins:`Plugins`,themes:`Temas`,customize:`Personalizar`,comments:`Comentários`,settings_reading:`Leitura`},actions:{logout:`Sair`,newPost:`Novo Post`,uploadMedia:`Enviar Mídia`,addUser:`Adicionar Usuário`,openSettings:`Configurações`}},t={title:`Painel`,stats:{totalContent:`Total de Conteúdos`,published:`Publicados`,drafts:`Rascunhos`,mediaFiles:`Arquivos de Mídia`,users:`Usuários`},recent:{title:`Conteúdos Recentes`,viewAll:`Ver Todos`,empty:`Nenhum conteúdo ainda — crie o primeiro!`,columns:{title:`Título`,type:`Tipo`,status:`Status`,updated:`Atualizado`}},widgets:{atGlance:`De relance`,posts:`Posts`,postsDesc:`Publicados / Rascunhos / Lixeira`,pages:`Páginas`,pagesDesc:`Publicadas / Rascunhos / Lixeira`,media:`Mídia`,mediaDesc:`Arquivos na biblioteca`,users:`Usuários`,usersDesc:`Total / Ativos / Inativos`,storage:`Armazenamento`,quickDraft:{title:`Rascunho rápido`,heading:`Título`,headingPlaceholder:`Dê um título ao seu rascunho`,content:`Conteúdo`,contentPlaceholder:`O que está pensando?`,save:`Salvar rascunho`,yourDrafts:`Seus rascunhos`,noDrafts:`Nenhum rascunho ainda.`},activity:{title:`Atividade`,empty:`Nenhuma atividade ainda.`}}},n={list:{title:`Conteúdo`,description:`Busque, filtre, edite e publique seu conteúdo.`,typeNotFound:`Este tipo de conteúdo não foi encontrado.`,columns:{title:`Título`,type:`Tipo`,status:`Status`,updated:`Atualizado`},actions:{edit:`Editar`,publish:`Publicar`,unpublish:`Despublicar`,delete:`Excluir`},filters:{search:`Buscar conteúdo…`,allTypes:`Todos os tipos`,allStatus:`Todos os status`},buttons:{new:`+ Novo conteúdo`,addNew:`+ Adicionar novo`,search:`Buscar`},all:`Todo o conteúdo`,empty:`Nenhum conteúdo encontrado.`,statuses:{draft:`Rascunho`,published:`Publicado`,archived:`Arquivado`},confirmDelete:`Excluir "{title}"?`,toasts:{published:`Conteúdo publicado ✓`,unpublished:`Conteúdo despublicado ✓`}},editor:{type:`Tipo`,adding:`Adicionar novo`,editing:`Editar`,backToList:`Voltar para a lista`,saving:`Salvando…`,title:`Título`,titlePlaceholder:`Adicione um título`,slug:`Slug`,slugPlaceholder:`gerado-a-partir-do-titulo`,toolbar:`Barra de ferramentas do editor`,bodyPlaceholder:`Comece a escrever…`,linkPrompt:`Digite a URL:`,excerpt:`Resumo`,featuredImage:`Imagem destacada (ID da mídia)`,mediaIdPlaceholder:`ID da mídia`,featuredImageHint:`Escolha um item na Biblioteca de Mídia.`,pageAttributes:`Atributos da página`,publishPanel:`Publicar`,status:`Status`,statusOptions:{draft:`Rascunho`,published:`Publicado`,archived:`Arquivado`},layout:`Layout`,layoutAuto:`Automático (hierarquia do tema)`,customFields:`Campos personalizados`,inspectTypes:`Inspecionar tipos disponíveis`,save:`Salvar`,saved:`Conteúdo salvo com sucesso.`,format:`Formato`,formatParagraph:`Parágrafo`,formatH1:`Título 1`,formatH2:`Título 2`,formatH3:`Título 3`,formatH4:`Título 4`,formatBlockquote:`Bloco de citação`,formatCode:`Código`,bold:`Negrito`,italic:`Itálico`,underline:`Sublinhado`,bulletList:`Lista com marcadores`,numberedList:`Lista numerada`,link:`Link`},taxonomy:{title:`Termos da taxonomia`,back:`← Voltar para o conteúdo`,choose:`Escolha uma taxonomia no menu de conteúdo.`,notFound:`Taxonomia não encontrada.`,addTerm:`Adicionar novo termo`,editTerm:`Editar termo`,name:`Nome`,slug:`Slug`,description:`Descrição`,descriptionHint:`Gerencie os termos usados por este tipo de conteúdo.`,attachedTo:`Vinculada a`,add:`Adicionar termo`,delete:`Excluir`,empty:`Nenhum termo ainda.`,confirmDelete:`Excluir "{name}"?`,termFields:`Campos do termo`}},r={title:`Biblioteca de Mídia`,description:"Envie e gerencie imagens, vídeos e documentos. Os arquivos ficam em `uploads/` e são servidos publicamente.",upload:{dropzone:`Arraste arquivos aqui ou`,select:`Selecionar arquivos`,uploading:`Enviando…`,hint:`Imagens, vídeos, áudios e documentos · até 25MB por arquivo`},toolbar:{search:`Buscar por nome ou alt…`,allTypes:`Todos os tipos`,searchBtn:`Buscar`},mimeTypes:{png:`PNG`,jpeg:`JPEG`,gif:`GIF`,webp:`WebP`,svg:`SVG`,pdf:`PDF`,mp4:`MP4`,mp3:`MP3`},empty:`Nenhum arquivo ainda. Envie o primeiro!`,details:{title:`Detalhes`,titleField:`Título`,file:`Arquivo`,type:`Tipo`,size:`Tamanho`,dimensions:`Dimensões`,uploaded:`Enviado em`,url:`URL`,copy:`Copiar`,alt:`Texto alternativo (alt)`,caption:`Legenda`,description:`Descrição`,save:`Salvar detalhes`,replace:`Substituir arquivo`,replacing:`Substituindo…`,replaceHint:`Mantém o mesmo item e seus metadados.`,delete:`Excluir`,close:`Fechar`,confirmDelete:`Excluir "{filename}"? O arquivo será removido do disco.`,saved:`Detalhes salvos ✓`,copied:`URL copiada ✓`,copyError:`Não foi possível copiar a URL`,replaced:`Arquivo substituído ✓`},toasts:{uploaded:`{count} arquivo(s) enviado(s) ✓`}},i={title:`Usuários`,description:`Gerencie contas, papéis (roles) e acessos do projeto.`,new:`Novo Usuário`,toolbar:{search:`Buscar por nome ou email…`,allStatus:`Todos os status`,active:`Ativos`,inactive:`Inativos`,newBtn:`+ Novo usuário`,searchBtn:`Buscar`},table:{name:`Nome`,email:`Email`,role:`Papel`,status:`Status`,lastAccess:`Último acesso`,actions:{manage:`Gerenciar`,delete:`Excluir`}},empty:`Nenhum usuário encontrado.`,noRole:`Sem função`,detail:{title:`Gerenciar usuário`,fields:{name:`Nome`,email:`Email`,status:`Status`,role:`Papel`,password:`Senha`},statusOptions:{active:`Ativo`,inactive:`Inativo`},rolePlaceholder:`— sem papel —`,meta:`Criado em {created} · último acesso {lastAccess}`,actions:{save:`Salvar`,resetPassword:`Redefinir senha`,close:`Fechar`},passwordPrompt:`Nova senha para {email} (mínimo 8 caracteres):`,passwordError:`A senha precisa de pelo menos 8 caracteres`,toasts:{roleUpdated:`Papel de {name} atualizado ✓`,passwordChanged:`Senha de {name} alterada ✓`,saved:`Usuário {name} salvo ✓`,deleted:`Usuário {name} excluído ✓`},confirmDelete:`Excluir o usuário {email}?`}},a=JSON.parse(`{"general":{"title":"Geral","description":"Informações básicas exibidas no site.","back":"← Todas as configurações","fields":{"siteTitle":"Título do site","siteTitlePlaceholder":"Meu Site","siteDescription":"Descrição","siteDescriptionPlaceholder":"Um novo site feito com OkCMS","language":"Idioma","timezone":"Fuso horário","timezonePlaceholder":"America/Sao_Paulo"},"saved":"Configurações salvas ✓","loading":"Carregando…","save":"Salvar"},"postTypes":{"title":"Tipos de Conteúdo","description":"Crie tipos de conteúdo personalizados (CPTs) além de Posts e Páginas.","form":{"title":"Criar Tipo de Conteúdo","slug":"Slug (singular, ex.: portfolio)","slugHint":"Apenas letras minúsculas, números e underscore","singular":"Nome no singular","plural":"Nome no plural","supports":"Suporta","supportsOptions":{"title":"Título","editor":"Editor","thumbnail":"Imagem destacada","excerpt":"Resumo","revisions":"Revisões"},"hasArchive":"Possui arquivo público (/slug)","singleton":"Singleton (apenas um conteúdo)","icon":"Ícone do menu lateral","iconHint":"Escolha um ícone Lucide — o nome dele é o que aparece no menu do admin","iconSearchPlaceholder":"Buscar ícones…","iconEmpty":"Nenhum ícone encontrado.","iconCount":"{count} ícones disponíveis","editTitle":"Editar Tipo de Conteúdo","update":"Atualizar","cancel":"Cancelar","create":"Criar"},"table":{"slug":"Slug","singular":"Singular","plural":"Plural","source":"Origem","supports":"Suporta","archive":"Arquivo","mode":"Modo","singleton":"Singleton","collection":"Coleção","icon":"Ícone","actions":{"edit":"Editar","remove":"Remover"}},"sources":{"admin":"Admin","core":"Core"}},"taxonomies":{"title":"Taxonomias","description":"Crie taxonomias personalizadas e vincule-as aos content types.","form":{"title":"Criar Taxonomia","name":"Nome (ex.: Gênero)","slug":"Slug (opcional, gerado do nome)","slugHint":"Apenas letras minúsculas, números e underscore","hierarchical":"Hierárquica (permite termos pai/filho)","attachTo":"Vincular aos content types","create":"Criar"},"table":{"taxonomy":"Taxonomia","hierarchical":"Hierárquica","attachedTypes":"Content types vinculados","actions":{"remove":"Remover"}}},"customFields":{"title":"Campos personalizados","description":"Crie grupos de campos, organize os campos e escolha quais campos padrão ficam visíveis em cada tipo de conteúdo.","contentType":"Tipo de conteúdo","location":{"title":"Regras de localização","description":"Escolha onde este grupo aparece. Regras no mesmo grupo usam E; grupos diferentes usam OU.","parameter":"Parâmetro de localização","operator":"Operador","chooseValue":"Escolha um valor","valuePlaceholder":"Digite um valor ou slug","showIf":"Mostrar se","removeRule":"Remover regra","required":"Adicione um valor a todas as regras de localização.","addRule":"Adicionar condição","addGroup":"Adicionar grupo OU","remove":"Remover","and":"E","or":"OU","params":{"content_type":"Tipo de post","content_slug":"Slug do post","taxonomy":"Taxonomia","term":"Slug do termo","user_role":"Papel do usuário","page_template":"Template da página","post_status":"Status do post","block":"Bloco"},"operators":{"eq":"é","neq":"não é"}},"standard":{"title":"Campos padrão","description":"Título e slug são obrigatórios. Os demais campos padrão podem ser ativados ou desativados.","enabled":"Ativo","locked":"Obrigatório","fields":{"title":"Título","slug":"Slug","content":"Conteúdo","excerpt":"Resumo","featured_image":"Imagem destacada","seo_title":"Título SEO","seo_description":"Descrição SEO","status":"Status","author":"Autor"}},"groups":{"title":"Grupos de campos","new":"Novo grupo de campos","empty":"Ainda não há grupos de campos personalizados.","emptyHint":"Crie seu primeiro grupo para começar a modelar o conteúdo.","search":"Buscar grupos…","groupName":"Grupo","status":"Status","fields":"campos","appliesTo":"Aplicado a","allContentTypes":"Todos os tipos de conteúdo","edit":"Editar","active":"Ativo","inactive":"Inativo"},"form":{"createTitle":"Criar grupo de campos","editTitle":"Editar grupo de campos","title":"Nome do grupo","titlePlaceholder":"Ex.: Detalhes do produto","displayTitle":"Título exibido","active":"Ativo","backToGroups":"Voltar aos grupos","editorEyebrow":"Construtor de campos","groupTitleHint":"O nome identifica este conjunto de campos dentro do editor de conteúdo.","fieldsTitle":"Campos","fieldsDescription":"Adicione, configure e ordene os campos. Use os seis pontos para arrastar sem perder a posição.","noFields":"Este grupo ainda não possui campos.","settingsTitle":"Configurações do grupo","settingsDescription":"Opções de apresentação e visibilidade do painel.","description":"Descrição","labelPlacement":"Posição dos rótulos","instructionPlacement":"Posição das instruções","menuOrder":"Ordem do menu","hideOnScreen":"Ocultar na tela de edição","hide":{"permalink":"Link permanente","content":"Editor de conteúdo","excerpt":"Resumo","featured_image":"Imagem destacada","author":"Autor","revisions":"Revisões","comments":"Comentários"},"assignTitle":"Localização","assignDescription":"Escolha o content type onde este grupo de campos estará disponível.","contentType":"Content type","position":"Posição","positions":{"normal":"Normal","side":"Barra lateral","after_title":"Após o título"},"displayStyle":"Estilo de exibição","displayStyles":{"standard":"Padrão","seamless":"Contínuo","grouped":"Agrupado"},"field":"Campo","fieldName":"Nome/chave","fieldNamePlaceholder":"codigo_produto","fieldLabel":"Rótulo","fieldLabelPlaceholder":"Código do produto","fieldType":"Tipo","instructions":"Instruções","instructionsPlaceholder":"Texto de ajuda opcional para editores","required":"Obrigatório","options":"Opções","optionsHint":"Uma opção por linha: valor|Rótulo","addField":"Adicionar campo","removeField":"Remover","dragHint":"Arraste para reordenar","editField":"Editar","duplicateField":"Duplicar","copySuffix":"(cópia)","selectFieldType":"Selecionar tipo de campo","searchFieldTypes":"Buscar tipos de campo…","popularFields":"Populares","noMatchingFieldTypes":"Nenhum tipo de campo encontrado.","fieldTypeHint":"Escolha o tipo que melhor representa o valor que será editado neste campo.","selectField":"Selecionar campo","save":"Salvar grupo","cancel":"Cancelar","newFieldDefault":"Novo campo","saved":"Grupo de campos salvo.","deleted":"Grupo de campos excluído."},"listEyebrow":"Estrutura de conteúdo","validation":{"titleRequired":"O nome do grupo é obrigatório."},"tabs":{"locationRules":"Regras de localização","presentation":"Apresentação","groupSettings":"Configurações do grupo"},"fieldSettings":{"general":"Geral","fieldLabel":"Rótulo do campo","fieldName":"Nome do campo","instructions":"Instruções","required":"Obrigatório","defaultValue":"Valor padrão","placeholder":"Placeholder","presentation":"Apresentação","wrapperWidth":"Largura do wrapper (%)","labelPlacement":"Rótulo","instructionPlacement":"Instruções","top":"Acima","left":"À esquerda","above":"Antes do campo","below":"Depois do campo","textSettings":"Texto","prepend":"Prefixo","append":"Sufixo","minLength":"Tamanho mínimo","maxLength":"Tamanho máximo","rows":"Linhas","newLines":"Novas linhas","wpautop":"Parágrafos automáticos","none":"Nenhuma","numberSettings":"Número","min":"Mínimo","max":"Máximo","step":"Incremento","choiceSettings":"Escolhas","choices":"Opções","layout":"Layout","vertical":"Vertical","horizontal":"Horizontal","multiple":"Múltipla escolha","allowNull":"Permitir vazio","mediaSettings":"Mídia","returnFormat":"Formato de retorno","array":"Array","id":"ID","previewSize":"Tamanho da prévia","library":"Biblioteca","all":"Todos","uploadedToPost":"Enviados neste conteúdo","allowedTypes":"Tipos permitidos","minWidth":"Largura mínima","maxWidth":"Largura máxima","minHeight":"Altura mínima","maxHeight":"Altura máxima","wysiwygSettings":"Editor visual","tabs":"Abas","toolbar":"Barra de ferramentas","mediaUpload":"Permitir envio de mídia","dateSettings":"Data e hora","displayFormat":"Formato de exibição","firstDay":"Primeiro dia da semana","colorSettings":"Cor","enableOpacity":"Permitir transparência","mapSettings":"Mapa","center":"Centro","zoom":"Zoom","height":"Altura","relationSettings":"Relacionamento","postType":"Tipo de conteúdo","taxonomy":"Taxonomia","booleanSettings":"Verdadeiro/Falso","message":"Mensagem","defaultChecked":"Marcado por padrão","linkSettings":"Link","cloneSettings":"Clone","cloneFields":"Campos para clonar","cloneHint":"Um nome de campo por linha","containerSettings":"Estrutura","buttonLabel":"Texto do botão","collapsed":"Campo usado como título da linha","subFields":"Subcampos","layouts":"Layouts","addLayout":"Adicionar layout","newLayout":"Novo layout","layoutName":"Nome do layout","layoutLabel":"Rótulo do layout","layoutDisplay":"Exibição do layout","conditionalLogic":"Lógica condicional","conditionalHint":"Mostra este campo apenas quando as regras forem atendidas.","chooseField":"Escolha um campo","conditionValue":"Valor","addCondition":"Adicionar condição","addConditionGroup":"Adicionar grupo OU","conditionsAnd":"As condições deste grupo usam E.","choicesHint":"Uma opção por linha no formato valor|Rótulo.","cloneSource":"Grupo ou campo de origem","cloneSourceHint":"Chave do grupo ou nome do campo de onde copiar os campos.","requiredOn":"Obrigatório","requiredOff":"Não obrigatório","pluginConfig":"Configuração do Plugin","mermaid":{"diagramSettings":"Configurações do Diagrama","theme":"Tema","selectTheme":"Selecionar tema","editable":"Permitir edição no editor de conteúdo","defaultCode":"Código Mermaid Padrão","defaultCodeHint":"Código inicial quando o campo for adicionado a um conteúdo. O usuário poderá editar depois.","examples":"Exemplos","exampleFlowchart":"Fluxograma","exampleSequence":"Sequência","exampleClass":"Diagrama de Classes","diagram":"Diagrama Mermaid","copyCode":"Copiar código","rerender":"Re-renderizar","showCode":"Mostrar código fonte","renderError":"Erro ao renderizar","rendering":"Renderizando diagrama..."},"libraryAll":"Toda a biblioteca","libraryUploaded":"Enviados neste conteúdo","ui":"UI aprimorada","uiHint":"Usa estilo aprimorado para o dropdown.","wrapperClass":"Classe do wrapper","wrapperWidthHint":"Largura CSS do wrapper do campo, ex.: 50%.","collapsedHint":"Nome do subcampo usado como título da linha.","conditionalActive":"Ativa","showIf":"Mostrar se","removeRule":"Remover regra","and":"E","or":"OU","noLayouts":"Nenhum layout ainda.","validation":"Validação","advanced":"Avançado","fieldType":"Tipo","fieldNameHint":"Apenas letras, números e sublinhados.","ariaLabel":"Configurações do campo","operators":{"eq":"é igual a","neq":"não é igual a","gt":"é maior que","lt":"é menor que","contains":"contém","hasAny":"tem algum valor","hasNone":"está vazio"}},"actions":{"delete":"Excluir","confirmDelete":"Excluir este grupo de campos?","edit":"Editar","duplicate":"Duplicar","activate":"Ativar","deactivate":"Desativar","export":"Exportar","import":"Importar"},"import":{"description":"Importe grupos de campos a partir de um arquivo JSON. O arquivo deve conter um objeto de grupo de campos ou um array de grupos. Grupos existentes com a mesma chave serão atualizados; novos grupos serão criados.","dropzone":"Clique para selecionar um arquivo .json, ou arraste e solte aqui","hint":"Arquivo selecionado. Clique em Importar para prosseguir."},"loading":"Carregando campos personalizados…","loadError":"Não foi possível carregar os campos personalizados."},"reading":{"title":"Leitura","description":"Configure como sua página inicial e página de posts são exibidas.","frontPageDisplays":"Sua página inicial exibe","frontPageDisplaysOptions":{"latest":"Seus últimos posts","static":"Uma página estática"},"frontPage":"Página inicial","postsPage":"Página de posts","selectPage":"— Selecione uma página —","saved":"Configurações de leitura salvas ✓","save":"Salvar alterações","timezoneString":"Fuso Horário","timezoneStringPlaceholder":"America/Sao_Paulo","gmtOffset":"Deslocamento GMT","gmtOffsetPlaceholder":"-3","timezoneDescription":"O fuso horário em formato IANA (ex: America/Sao_Paulo). Deslocamento GMT é alternativa em horas.","gmtOffsetDescription":"Deslocamento GMT em horas (ex: -3 para UTC-3). Alternativa à string de fuso IANA.","loading":"Carregando…"}}`),o={title:`Menus`,description:`Crie e gerencie os menus de navegação usados pelo seu site.`,hint:`Os menus são independentes dos content types e podem ser renderizados pelo seu tema.`,new:`Novo menu`,create:`Criar menu`,edit:`Editar menu`,name:`Nome`,slug:`Slug`,items:`Itens`,back:`Voltar para menus`,nameRequired:`Informe o nome do menu.`,editor:{eyebrow:`Estrutura de navegação`,addItems:`Adicionar itens ao menu`,search:`Pesquisar…`,addSelected:`Adicionar selecionados`,addToMenu:`Adicionar ao menu`,structure:`Estrutura do menu`,structureHint:`Arraste os itens para reordenar. Use as setas para criar submenus.`,empty:`Adicione itens pelos painéis à esquerda.`,emptyLevel:`Nenhum item neste submenu.`,drag:`Arrastar para reordenar`,untitled:`Item sem título`,noUrl:`Sem URL`,up:`Mover para cima`,down:`Mover para baixo`,indent:`Criar submenu`,outdent:`Mover para o nível anterior`,itemSettings:`Configurações do item`,navigationLabel:`Rótulo de navegação`,url:`URL`,titleAttribute:`Atributo title`,cssClasses:`Classes CSS`,target:`Abrir link em`,sameWindow:`Mesma janela`,newWindow:`Nova janela`,xfn:`Relacionamento do link (XFN)`,description:`Descrição`,remove:`Remover`,settings:`Configurações do menu`,autoAddPages:`Adicionar automaticamente novas páginas de primeiro nível a este menu`,autoAddPagesHint:`Esta configuração é salva com o menu e pode ser usada pelo tema ativo.`},sources:{pages:`Páginas`,posts:`Posts`,custom:`Links personalizados`,customHint:`Adicione qualquer URL interna ou externa.`,home:`Início`,contentTypes:`Itens de content types`,archives:`Arquivos de content types`,taxonomies:`Termos de taxonomias`},saved:`Menu salvo.`,deleted:`Menu excluído.`,empty:`Ainda não há menus.`,confirmDelete:`Excluir o menu "{name}"?`},s={title:`Recursos de conteúdo`,description:`Descrição`,tabs:{category:`Categorias`,tag:`Tags`,menu:`Menus`},new:`Novo recurso`,name:`Nome`,slug:`Slug`,items:`Itens do menu (JSON)`,saved:`Recurso salvo.`,confirmDelete:`Excluir este recurso?`,form:{new:`Criar recurso`,edit:`Editar recurso`},terms:{title:`Termos de taxonomia`,choose:`Escolha uma taxonomia`,new:`Novo termo`}},c={title:`Acesso`,description:`Gerencie papéis, permissões e tenants.`,roles:`Papéis`,tenants:`Tenants`,permissions:`Permissões`,domain:`Domínio`,permissionsPlaceholder:`Nenhuma permissão selecionada`,permissionsSummary:`{resources} recursos · {count} permissões`,permissionSearch:`Filtrar recursos…`,permissionNoMatches:`Nenhum recurso corresponde.`,customPermissions:`Permissões personalizadas`,customPermission:`ação:recurso`,permissionsSelected:`{count} selecionadas`,newRole:`Novo papel`,editRole:`Editar papel`,newTenant:`Novo tenant`,editTenant:`Editar tenant`,resources:{content:`Conteúdo`,media:`Mídia`,category:`Categorias`,tag:`Tags`,menu:`Menus`,user:`Usuários`,roles:`Papéis`,theme:`Temas`,plugin:`Plugins`,setting:`Configurações`,webhook:`Webhooks`,tenants:`Tenants`,audit:`Auditoria`,build:`Builds`,system:`Sistema`}},l={title:`Logs`,description:`Histórico completo das ações realizadas dentro do CMS.`,retentionTitle:`Retenção dos logs`,retentionDescription:`Logs mais antigos que este período serão removidos automaticamente.`,retentionDays:`Manter logs por (dias)`,retentionSaved:`Retenção dos logs atualizada.`,historyTitle:`Histórico de auditoria`,actionFilter:`Filtrar por ação`,resourceFilter:`Filtrar por recurso`,loading:`Carregando logs…`,empty:`Nenhuma ação registrada ainda.`,system:`Sistema`,columns:{date:`Data`,action:`Ação`,resource:`Recurso`,user:`Usuário`,status:`Status`,ip:`IP`}},u={title:`Webhooks`,description:`Envie eventos do CMS para serviços externos com autenticação configurável.`,listTitle:`Webhooks configurados`,new:`Novo webhook`,create:`Criar webhook`,edit:`Editar webhook`,url:`URL do endpoint`,events:`Eventos`,selectEvents:`Selecione um ou mais eventos`,searchEvents:`Pesquisar eventos…`,noEvents:`Nenhum evento encontrado.`,eventsRequired:`Selecione pelo menos um evento.`,authentication:`Autenticação`,active:`Ativo`,token:`Token Bearer`,username:`Usuário`,password:`Senha`,headerName:`Nome do header`,apiKeyValue:`Valor da API key`,secret:`Segredo HMAC`,signatureHeader:`Header da assinatura`,keepExisting:`Deixe em branco para manter o valor atual`,loading:`Carregando webhooks…`,empty:`Nenhum webhook configurado.`,auth:{none:`Nenhuma`,bearer:`Token Bearer`,basic:`Autenticação básica`,apiKey:`API key`,hmac_sha256:`HMAC SHA-256`}},d={title:`API keys`,description:`Emita credenciais para aplicações externas trocarem uma API key por access e refresh JWT e consumirem a API de conteúdo.`,howItWorks:`A key é usada somente uma vez, em POST /api/v1/auth/api-key-login, para obter JWTs. Ela nunca autoriza requests diretamente.`,listTitle:`Keys emitidas`,new:`Nova API key`,create:`Criar API key`,createSubmit:`Criar key`,prefix:`Prefixo`,lastUsed:`Último uso`,neverUsed:`Nunca usada`,revoke:`Revogar`,revoked:`API key revogada.`,loading:`Carregando API keys…`,empty:`Nenhuma API key emitida.`,status:{active:`Ativa`,oneTime:`Uso único`,expired:`Expirada`,revoked:`Revogada`},form:{name:`Nome`,namePlaceholder:`ex.: Backend do app mobile`,user:`Identidade (usuário)`,currentUser:`Usuário atual`,expiresAt:`Expira em (opcional)`,oneTime:`Uso único (revoga automaticamente após o primeiro login)`,oneTimeHint:`Recomendado para integrações que conseguem trocar a key por JWTs imediatamente.`},errors:{nameRequired:`O nome é obrigatório.`},created:{title:`API key criada`,warning:`Copie este valor agora — ele nunca mais será exibido. Se perder, revogue a key e crie outra.`,value:`API key`,howToUse:`Use-a uma vez para obter os JWTs:`,copy:`Copiar`,copied:`Copiado!`}},f={title:`Plugins`,description:`Visualize os plugins instalados.`,directoryHint:`Detectados automaticamente no diretório plugins/ do projeto. Para instalar, atualizar ou ativar um plugin, coloque os arquivos em plugins/ e reinicie o servidor (okcms start, pm2 ou docker).`,columns:{name:`Nome`,version:`Versão`,status:`Status`,enabled:`Ativo no tenant`,actions:`Ações`},status:{active:`Ativo`,installed:`Instalado`,inactive:`Inativo`,quarantined:`Em quarentena`,missing:`Ausente`,loadFailed:`Falha ao carregar`},install:`Instalar plugin`,uninstall:`Desinstalar`,confirmUninstall:`Desinstalar {name}?`,name:`Nome do plugin`,version:`Versão`,manifest:`Manifesto (JSON)`,loadError:`Não foi possível carregar os plugins.`,actionError:`Não foi possível atualizar o plugin.`,actions:{activate:`Ativar`,deactivate:`Desativar`},installError:`Não foi possível instalar o plugin.`,uninstallError:`Não foi possível desinstalar o plugin.`,empty:`Nenhum plugin instalado.`,enabledForTenant:`Ativo para este tenant`,enabledYes:`Sim`,enabledNo:`Não`},p={title:`Temas`,description:`Gerencie os temas instalados.`,directoryHint:`Detectados automaticamente no diretório themes/ do projeto. Use a CLI ou o deploy para adicionar temas.`,version:`Versão`,active:`Ativo`,status:{active:`Ativo`,installed:`Instalado`,inactive:`Inativo`},activate:`Ativar`,deactivate:`Desativar`,customize:`Personalizar`,install:`Instalar tema`,name:`Nome do tema`,manifest:`Manifesto (JSON)`,loadError:`Não foi possível carregar os temas.`,activateError:`Não foi possível ativar o tema.`,deactivateError:`Não foi possível desativar o tema.`,deactivateBlocked:`É necessário manter pelo menos um tema ativo.`,installError:`Não foi possível instalar o tema.`,reload:`Sincronizar`,empty:`Nenhum tema instalado.`},m={title:`Página não encontrada`,description:`O endereço pode estar desatualizado ou a página pode ter sido movida. Confira o endereço ou acesse uma das seções abaixo.`,requestedPath:`Você tentou abrir`,suggestionsLabel:`Ou acesse uma destas seções`,goHome:`Voltar ao início`,goBack:`Voltar`},h={notice:`Limite de requisições atingido — aguarde alguns segundos e tente de novo.`,noticeRetry:`Limite de requisições atingido — nova tentativa automática em {seconds}s.`},g={title:`Login`,subtitle:`Entre na sua conta`,email:`Email`,password:`Senha`,submit:`Entrar`,failed:`Email ou senha inválidos`},_={save:`Salvar`,cancel:`Cancelar`,delete:`Excluir`,edit:`Editar`,close:`Fechar`,confirm:`Confirmar`,loading:`Carregando…`,yes:`Sim`,no:`Não`,search:`Buscar`,filter:`Filtrar`,create:`Criar`,update:`Atualizar`,remove:`Remover`,viewAll:`Ver Todos`,back:`Voltar`,next:`Próximo`,previous:`Anterior`,page:`Página`,of:`de`,items:`itens`,item:`item`,empty:`Nenhum {items} encontrado.`,toast:{success:`✓`,error:`Erro: {message}`},status:{active:`Ativo`,inactive:`Inativo`,draft:`Rascunho`,published:`Publicado`,archived:`Arquivado`,locked:`Bloqueado`},language:`Idioma`,refresh:`Atualizar`,actions:`Ações`,add:`Adicionar`},v={justNow:`agora mesmo`,minAgo:`minutos atrás`,ago:`atrás`,published:`Publicado`,updated:`Atualizado`,newUser:`Novo usuário: {name}`},y={mainMenu:`Menu principal`,notifications:`Notificações`,notificationsEmpty:`Nenhuma atividade recente`,settings:`Configurações`,toggleSidebar:`Alternar barra lateral`,userMenu:`Menu do usuário`},b={copyright:`© 2026 OkCMS. Todos os direitos reservados.`,links:`Links`,website:`Site`,github:`GitHub`,docs:`Documentação`,community:`Comunidade`,poweredBy:`Desenvolvido com Oktis Works`},x={title:`Ajuda`,label:`Ajuda`,tabs:`Tópicos de ajuda`,topics:{overview:{label:`De relance`,content:`<h4>Bem-vindo ao Painel do OkCMS</h4><p>Este painel oferece uma visão geral do conteúdo e da atividade do seu site.</p><h4>Widgets disponíveis</h4><ul><li><strong>De relance:</strong> visão geral de posts, páginas, mídia e usuários</li><li><strong>Rascunho rápido:</strong> salve rascunhos rapidamente pelo painel</li><li><strong>Atividade:</strong> atividade e atualizações recentes do site</li></ul>`},content:{label:`Gestão de conteúdo`,content:`<h4>Gerenciando conteúdo</h4><p>Crie, edite e publique conteúdo na seção Conteúdo.</p><h4>Ações rápidas</h4><ul><li>Clique em "Novo conteúdo" para criar um novo post ou página</li><li>Use filtros para encontrar conteúdo específico</li><li>Ações em lote disponíveis para vários itens</li></ul>`},media:{label:`Biblioteca de mídia`,content:`<h4>Gerenciando mídia</h4><p>Envie e gerencie imagens, vídeos e documentos.</p><h4>Dicas</h4><ul><li>Arraste e solte arquivos para enviar</li><li>Adicione texto alternativo para acessibilidade</li><li>Organize com pastas (em breve)</li></ul>`}}},S={title:`Opções de tela`,label:`Opções de tela`,showOnScreen:`Mostrar na tela`},C={title:`Customizador`,description:`Ajuste as configurações do tema ativo com preview ao vivo. Mudanças aparecem no preview na hora e só persistem ao salvar.`,loadError:`Falha ao carregar os temas.`,saveError:`Falha ao salvar as configurações do tema.`,noTheme:`Nenhum tema ativo para personalizar.`,goToThemes:`Ir para Temas`,noSettings:`Este tema não declara configurações personalizáveis (manifest.settings).`,save:`Salvar`,saving:`Salvando...`,saved:`Salvo.`,reset:`Redefinir`,refreshPreview:`Atualizar preview`,previewHint:`O preview sobrepõe o rascunho às configurações salvas — vale só para a requisição, nunca persiste.`,previewPath:`Caminho do preview`,previewTitle:`Preview do tema`},w={title:`Comentários`,description:`Modere os comentários dos visitantes: aprove, marque como spam, jogue na lixeira ou exclua definitivamente.`,loading:`Carregando comentários...`,empty:`Nenhum comentário nesta fila.`,reload:`Recarregar`,author:`Autor`,comment:`Comentário`,inReplyTo:`Conteúdo`,submitted:`Enviado em`,approve:`Aprovar`,spam:`Spam`,trash:`Lixeira`,delete:`Excluir`,confirmDelete:`Excluir este comentário permanentemente? Não dá para desfazer.`,status:{pending:`Pendentes`,approved:`Aprovados`,spam:`Spam`,trashed:`Lixeira`}},T={layout:e,dashboard:t,content:n,media:r,users:i,settings:a,menus:o,resources:s,access:c,logs:l,webhooks:u,apiKeys:d,plugins:f,themes:p,notFound:m,rateLimit:h,login:g,common:_,activity:v,adminBar:y,footer:b,helpTabs:x,screenOptions:S,customizer:C,comments:w};export{c as access,v as activity,y as adminBar,d as apiKeys,w as comments,_ as common,n as content,C as customizer,t as dashboard,T as default,b as footer,x as helpTabs,e as layout,g as login,l as logs,r as media,o as menus,m as notFound,f as plugins,h as rateLimit,s as resources,S as screenOptions,a as settings,p as themes,i as users,u as webhooks};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{S as e,a as t,h as n,i as r,l as i,p as a,r as o,s,y as c}from"./solid.Ck4Vtfe4.js";import{_ as l,a as u,f as d,h as f,i as p,l as m,o as h,p as g,s as _,t as v,u as y}from"./web.DD6VKaIp.js";var b=l(`<span class=muted>…`),x=l(`<span class=muted>⚙ <!$><!/>`),S=l(`<div class=sidebar__submenu>`),C=l(`<div class=sidebar-plugins__group><a class=sidebar__link><!$><!/> <!$><!/></a><!$><!/>`),w=l(`<span aria-hidden=true>`),T=l(`<a class="sidebar__link sidebar__link--sub">`),E=l(`<div class=dashboard-widgets>`),D=l(`<div class="card widget"><h3 class=stat-label></h3><div>`),O=l(`<div class=notices role=status aria-live=polite>`),k=l(`<button type=button class=notice__close aria-label=Dispensar>×`),A=l(`<div><span></span><!$><!/>`),j=l(`<div class="metabox card"><h3 class=metabox__title></h3><div class=metabox__body>`),M=l(`<div class=action-links>`),N=l(`<a class=action-link>`),P=`../../../plugins`,F=Object.assign({});function I(e,t){if(!e||e.includes(`..`)||e.includes(`://`)||e.startsWith(`/`))throw Error(`Invalid plugin component reference: ${e}`);if(e.startsWith(`@/plugins/`))return`${P}/${e.slice(10)}`;let n=e.indexOf(`:`);if(n===-1){let n=t??``;if(!/^[a-z0-9][a-z0-9._-]*$/i.test(n))throw Error(`Invalid plugin name: ${n}`);let r=e.replace(/^\/+/,``);return n?`${P}/${n}/${r}`:e}let r=t??e.slice(0,n);if(!/^[a-z0-9][a-z0-9._-]*$/i.test(r))throw Error(`Invalid plugin name: ${r}`);let i=e.slice(n+1);return i.startsWith(`@/plugins/`)?`${P}/${i.slice(10)}`:i.includes(`/`)?`${P}/${r}/${i.replace(/^\/+/,``)}`:`${P}/${r}/admin/components/${i}.tsx`}async function L(e,t){let n=F[I(e,t)];if(!n)throw Error(`Plugin component is not included in the admin build: ${e}`);return n()}function R(t){let[o,l]=n(null),[u,d]=n(null),[f,p]=n(!0);return e(async()=>{try{let e=(await L(t.componentId,t.plugin)).default;if(!e)throw Error(`componente default ausente no módulo`);l(()=>e)}catch(e){console.warn(`[PluginComponentHost] falha ao carregar ${t.componentId}:`,e),d(e instanceof Error?e.message:String(e))}finally{p(!1)}}),i(s,{get children(){return[i(r,{get when(){return f()},get children(){var e=h(b);return a(()=>g(e,`data-plugin-component-loading`,t.componentId)),e}}),i(r,{get when(){return u()||!o()},get children(){var e=h(x),n=e.firstChild.nextSibling,[r,i]=_(n.nextSibling);return m(e,()=>t.componentId,r,i),a(n=>{var r=t.componentId,i=u()??``;return r!==n.e&&g(e,`data-plugin-component-error`,n.e=r),i!==n.t&&g(e,`title`,n.t=i),n},{e:void 0,t:void 0}),e}}),i(r,{when:!0,get children(){return i(v,c({get component(){return o()}},()=>t.extraProps??{}))}})]}})}function z(e){let n=()=>e.extensions.menuPages.filter(t=>e.can(t.capability??`read`)),r=t=>e.extensions.submenuPages.filter(e=>e.parentSlug===t).filter(t=>e.can(t.capability??`read`)).sort((e,t)=>(e.position??0)-(t.position??0));return i(o,{get each(){return n()},children:e=>(()=>{var n=h(C),s=n.firstChild,c=s.firstChild,[l,u]=_(c.nextSibling),d=l.nextSibling.nextSibling,[f,p]=_(d.nextSibling),v=s.nextSibling,[b,x]=_(v.nextSibling);return m(s,(()=>{var t=y(()=>!!e.icon);return()=>t()?(()=>{var t=h(w);return m(t,()=>e.icon),t})():null})(),l,u),m(s,()=>e.label,f,p),m(n,i(t,{get when(){return r(e.slug).length>0},get children(){var t=h(S);return m(t,i(o,{get each(){return r(e.slug)},children:e=>(()=>{var t=h(T);return m(t,()=>e.label),a(()=>g(t,`href`,`/plugins/${e.slug}`)),t})()})),t}}),b,x),a(t=>{var r=e.slug,i=`/plugins/${e.slug}`;return r!==t.e&&g(n,`data-plugin-menu`,t.e=r),i!==t.t&&g(s,`href`,t.t=i),t},{e:void 0,t:void 0}),n})()})}function B(e){return i(t,{get when(){return e.extensions.dashboardWidgets.length>0},get children(){var t=h(E);return m(t,i(o,{get each(){return e.extensions.dashboardWidgets},children:e=>{let t=e.componentId.split(`:`)[0]??e.id.split(`:`)[0]??`unknown`;return(()=>{var n=h(D),r=n.firstChild,o=r.nextSibling;return g(n,`data-plugin`,t),m(r,()=>e.title),g(o,`data-plugin`,t),m(o,i(R,{get componentId(){return e.componentId},plugin:t})),a(t=>{var r=e.id,i=`span ${e.columnsSpan??1}`,a=e.componentId;return r!==t.e&&g(n,`data-widget-id`,t.e=r),i!==t.t&&f(n,`grid-column`,t.t=i),a!==t.a&&g(o,`data-plugin-component`,t.a=a),t},{e:void 0,t:void 0,a:void 0}),n})()}})),t}})}function V(e){return(()=>{var n=h(O);return m(n,i(o,{get each(){return e.extensions.notices},children:n=>{let r=n.id.split(`:`)[0]??`unknown`;return(()=>{var o=h(A),s=o.firstChild,c=s.nextSibling,[l,u]=_(c.nextSibling);return g(o,`data-plugin`,r),m(s,()=>n.message),m(o,i(t,{get when(){return y(()=>n.dismissible!==!1)()&&e.onDismiss},get children(){var t=h(k);return t.$$click=()=>e.onDismiss?.(n.id),d(),t}}),l,u),a(()=>p(o,`notice notice--${n.level}`)),o})()}})),n})()}function H(e){let t=()=>e.extensions.metaBoxes.filter(t=>t.screens.includes(e.screen)&&t.context===e.context).sort((e,t)=>{let n={high:0,default:1,low:2};return n[e.priority]-n[t.priority]});return i(o,{get each(){return t()},children:e=>{let t=e.componentId.split(`:`)[0]??e.id.split(`:`)[0]??`unknown`;return(()=>{var n=h(j),r=n.firstChild,o=r.nextSibling;return g(n,`data-plugin`,t),m(r,()=>e.title),g(o,`data-plugin`,t),m(o,i(R,{get componentId(){return e.componentId},plugin:t})),a(t=>{var r=e.id,i=e.componentId;return r!==t.e&&g(n,`data-metabox-id`,t.e=r),i!==t.t&&g(o,`data-plugin-component`,t.t=i),t},{e:void 0,t:void 0}),n})()}})}function U(e){return i(t,{get when(){return e.extensions.actionLinks.length>0},get children(){var t=h(M);return m(t,i(o,{get each(){return e.extensions.actionLinks},children:e=>(()=>{var t=h(N);return m(t,()=>e.label),a(()=>g(t,`href`,e.url)),t})()})),t}})}u([`click`]);export{V as a,H as i,z as n,R as o,B as r,L as s,U as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{h as e}from"./solid.Ck4Vtfe4.js";import{n as t}from"./api.fpBzBw4U.js";import{s as n}from"./slots.CSARb9TW.js";function r(){return{menuPages:[],submenuPages:[],dashboardWidgets:[],metaBoxes:[],notices:[],columns:{},columnRenderers:{},actionLinks:[],editors:[]}}var[i,a]=e(r()),o=null,s=new Set;function c(e){let t=typeof window<`u`&&typeof window.requestIdleCallback==`function`?e=>window.requestIdleCallback(()=>e()):e=>setTimeout(e,1),r=[...e.dashboardWidgets.map(e=>e.componentId),...e.metaBoxes.map(e=>e.componentId),...e.editors.map(e=>e.componentId),...Object.values(e.columnRenderers).flatMap(e=>Object.values(e))];for(let e of r)e&&!s.has(e)&&(s.add(e),t(()=>{n(e).catch(()=>{})}))}function l(){return o||=t.getAdminExtensions().then(e=>{a(e),c(e)}).catch(()=>{}),o.then(()=>i())}export{l as n,r as t};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
|
|
2
2
|
import { S as createAstro, d as maybeRenderHead, i as renderComponent, p as addAttribute, u as renderTemplate } from "./server_B5N27szj.mjs";
|
|
3
3
|
import { t as createComponent } from "./compiler_O7J1rlsi.mjs";
|
|
4
|
-
import { n as renderScript, t as $$BaseLayout } from "./
|
|
4
|
+
import { n as renderScript, t as $$BaseLayout } from "./BaseLayout_CJGULIpb.mjs";
|
|
5
5
|
//#region src/pages/404.astro
|
|
6
6
|
var _404_exports = /* @__PURE__ */ __exportAll({
|
|
7
7
|
default: () => $$404,
|
|
@@ -18,7 +18,7 @@ async function renderScript(result, id) {
|
|
|
18
18
|
}
|
|
19
19
|
var package_default = {
|
|
20
20
|
name: "@oktis-works/admin",
|
|
21
|
-
version: "0.23.
|
|
21
|
+
version: "0.23.3",
|
|
22
22
|
type: "module",
|
|
23
23
|
bin: { "okcms-admin": "./bin/admin.js" },
|
|
24
24
|
files: ["bin", "dist"],
|
|
@@ -34,8 +34,8 @@ var package_default = {
|
|
|
34
34
|
"@astrojs/node": "11.1.6",
|
|
35
35
|
"@astrojs/solid-js": "7.0.2",
|
|
36
36
|
"@dnd-kit/solid": "0.5.0",
|
|
37
|
-
"@oktis-works/plugin-sdk": "^0.7.
|
|
38
|
-
"@oktis-works/types": "^0.9.
|
|
37
|
+
"@oktis-works/plugin-sdk": "^0.7.1",
|
|
38
|
+
"@oktis-works/types": "^0.9.2",
|
|
39
39
|
"@oktis-works/ui": "^0.5.8",
|
|
40
40
|
"@oktis-works/validation": "^0.7.0",
|
|
41
41
|
"astro": "7.3.5",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { n as useTranslation, r as apiClient } from "./
|
|
2
|
-
import { a as MetaBoxesSlot, n as emptyExtensionsState, o as PluginComponentHost, r as loadExtensions } from "./
|
|
3
|
-
import { t as FieldRenderer } from "./
|
|
1
|
+
import { n as useTranslation, r as apiClient } from "./i18n_BlAR9yiz.mjs";
|
|
2
|
+
import { a as MetaBoxesSlot, n as emptyExtensionsState, o as PluginComponentHost, r as loadExtensions } from "./DashboardLayout_DvfGK5S9.mjs";
|
|
3
|
+
import { t as FieldRenderer } from "./FieldRenderer_hN7BJpMp.mjs";
|
|
4
4
|
import { t as expandCloneFields } from "./clone_FT3Zf-Bf.mjs";
|
|
5
5
|
import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
|
|
6
6
|
import { For, Show, createMemo, createSignal, onMount } from "solid-js";
|
|
@@ -381,6 +381,12 @@ var _tmpl$9 = [
|
|
|
381
381
|
"<!--/--></select></label></section>"
|
|
382
382
|
];
|
|
383
383
|
var _tmpl$0 = [
|
|
384
|
+
"<section",
|
|
385
|
+
" class=\"card classic-editor__panel plugin-catalog-panel\"><h3>Plugin blocks and patterns</h3><!--$-->",
|
|
386
|
+
"<!--/--><!--$-->",
|
|
387
|
+
"<!--/--></section>"
|
|
388
|
+
];
|
|
389
|
+
var _tmpl$1 = [
|
|
384
390
|
"<form",
|
|
385
391
|
" class=\"content-editor classic-editor\"><!--$-->",
|
|
386
392
|
"<!--/--><!--$-->",
|
|
@@ -409,25 +415,31 @@ var _tmpl$0 = [
|
|
|
409
415
|
"</button></section><!--$-->",
|
|
410
416
|
"<!--/--><!--$-->",
|
|
411
417
|
"<!--/--><!--$-->",
|
|
418
|
+
"<!--/--><!--$-->",
|
|
412
419
|
"<!--/--></aside></div><!--$-->",
|
|
413
420
|
"<!--/--></form>"
|
|
414
421
|
];
|
|
415
|
-
var _tmpl$
|
|
422
|
+
var _tmpl$10 = [
|
|
416
423
|
"<div",
|
|
417
424
|
" class=\"notice notice--error\">",
|
|
418
425
|
"</div>"
|
|
419
426
|
];
|
|
420
|
-
var _tmpl$
|
|
427
|
+
var _tmpl$11 = [
|
|
421
428
|
"<div",
|
|
422
429
|
" class=\"plugin-editor\"",
|
|
423
430
|
">",
|
|
424
431
|
"</div>"
|
|
425
432
|
];
|
|
426
|
-
var _tmpl$
|
|
433
|
+
var _tmpl$12 = [
|
|
427
434
|
"<option",
|
|
428
435
|
">",
|
|
429
436
|
"</option>"
|
|
430
437
|
];
|
|
438
|
+
var _tmpl$13 = [
|
|
439
|
+
"<button",
|
|
440
|
+
" type=\"button\" class=\"btn btn-secondary\">+ <!--$-->",
|
|
441
|
+
"<!--/--></button>"
|
|
442
|
+
];
|
|
431
443
|
/**
|
|
432
444
|
* Normalizes content body: parses string (double-encoded) to object.
|
|
433
445
|
* Ensures `content` key exists for classic editor (falls back to `html`).
|
|
@@ -458,6 +470,8 @@ function ContentEditor(props) {
|
|
|
458
470
|
const [saving, setSaving] = createSignal(false);
|
|
459
471
|
const [message, setMessage] = createSignal("");
|
|
460
472
|
const [extensions, setExtensions] = createSignal(emptyExtensionsState());
|
|
473
|
+
const [blocks, setBlocks] = createSignal([]);
|
|
474
|
+
const [patterns, setPatterns] = createSignal([]);
|
|
461
475
|
const [draft, setDraft] = createSignal({
|
|
462
476
|
type: props.initialType || "post",
|
|
463
477
|
title: "",
|
|
@@ -502,10 +516,17 @@ function ContentEditor(props) {
|
|
|
502
516
|
loadExtensions().then(setExtensions);
|
|
503
517
|
let typeList = [];
|
|
504
518
|
try {
|
|
505
|
-
const [typeCatalog, themeList] = await Promise.all([
|
|
519
|
+
const [typeCatalog, themeList, blockCatalog, patternCatalog] = await Promise.all([
|
|
520
|
+
apiClient.getContentTypes(),
|
|
521
|
+
apiClient.getThemes().catch(() => []),
|
|
522
|
+
apiClient.getBlocks().catch(() => []),
|
|
523
|
+
apiClient.getPatterns().catch(() => [])
|
|
524
|
+
]);
|
|
506
525
|
typeList = typeCatalog;
|
|
507
526
|
setTypes(typeCatalog);
|
|
508
527
|
setThemes(themeList);
|
|
528
|
+
setBlocks(blockCatalog);
|
|
529
|
+
setPatterns(patternCatalog);
|
|
509
530
|
} catch (err) {
|
|
510
531
|
setErrors([err instanceof Error ? err.message : String(err)]);
|
|
511
532
|
}
|
|
@@ -548,7 +569,7 @@ function ContentEditor(props) {
|
|
|
548
569
|
const value = data()["content"];
|
|
549
570
|
return typeof value === "string" ? value : "";
|
|
550
571
|
};
|
|
551
|
-
return ssr(_tmpl$
|
|
572
|
+
return ssr(_tmpl$1, ssrHydrationKey(), escape(createComponent(Show, {
|
|
552
573
|
get when() {
|
|
553
574
|
return errors().length > 0;
|
|
554
575
|
},
|
|
@@ -557,7 +578,7 @@ function ContentEditor(props) {
|
|
|
557
578
|
get each() {
|
|
558
579
|
return errors();
|
|
559
580
|
},
|
|
560
|
-
children: (err) => ssr(_tmpl$
|
|
581
|
+
children: (err) => ssr(_tmpl$10, ssrHydrationKey(), escape(err))
|
|
561
582
|
});
|
|
562
583
|
}
|
|
563
584
|
})), escape(createComponent(Show, {
|
|
@@ -584,7 +605,7 @@ function ContentEditor(props) {
|
|
|
584
605
|
return activeEditor()?.mode !== "replace-body";
|
|
585
606
|
},
|
|
586
607
|
get fallback() {
|
|
587
|
-
return ssr(_tmpl$
|
|
608
|
+
return ssr(_tmpl$11, ssrHydrationKey(), ssrAttribute("data-plugin-editor", escape(activeEditor().id, true), false), escape(createComponent(PluginComponentHost, {
|
|
588
609
|
get componentId() {
|
|
589
610
|
return activeEditor().componentId;
|
|
590
611
|
},
|
|
@@ -665,7 +686,24 @@ function ContentEditor(props) {
|
|
|
665
686
|
get each() {
|
|
666
687
|
return availableLayouts();
|
|
667
688
|
},
|
|
668
|
-
children: (layout) => ssr(_tmpl$
|
|
689
|
+
children: (layout) => ssr(_tmpl$12, ssrHydrationKey() + ssrAttribute("value", escape(layout, true), false), escape(layout))
|
|
690
|
+
})));
|
|
691
|
+
}
|
|
692
|
+
})), escape(createComponent(Show, {
|
|
693
|
+
get when() {
|
|
694
|
+
return blocks().length > 0 || patterns().length > 0;
|
|
695
|
+
},
|
|
696
|
+
get children() {
|
|
697
|
+
return ssr(_tmpl$0, ssrHydrationKey(), escape(createComponent(For, {
|
|
698
|
+
get each() {
|
|
699
|
+
return blocks();
|
|
700
|
+
},
|
|
701
|
+
children: (block) => ssr(_tmpl$13, ssrHydrationKey(), escape(block.label))
|
|
702
|
+
})), escape(createComponent(For, {
|
|
703
|
+
get each() {
|
|
704
|
+
return patterns();
|
|
705
|
+
},
|
|
706
|
+
children: (pattern) => ssr(_tmpl$13, ssrHydrationKey(), escape(pattern.label))
|
|
669
707
|
})));
|
|
670
708
|
}
|
|
671
709
|
})), escape(createComponent(MetaBoxesSlot, {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "./rolldown-runtime_BMI-E3GI.mjs";
|
|
2
2
|
import { S as createAstro, d as maybeRenderHead, i as renderComponent, p as addAttribute, s as renderSlot, u as renderTemplate } from "./server_B5N27szj.mjs";
|
|
3
3
|
import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
|
|
4
|
-
import { n as renderScript, t as $$BaseLayout } from "./
|
|
5
|
-
import { a as LOCALE_LABELS, i as LOCALE_FLAGS, n as useTranslation, o as SUPPORTED_LOCALES, r as apiClient } from "./
|
|
4
|
+
import { n as renderScript, t as $$BaseLayout } from "./BaseLayout_CJGULIpb.mjs";
|
|
5
|
+
import { a as LOCALE_LABELS, i as LOCALE_FLAGS, n as useTranslation, o as SUPPORTED_LOCALES, r as apiClient } from "./i18n_BlAR9yiz.mjs";
|
|
6
6
|
import { t as require_semver } from "./semver_WbqCUY_o.mjs";
|
|
7
7
|
import { Dynamic, createComponent, escape, memo, mergeProps, ssr, ssrAttribute, ssrHydrationKey, ssrStyle, ssrStyleProperty } from "solid-js/web";
|
|
8
8
|
import { For, For as For2, Match, Show, Show as Show2, Switch, createEffect, createMemo as createMemo$1, createSignal, createSignal as createSignal$1, onCleanup, onMount, onMount as onMount$1 } from "solid-js";
|
|
@@ -396,6 +396,8 @@ var _tmpl$12 = [
|
|
|
396
396
|
" class=\"action-link\">",
|
|
397
397
|
"</a>"
|
|
398
398
|
];
|
|
399
|
+
var PLUGIN_ROOT = "../../../plugins";
|
|
400
|
+
var pluginModules = /* #__PURE__ */ Object.assign({});
|
|
399
401
|
/**
|
|
400
402
|
* Resolve o componentId declarado num caminho de import dinâmico (alias Vite
|
|
401
403
|
* `@/plugins/` aponta para a raiz dos plugins; o componente vive em
|
|
@@ -406,18 +408,26 @@ var _tmpl$12 = [
|
|
|
406
408
|
* - `plugin` explícito tem prioridade sobre o prefixo do componentId.
|
|
407
409
|
*/
|
|
408
410
|
function resolvePluginComponentPath(componentId, plugin) {
|
|
409
|
-
if (componentId.startsWith("
|
|
411
|
+
if (!componentId || componentId.includes("..") || componentId.includes("://") || componentId.startsWith("/")) throw new Error(`Invalid plugin component reference: ${componentId}`);
|
|
412
|
+
if (componentId.startsWith("@/plugins/")) return `${PLUGIN_ROOT}/${componentId.slice(10)}`;
|
|
410
413
|
const separator = componentId.indexOf(":");
|
|
411
414
|
if (separator === -1) {
|
|
412
415
|
const owner = plugin ?? "";
|
|
416
|
+
if (!/^[a-z0-9][a-z0-9._-]*$/i.test(owner)) throw new Error(`Invalid plugin name: ${owner}`);
|
|
413
417
|
const relative = componentId.replace(/^\/+/, "");
|
|
414
|
-
return owner ?
|
|
418
|
+
return owner ? `${PLUGIN_ROOT}/${owner}/${relative}` : componentId;
|
|
415
419
|
}
|
|
416
420
|
const owner = plugin ?? componentId.slice(0, separator);
|
|
421
|
+
if (!/^[a-z0-9][a-z0-9._-]*$/i.test(owner)) throw new Error(`Invalid plugin name: ${owner}`);
|
|
417
422
|
const rest = componentId.slice(separator + 1);
|
|
418
|
-
if (rest.startsWith("@/")) return rest
|
|
419
|
-
if (rest.includes("/")) return
|
|
420
|
-
return
|
|
423
|
+
if (rest.startsWith("@/plugins/")) return `${PLUGIN_ROOT}/${rest.slice(10)}`;
|
|
424
|
+
if (rest.includes("/")) return `${PLUGIN_ROOT}/${owner}/${rest.replace(/^\/+/, "")}`;
|
|
425
|
+
return `${PLUGIN_ROOT}/${owner}/admin/components/${rest}.tsx`;
|
|
426
|
+
}
|
|
427
|
+
async function loadPluginComponent(componentId, plugin) {
|
|
428
|
+
const loader = pluginModules[resolvePluginComponentPath(componentId, plugin)];
|
|
429
|
+
if (!loader) throw new Error(`Plugin component is not included in the admin build: ${componentId}`);
|
|
430
|
+
return loader();
|
|
421
431
|
}
|
|
422
432
|
/**
|
|
423
433
|
* Monta um componente de plugin via import dinâmico (lazy — chunk separado).
|
|
@@ -430,11 +440,7 @@ function PluginComponentHost(props) {
|
|
|
430
440
|
const [loading, setLoading] = createSignal(true);
|
|
431
441
|
onMount(async () => {
|
|
432
442
|
try {
|
|
433
|
-
const
|
|
434
|
-
/* @vite-ignore */
|
|
435
|
-
resolvePluginComponentPath(props.componentId, props.plugin)
|
|
436
|
-
);
|
|
437
|
-
const candidate = module["default"] ?? Object.values(module).find((value) => typeof value === "function");
|
|
443
|
+
const candidate = (await loadPluginComponent(props.componentId, props.plugin))["default"];
|
|
438
444
|
if (!candidate) throw new Error("componente default ausente no módulo");
|
|
439
445
|
setComponent(() => candidate);
|
|
440
446
|
} catch (err) {
|
|
@@ -610,10 +616,7 @@ function prefetchPluginChunks(state) {
|
|
|
610
616
|
if (!componentId || prefetchedChunks.has(componentId)) continue;
|
|
611
617
|
prefetchedChunks.add(componentId);
|
|
612
618
|
schedule(() => {
|
|
613
|
-
|
|
614
|
-
/* @vite-ignore */
|
|
615
|
-
resolvePluginComponentPath(componentId)
|
|
616
|
-
).catch(() => {});
|
|
619
|
+
loadPluginComponent(componentId).catch(() => {});
|
|
617
620
|
});
|
|
618
621
|
}
|
|
619
622
|
}
|
|
@@ -1299,4 +1302,4 @@ var $$DashboardLayout = createComponent$1(($$result, $$props, $$slots) => {
|
|
|
1299
1302
|
})}</div>` })}${renderScript($$result, "/home/runner/work/cms/cms/apps/admin/src/layouts/DashboardLayout.astro?astro&type=script&index=0&lang.ts")}`;
|
|
1300
1303
|
}, "/home/runner/work/cms/cms/apps/admin/src/layouts/DashboardLayout.astro", void 0);
|
|
1301
1304
|
//#endregion
|
|
1302
|
-
export {
|
|
1305
|
+
export { Table as _, MetaBoxesSlot as a, onMount$1 as b, Badge as c, For2 as d, Input as f, Show2 as g, Select as h, ActionLinksSlot as i, Button as l, Pagination as m, emptyExtensionsState as n, PluginComponentHost as o, Modal as p, loadExtensions as r, loadPluginComponent as s, $$DashboardLayout as t, Card as u, createMemo$1 as v, createSignal$1 as y };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "./
|
|
2
|
-
import {
|
|
1
|
+
import "./i18n_BlAR9yiz.mjs";
|
|
2
|
+
import { d as For2, g as Show2, s as loadPluginComponent, v as createMemo$1, y as createSignal$1 } from "./DashboardLayout_DvfGK5S9.mjs";
|
|
3
3
|
import { Dynamic, createComponent, escape, memo, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
|
|
4
4
|
import { For, Match, Show, Switch, createMemo, createSignal, onMount } from "solid-js";
|
|
5
5
|
//#region ../../packages/validation/dist/client-validate.js
|
|
@@ -596,8 +596,8 @@ function PluginFieldRenderer(props) {
|
|
|
596
596
|
onMount(async () => {
|
|
597
597
|
const pathsToTry = [props.adminRendererPath, props.adminComponentPath].filter(Boolean);
|
|
598
598
|
for (const path of pathsToTry) try {
|
|
599
|
-
const module = await
|
|
600
|
-
const Comp = module
|
|
599
|
+
const module = await loadPluginComponent(path);
|
|
600
|
+
const Comp = module["default"] || module["PluginFieldRenderer"] || module["PluginFieldConfig"];
|
|
601
601
|
if (Comp) {
|
|
602
602
|
setComponent(Comp);
|
|
603
603
|
setLoading(false);
|
|
@@ -646,7 +646,7 @@ function PluginFieldRenderer(props) {
|
|
|
646
646
|
get disabled() {
|
|
647
647
|
return props.disabled;
|
|
648
648
|
},
|
|
649
|
-
get
|
|
649
|
+
get t() {
|
|
650
650
|
return props._t;
|
|
651
651
|
}
|
|
652
652
|
})));
|
|
@@ -669,7 +669,7 @@ function PluginFieldRenderer(props) {
|
|
|
669
669
|
get disabled() {
|
|
670
670
|
return props.disabled;
|
|
671
671
|
},
|
|
672
|
-
get
|
|
672
|
+
get t() {
|
|
673
673
|
return props._t;
|
|
674
674
|
}
|
|
675
675
|
})));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as useTranslation, r as apiClient } from "./
|
|
2
|
-
import {
|
|
1
|
+
import { n as useTranslation, r as apiClient } from "./i18n_BlAR9yiz.mjs";
|
|
2
|
+
import { b as onMount, d as For2, f as Input, g as Show2, h as Select, l as Button, m as Pagination, p as Modal, y as createSignal } from "./DashboardLayout_DvfGK5S9.mjs";
|
|
3
3
|
import { createComponent, escape, memo, ssr, ssrAttribute, ssrHydrationKey, ssrStyleProperty } from "solid-js/web";
|
|
4
4
|
//#region src/components/media/MediaLibrary.tsx
|
|
5
5
|
var _tmpl$ = [
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as useTranslation } from "./
|
|
1
|
+
import { n as useTranslation } from "./i18n_BlAR9yiz.mjs";
|
|
2
2
|
import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
|
|
3
3
|
import { Show, createEffect, onCleanup } from "solid-js";
|
|
4
4
|
//#region src/components/ui/Modal.tsx
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
|
|
2
|
+
import { S as createAstro, d as maybeRenderHead, i as renderComponent, p as addAttribute, u as renderTemplate } from "./server_B5N27szj.mjs";
|
|
3
|
+
import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
|
|
4
|
+
import { o as PluginComponentHost, r as loadExtensions, t as $$DashboardLayout } from "./DashboardLayout_DvfGK5S9.mjs";
|
|
5
|
+
import { t as PageHeader } from "./PageHeader_CBOioOjo.mjs";
|
|
6
|
+
import { createComponent, escape, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
|
|
7
|
+
import { Show, createSignal, onMount } from "solid-js";
|
|
8
|
+
//#region src/ext/PluginPageHost.tsx
|
|
9
|
+
var _tmpl$ = [
|
|
10
|
+
"<span",
|
|
11
|
+
" class=\"muted\"",
|
|
12
|
+
">",
|
|
13
|
+
"</span>"
|
|
14
|
+
];
|
|
15
|
+
function PluginPageHost(props) {
|
|
16
|
+
const [componentId, setComponentId] = createSignal(null);
|
|
17
|
+
const [error, setError] = createSignal(null);
|
|
18
|
+
onMount(async () => {
|
|
19
|
+
const state = await loadExtensions();
|
|
20
|
+
const menu = state.menuPages.find((page) => page.slug === props.slug);
|
|
21
|
+
const submenu = state.submenuPages.find((page) => page.slug === props.slug);
|
|
22
|
+
const component = menu?.componentId ?? submenu?.componentId;
|
|
23
|
+
if (component) setComponentId(component);
|
|
24
|
+
else setError(`No component is registered for plugin page "${props.slug}"`);
|
|
25
|
+
});
|
|
26
|
+
return createComponent(Show, {
|
|
27
|
+
get when() {
|
|
28
|
+
return componentId();
|
|
29
|
+
},
|
|
30
|
+
get fallback() {
|
|
31
|
+
return ssr(_tmpl$, ssrHydrationKey(), ssrAttribute("data-plugin-component-error", escape(props.slug, true), false), escape(error() ?? "Loading plugin page…"));
|
|
32
|
+
},
|
|
33
|
+
get children() {
|
|
34
|
+
return createComponent(PluginComponentHost, { get componentId() {
|
|
35
|
+
return componentId();
|
|
36
|
+
} });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/pages/plugins/[...slug].astro
|
|
42
|
+
var ____slug__exports = /* @__PURE__ */ __exportAll({
|
|
43
|
+
default: () => $$Component,
|
|
44
|
+
file: () => $$file,
|
|
45
|
+
url: () => $$url
|
|
46
|
+
});
|
|
47
|
+
createAstro("https://astro.build");
|
|
48
|
+
var $$Component = createComponent$1(($$result, $$props, $$slots) => {
|
|
49
|
+
const Astro = $$result.createAstro($$props, $$slots);
|
|
50
|
+
Astro.self = $$Component;
|
|
51
|
+
const slug = String(Astro.params.slug ?? "");
|
|
52
|
+
const pluginSlug = slug.split("/")[0] ?? "";
|
|
53
|
+
const pageTitle = slug.split("/").at(-1) || "Plugin";
|
|
54
|
+
return renderTemplate`${renderComponent($$result, "DashboardLayout", $$DashboardLayout, {
|
|
55
|
+
"title": pageTitle,
|
|
56
|
+
"data-astro-cid-humdomfa": true
|
|
57
|
+
}, { "default": ($$result) => renderTemplate`${renderComponent($$result, "PageHeader", PageHeader, {
|
|
58
|
+
"title": pageTitle,
|
|
59
|
+
"description": `Plugin extension page for ${pluginSlug}`,
|
|
60
|
+
"data-astro-cid-humdomfa": true
|
|
61
|
+
})}${maybeRenderHead($$result)}<div class="plugin-page"${addAttribute(pluginSlug, "data-plugin")}${addAttribute(slug, "data-plugin-page")} data-astro-cid-humdomfa><div class="card plugin-page__container" data-astro-cid-humdomfa><div class="plugin-page__mount"${addAttribute(pluginSlug, "data-plugin")} data-astro-cid-humdomfa>${renderComponent($$result, "PluginPageHost", PluginPageHost, {
|
|
62
|
+
"client:load": true,
|
|
63
|
+
"slug": slug,
|
|
64
|
+
"data-astro-cid-humdomfa": true,
|
|
65
|
+
"client:component-hydration": "load",
|
|
66
|
+
"client:component-path": "/home/runner/work/cms/cms/apps/admin/src/ext/PluginPageHost.tsx",
|
|
67
|
+
"client:component-export": "PluginPageHost"
|
|
68
|
+
})}</div></div></div>` })}`;
|
|
69
|
+
}, "/home/runner/work/cms/cms/apps/admin/src/pages/plugins/[...slug].astro", void 0);
|
|
70
|
+
var $$file = "/home/runner/work/cms/cms/apps/admin/src/pages/plugins/[...slug].astro";
|
|
71
|
+
var $$url = "/plugins/[...slug]";
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region \0virtual:astro:page:src/pages/plugins/[...slug]@_@astro
|
|
74
|
+
var page = () => ____slug__exports;
|
|
75
|
+
//#endregion
|
|
76
|
+
export { page };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
|
|
2
2
|
import { S as createAstro, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
|
|
3
3
|
import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
|
|
4
|
-
import { n as useTranslation, r as apiClient } from "./
|
|
5
|
-
import { t as $$DashboardLayout } from "./
|
|
4
|
+
import { n as useTranslation, r as apiClient } from "./i18n_BlAR9yiz.mjs";
|
|
5
|
+
import { s as loadPluginComponent, t as $$DashboardLayout } from "./DashboardLayout_DvfGK5S9.mjs";
|
|
6
6
|
import { t as PageHeader } from "./PageHeader_CBOioOjo.mjs";
|
|
7
7
|
import { t as FloatingPanel } from "./FloatingPanel_DI2CdUZK.mjs";
|
|
8
8
|
import { t as FbIcon } from "./FbIcon_D0f6QiFJ.mjs";
|
|
@@ -6099,8 +6099,8 @@ function PluginFieldConfig(props) {
|
|
|
6099
6099
|
const [loading, setLoading] = createSignal(true);
|
|
6100
6100
|
onMount(async () => {
|
|
6101
6101
|
try {
|
|
6102
|
-
const module = await
|
|
6103
|
-
const Comp = module
|
|
6102
|
+
const module = await loadPluginComponent(props.adminComponentPath);
|
|
6103
|
+
const Comp = module["default"] || module["PluginFieldConfig"];
|
|
6104
6104
|
if (Comp) setComponent(Comp);
|
|
6105
6105
|
else setError("Componente de configuração não encontrado no módulo");
|
|
6106
6106
|
} catch (_e) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { r as __exportAll } from "./rolldown-runtime_BMI-E3GI.mjs";
|
|
2
2
|
import { S as createAstro, i as renderComponent, u as renderTemplate } from "./server_B5N27szj.mjs";
|
|
3
3
|
import { t as createComponent$1 } from "./compiler_O7J1rlsi.mjs";
|
|
4
|
-
import { n as useTranslation, r as apiClient } from "./
|
|
5
|
-
import { t as $$DashboardLayout } from "./
|
|
4
|
+
import { n as useTranslation, r as apiClient } from "./i18n_BlAR9yiz.mjs";
|
|
5
|
+
import { t as $$DashboardLayout } from "./DashboardLayout_DvfGK5S9.mjs";
|
|
6
6
|
import { t as PageHeader } from "./PageHeader_CBOioOjo.mjs";
|
|
7
|
-
import { t as Modal } from "./
|
|
7
|
+
import { t as Modal } from "./Modal_Ch2TxBxO.mjs";
|
|
8
8
|
import { t as FloatingPanel } from "./FloatingPanel_DI2CdUZK.mjs";
|
|
9
9
|
import { createComponent, escape, memo, ssr, ssrAttribute, ssrHydrationKey } from "solid-js/web";
|
|
10
10
|
import { For, Show, createMemo, createSignal, onMount } from "solid-js";
|