Web Component · Lit

<ws-motor>

Motor de reservas embutível — fixo na base da página, com integração de webhook e redirecionamento para o motor de reservas do hotel.

Instalação

Inclua o script do widget e adicione a tag <ws-motor> na página. O elemento se posiciona automaticamente fixo na base da janela.

<!-- Carrega o custom element (registra <ws-motor>) -->
<script type="module" src="/caminho/para/ws-motor.js"></script>

<ws-motor
  api-key="SUA_API_KEY"
  hotel-id="23099"
  webhook="ID_DO_WEBHOOK"
  engine="omnibees"
  collect-contact-data
></ws-motor>
O widget usa position: fixed; bottom: 0 e ocupa toda a largura. Reserve espaço na base da sua página (ex.: padding-bottom no <body>) para o conteúdo não ficar escondido atrás dele. Em telas < 768px ele aparece como um botão “Reservar agora” que abre uma bottom sheet.

Atributos

Configuração via atributos HTML. Todos são opcionais, mas api-key, hotel-id e webhook são necessários para o fluxo completo de reserva.

AtributoTipoPadrãoDescrição
api-key string "" Enviado no header x-api-key para o webhook da Innsights.
hotel-id string "" Identificador do hotel. Usado como q na engine omnibees e como companyId na engine hbook.
webhook string "" ID do webhook. A reserva é enviada para https://api.innsights.com.br/webhooks/{webhook}.
engine string "omnibees" Estratégia do motor de reservas: omnibees, foco ou hbook. Valor desconhecido cai em omnibees.
engine-url string "" URL base do motor. Obrigatório apenas para a engine foco.
collect-contact-data boolean ausente Se presente, abre uma etapa que coleta nome, e-mail e telefone antes de enviar/redirecionar. Sem ele, usa dados anônimos.
O código promocional e os campos de datas, adultos e crianças são preenchidos pelo hóspede na própria interface — não são atributos. Padrões: check-in hoje, check-out +2 dias, 2 adultos, 0 crianças.

Engines de reserva

A engine define para onde o hóspede é redirecionado após a reserva. Cada engine monta a URL a partir dos dados preenchidos.

omnibees (padrão)

Usa hotel-id e o código promocional digitado. Redireciona para o motor Omnibees.

https://book.omnibees.com/hotelresults?q={hotel-id}&CheckIn=DDMMYYYY
    &CheckOut=DDMMYYYY&ad={adultos}&ch={criancas}&ag={idades}&Code={promo}

foco

Usa engine-url como base. Barra final duplicada é removida.

{engine-url}/search/{checkin}/{checkout}/{adultos-idade1-idade2}
# ex.: https://chapadaindaia.com.br/search/2026-06-10/2026-06-12/2-3-5

hbook

Usa hotel-id como companyId. Datas em DD/MM/YYYY e um parâmetro childrenage por criança.

https://hbook.hsystem.com.br/Booking?companyId={hotel-id}
    &checkin=02/07/2026&checkout=03/07/2026
    &adults=2&children=2&childrenage=8&childrenage=2

Evento

Ao confirmar a reserva, o widget dispara reservation-submit (com bubbles e composed), permitindo interceptar o payload completo.

document.querySelector('ws-motor').addEventListener(
  'reservation-submit',
  (event) => {
    console.log(event.detail)
    // { name, email, phone, checkin, checkout, adults,
    //   childrens, ages, utm_source, utm_medium, utm_campaign,
    //   utm_term, utm_content, source_page, source_form, shubid }
  }
)

Os parâmetros utm_*, source_page e shubid são coletados automaticamente da URL e dos cookies da página.

Estilização

Toda a aparência é controlada por CSS Custom Properties definidas no seletor ws-motor. Sobrescreva apenas as que quiser — as demais mantêm o padrão.

Barra e controles — --ws-element-*

VariávelPadrãoAplica-se a
--ws-element-bg#ffffffFundo da barra
--ws-element-border#e5e7ebBorda superior da barra
--ws-element-divider#e5e7ebDivisores entre os controles
--ws-element-control-bg#ffffffFundo dos controles (datas, hóspedes, promo)
--ws-element-control-border#d1d5dbBorda dos controles
--ws-element-control-text#111827Texto dos controles
--ws-element-control-height44pxAltura dos controles e botões
--ws-element-input-bg#ffffffFundo dos inputs de texto
--ws-element-button-bg#111827Fundo do botão “Reservar agora”
--ws-element-button-text#ffffffTexto do botão principal
--ws-element-text#111827Texto geral do widget
--ws-element-muted-text#374151Texto secundário / legendas
--ws-element-icon-color#171717Cor dos ícones da barra
--ws-element-range-bg#e5e7ebFundo de faixas
--ws-element-disabled-text#9ca3afTexto de itens desabilitados
--ws-element-border-soft#f3f4f6Bordas suaves internas

Popover de hóspedes — --ws-popover-*

VariávelPadrãoAplica-se a
--ws-popover-bg#ffffffFundo do popover
--ws-popover-border#e5e7ebBorda do popover
--ws-popover-text#111827Texto do popover
--ws-popover-muted-text#6b7280Texto secundário (subtítulos dos steppers)
--ws-popover-icon-color#171717Ícones dos botões +/− dos steppers

Calendário — --ws-calendar-*

VariávelPadrãoAplica-se a
--ws-calendar-bg#ffffffFundo do calendário
--ws-calendar-border#e5e7ebBorda e rodapé do calendário
--ws-calendar-text#111827Texto dos dias
--ws-calendar-muted-text#6b7280Legendas e dias fora do mês
--ws-calendar-hover-bg#f3f4f6Hover sobre os dias
--ws-calendar-selected-bg#111827Dia de check-in / check-out selecionado
--ws-calendar-selected-text#ffffffTexto do dia selecionado
--ws-calendar-range-bg#e5e7ebFaixa entre check-in e check-out

Exemplo de tema

O tema aplicado no widget ao vivo (fixo na base desta página). Copie e ajuste as cores para a sua marca.

ws-motor {
  --ws-element-bg: #002925;
  --ws-element-border: #003b35;
  --ws-element-divider: #003b35;
  --ws-element-control-bg: #ffffff26;
  --ws-element-control-border: #414141;
  --ws-element-control-text: #ffffff;
  --ws-element-input-bg: #ffffff;
  --ws-element-button-bg: #ff7a00;
  --ws-element-button-text: #ffffff;
  --ws-element-icon-color: #ffffff;
  --ws-element-text: #f3f3f3;
  --ws-calendar-selected-bg: #ff7a00;
  --ws-calendar-selected-text: #341e0a;
  --ws-calendar-range-bg: #fbdcbf;
}
Role até o fim da página: o <ws-motor> abaixo está usando exatamente este tema. Interaja com datas, hóspedes e o botão para ver as variáveis em ação.