diff --git a/src/main/webapp/cliente/assembleias.html b/src/main/webapp/cliente/assembleias.html
new file mode 100644
index 0000000..8daaa27
--- /dev/null
+++ b/src/main/webapp/cliente/assembleias.html
@@ -0,0 +1 @@
+
AssembleiaAssembleia
diff --git a/src/main/webapp/cliente/assembleias.js b/src/main/webapp/cliente/assembleias.js
new file mode 100644
index 0000000..0844a1b
--- /dev/null
+++ b/src/main/webapp/cliente/assembleias.js
@@ -0,0 +1,30 @@
+const rows=document.querySelector('#rows');
+let assembleias=[];
+
+function esc(v){return String(v??'').replace(/[&<>'"]/g,c=>({'&':'&','<':'<','>':'>',"'":''','"':'"'}[c]))}
+function termo(){return document.querySelector('#assembleia-search-input')?.value.trim().toLowerCase()||''}
+function contem(q,...vals){return !q||vals.some(v=>String(v??'').toLowerCase().includes(q))}
+function destinatariosLabel(a){return (a.destinatarios||[]).map(x=>x.nome+' ('+x.tipo+')').join(', ')||'-'}
+
+function renderAssembleias(){
+ const q=termo();
+ const lista=assembleias.filter(a=>contem(q,a.condominio_nome,a.tipo,a.data_hora,a.local,a.status,destinatariosLabel(a)));
+ rows.innerHTML=lista.map(a=>`| ${esc(a.condominio_nome||'-')} | ${esc(a.tipo)} | ${Util.date(a.data_hora)} | ${esc(a.local||'')} | ${Util.badge(a.status)} | ${esc(destinatariosLabel(a))} | Abrir |
`).join('')||'| Nenhuma assembleia encontrada. |
';
+}
+
+async function load(){
+ try{
+ const d=await Api.get('/api/assembleias-calendario');
+ assembleias=d.assembleias||[];
+ renderAssembleias();
+ }catch(e){Util.toast(e.message,true)}
+}
+
+window.alternarBuscaAssembleias=()=>{
+ const strip=document.querySelector('#assembleia-search'),input=document.querySelector('#assembleia-search-input');
+ strip.classList.toggle('hidden');
+ if(!strip.classList.contains('hidden'))input.focus();
+};
+
+document.querySelector('#assembleia-search-input')?.addEventListener('input',renderAssembleias);
+load();
diff --git a/src/main/webapp/js/layout.js b/src/main/webapp/js/layout.js
index f5dd7c7..ef732e8 100644
--- a/src/main/webapp/js/layout.js
+++ b/src/main/webapp/js/layout.js
@@ -1 +1 @@
-window.Layout={mount(scope,active){Auth.require(scope);const label=localStorage.getItem('auth_label')||(scope==='master'?'Master':'Escritório');const master=[['Clientes','/master/clientes.html','clientes'],['Planos','/master/planos.html','planos'],['Financeiro','/master/financeiro.html','financeiro'],['Configurações','/master/configuracoes.html','configuracoes'],['Backup','/master/backup.html','backup']];let cliente=[['Cadastro','/cliente/condominios.html','condominios'],['Lembretes','/cliente/lembretes.html','lembretes'],['Financeiro','/cliente/financeiro.html','financeiro'],['WhatsApp','/cliente/configuracoes.html','configuracoes']];if(scope==='empresa'&&!Auth.isAdminEmpresa())cliente=cliente.filter(x=>x[2]!=='configuracoes');const menu=(scope==='master'?master:cliente).map(([n,h,k])=>`${n}`).join('');document.body.insertAdjacentHTML('afterbegin',``);document.body.classList.add('app');document.querySelector('main')?.classList.add('content')}};
+window.Layout={mount(scope,active){Auth.require(scope);const label=localStorage.getItem('auth_label')||(scope==='master'?'Master':'Escritório');const master=[['Clientes','/master/clientes.html','clientes'],['Planos','/master/planos.html','planos'],['Financeiro','/master/financeiro.html','financeiro'],['Configurações','/master/configuracoes.html','configuracoes'],['Backup','/master/backup.html','backup']];let cliente=[['Cadastro','/cliente/condominios.html','condominios'],['Lembretes','/cliente/lembretes.html','lembretes'],['Assembleia','/cliente/assembleias.html','assembleias'],['Financeiro','/cliente/financeiro.html','financeiro'],['WhatsApp','/cliente/configuracoes.html','configuracoes']];if(scope==='empresa'&&!Auth.isAdminEmpresa())cliente=cliente.filter(x=>x[2]!=='configuracoes');const menu=(scope==='master'?master:cliente).map(([n,h,k])=>`${n}`).join('');document.body.insertAdjacentHTML('afterbegin',``);document.body.classList.add('app');document.querySelector('main')?.classList.add('content')}};