Há muitas maneiras de contar a história dos 93 anos de Goiânia. Quase um século de transformações que se revela nas ruas, nas indústrias, nas casas e nos comércios da capital. Inaugurada como símbolo de modernidade em meio ao Cerrado dos anos 1930, a cidade atraiu trabalhadores e famílias do interior de Goiás, de outras regiões do Brasil e até de diferentes partes do mundo, que vieram em busca de novas oportunidades e de um lugar para construir suas histórias.
Assim se formou a Goiânia que conhecemos hoje, a chamada Cidade Verde. Um jardim que vai além das árvores e dos parques: reúne memórias, encontros, afetos e esperanças. Histórias tão diversas quanto seus moradores, mas que compartilham uma paixão em comum: sentar-se à mesa de um boteco, saborear uma boa comida, tomar uma cerveja gelada e aproveitar a companhia de amigos.
Para celebrar o aniversário da capital e resgatar um pouco das histórias que fazem parte de sua identidade, o Jornal Opção selecionou 24 bares espalhados por diferentes regiões de Goiânia. A lista busca contemplar a diversidade da cidade e os mais variados gostos, reunindo lugares que fazem parte do cotidiano e da memória dos goianienses.
Confira os estabelecimentos selecionados, com informações sobre localização, horários de funcionamento e principais características de cada bar.
1. Bar do Bigode
Com dez anos de história, o Bar do Bigode, localizado na Rua São Luís, no Alto da Glória, é ponto de encontro de músicos, frequentadores antigos, idosos e famílias. O ambiente também é marcado por encontros espontâneos entre artistas. À frente do estabelecimento está Élvio de Oliveira, conhecido como Bigode, que já administrou cerca de oito bares ao longo da trajetória profissional.
O cardápio reúne pratos tradicionais, como feijoada aos sábados, disco recheado, dobradinha, mocotó e língua. A casa funciona de segunda-feira a sábado, até aproximadamente meia-noite, conforme o movimento.
Mais do que servir comida, o bar aposta na convivência e no acolhimento para reunir diferentes gerações de clientes. Para Élvio, a identidade do estabelecimento está resumida em três pilares: “O bar se resume a amizade, comida e atendimento”.
2. Bolshoi Pub
Com 22 anos de história, o Bolshoi Pub, localizado na Avenida T-53, nasceu da paixão pela música de seu fundador, Rodrigo Carrilho, que decidiu criar o estabelecimento após retornar dos Estados Unidos. O nome, de origem russa, significa “grande” e combina com a proposta da casa, que recebe apreciadores de diferentes estilos musicais, do jazz e da música gospel ao black metal.
Além da programação musical, o pub também recebe eventos corporativos e festas fechadas. O funcionamento é de quinta-feira a sábado, das 20h às 3h.
Entre os desafios enfrentados ao longo dos anos, Rodrigo destaca as mudanças nos hábitos de consumo do público que frequenta a vida noturna e as oscilações no movimento. Apesar disso, ele avalia positivamente a trajetória do estabelecimento, especialmente em relação à estrutura atual. “Não posso reclamar, nunca estivemos melhor em termos de infraestrutura”, afirma.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
Para o fundador, a longevidade é resultado de trabalho e dedicação. “É a casa mais longeva de Goiânia, são 22 anos de muito trabalho e dedicação”, diz Rodrigo Carrilho.
3. Na Xinxa
A caminho de completar três anos de funcionamento, o Na Xinxa, localizado na esquina da T-2 com a T-50, no Setor Bueno, aposta em um ambiente democrático e em pratos autorais para atrair diferentes públicos. Entre os destaques do cardápio está o arroz de moela, carro-chefe da casa, além de opções como o beijo grego, preparado com rabada e língua, e o tradicional disco de carne.
O estabelecimento funciona de terça-feira a domingo, das 12h à meia-noite, e abre às segundas-feiras exclusivamente para o jantar. Durante o almoço, o público é formado principalmente por pessoas mais velhas. À noite, os jovens passam a ocupar mais espaço, em uma dinâmica que reflete a proposta de receber frequentadores de diferentes perfis.
“Nós somos um bar democrático. Quem quiser, vem”, afirma Juna Pereira da Costa, gerente do bar.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
4. Maria Garrafinhas
Fundado há um ano e dois meses, o Maria Garrafinhas surgiu como uma expansão do projeto familiar iniciado na Rua 8. O nome homenageia o pai da fundadora, proprietário do tradicional Zé Latinhas. Localizado na Rua do Lazer, o bar tem como destaque a coxa creme, além de petiscos como bolinho de abóbora com carne-seca, panceta e croquete.
A casa funciona às quintas e sextas-feiras, das 16h à meia-noite; aos sábados, das 14h às 23h; e aos domingos, das 15h à 1h. A localização e o aproveitamento do espaço público ajudam a compor a experiência dos frequentadores, que formam um público diversificado.
Para a equipe do estabelecimento, a identidade do bar é construída principalmente pelas pessoas que o frequentam e pela convivência que se estabelece no local. “Eu acho que tudo é sobre quem frequenta e não sobre o bar em si. Quem faz o bar é o cliente”, afirma Morgana Vasconcelos, gerente do Maria Garrafinhas.
5. Bar da Tia
Fundado em 5 de março de 1985, o Bar da Tia é um dos estabelecimentos tradicionais da Praça Universitária, em Goiânia. A história começou quando a família deixou o interior para acompanhar os filhos durante o ensino superior na capital e decidiu investir no botequim. O nome surgiu da forma carinhosa como os clientes chamavam os fundadores no antigo armazém.
O bar funciona de segunda a quinta-feira, das 10h às 22h30, e às sextas-feiras, das 10h à meia-noite. No cardápio, estão petiscos tradicionais, como pastéis e disquinhos.
Ao longo das décadas, o estabelecimento acompanhou as mudanças no perfil de quem circula pela região. Se antes cerca de 95% dos frequentadores eram universitários, hoje esse público representa aproximadamente 70% dos clientes. O restante inclui pessoas de diferentes regiões da cidade, que também encontram no bar um espaço de convivência.
Manter um ambiente acolhedor, pautado pela igualdade e pela harmonia entre os frequentadores, é um dos desafios do negócio. Lênio Roberto, conhecido como Primo, destaca a importância de preservar esse espírito ao longo dos anos. “O principal desafio é sempre manter a constância da alegria. Da paz. Da harmonia”, afirma.
6. Breguella’s Bar
Fundado em 1978 por dois primos vindos de Minas Gerais, o Breguellas é um botequim tradicional de Goiânia, frequentado por moradores do bairro, clientes antigos e profissionais como advogados e juízes. O nome tem origem no apelido de infância de um dos primos que participaram da fundação do bar. Entre as atrações da casa estão as rodas de chorinho realizadas aos sábados.
Atualmente, o estabelecimento mantém apenas a unidade do Setor Oeste. O funcionamento é de terça a quinta-feira, das 15h à meia-noite ou 0h30, e de sexta-feira a domingo, das 10h à 1h ou 2h, conforme o dia.
Com quase cinco décadas de história, o bar enfrenta o desafio de se manter competitivo em meio à concorrência. Para Gonçalo Antônio, proprietário do Breguellas, diversificar as atrações e buscar novidades são medidas importantes para acompanhar as mudanças no setor. “Hoje a concorrência está grande demais. Hoje você tem que criar, tem que ter uma diversidade”, afirma.
7. Woodstock Bar
Com 22 anos de história, o Woodstock Bar, an Avenida D, mantém uma proposta voltada ao rock clássico e à música ao vivo nos fins de semana. O nome homenageia o festival de música de Woodstock e foi escolhido pela antiga dona. O atual propietário, Marcão, comprou o bar de uma ex-cunhada.
O pub funciona de quarta-feira a domingo, a partir das 18h. Fecha à 1h às quartas, quintas e domingos e às 3h às sextas-feiras e aos sábados. Entre as opções do cardápio estão a Coxa Louca, criada para o concurso Comida di Buteco, e os hanbúrgueres do local. O público é fiel e multigeracional, com frequentadores entre 25 e 60 anos.
A dificuldade de contratação e manutenção de mão de obra está entre os principais desafios. “O desafio maior acho que é mão de obra”, afirmam Marcão e Elisabeth Scalon, namorada de marcão.
8. Gellim
Fundado em 1997 pelo tio do atual proprietário, o Gellim é um ponto de encontro para quem estende a noite até o início da manhã. Localizado na Avenida T-9, o bar funciona diariamente, a partir das 17h ou 18h, até as 6h. No cardápio, o destaque é o frango a passarinho, acompanhado de opções como disco de carne e batata frita. As mesas de sinuca estão entre as principais atrações da casa.
Wilmo Costa Júnior, conhecido como Júnior, assumiu a gestão do estabelecimento em 2012, após morar dez anos na Europa. O nome do bar é uma referência ao apelido de seu fundador. Ao longo dos anos, a casa reuniu um público diversificado, que inclui jovens, frequentadores alternativos e clientes antigos.
Entre os desafios enfrentados pelo negócio estão os impactos financeiros da pandemia de Covid-19 e a dificuldade de encontrar mão de obra. Segundo Júnior, o período deixou marcas no setor de bares da capital, com reflexos que ainda pesam sobre os estabelecimentos. “Depois da pandemia, ficou muito pesado pra bar em Goiânia… Todos os bares em Goiânia endividaram bastante na época da pandemia”, relata.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
9. Bom Malandro
Inaugurado em março, na Rua 8, o Bom Malandro nasceu da iniciativa de Tiago Pires, professor de Sociologia que decidiu deixar a sala de aula para se dedicar ao próprio bar. A proposta também surgiu do desejo de contribuir para a revitalização da rua. O nome do estabelecimento faz referência à música brasileira e à figura de Zé Pilintra, entidade associada à boemia.
Pires conta que comprou o bar de amigos que mantinham uma proposta mais voltada ao rock, mas que, na avaliação dele, não combinava com o ambiente da Rua 8. Ao identificar uma oportunidade de negócio, decidiu assumir o espaço e criar uma nova identidade para o estabelecimento.
O Bom Malandro funciona de quarta a sexta-feira, das 16h à meia-noite, e aos sábados e domingos, das 15h à meia-noite. O cardápio inclui disco de costelinha, pastel de camarão, disco de tilápia e coxinha. A programação musical privilegia a música brasileira, com forró às quintas-feiras e samba às sextas.
O público é formado principalmente por pessoas que apreciam esses gêneros musicais. Entre os desafios do negócio está a redução sazonal do movimento durante os meses de festas de fim de ano. A mudança de carreira representa uma nova etapa na trajetória de Pires, que resume a decisão com bom humor: “Eu sou professor de sociologia de ofício, mas larguei o colégio pra virar diretor de um boteco”, conta.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
10. Zé Latinhas
Fundado em 1967, o Zé Latinhas permanece no mesmo endereço desde a inauguração, na Rua 8, e é administrado por três gerações da família Rosa da Silva. Com quase seis décadas de história, o estabelecimento atravessou diferentes períodos da vida política e social brasileira, incluindo os anos da ditadura militar, e se consolidou como um dos símbolos da boemia goianiense. Pela longevidade, é apontado como um dos bares mais antigos de Goiânia.
A coxa creme, um croquete de frango característico da casa, é o prato mais vendido. A programação musical reúne jazz, chorinho, samba e pagode, em uma proposta que valoriza a cultura brasileira e as manifestações artísticas. O bar funciona às quintas e sextas-feiras, a partir das 16h, e aos sábados e domingos, a partir das 14h.
O público é formado por frequentadores interessados em música, cultura e encontros que atravessam gerações. Para Pilar Paz, gerente do estabelecimento, fazer parte dessa trajetória também significa acompanhar um momento importante para a história da cidade. “Parece que a gente tá fazendo parte de um momento muito histórico mesmo”, afirma.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
11. Fubanga
Criado há um ano e dois meses por quatro sócios com experiência na alta gastronomia, o Fubanga foi idealizado como um botequim simples e acolhedor, em sintonia com o ambiente da Rua 8. O nome é uma expressão associada à cultura cearense ou nordestina, marcada pela irreverência. No cardápio, um dos destaques é a precheca, além de opções como bolinho de carne recheado com presunto e queijo, pão de coração, torresmo, croqueta e baião de dois.
O bar funciona às quartas e quintas-feiras, das 17h30 às 23h30; às sextas-feiras, das 17h30 à 1h; aos sábados, das 12h30 à 1h; e aos domingos, das 12h30 às 20h.
Com foco na comunidade LGBTQIA+, o Fubanga se apresenta como um espaço aberto à diversidade, que busca receber pessoas de diferentes orientações sexuais e faixas etárias. A proposta é manter um ambiente acolhedor para todos os públicos. “A gente é LGBTQIA+. Mas, que nem a gente tem na parede, né? A gente é hétero-friendly”, afirma Junior Marinho, entrevistado pela reportagem.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
12. Tainá-Kan Bar
Com 37 anos de funcionamento, o Tainá-Kan Bar, localizado na T-1, no Setor Bueno, construiu sua história a partir da trajetória de Mauro, que começou como garçom em outro estabelecimento, teve a oportunidade de se tornar sócio e, posteriormente, assumiu o próprio negócio. Hoje, a filha dele, Bruna Lobo, pretende dar continuidade à tradição da família no ramo.
“Já tem trinta e sete anos. Ele começou como garçom em outro bar e aí teve a oportunidade de entrar como sócio, mas desde sempre ficou ele sozinho. Aprendeu como funcionava o negócio e começou o próprio”, conta Bruna.
O nome Tainá-Kan tem origem indígena e significa “Estrela D’Alva”, além de estar associado a uma lenda sobre a cerveja. No cardápio, os espetinhos variados são o carro-chefe, acompanhados de opções como torresmo.
O estabelecimento funciona de segunda a sexta-feira, das 16h à meia-noite, e aos sábados, das 11h à meia-noite. Ao longo dos anos, o bar consolidou um perfil familiar, com uma proposta voltada à alimentação e à convivência entre amigos e parentes. “Sempre foi família, assim, né? Porque aqui é um bar de espetinho, então é mais pra comer, então assim, sempre foi o bar mais familiar”, afirma Bruna Lobo.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
13. Se Sobrar Eu Vendo
Com cerca de 17 anos de história, o Se Sobrar Eu Vendo começou em um espaço pequeno, depois de o proprietário, Júnior, acumular experiência em outros estabelecimentos do ramo. O nome foi sugerido por um distribuidor de bebidas e acabou adotado pelo dono. Localizado na Rua Professor João Henrique Gonçalves, o bar se tornou um ponto tradicional do Setor Leste Vila Nova, com um cardápio que reúne caldo de mocotó, língua, sarapatel, costela e rabada.
Segundo Verônica, filha do proprietário, o perfil dos frequentadores mudou nos últimos cinco anos. No início, o público era formado principalmente por pessoas mais velhas, que também iam ao local para assistir à televisão. Com o aumento do movimento, o estabelecimento passou a receber mais jovens.
Há cerca de seis anos, as quatro filhas do proprietário começaram a ajudar na administração, organizando-se em uma escala de trabalho. Formadas ou em formação em diferentes áreas, elas contribuíram para mudanças na gestão, como a implantação do pagamento com cartão de crédito. Verônica é médica-veterinária anestesiologista; uma das irmãs é formada em Ciências Políticas, outra em Pedagogia, e a quarta está concluindo Psicologia.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
Apesar do envolvimento com o negócio da família, Verônica afirma que ainda não sabe se continuará à frente do bar no futuro. Por enquanto, a continuidade está ligada à participação dos pais no preparo dos pratos. “Enquanto eles estiverem cozinhando, a gente vai continuar tocando”, afirma.
Entre as especialidades da casa, o caldo de mocotó ocupa lugar de destaque e é apontado por Verônica como o principal diferencial do estabelecimento. “O grande diferencial lá do nosso bar é o caldo de mocotó, que, na minha humilde opinião, é disparado o melhor”, diz.
14. Limas Bar
Com 23 anos de história, o Limas Bar foi fundado pelo sogro do atual gestor, Jhon Kennedy. O estabelecimento começou com a venda de petiscos simples e, ao longo do tempo, se transformou em uma peixaria especializada em peixes de água doce. Localizado na Rua Minas Gerais, no Urias Magalhães, o bar oferece opções como tilápia grelhada e frita, traíra e tucunaré.
O público é diversificado, com presença de famílias e pessoas que buscam um ambiente tranquilo para comer e conversar. A proposta é manter a música em volume baixo, sem comprometer a convivência entre os clientes.
O bar funciona de terça a sexta-feira, das 17h às 23h. Aos sábados e domingos, abre a partir das 11h30 e encerra as atividades às 23h.
“Nosso ambiente não tem música alta, é música ambiente. Aquela pessoa que quer um lugar tranquilo, pra sentar e comer, um lugar aconchegante, bem familiar”, afirma Jhon Kennedy.
15. Bentos Bar
Fundado em 2019 por familiares, o Bentos Bar funciona no segundo andar de um estabelecimento no Jardim Nova Esperança. O atual proprietário, Altair Ramos, assumiu a administração há dois anos e mantém uma proposta voltada à convivência entre casais, famílias e grupos de amigos.
A casa oferece almoço de segunda a sábado, das 10h30 às 14h, e jantar diariamente a partir das 18h. De segunda a quinta-feira e aos domingos, fecha à meia-noite. Às sextas-feiras e aos sábados, o funcionamento se estende até as 2h. Aos domingos, o estabelecimento abre exclusivamente para o jantar.
Entre as atrações estão karaokê, noites temáticas e apresentações de música ao vivo. O público é formado principalmente por casais e famílias, além de grupos corporativos que utilizam o espaço para confraternizações.
Um dos desafios do negócio é manter o movimento durante a semana, quando a procura costuma ser menor. Altair destaca o perfil familiar como uma das principais características do estabelecimento. “Nosso bar… é um bar bem familiar, é um bar que 99% do nosso público é casal, é família”, afirma.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
16. Buteco do Pedro
Com dois anos e meio de funcionamento, o Buteco do Pedro nasceu da iniciativa do gastrônomo Pedro de Oliveira, que, após viagens de estudo a botequins de São Paulo, Rio de Janeiro e Belo Horizonte, decidiu trazer para Goiânia referências dos bares tradicionais. A proposta é resgatar a memória afetiva dos antigos botecos do Centro, com comida típica, conversa e convivência.
O estabelecimento funciona de terça a quinta-feira, das 17h às 23h; às sextas-feiras, das 17h à meia-noite; e aos sábados, das 12h à meia-noite. Um dos destaques do cardápio é o bolinho de galinhada, criado inicialmente como trabalho acadêmico durante a formação de Pedro em Gastronomia. Moela, língua e torresmo também ficam expostos em uma estufa aquecida no balcão, enquanto as mesas ocupam a calçada da Rua 4.
O público reúne apreciadores da comida afetiva e do ambiente dos botequins tradicionais, onde a experiência vai além da refeição. Entre os desafios do negócio, Pedro aponta a falta de políticas públicas eficazes para a revitalização do Centro Histórico, região onde o bar está instalado.
A proposta da casa é aproximar a cozinha dos clientes e valorizar pratos que fazem parte da tradição dos botecos. “A ideia é trazer o prato da cozinha para a vitrine. Então, esse é o conceito do bar”, explica Pedro.
17. Shiva Alt-Bar
Criado em 2015, o Shiva Alt-Bar é um espaço independente dedicado à música e à cultura em Goiânia. Localizado na Alameda das Rosas, no Setor Oeste, o estabelecimento mantém uma programação voltada principalmente à cena autoral, com shows, apresentações de DJs, festas e projetos culturais que reúnem artistas locais e nacionais. Ao longo de sua trajetória, consolidou-se como ponto de encontro da produção musical independente na capital.
Além da agenda regular, o Shiva promove residências artísticas, intercâmbios e iniciativas em parceria com coletivos, festivais, universidades e instituições públicas e privadas. Integrante da Rota Cerrado, o espaço aposta na colaboração entre artistas, produtores e agentes culturais para ampliar a circulação de trabalhos autorais, formar público e fortalecer a economia da cultura.
O estabelecimento funciona de quarta a quinta-feira, das 17h30 à 1h; às sextas-feiras, das 17h30 às 2h; aos sábados, das 16h às 2h; e aos domingos, das 16h à meia-noite. O bar não abre às segundas e terças-feiras.
A proposta vai além do entretenimento e busca contribuir para o desenvolvimento da cena cultural goianiense, conectando diferentes profissionais e criando oportunidades para a produção independente.
18. Kuka Bar
Aberto em 2000, o Kuka Bar, também conhecido como Vá Tomá no Kuka Bar, surgiu como ponto de encontro para os amantes do rock em Goiânia. O estabelecimento funciona de terça-feira a domingo, das 19h às 5h, no Jardim América, Rua C-30.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
O principal destaque do cardápio é o pastel gigante, com tamanho aproximado ao de uma folha A4. O prato tem opções carnívoras, vegetarianas e veganas, e a casa também oferece cervejas especiais. O público reúne roqueiros e frequentadores da madrugada goianiense.
A característica principal é a combinação entre temática musical, funcionamento durante a madrugada e o famoso pastel.
19. Gercina Bar
Instalado na rua 104 do Setor Sul, o Gercina Bar mantém características dos botequins clássicos. O nome faz referência à tradição local do bairro. Com mesas na varanda, o estabelecimento aposta em porções fartas e parcerias gastronômicas.
O bar funciona de terça a sexta-feira, das 17h30 à meia-noite, e aos sábados, das 12h à meia-noite. O cardápio inclui arroz de fumeiro, servido aos sábados em colaboração com a chef Hanna, frango empanado, torresmo e pastel crocante.
O público é formado por boêmios e frequentadores tradicionais de boteco. A principal característica é a combinação entre ambiente de varanda, porções fartas e parcerias gastronômicas.
20. Mandala Cervejaria
Criada na Vila Itatiaia, a Mandala Cervejaria reúne gastronomia, música e cerveja artesanal em um ambiente integrado à natureza. O nome faz referência à união e à celebração de momentos em comunidade. A casa oferece chope próprio e pratos como costela suína, carnes na chapa e hambúrgueres, incluindo opções vegetarianas e veganas e queijo empanado.
O público reúne estudantes, moradores da região Norte e apreciadores da cultura alternativa. O espaço também recebe eventos e desenvolve um serviço itinerante.
Sua característica principal é a combinação entre cervejaria artesanal, ambiente arborizado e programação voltada à convivência.
“A Mandala Cervejaria nasceu para ser um ponto de encontro onde boa música, gastronomia de qualidade e momentos especiais se conectam”, informa a apresentação do bar no site oficial.
O estabelecimento funciona às terças e quartas-feiras, das 16h à 1h30; às quintas-feiras, das 16h às 2h; às sextas-feiras e aos sábados, das 15h às 2h; e aos domingos, das 15h às 23h30.
21. Bar do Leandro
O Bar do Leandro mantém a proposta de um botequim simples, administrado pelo proprietário (Leandro) e sua esposa, na Vila Itatiaia. O estabelecimento funciona de terça-feira a domingo, das 16h às 2h.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
O principal destaque do cardápio é o disco artesanal de carne, um dos melhores de Goiânia. O público reúne moradores do bairro e frequentadores locais. A casa tem mesas distribuídas pela calçada e mesas de sinuca, características que reforçam o perfil tradicional do estabelecimento.
22. Gurupi Restaurante
Fundado em 1985, o Gurupi Restaurante é um ponto de convivência da comunidade universitária da Universidade Federal de Goiás (UFG). Administrado pela família fundadora, hoje sob o comando dos irmãos Ricardo e Patrese, o estabelecimento serve almoço self-service com churrasco e também recebe festas universitárias.
O restaurante funciona de segunda a sexta-feira, das 7h30 às 23h30 ou meia-noite; aos sábados, das 7h à meia-noite; e permanece fechado aos domingos. A denominação tem inspiração regional. Historicamente, o local recebeu o apelido de “pamonharia”, embora não venda pamonha.
O público inclui estudantes, professores e servidores da UFG e o população do Itatiaia. A característica principal do Gurupi é a ligação com a vida universitária, com almoço executivo e eventos acadêmicos.
23. Bar do Seu Raimundo
Com 48 anos de história, o Bar do Seu Raimundo foi criado para sustentar a família do fundador, pai de oito filhos. Hoje, o estabelecimento é administrado por Wesley, um dos filhos do senhor Raimundo, que mantém a tradição familiar à frente do negócio. Localizado na Vila Itatiaia, o bar se tornou ponto de encontro de moradores e estudantes da comunidade acadêmica, especialmente por sua proximidade com o campus Samambaia da Universidade Federal de Goiás (UFG).
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
A relação com a música também levou o estabelecimento a ganhar projeção fora do bairro. O Bar do Seu Raimundo já serviu de cenário para gravações de artistas como Zé Felipe, que esteve no local para produzir um videoclipe junto com a ex-namorada Virgínia. O espaço também recebeu o DJ Jiraya Uai, ligado ao eletrofunk goiano.
“É um trabalho feito com muita clareza, muita honestidade, muito carinho, muito amor. E tem 48 anos de tradição…”, afirma Wesley que destaca a relvância do Bar “Vários cantores frequentam o bar e muitos artistas usam o cenário aqui a nível nacional”.
O estabelecimento funciona todos o dias das 10h às 21h.
24. Quintal do Jajá
Idealizado no fim de 2017 e inaugurado em 31 de março de 2018, o Quintal do Jajá foi criado para reunir gastronomia de botequim, cultura e samba no setor Central de Goiânia, na rua R.15. O nome faz referência ao sócio fundador Jajá e ao espaço aberto no estilo quintal, conta Ricardo Coutinho o outro sócio-fundador do bar.
O estabelecimento funciona às quintas e sextas-feiras, das 18h à meia-noite, e aos sábados e domingos, das 12h às 18h. A feijoada tradicional é o carro-chefe dos fins de semana, acompanhada de opções como panceta crocante com geleia de cachaça.
/**
* nwe-wp-gallery.js
*
* Extraído do bundle (public.js) para uso em arquivo separado.
* Requer:
* – jQuery (window.jQuery)
* – Viewer (a lib usada no bundle; pode ser importada ou estar em window.Viewer)
*
* Estrutura esperada no HTML:
* .nwe-wp-gallery
* .nwe-wp-gallery-img img (imagem principal)
* .nwe-wp-gallery-cont-list
* .nwe-wp-gallery-arrow.left/.right (setas)
* .nwe-wp-gallery-list (container com scroll horizontal)
* .nwe-wp-gallery-list-item (thumb)
* data-original=”URL” (imagem grande)
* data-pos=”1″ (posição para o contador)
* .page span (contador/posição)
*/
(function (global) {
const DEFAULTS = {,
};
function getJquery($) {
const jq = $ || global.jQuery;
if (!jq) {
throw new Error(“[nwe-wp-gallery] jQuery não encontrado (window.jQuery).”);
}
return jq;
}
function getViewer(ViewerClass) {
// No bundle ele aparece como “new y.a(…)”.
// Aqui aceitamos via injeção ou via global window.Viewer.
return ViewerClass || global.Viewer;
}
/**
* Liga os eventos e o comportamento do “thumb strip” + setas.
* @param {jQuery} $gallery – container .nwe-wp-gallery
* @param {object} opts
*/
function bindGalleryControls($gallery, opts) {
const $ = $gallery.constructor; // jQuery ref
const $list = $gallery.find(“.nwe-wp-gallery-list”);
// Clique nas setas para scroll horizontal
$gallery
.find(“.nwe-wp-gallery-cont-list .nwe-wp-gallery-arrow”)
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
const itemWidth = $list.find(“.nwe-wp-gallery-list-item”).outerWidth();
const step = opts.animation.scrollMultiplier * itemWidth;
let next = $list[0].scrollLeft + step + opts.animation.scrollPadding;
if ($(this).hasClass(“left”)) {
next = $list[0].scrollLeft – step – opts.animation.scrollPadding;
}, opts.animation.scrollMs);
});
const $items = $gallery.find(“.nwe-wp-gallery-list .nwe-wp-gallery-list-item”);
// Mostra as setas quando o usuário scrolla a lista
$list
.off(“scroll.nweGallery”)
.on(“scroll.nweGallery”, function () {
const $arrows = $(this).parent().find(“.nwe-wp-gallery-arrow”);
if ($arrows.is(“:visible”) === false) {
$arrows.fadeIn(opts.animation.arrowFadeInMs);
}
});
// Força um pequeno scroll inicial (como no bundle)
$list.scrollLeft(1);
// Clique em um thumb: ativa, troca imagem principal, atualiza contador
$items
.off(“click.nweGallery”)
.on(“click.nweGallery”, function () {
$items.removeClass(“active”);
$(this).addClass(“active”);
const $main = $gallery.find(“.nwe-wp-gallery-img”);
const data = this.dataset || {};
const original = data.original;
const pos = data.pos;
if (!original) return;
const $caption = $main.find(“span”);
const $img = $main.find(“img”);
$img.fadeOut(opts.animation.fadeMs, () => {
$img.attr(“src”, original);
$caption.html(data.caption);
$img.fadeIn(opts.animation.fadeMs);
});
if (pos != null) {
$gallery.find(“.page span”).html(pos);
}
});
}
/**
* Inicializa UMA galeria: Viewer + controles.
* @param {Element|jQuery} galleryEl
* @param {object} options
* @returns {void}
*/
function initSingleGallery(galleryEl, options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
const ViewerClass = getViewer(opts.Viewer);
const $gallery = $(galleryEl);
if ($gallery.length === 0) return;
// 1) Viewer (clique na imagem e abre lightbox)
if (ViewerClass) {
// Evita duplicar Viewer caso você reinicialize via AJAX/hook
// (a lib geralmente seta “element.viewer”, mas isso depende da versão).
try {
// eslint-disable-next-line no-new
new ViewerClass($gallery[0], opts.viewerOptions);
} catch (e) {
// Se o Viewer não estiver disponível/compatível, segue só com os controles
// para não quebrar a página.
}
}
// 2) Controles (setas + thumbs)
bindGalleryControls($gallery, opts);
}
/**
* Inicializa TODAS as galerias que existem no DOM.
* @param {object} options
*/
function initAllGalleries(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
const $ = getJquery(opts.$);
$(opts.selector).each(function () {
initSingleGallery(this, opts);
});
}
/**
* Reproduz o comportamento do bundle:
* – Ao DOMContentLoaded inicializa tudo
* – Se existir wp.hooks, registra o addAction para reinicializar galerias inseridas dinamicamente
*/
function bootstrapNweWpGallery(options = {}) {
const opts = mergeDeep({}, DEFAULTS, options);
global.addEventListener(“DOMContentLoaded”, function () {
initAllGalleries(opts);
});
// Hook usado no bundle: “nwe_next_post_after_insert”
if (global.wp && global.wp.hooks && typeof global.wp.hooks.addAction === “function”) {
global.wp.hooks.addAction(
“nwe_next_post_after_insert”,
“theme_next_post_after_insert”,
(containerEl) => {
if (!containerEl) return;
const galleries = containerEl.querySelectorAll(opts.selector);
if (!galleries || galleries.length === 0) return;
galleries.forEach((el) => initSingleGallery(el, opts));
}
);
}
}
// Helpers simples (sem depender de libs)
function isObject(item) {
return item && typeof item === “object” && !Array.isArray(item);
}
function mergeDeep(target, …sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, …sources);
}
// Exports globais (pode trocar para export default se estiver em bundler)
global.NweWpGallery = {
initSingleGallery,
initAllGalleries,
bootstrapNweWpGallery,
};
})(window);
window.NweWpGallery.bootstrapNweWpGallery();
O público inclui professores, estudantes universitários, famílias, integrantes da comunidade LGBTQIA+ e apreciadores de samba de diferentes estados. A programação também atrai compositores nacionais, que visitam o bar com certa frequência. Entre os desafios estão conciliar a gestão do tempo entre múltiplos empreendimentos, preservar a identidade cultural e contratar mão de obra.
A característica principal é a atuação como polo cultural do samba no Centro, associando gastronomia e música. “Esse nosso amor pelo samba começa a chegar um pouquinho para fora de Goiânia… chega no Rio de Janeiro, chega em São Paulo, chega em Belo Horizonte”, afirma Ricardo.
Leia mais: Sabores do mundo em Goiânia: uma viagem gastronômica sem sair da capital