HTML |
---|
<div> <div class="imgcapa"> <img src="http://danielypaz.com.br/wp-content/uploads/2023/02/capaartigo3-1final.png" style="width:100%"> </div> |
HTML |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> <div class="content"> <div class="article"> <br> <h2> <img src="http://danielypazprojeto.com.brcloud/wp-content/uploads/2023/0203/[email protected]" alt="some text" width=40>   WEBHOOKS WEBHOOKS NO WORKFLOW DO TOTVS CRM <CRM</h2> <br> <div class="table-wrap" style="margin-left: 30px;"> <table class="relative-table wrapped confluenceTable" style="width: 367.06px;" resolved=""> <thead> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Produto:</th> <td style="text-align: left;" colspan="1" class="confluenceTd"> TCRM - Gestão de Clientes</td> <div class="content-wrapper"> </div> </td> </tr> </thead> <colgroup> <col style="width: 162.912px;"> <col style="width: 203.153px;"> </colgroup> <tbody> <tr> <th style="text-align: left;" class="confluenceTh">Linha de Produto:</th> <td style="text-align: left;" class="confluenceTd">TOTVS CRM</td> <div class="content-wrapper"> </div> </td> </tr> <tr> <th style="text-align: left;" class="confluenceTh">Segmento:</th> <td style="text-align: left;" class="confluenceTd">Cross Segmentos</td> <div class="content-wrapper"> </div> </td> </tr> <tr> <th style="text-align: left;" class="confluenceTh">Módulo:</th> <td style="text-align: left;" class="confluenceTd">Workflow</td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Aplicação</th> <td style="text-align: left;" colspan="1" class="confluenceTd">Web/app móvel</td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Identificador:</th> <td style="text-align: left;" colspan="1" class="confluenceTd"><span style="color: rgb(23,43,77);">ME261020221452</span></td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Stakeholder:</th> <td style="text-align: left;" colspan="1" class="confluenceTd">TOTVS Connector</td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Ticket:</th> <td style="text-align: left;" colspan="1" class="confluenceTd"><br></td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh"><span style="color: rgb(0,0,0);">Requisito/S</span><span style="color: rgb(0,0,0);">tory/Issue (informe o requisito relacionado)</span><span style="color: rgb(47,57,65);"> :</span></th> <td style="text-align: left;" colspan="1" class="confluenceTd"> <div class="content-wrapper"> <span class="jira-issue" data-jira-key="DTCRMSC-2480"> <a href="https://jiraproducao.totvs.com.br/browse/DTCRMSC-2480" class="jira-issue-key"><img class="icon" src="https://jiraproducao.totvs.com.br/images/icons/ico_epic.png">DTCRMSC-2480</a> - <span class="summary">ME261020221452 - Suporte a webhooks via Workflow</span> <span class="aui-lozenge aui-lozenge-subtle aui-lozenge-current jira-macro-single-issue-export-pdf">Em Execução</span> </span> </div> </td> </tr> </tbody> </table> </div> |
HTML |
---|
<br> <p> Muitas empresas enfrentam o desafio de manter seus registros atualizados em diversos sistemas quando uma ação é executada no TOTVS CRM. Esse processo manual é demorado e pode levar a erros, impactando negativamente a eficiência e produtividade da equipe. Para superar essa dificuldade, o TOTVS CRM lançou recentemente um novo recurso de ação chamado Webhook, disponível no módulo de workflow. Com a utilização de Webhooks, os clientes agora podem automatizar esses processos e integrar facilmente diferentes sistemas e aplicativos. Quando um gatilho de criação ou atualização é acionado no TOTVS CRM, a ação de Webhook é executada, permitindo que as informações sejam atualizadas em tempo real em outros sistemas conectados. Esse processo resulta em atualizações rápidas e precisas, economizando tempo e eliminando erros manuais que antes eram muito comuns. Em outras palavras, a ação de Webhook permite que os clientes conectem seus sistemas e automatizem a atualização de registros, o que simplifica o processo e melhora significativamente a eficiência operacional da empresa. <br> <br> <div> </div> <br> <br> <br> <br> <br> <br> |
HTML |
---|
<div class="pause" id="secao-5">   <b> TIPO DE INTEGRAÇÃO</b> </div>
<p> <strong>Saída:</strong> esta integração envia dados do TCRM - Gestão de Clientes para uma ferramenta destino, especificada na configuração.
</p>
<br> <br> |
HTML |
---|
<div class="pause" id="secao-5">   <b> O QUE ESTA INTEGRAÇÃO FAZ?</b> </div>
<p> Esta configuração permite enviar dados do TOTVS CRM para outras ferramentas que disponham de uma URL de entrada de dados. Essa URL precisa conseguir ler e consumir dados enviados em formato JSON.
</p>
<br> <br> |
HTML |
---|
<div class="pause" id="secao-5">   <b> OBSERVAÇÕES E REQUISITOS</b> </div>
<p> É importante ter um desenvolvedor ou contato com o suporte do seu outro sistema para checar a compatibilidade com a leitura do pacote de dados que o TOTVS CRM envia. </p>
<br> <br> |
HTML |
---|
<div class="pause" id="secao-5">   <b> PASSO A PASSO PARA REALIZAR A INTEGRAÇÃO </b> </div>
<br>
<ol>
<li>Com o TOTVS CRM Gestão de Clientes aberto em seu navegador, acesse o Workflow por meio do menu principal;</li> <br>
<li>Para adicionar uma automação, clique no botão "Adicionar" localizado no canto superior direito da tela;</li><br>
<li>No campo de nome, insira uma breve descrição do Webhook, facilitando a identificação do cadastro em acessos futuros. Se necessário, adicione informações complementares no campo de observações;</li><br>
<li>Depois de nomear seu Workflow, selecione o gatilho do seu workflow clicando no botão "Selecionar Gatilho" disponível em tela. Em seguida, selecione o gatilho que iniciará sua automação clicando no botão "Selecionar Gatilho". O gatilho será o evento que desencadeará a chamada do Webhook, como uma atividade concluída ou uma oportunidade ganha, entre outros;</li><br>
<li>Se desejar, você pode adicionar condições (filtros) para limitar quando a automação será executada, clicando em "Adicionar Condições";</li><br>
<li>Por fim, selecione a ação "Webhook" em "Selecionar Ação" e informe a URL pública do sistema que receberá a notificação do evento. Se necessário, adicione cabeçalhos adicionais para questões técnicas, como autenticação;</li><br>
<li>Salve seu Workflow com o status de ativo e ele passará a ser executado para os próximos eventos;</li><br>
<li>Vale destacar que Webhooks no TOTVS CRM são regidos por algumas características técnicas importantes. Consulte a próxima seção deste documento para maiores informações a respeito, permitindo que sua integração aconteça com sucesso e de forma eficiente.</li><br>
</ol>
<img src="https://tdn.totvs.com/download/attachments/745140752/gifwehook.gif?version=1&modificationDate=1678548639423&api=v2"> |
HTML |
---|
<div class="pause" id="secao-5">   <b> INFORMAÇÕES TÉCNICAS</b> </div>
<p> Quando o TOTVS CRM Gestão de Clientes realiza uma chamada para sistemas externos via Webhooks, ele transmite metadados sobre o evento que permitem identificar o que aconteceu e reagir adequadamente. Esses metadados são enviados por meio de uma chamada HTTP utilizando o método POST, com o conteúdo (payload/body) formatado em JSON.
<br> <br>
Aqui está um exemplo desse formato JSON e as informações incluídas nele para referência: </p>
<br> <br> |
HTML |
---|
<style>
.code-box {
background-color: #282c34;
color: #abb2bf;
padding: 20px;
margin: 20px;
border-radius: 5px;
position: relative;
}
.code-title {
position: absolute;
top: 0;
left: 0;
right: 0;
background-color: #343541;
color: #282c34;
padding: 10px;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
font-weight: bold;
}
.code-btn {
position: absolute;
top: 5px;
right: 5px;
background-color: #343541;
color: #fff;
border: none;
border-radius: 5px;
padding: 5px 10px;
font-weight: bold;
cursor: pointer;
}
.code-box pre {
margin: 0;
}
.code-string {
color: #98c379;
}
.code-number {
color: #d19a66;
}
.code-boolean {
color: #56b6c2;
}
.code-null {
color: #e06c75;
}
</style>
<div class="code-box">
<div class="code-title">
<img src="http://projeto.cloud/wp-content/uploads/2023/03/json-file.png" alt="JSON logo" width="20" height="20" style="margin-right: 5px;">
</div>
<button class="code-btn" onclick="copyToClipboard()">Copiar</button>
<pre><code id="myCode" class="language-json">
{
"eventId": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"timestamp": <span class="code-string">"2022-05-06T15:28:36.110-03:00"</span>,
"workflow": {
"id": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"description": <span class="code-string">"Lorem ipsum dolor sit amet"</span>
},
"trigger": {
"id": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"description": <span class="code-string">"Opportunity won"</span>
},
"source": {
"object": {
"id": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"description": <span class="code-string">"Opportunity"</span>,
"contextUrl": <span class="code-string">"/api/v11/opportunity/opportunities"</span>
},
"row": {
"id": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"externalId": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>
}
}
}
</code></pre>
</div>
<script>
function copyToClipboard() {
const codeToCopy = document.getElementById("myCode").textContent;
const el = document.createElement('textarea');
el.value = codeToCopy;
document.body.appendChild(el);
el.select();
document.execCommand('copy');
document.body.removeChild(el);
alert("Código copiado para a área de transferência.");
}
</script> <br> <br> |
HTML |
---|
<p> A tabela abaixo contém informações detalhadas sobre os atributos presentes no formato JSON. Esses atributos são listados juntamente com seus respectivos formatos e intenções. Essas informações podem ser úteis para entender melhor a estrutura do JSON e como usá-lo. </p> <br>
<p>
<style>
table {
}
</style>
<table class="wrapped confluenceTable tablesorter tablesorter-default" role="grid" resolved="">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead>
<tr role="row" class="tablesorter-headerRow">
<th class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="0" tabindex="0" scope="col" role="columnheader" aria-disabled="false" unselectable="on" aria-sort="none" aria-label="Atributo: No sort applied, activate to apply an ascending sort" style="user-select: none;">
<div class="tablesorter-header-inner">Atributo</div>
</th>
<th class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="1" tabindex="0" scope="col" role="columnheader" aria-disabled="false" unselectable="on" aria-sort="none" aria-label="Tipo de dados: No sort applied, activate to apply an ascending sort" style="user-select: none;">
<div class="tablesorter-header-inner">Tipo de dados</div>
</th>
<th class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="2" tabindex="0" scope="col" role="columnheader" aria-disabled="false" unselectable="on" aria-sort="none" aria-label="Descrição: No sort applied, activate to apply an ascending sort" style="user-select: none;">
<div class="tablesorter-header-inner">Descrição</div>
</th>
</tr>
</thead>
<tbody aria-live="polite" aria-relevant="all">
<tr role="row">
<td class="confluenceTd">eventId</td>
<td class="confluenceTd">String</td>
<td class="confluenceTd">Identificador único do evento</td>
</tr>
<tr role="row">
<td class="confluenceTd">timestamp</td>
<td class="confluenceTd">Data e hora formatados como String (ISO 8601)</td>
<td class="confluenceTd">Data e hora em que o Workflow foi executado</td>
</tr>
<tr role="row">
<td class="confluenceTd">workflow.id</td>
<td class="confluenceTd">UUID formatado como String</td>
<td class="confluenceTd">Identificador único do workflow que emitiu o evento</td>
</tr>
<tr role="row">
<td class="confluenceTd">workflow.description</td>
<td class="confluenceTd">String</td>
<td class="confluenceTd">Nome do workflow que emitiu o evento, como definido no momento que a chamada foi disparada </td>
</tr>
<tr role="row">
<td class="confluenceTd">trigger.id</td>
<td class="confluenceTd">UUID formatado como String</td>
<td class="confluenceTd">Identificador único global do gatilho definido no Workflow no momento que o evento foi disparado</td>
</tr>
<tr role="row">
<td class="confluenceTd">trigger.description</td>
<td class="confluenceTd">String</td>
<td class="confluenceTd">Nome do gatilho definido no Workflow no momento que o evento foi disparado</td>
</tr>
<tr role="row">
<td class="confluenceTd">source.object.id</td>
<td class="confluenceTd">UUID formatado como String</td>
<td class="confluenceTd">Identificador único do objeto de origem do evento (oportunidades, leads, atividades, etc)</td>
</tr>
<tr role="row">
<td class="confluenceTd">source.object.description</td>
<td class="confluenceTd">String</td>
<td class="confluenceTd">Descrição do objeto de origem do evento</td>
</tr>
<tr role="row">
<td class="confluenceTd">source.object.contextUrl</td>
<td class="confluenceTd">URL formata como String</td>
<td class="confluenceTd">URL base da API do objeto de origem no TOTVS CRM Gestão de Clientes</td>
</tr>
<tr role="row">
<td class="confluenceTd">source.row.id</td>
<td class="confluenceTd">UUID formatado como String</td>
<td class="confluenceTd">Identificador único do registro de origem do evento (ID da oportunidade, lead, atividade, etc)</td>
</tr>
<tr role="row">
<td colspan="1" class="confluenceTd">source.row.externalId</td>
<td colspan="1" class="confluenceTd">String</td>
<td colspan="1" class="confluenceTd">Identificador externo do registro de origem do evento, se houver um e o atributo estiver visível no Workflow</td>
</tr>
</tbody>
</table> </p> |
HTML |
---|
<div class="pause" id="secao-5">   <b> ESTRATÉGIA DA EXECUÇÃO DAS CHAMADAS</b> </div>
<p> O TOTVS CRM Gestão de Clientes faz a execução das chamadas de forma assíncrona e baseada em consistência eventual, o que pode resultar em eventos entregues fora de ordem e com atrasos de alguns minutos. Em caso de falhas de comunicação, os eventos são retornados para a fila e uma nova tentativa é feita após pelo menos 5 minutos, podendo ocorrer entregas de novos eventos durante esse período. É importante que o sistema terceiro que recebe os eventos esteja preparado para lidar com possíveis cenários de eventos entregues fora de ordem, mais de uma vez e/ou com atrasos, identificáveis pelos atributos eventId e timestamp.</p>
<br> |
HTML |
---|
<div class="pause" id="secao-5">   <b> CENÁRIOS DE FALHA</b> </div>
<p> Quando o TOTVS CRM Gestão de Clientes chama o sistema terceiro para informar um evento, ele verifica se a resposta HTTP recebida é da família 2xx para entender se a entrega foi bem-sucedida. Se sim, o evento é considerado entregue com sucesso. Caso contrário, o evento é encaminhado para uma fila de novas tentativas de entrega, com um intervalo de pelo menos 5 minutos entre cada tentativa. Se após 10 tentativas o evento não for entregue com sucesso, ele será descartado. O TOTVS CRM também estabelece um tempo limite de 5 segundos para a conexão com o serviço remoto e 60 segundos para receber uma resposta. Se esses limites forem ultrapassados, o evento será encaminhado para a fila de novas tentativas, independentemente de o sistema terceiro ter recebido a mensagem depois desses limites.</p>
<br> <br> <br> <br> <br> <br> <br> <br> |
HTML |
---|
<style>
#title-text {
display: none !important;}
@import "compass/css3"; @import "compass/css3";
* {
box-sizing: border-box;
font-family: lato, sans-serif;
}
* {
font-family: lato, sans-serif;
}
blockquote {
margin: 3%;
border-left: 10px solid #363636;
padding: 2%;
color: #222;
background: #fff;
font-style: italic;
line-height: 130%;
}
.top {
width: 100%;
background: #363636;
}
.img {
image-resolution: 5px 5px 9px;
image-rendering: auto;
image-orientation:0deg
}
.header {
max-width: 1200px;
width: 98%;
height: 7em;
margin: 0px auto;
overflow: hidden;
h1 {
text-align: center;
font-weight: bold;
color: #fff;
padding: 20px;
font-size: 22px;
div {
margin: 0;
font-weight: normal;
font-size: 1.8em;
}
}
.author {
font-size: 0.8em;
font-weight: normal;
border-top: 1px dashed #555;
border-bottom: 1px dashed #555;
max-width: 160px;
text-align: center;
margin: -1em auto 0 auto;
padding: 0.3em;
text-transform: uppercase;
color: #ccc;
}
}
.content {
max-width: auto;
float: right;
margin: auto;
padding: 0;
}
.date {
float: left;
width: 10%;
color: #444;
text-align: center;
div {
margin: 0;
line-height: 50%;
}}
.day {
float: left;
margin-top: 0.1em;
width: 100%;
color: #FEAC0E;
font-size: 200%;
}
}
.date-line {
display: none;
}
.article {
width: 100%;
padding: 0 7em 0 7em;
background: rgb(247, 247, 252);
}
h2 {
font-weight: normal;
font-size: 22px;
font-weight: bold;
color: #555555;
margin: 0;
}
h3 {
font-weight: normal;
font-size: 16px;
color: #888;
font-style: italic;
margin: 0 0 1em 0;
}
p {
margin: 0;
padding-top: 8px;
color: #555;
text-align: justify;
font-size: 16px;
line-height: 150%;
}
li{
font-size: 16px;
color: #555555;
}
div{
font-style: 16px;
color: #555;
}
.firstpara {
text-indent: 0;
font-size: 16px;
}
.pause {
margin: 2em auto 2em auto;
color: #555555;
width: 60%;
padding: 10px;
text-align: center;
font-size: 20px;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.firstcharacter {
float: left;
font-size: 16px;
font-weight: bold;
color: #555;
line-height: 0.6em;
padding-top: 0.12em;
padding-right: 0.1em;
padding-left: 0;
}
}
.footer {
max-width: 1200px;
width: 98%;
height: 50px;
margin: 0px auto;
overflow: hidden;
border-top: 1px solid #ccc;}
.copy {
float: right;
font-style: italic;
color: #888;
padding: 1% 1% 0 0;
}
}
.prev a,
.next a {
position: fixed;
top: 9.6em;
padding: 1em;
background: #f1f1f1;
border: 1px solid #ccc;
border-radius: 5px;
}
.prev a:hover,
.next a:hover {
background: #fff;
}
.prev a {
left: 0.7em;
}
.next a {
right: 0.7em;
}
@media only screen and (max-width: 450px) {
.content {
margin-top: 2em;
}
.social {
display: none;
}
.date {
display: none;
}
.date-line {
display: inline;
}
.article {
width: 100%;
margin: 0 auto 2em auto;
border-left: none;
padding-bottom: 2em;
border-bottom: 1px solid #ccc;
p {
font-size: 1.2em;
}
}
.header {
height: auto;
position: fixed;
top: 0;
padding: 0;
margin: 0;
background: rgb(34, 16, 171)
h1 {
text-align: center;
width: 100%;
margin: 0;
color: #f1f1f1;
span {
font-size: 80%;
}
}
.author {
display: none;
}
}
.footer {
text-align: center;
padding: 3%;
height: 40px;
.copy {
float: none;
}
}
.prev a,
.next a {
position: relative;
margin-bottom: 2em;
text-align: center;
top: 0;
}
.prev a {
float: left;
width: 40%;
}
.next a {
float: right;
width: 40%;
}s
.table {
font-family: lato;
background-color: #fff;
}
#wrapper {
display: flex;
flex-direction: column;
gap: 2px;
position: absolute;
inset: 0;
justify-content: center;
align-items: center;
}}
.flexWrap {
display: flex;
gap: 2px;
width: 110px;
}
#disclaimer {
font-family: sans-serif;
color: #333333;
position: fixed;
top: 5%;
right: 5%;
width: 5%;
}
.badge-primary {
color: #8686FF;
background-color: #F3F3FF;
border-radius: 10px;
padding: 6px 7px;
font-size: 9px;
font-weight: bold }
.badge-secondary{
color: #ebeef0;
background-color: #2abe74;
border-radius: 10px;
padding: 6px 7px;
font-size: 9px;
font-weight: bold
}
.badge-novo {
color: #fff;
background-color: #20d691;
border-radius: 10px;
padding: 6px 7px;
font-size: 9px;
font-weight: bold }
.badge-danger{
color: #FFFFFF;
background-color: #FF4057;
border-radius: 10px;
padding: 6px 7px;
font-size: 9px;
font-weight: bold }
.badge-manutencao {
color: #FFF;
background-color: #efc307;
border-radius: 10px;
padding: 6px 7px;
font-size: 9px;
font-weight: bold;
}
.badge-melhoria {
color: #FFF;
background-color: #6f60f6;
border-radius: 10px;
padding: 6px 7px;
font-size: 9px;
font-weight: bold;
}
.badge-light {
color: #8686FF;
background-color: #F3F3FF
border-radius: 10px;
padding: 6px 7px;
font-size: 9px;
font-weight: bold;
}
.badge-dark {
color: #ebeef0;
background-color: #064118;
border-radius: 10px;
padding: 6px 7px;
font-size: 9px;
font-weight: bold }
body {
font-family: lato;
}
}
caption {
font-size: 1.5rem;
text-align: left;
padding-bottom: 1rem;
}
}
tbody tr:nth-child(odd),
tfoot tr:nth-child(even) {
background-color: #fff;
}
tfoot tr td:first-child {
border: none;
background-color: white;
}
tfoot {
border-top: 5px solid #fff;
}
.img2 {
width:50%;
height:auto;
padding:2%;
margin-bottom:4%;
align-content: center;
display: block;
margin-left: auto;
margin-right: auto }
#f7f7fc;
}
}
container{
width: 50%;
}
.borderbox{
border: 1px dashed #ebebeb;
width:45%;
margin: 50px auto;
border-radius: 8px;
border-width:2px;
}
.box{
position:relative;
width:auto;
height:auto;
margin: 30px auto;
padding: 15px;
box-shadow: 0px 1px 6px 1px #ebebeb;
border-radius: 8px;
}
.sucess-box{
border-left: solid 5px #3FC43C;
background-color: #fff;
} .info-box{
border-left: solid 5px #585EC2;
background-color: #fff;
}
.warning-box{
border-left: solid 5px #EFA162;
background-color: #fff;
}
.error-box{
border-left: solid 5px #F32D70;
background-color: #fff;
}
.fa{
padding-right:10px;
}
.fa-check-circle{
color: #3FC43C;
}
.fa fa-info-circle {
color: #585EC2;
}
.warning-box .fa-exclamation-triangle{
color: #EFA162;
}
.info-box .fa-info-circle{
color: #585EC2;
}
.error-box .fa-exclamation-triangle{
color: #E63470;
}
p{
padding:0px 28px;
}
.time{
color:#9b9b9b;
}
.fa-close{
color:#BCC4CD;
}
.close{
position:absolute;
top: 20px;
right:20px;
}
.link1,
.link2,
.link3,
.link4{
opacity:0;
margin-left:20px;
text-decoration:none;
}
.link1{
color:#3FC43C;
}
.link2{
color:#585EC2;
}
.link3{
color:#EFA162;
}
.link4{
color:#E63470;
}
.box:hover a{
opacity:1;
}
.topic-cluster-index {
list-style: none;
padding: 0;
}
.topic-cluster-index li {
display: inline-block; list-style: none;
min-height: 30px;
width: 98%;
background-color: #fff;
border-radius: 2px;
padding: 24px;
margin: 5px 0;
border: 1px solid #e4e8ec;
line-height: 16px !important;
font-weight: bold;
color: #363636;
font-family: lato;
font-weight: 600;
}
.topic-cluster-index li a {
list-style: none;
font-weight: 400;
color: #363636 !important;
list-style: none;
font-size: 15px;
margin: 0;
padding: 0;
font-family: lato;
font-weight: bold;
text-decoration: none !important;
}
.topic-cluster-index li:hover {
list-style: none;
background-color: #F7F7FC;
font-family: lato;
font-weight: 700;
cursor: pointer;
}
.topic-cluster-index li:hover a {
list-style: none;
color: #feac0e !important;
font-family: lato;
font-weight: 700;
text-decoration: none !important;
}
.index-title {
width: 100%;
height: 30px;
background: #feac0e;
font-family: lato;
font-size: 20px;
border-radius: 2px;
color: #fff;
font-weight: 700;
padding: 6px 10px 6px 25px;
}
.imgcapa {
width: 100%;
margin-top: 0px;}
</style>
|
HTML |
---|
<style>
.main-presupuestoMensual {
min-width: 320px;
max-width: 100%;
padding: 50px;
margin: 0 auto;
background: #F7F7FC;
}
.containter-tab1 {
display: none;
padding: 20px 0 0;
border-top: 1px solid #ddd;
}
.input-tabPresupuestoMensual {
display: none;
}
.label-tabPresupuestoMensual {
display: inline-block;
margin: 0 0 -1px;
padding: 15px 25px;
font-weight: 600;
text-align: center;
color: #bbb;
border: 1px solid transparent;
}
.label-tabPresupuestoMensual:before {
font-family: fontawesome;
font-weight: normal;
margin-right: 10px;
}
/* .label-tabPresupuestoMensual[for*='1']:before {
content: '\f1cb';
}
.label-tabPresupuestoMensual[for*='2']:before {
content: '\f17d';
}
.label-tabPresupuestoMensual[for*='3']:before {
content: '\f16b';
}
.label-tabPresupuestoMensual[for*='4']:before {
content: '\f1a9';
} */
.label-tabPresupuestoMensual:hover {
color: #888;
cursor: pointer;
}
.input-tabPresupuestoMensual:checked + .label-tabPresupuestoMensual {
color: #555;
border: 1px solid #ddd;
border-top: 2px solid orange;
border-bottom: 1px solid #fff;
}
#tab1:checked ~ #content1,
#tab2:checked ~ #content2,
#tab3:checked ~ #content3,
#tab4:checked ~ #content4
{
display: flex;
}
@media screen and (max-width: 650px) {
.label-tabPresupuestoMensual {
font-size: 0;
}
.label-tabPresupuestoMensual:before {
margin: 0;
font-size: 18px;
}
}
@media screen and (max-width: 400px) {
.label-tabPresupuestoMensual {
padding: 15px;
}
}
/**/
body {
background: #ececec;
}
.loader:before,
.loader:after {
position: absolute;
top: 50%;
left: 50%;
border-radius: 50%;
border-style: solid;
border-top-color: #ecd078;
border-right-color: #c02942;
border-bottom-color: #542437;
border-left-color: #53777a;
content: "";
transform: translate(-50%, -50%);
animation: rotate 1.5s infinite ease-in-out;
}
.loader:before {
border-width: 10vh;
}
.loader:after {
width: 30vh;
height: 30vh;
border-width: 2.5vh;
animation-direction: reverse;
}
@keyframes rotate {
0% {
transform: translate(-50%, -50%) rotate(0);
}
100% {
transform: translate(-50%, -50%) rotate(360deg);
}
}
</style> |
HTML |
---|
<style> #title-text { display: none !important;} body { font-size: 100%; font-family: "lato", serif; color: #363636; background-color: #ffffff; } a { color: #acb7c0; text-decoration: none; font-family: "lato"; font-family: lato, sans-serif!important; font-size: 16px; } img { max-width: 100%; } p { text-align:justify; font-family: "Lato", sans-serif; } h2 h5 { font-family: "lato", sans-serif; font-size: 90px ; font-weight: bold; } /* -------------------------------- Modules - reusable parts of our design -------------------------------- */ .cd-container { /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */ width: 100%; max-width: 1170px; margin: 0 auto; } .cd-container::after { /* clearfix */ content: ""; display: table; clear: both; } /* -------------------------------- xnugget info -------------------------------- */ .cd-nugget-info { text-align: center; position: absolute; width: 100%; height: 50px; line-height: 50px; top: 0; left: 0; } .cd-nugget-info a { position: relative; font-size: 14px; color: #718ca1; -webkit-transition: all 0.2s; -moz-transition: all 0.2s; transition: all 0.2s; } .no-touch .cd-nugget-info a:hover { opacity: 0.8; } .cd-nugget-info span { vertical-align: middle; display: inline-block; } .cd-nugget-info span svg { display: block; } .cd-nugget-info .cd-nugget-info-arrow { fill: #718ca1; } /* -------------------------------- Main components -------------------------------- */ #cd-timeline { position: relative; padding: 2em 0; margin-top: 2em; margin-bottom: 2em; } #cd-timeline::before { /* this is the vertical line */ content: ""; position: absolute; top: 0; left: 18px; height: 100%; width: 4px; background: #d7e4ed; } @media only screen and (min-width: 1170px) { #cd-timeline { margin-top: 3em; margin-bottom: 3em; } #cd-timeline::before { left: 50%; margin-left: -2px; } } .cd-timeline-block { position: relative; margin: 2em 0; } .cd-timeline-block:after { content: ""; display: table; clear: both; } .cd-timeline-block:first-child { margin-top: 0; } .cd-timeline-block:last-child { margin-bottom: 0; } @media only screen and (min-width: 1170px) { .cd-timeline-block { margin: 4em 0; } .cd-timeline-block:first-child { margin-top: 0; } .cd-timeline-block:last-child { margin-bottom: 0; } } .cd-timeline-img { position: absolute; top: 0; left: 0; width: 40px; height: 40px; border-radius: 50%; box-shadow: 0 0 0 4px white, inset 0 2px 0 rgba(0, 0, 0, 0.08), 0 3px 0 4px rgba(0, 0, 0, 0.05); } .cd-timeline-img img { display: block; width: 32px; height: 32px; position: relative; left: 50%; top: 50%; margin-left: -16px; margin-top: -16px; } .cd-timeline-img.cd-novo { background: #363636; } .cd-timeline-img.cd-melhoria { background: #363636; } .cd-timeline-img.cd-manutencao { background: #363636; } @media only screen and (min-width: 1170px) { .cd-timeline-img { width: 60px; height: 60px; left: 50%; margin-left: -30px; } .cssanimations .cd-timeline-img.is-hidden { visibility: hidden; } .cssanimations .cd-timeline-img.bounce-in { visibility: visible; -webkit-animation: cd-bounce-1 0.6s; -moz-animation: cd-bounce-1 0.6s; animation: cd-bounce-1 0.6s; } } @-webkit-keyframes cd-bounce-1 { 0% { opacity: 0; -webkit-transform: scale(0.5); } 60% { opacity: 1; -webkit-transform: scale(1.2); } 100% { -webkit-transform: scale(1); } } @-moz-keyframes cd-bounce-1 { 0% { opacity: 0; -moz-transform: scale(0.5); } 60% { opacity: 1; -moz-transform: scale(1.2); } 100% { -moz-transform: scale(1); } } @keyframes cd-bounce-1 { 0% { opacity: 0; -webkit-transform: scale(0.5); -moz-transform: scale(0.5); -ms-transform: scale(0.5); -o-transform: scale(0.5); transform: scale(0.5); } 60% { opacity: 1; -webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); -o-transform: scale(1.2); transform: scale(1.2); } 100% { -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); -o-transform: scale(1); transform: scale(1); } } .cd-timeline-content { position: relative; margin-left: 50px; background: #f5f5fa; border-radius: 0.25em; max-width: 400px; padding: 1em; box-shadow: 0 3px 0 #363636; } .cd-timeline-content:after { content: ""; display: table; clear: both; } .cd-timeline-content h2 { color: #363636; font-weight: bold; } .cd-timeline-content p, .cd-timeline-content .cd-date { font-size: 13px; font-size: 0.8125rem; } .cd-timeline-content .cd-date { display: inline-block; } .cd-timeline-content p { margin: 1em 0; line-height: 1.6; } .cd-timeline-content .cd-read-more { float: right; padding: 0.8em 1em; background: #5596e6; color: white; border-radius: 0.25em; text-decoration: none; } .no-touch .cd-timeline-content .cd-read-more:hover { background-color: #ffffff; } .cd-timeline-content .cd-date { float: left; padding: 0.8em 0; opacity: 0.7; } .cd-timeline-content::before { content: ""; position: absolute; top: 16px; right: 100%; height: 0; width: 0; border: 7px solid transparent; border-right: 7px solid #bfcdd6; } @media only screen and (min-width: 768px) { .cd-timeline-content h2 { font-size: 20px; font-size: 1.25rem; font-weight: bold ; } .cd-timeline-content p { font-size: 16px; font-size: 1rem; } .cd-timeline-content .cd-read-more, .cd-timeline-content .cd-date { font-size: 14px; font-size: 0.875rem; } } @media only screen and (min-width: 1170px) { .cd-timeline-content { margin-left: 0; padding: 1.6em; width: 45%; } .cd-timeline-content::before { top: 24px; left: 100%; border-color: transparent; border-left-color: #d7e4ed; } .cd-timeline-content .cd-read-more { float: left; } .cd-timeline-content .cd-date { position: absolute; width: 100%; left: 122%; top: 6px; font-size: 16px; font-size: 1rem; } .cd-timeline-block:nth-child(even) .cd-timeline-content { float: right; } .cd-timeline-block:nth-child(even) .cd-timeline-content::before { top: 24px; left: auto; right: 100%; border-color: transparent; border-right-color: #d7e4ed; } .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-read-more { float: right; } .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-date { left: auto; right: 122%; text-align: right; } .button-2 { padding: 8px 9px; font-size: 12px; color: #fff; background-color: #FDAB0E; border: none; border-radius: 4px; cursor: pointer; } .button-2:hover { background-color: #0897E9; } .button-2:active { background-color: #FDAB0E; } #wrapper { display: flex; flex-direction: column; gap: 20px; position: absolute; inset: 0; justify-content: center; align-items: center; margin: 0; } .flexWrap { display: flex; gap: 2px; width: 50px; } #disclaimer { font-family: Tahoma; color: #333333; position: fixed; top: 5%; right: 5%; width: 5%; } .button-2 { padding: 8px 9px<style> #title-text { display: none !important;} @import "compass/css3"; @import "compass/css3"; * { box-sizing: border-box; font-family: lato, sans-serif; } * { font-family: lato, sans-serif; } blockquote { margin: 3%; border-left: 10px solid #363636; padding: 2%; color: #222; background: #fff; font-style: italic; line-height: 130%; } .top { width: 100%; background: #363636; } .img { image-resolution: 5px 5px 9px; image-rendering: auto; image-orientation:0deg } .header { max-width: 1200px; width: 98%; height: 7em; margin: 0px auto; overflow: hidden; h1 { text-align: center; font-weight: bold; color: #fff; padding: 20px; font-size: 22px; div { margin: 0; font-weight: normal; font-size: 1.8em; } } .author { font-size: 0.8em; font-weight: normal; border-top: 1px dashed #555; border-bottom: 1px dashed #555; max-width: 160px; text-align: center; margin: -1em auto 0 auto; padding: 0.3em; text-transform: uppercase; color: #ccc; } } .content { max-width: auto; float: right; margin: auto; padding: 0; } .date { float: left; width: 10%; color: #444; text-align: center; div { margin: 0; line-height: 50%; }} .day { float: left; margin-top: 0.1em; width: 100%; color: #FEAC0E; font-size: 200%; } } .date-line { display: none; } .article { width: 100%; padding: 0 7em 0 7em; background: rgb(247, 247, 252); } h2 { font-weight: normal; font-size: 22px; font-weight: bold; color: #555555; margin: 0; } h3 { font-weight: normal; font-size: 16px12px; color: #888#fff; fontbackground-stylecolor: italic#363636; marginborder: 0 0 1em 0none; } p {border-radius: 6px; margincursor: 0pointer; } padding-top: 8px; .button-2:hover { background-color: #555#feac0e; } text-align: justify; font-size: 16px;.button-2:active { linebackground-heightcolor: 150%#feac0e; } } li #wrapper { font-sizedisplay: 16pxflex; colorflex-direction: #555555column; } div{ font-stylegap: 16px2px; colorposition: #555absolute; } .firstpara {inset: 0; textjustify-indentcontent: 0center; fontalign-sizeitems: 16pxcenter; } .pauseflexWrap { margindisplay: 2em auto 2em autoflex; colorgap: #5555552px; width: 60%110px; } padding:#disclaimer 10px;{ textfont-alignfamily: center; font-size: 20pxsans-serif; border-topcolor: 1px solid #ccc#333333; border-bottom: 1px solid #cccposition: fixed; } .firstcharacter {top: 5%; floatright: left5%; font-sizewidth: 16px5%; } font.badge-weight:primary bold;{ color: #555#8686FF; linebackground-heightcolor: 0.6em#F3F3FF; paddingborder-topradius: 0.12em10px; padding-right: 0.1em6px 7px; paddingfont-leftsize: 09px; font-weight: bold } } .footer .badge-secondary{ max-width color: 1200px#ebeef0; widthbackground-color: 98%#2abe74; height border-radius: 50px10px; margin padding: 0px6px auto7px; overflowfont-size: hidden9px; borderfont-topweight: bold 1px solid #ccc;} .copybadge-novo { floatcolor: right#fff; fontbackground-stylecolor: italic#20d691; color border-radius: #88810px; padding: 6px 7px; 1% 1% 0 0font-size: 9px; font-weight: bold } } .prev a, .next a { position: fixed .badge-danger{ color: #FFFFFF; top: 9.6em; paddingbackground-color: 1em;#FF4057 background border-radius: #f1f1f110px; borderpadding: 1px6px solid #ccc7px; borderfont-radiussize: 5px9px; } .prev a:hover, .next a:hover { background: #fff; } .prev a { left: 0.7em; } .next a { right: 0.7em; } @media only screen and (max-width: 450px) { .content { margin-top: 2em; } .social { display: none; } .datefont-weight: bold } .badge-manutencao { color: #FFF; background-color: #FEAC0E; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-melhoria { displaycolor: none#FFF; } .datebackground-linecolor: {#6f60f6; displayborder-radius: inline10px; } .article {padding: 6px 7px; widthfont-size: 100%9px; marginfont-weight: 0 auto 2em auto;bold; } .badge-light { border-leftcolor: none#8686FF; paddingbackground-bottomcolor: 2em;#F3F3FF border-bottomradius: 1px solid #ccc10px; padding: p6px {7px; font-size: 1.2em9px; }font-weight: bold; } .headerbadge-dark { heightcolor: auto#ebeef0; positionbackground-color: fixed#064118; top border-radius: 010px; padding: 6px 07px; marginfont-size: 09px; font-weight: bold background: rgb(34, 16, 171) h1 { } </style> |
HTML |
---|
<style> @import url(https://fonts.googleapis.com/css?family=Raleway:300); .my-custom-class { /* Estilos para o body */ margin: 0; padding: 15px; background: #f7f7fc; text-align: center; } .personne { display: inline-block; widthposition: 100%relative; width: 80px; margin: 0 20px; cursor: pointer; colorvertical-align: #f1f1f1top; } .personne > spandiv { font-sizewidth: 80%100%; }height: 80px; }border-radius: 50%; border: 4px .authorsolid {transparent; display: none; } } .footer { box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.18); text-align: center; overflow: hidden; paddingbox-sizing: 3%border-box; } .personne img { height: 40px100%; margin: .copy {0 -50%; transition: all float: none0.5s ease; } .personne:hover img }{ .prev a, .next aheight: 105%; } .personne:hover > div { border: 4px position: relative; margin-bottom: 2em; solid #feac0e; } .personne h4 { font-family: lato, sans-serif!important; text-align: center; margin-top: 05px; } .prev a {color: #363636; floatfont-size: left13px; widthpadding-left: 40%1px; } .next a { float: right; width: 40%; }s .table { font-family: lato; background-color: #fff; } #wrapper { display: flex; flex-direction: column; gap: 2px; position: absolute; inset: 0; justify-content: center; align-items: center; }} .flexWrap { display: flex; gap: 2px; width: 110px; } #disclaimer { font-family: sans-serif; color: #333333; position: fixed; top: 5%; right: 5%; width: 5%; } .badge-primary { color: #8686FF; background-color: #F3F3FF; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-secondary{ color: #ebeef0; background-color: #2abe74; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-novo { color: #fff; background-color: #20d691; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-danger{ color: #FFFFFF; background-color: #FF4057; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-manutencao { color: #FFF; background-color: #efc307; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-melhoria { color: #FFF; background-color: #6f60f6; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-light { color: #8686FF; background-color: #F3F3FF border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-dark { color: #ebeef0; background-color: #064118; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } body { font-family: lato; } table { border-collapse: collapse; } th { text-align: left; background-color: #363636; color: #fff; } caption { font-size: 1.5rem; text-align: left; padding-bottom: 1rem; } td, th { padding: 0.5rem; border: 3px solid #fff; } tbody tr:nth-child(odd), tfoot tr:nth-child(even) { background-color: #fff; } tfoot tr td:first-child { border: none; background-color: white; } tfoot { border-top: 5px solid #fff; } .img2 { width:50%; height:auto; padding:2%; margin-bottom:4%; align-content: center; display: block; margin-left: auto; margin-right: auto } #f7f7fc; } } container{ width: 50%; } .borderbox{ border: 1px dashed #ebebeb; width:45%; margin: 50px auto; border-radius: 8px; border-width:2px; } .box{ position:relative; width:auto; height:auto; margin: 50px auto; padding: 20px; box-shadow: 0px 1px 8px 1px #ebebeb; border-radius: 8px; } .sucess-box{ border-left: solid 5px #3FC43C; background-color: #fff; } .info-box{ border-left: solid 5px #585EC2; background-color: #fff; } .warning-box{ border-left: solid 5px #EFA162; background-color: #fff; } .error-box{ border-left: solid 5px #F32D70; background-color: #fff; } .fa{ padding-right:10px; } .fa-check-circle{ color: #3FC43C; } .fas fa-info-circle { color: #585EC2; } .warning-box .fa-exclamation-triangle{ color: #EFA162; } .error-box .fa-exclamation-triangle{ color: #E63470; } p{ padding:0px 28px; } .time{ color:#9b9b9b; } .fa-close{ color:#BCC4CD; } .close{ position:absolute; top: 20px; right:20px; } .link1, .link2, .link3, .link4{ opacity:0; margin-left:20px; text-decoration:none; } .link1{ color:#3FC43C; } .link2{ color:#585EC2; } .link3{ color:#EFA162; } .link4{ color:#E63470; } .box:hover a{ opacity:1; } </style> /* Estilos para o tooltip */ .tooltip { position: absolute; top: -30px; left: 50%; transform: translateX(-50%); color: #fff; font-size: 12px; padding: 4px 8px; border-radius: 4px; white-space: nowrap; } /* Mostrar o tooltip quando o elemento pai é hover */ .personne:hover .tooltip { display: block; } .titulo-destaque { font-size: 18px; font-family: lato, sans-serif!important; font-weight: bold; margin: 0; text-align: center; padding-bottom: 5px; color: #363636; } .subtitulo-destaque { font-family: lato; margin-left: 22%; margin-right: 22%; padding-top: 8px; color: #555; text-align: center; font-size: 16px; line-height: 150%; text-align: justify; } .tooltip { position: relative; } .tooltip:before { content: ""; display: none; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); padding: 5px; border-radius: 5px; background-color: #333; color: #fff; font-size: 12px; line-height: 1.2; white-space: nowrap; } .tooltip:hover:before { display: block; } .titulo-destaque.tooltip:before { content: attr(data-tooltip); } .tooltip:before { content: ""; display: none; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); padding: 5px; border-radius: 5px; background-color: #333; color: #fff; font-size: 12px; line-height: 1.2; white-space: nowrap; max-width: 80px; /* Define a largura máxima do tooltip */ word-wrap: break-word; /* Faz o tooltip quebrar a linha quando necessário */ } </style> |
HTML |
---|
<style>
#conteudo {
background-color: #f7f7fc;
}
.caixas {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 10px;
}
.caixa {
width: calc(50% - 10px);
background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px;
text-align: center;
transition: transform 0.3s ease;
display: flex;
flex-direction: column;
}
.caixa:hover {
background-color: #F7F7FC;;
}
.caixa .conteudo {
flex-grow: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
}
.caixa .imagem {
height: 100px;
width: 100px;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 10px;
}
.caixa img {
max-width: 100%;
max-height: 100%;
border-radius: 50%;
}
.caixa .texto {
height: 0%;
flex-grow: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
font-family: 'Lato', sans-serif;
max-width: 100%;
font-size: 14px;
color: #363636;
}
.caixa h3 {
margin-top: 10px;
font-size: 1.2em;
font-family: 'Lato', sans-serif;
color: #363636;
}
.caixa p {
margin: 15 10px;
font-family: 'Lato', sans-serif;
font-size: 14px;
color: #363636;
</style> |
HTML |
---|
<style> body {
margin: 0; // 1
font-family: lato;
font-size: 16px;
font-weight: $font-weight-base;
line-height: $line-height-base;
color: #555555
text-align: left; // 3
background-color: $body-bg; // 2
}
.speech-bubble {
max-width: 300px;
font-family: lato;
color: #555555;
font-size: 16px;
margin: 1rem;
padding: 1rem;
position: relative;
border: 2px solid #FEAC0E;
background: #fff;
border-radius: 0.4em;
}
.speech-row {
display: flex;
justify-content: center;
}
img {
overflow-clip-margin: content-box;
overflow: clip;
}
.speech-img img {
border-radius: 50%;
}
img {
vertical-align: middle;
border-style: none;
}
.speech-img {
align-self: center;
max-width: 100%;
height: auto;
}
*,
::after,
::before {
box-sizing: border-box;
}
img {
overflow-clip-margin: content-box;
overflow: clip;
}
.speech-bubble:before,
.speech-bubble:after {
content: "";
position: absolute;
left: 0;
top: 50%;
width: 0;
height: 0;
border: 20px solid transparent;
border-right-color: #FEAC0E;
border-left: 0;
margin-top: -20px;
margin-left: -20px;
}
.speech-bubble:after {
border-right-color: #fff;
margin-left: -18px;
z-index: 1;
}
</style> |
HTML |
---|
<style>
.alert-box {
color:#555;
border-radius:5px;
font-family:Tahoma,Geneva,Arial,sans-serif;font-size:11px;
padding:10px 25px 10px 25px;
margin: 5px 25px 5px 25px;
max-width: 100%;
}
.alert-box span {
font-weight:bold;
text-transform:uppercase;
}
.error {
background:#ffecec url('images/error.png') no-repeat 10px 50%;
border:1px solid #f5aca6;
}
.success {
background:#e9ffd9 url('images/success.png') no-repeat 10px 50%;
border:1px solid #a6ca8a;
}
.warning {
background:#fff8c4 url('images/warning.png') no-repeat 10px 50%;
border:1px solid #f2c779;
}
.notice {
background:#e3f7fc url('images/notice.png') no-repeat 10px 50%;
border:1px solid #8ed9f6;
}
< |
HTML |
<style> body {
margin: 0; // 1
font-family: lato;
font-size: 16px;
font-weight: $font-weight-base;
line-height: $line-height-base;
color: #555555
text-align: left; // 3
background-color: $body-bg; // 2
}
.speech-bubble {
max-width: 300px;
font-family: lato;
color: #555555;
font-size: 16px;
margin: 1rem;
padding: 1rem;
position: relative;
border: 2px solid #FEAC0E;
background: #fff;
border-radius: 0.4em;
}
.speech-row {
display: flex;
justify-content: center;
}
img {
overflow-clip-margin: content-box;
overflow: clip;
}
.speech-img img {
border-radius: 50%;
}
img {
vertical-align: middle;
border-style: none;
}
.speech-img {
align-self: center;
max-width: 100%;
height: auto;
}
*,
::after,
::before {
box-sizing: border-box;
}
img {
overflow-clip-margin: content-box;
overflow: clip;
}
.speech-bubble:before,
.speech-bubble:after {
content: "";
position: absolute;
left: 0;
top: 50%;
width: 0;
height: 0;
border: 20px solid transparent;
border-right-color: #FEAC0E;
border-left: 0;
margin-top: -20px;
margin-left: -20px;
}
.speech-bubble:after {
border-right-color: #fff;
margin-left: -18px;
z-index: 1;
}
</style> |