[REF] base: onboarding-panel, review/simplify scss

Part of the overall v16 SCSS optimization/restyle (task-2704984).

task-2753905

closes odoo/odoo#84058

Related: odoo/upgrade#3228
Signed-off-by: Pierre Paridans (app) <app@odoo.com>
This commit is contained in:
stefanorigano (SRI)
2022-03-14 14:29:45 +00:00
parent f0e6486e13
commit 6e77e9c5a1
3 changed files with 171 additions and 458 deletions
@@ -0,0 +1 @@
<svg width='600' height='90' viewBox='0 0 600 90' fill='none' xmlns='http://www.w3.org/2000/svg'><rect x='42' y='-10' width='6' height='10'/><rect x='84' y='-10' width='6' height='10'/><rect x='126' y='-13' width='5' height='13'/><rect x='168' y='-13' width='5' height='13'/><rect x='210' y='-10' width='6' height='10'/><rect x='252' y='-13' width='5' height='13'/><rect x='294' y='-10' width='6' height='10'/><rect x='336' y='-13' width='5' height='13'/><rect x='378' y='-13' width='5' height='13'/><rect x='420' y='-10' width='6' height='10'/><rect x='462' y='-10' width='6' height='10'/><rect x='504' y='-13' width='5' height='13'/><rect x='546' y='-10' width='6' height='10'/><style type='text/css'> rect { opacity: 0; } rect:nth-child(1) { transform-origin: 45px 5px; transform: rotate(-145deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 88ms; animation-duration: 631ms; } rect:nth-child(2) { transform-origin: 87px 5px; transform: rotate(164deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 131ms; animation-duration: 442ms; } rect:nth-child(3) { transform-origin: 128px 6px; transform: rotate(4deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 92ms; animation-duration: 662ms; } rect:nth-child(4) { transform-origin: 170px 6px; transform: rotate(-175deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 17ms; animation-duration: 593ms; } rect:nth-child(5) { transform-origin: 213px 5px; transform: rotate(-97deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 122ms; animation-duration: 476ms; } rect:nth-child(6) { transform-origin: 255px 6px; transform: rotate(57deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 271ms; animation-duration: 381ms; } rect:nth-child(7) { transform-origin: 297px 5px; transform: rotate(-46deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 131ms; animation-duration: 619ms; } rect:nth-child(8) { transform-origin: 338px 6px; transform: rotate(-65deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 85ms; animation-duration: 668ms; } rect:nth-child(9) { transform-origin: 380px 6px; transform: rotate(13deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 128ms; animation-duration: 377ms; } rect:nth-child(10) { transform-origin: 423px 5px; transform: rotate(176deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 311ms; animation-duration: 508ms; } rect:nth-child(11) { transform-origin: 465px 5px; transform: rotate(108deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 108ms; animation-duration: 595ms; } rect:nth-child(12) { transform-origin: 506px 6px; transform: rotate(62deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 105ms; animation-duration: 375ms; } rect:nth-child(13) { transform-origin: 549px 5px; transform: rotate(16deg); animation: o_onb_anim 700ms infinite ease-out; animation-delay: 149ms; animation-duration: 491ms; } rect:nth-child(odd) { fill: #65BB5C; } rect:nth-child(even) { z-index: 1; fill: #58cafe; } rect:nth-child(4n) { animation-duration: 1400ms; fill: #ff6e83; } rect:nth-child(3n) { animation-duration: 1750ms; animation-delay: 700ms; } rect:nth-child(4n-7) { fill: #bea4ff; } rect:nth-child(6n) { fill: #feb535; } @keyframes o_onb_anim { from { opacity: 0; } 20% { opacity: 1; } to { transform: translateY(90px); } } </style></svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

+129 -373
View File
@@ -1,409 +1,165 @@
$o-onboarding-dot-size: 20px;
$o-onboarding-dot-timing: 0.5s;
// = Onboarding Panel
// ============================================================================
.o_onboarding_main {
$o-onboarding-base-time: 0.5s;
$o-onboarding-dot-size: 20px;
$o-onboarding-progress-size: 2px;
$o-onboarding-step-width: map-get($container-max-widths, 'lg') / 4;
$o-onboarding-blue-bg-1: #60ABC3;
$o-onboarding-blue-bg-2: #4187AE;
$o-onboarding-blue-ui-1: #F39D9B;
$o-onboarding-blue-ui-2: #FBEEC8;
$o-onboarding-colors: (
'blue': (
'bg': (#60ABC3, #4187AE),
'ui': (#fcb157, #FBEEC8),
),
'orange': (
'bg': (#DA9D77, #B9684F),
'ui': (#0774f4, #68B3C9),
),
'violet': (
'bg': (#6070C3, #475DA4),
'ui': (#F39D9B, #FBEEC8),
),
);
$o-onboarding-orange-bg-1: #DA9D77;
$o-onboarding-orange-bg-2: #B9684F;
$o-onboarding-orange-ui-1: #599FF1;
$o-onboarding-orange-ui-2: #68B3C9;
$o-onboarding-violet-bg-1: #6070C3;
$o-onboarding-violet-bg-2: #475DA4;
$o-onboarding-violet-ui-1: #F39D9B;
$o-onboarding-violet-ui-2: #FBEEC8;
@mixin o-onboarding-vertical-gradient($startColor: #555, $endColor: #333) {
background-color: mix($startColor, $endColor);
background-image: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor));
background-image: -webkit-linear-gradient(top, $startColor, $endColor);
background-image: -moz-linear-gradient(top, $startColor, $endColor);
background-image: -ms-linear-gradient(top, $startColor, $endColor);
background-image: -o-linear-gradient(top, $startColor, $endColor);
background-image: linear-gradient(to bottom, $startColor, $endColor);
}
.o_onboarding {
position: relative;
overflow: hidden;
background: white center top;
background-size: cover;
border-bottom: 1px solid gray('300');
// = Color Variations
// ------------------------------------------------------------------------
@each $key, $values in $o-onboarding-colors {
&.o_onboarding_#{$key} {
$-bg: map-get($values, 'bg');
$-ui: map-get($values, 'ui');
@include print-variable('o-onboarding-done-color', nth($-ui, 1));
@include print-variable('o-onboarding-todo-color', nth($-ui, 2));
@include print-variable('o-onboarding-bg_1-color', fade-out(nth($-bg, 1), 0.5));
@include print-variable('o-onboarding-bg_2-color', nth($-bg, 2));
}
}
.o_onboarding_wrap {
padding: $o-horizontal-padding*2 $o-horizontal-padding;
@include media-breakpoint-down(sm) {
overflow-x: auto;
}
}
.o_onboarding_step_title, a.o_onboarding_all_done {
cursor: pointer;
overflow-x: auto;
background-color: var(--o-onboarding-bg_1-color);
background-image: linear-gradient(to bottom, var(--o-onboarding-bg_1-color), var(--o-onboarding-bg_2-color));
}
.o_onboarding_btn_close {
@include o-position-absolute(auto, 0, 0);
padding: 6px 12px;
cursor: pointer;
}
.o_onboarding_btn_close {
top: 0;
bottom: auto;
}
.o_onboarding_completed_message {
@include o-position-absolute(auto, 0,0,0);
//transform: translateY(115%);
//transition: transform $o-onboarding-dot-timing;
box-shadow: 0 2px 10px gray(600);
padding: $o-horizontal-padding;
background-color: white;
color: $o-main-text-color;
opacity: 0;
z-index: -1;
&.o_onboarding_steps_just_done {
animation: o_onb_fadeIn ($o-onboarding-dot-timing*3);
}
&.o_onboarding_steps_done {
opacity: 1;
z-index: auto;
}
}
.o_onboarding_steps, .o_onboarding_step {
display: flex;
}
.o_onboarding_steps {
flex-flow: row nowrap;
justify-content: initial;
box-shadow: 0 -7px 20px -5px rgba(#000, 0.3);
animation: o_onboarding_slideInUp $o-onboarding-base-time ease-out;
}
// = Step Design
// ------------------------------------------------------------------------
.o_onboarding_step {
flex-flow: column nowrap;
flex: 1 1 auto;
align-items: center;
text-align: center;
position: relative;
opacity: 0.6;
flex: 1 1 0;
@include media-breakpoint-down(sm) {
flex: 1 0 auto;
margin-bottom: 16px;
align-items: baseline;
.o_onboarding_step_content {
max-width: none;
}
}
&:first-of-type {
.o_onboarding_progress {
display: none !important;
}
.o_onboarding_dot {
transition-delay: 0s;
@for $i from 1 through 5 {
&.o_onboarding_step__todo:nth-child(#{$i}) {
@include print-variable('o-onboarding-animation-delay', $i * .15s);
}
}
.o_onboarding_step_content {
@include media-breakpoint-up(lg) {
min-width: 230px;
}
/* Progressbar should not break in mobile view */
@include media-breakpoint-down(sm) {
min-width: 230px;
}
max-width: 230px;
padding: 0 10px;
.o_onboarding_step_action {
border: 1px solid gray('200');
display: none;
}
p {
opacity: 0.8;
}
}
.o_onboarding_progress {
@include o-position-absolute($o-onboarding-dot-size*0.5 - 2px, calc(50% + 10px));
width: calc(100% - 20px);
height: 4px;
background-color: gray('200');
.progress-bar {
background-image: linear-gradient(90deg, $o-brand-primary, $o-brand-odoo);
transition: opacity $o-onboarding-dot-timing;
}
}
.o_onboarding_dot {
@include media-breakpoint-down(sm) {
margin-left: auto;
margin-right: auto;
}
width: $o-onboarding-dot-size;
height: $o-onboarding-dot-size;
color: transparent;
padding-top: 5px;
font-size: 11px;
display: inline-block;
border-radius: 100%;
background-color: gray('200');
position: relative;
transition: background $o-onboarding-dot-timing ease $o-onboarding-dot-timing;
}
.o_onboarding_all_done {
display: none;
}
// Steps' Status
&.o_onboarding_current, &.o_onboarding_done {
opacity: 1;
.o_onboarding_progress .progress-bar {
width: 100%;
box-shadow: none;
transition: width $o-onboarding-dot-timing;
}
}
&.o_onboarding_current {
.o_onboarding_step_action, .o_onboarding_dot {
animation: bounceIn ($o-onboarding-dot-timing*2);
}
.o_onboarding_step_action {
display: inline-block;
}
.o_onboarding_dot {
background: $o-brand-odoo;
}
}
&.o_onboarding_done {
.o_onboarding_dot {
background: $o-brand-primary;
color: white;
}
.o_onboarding_all_done {
display: block;
}
+ .o_onboarding_done {
.o_onboarding_dot {
transition-delay: 0s;
}
.o_onboarding_progress {
background: $o-brand-primary;
}
.progress-bar {
opacity: 0;
}
}
}
&.o_onboarding_just_done {
.o_onboarding_all_done {
animation: bounceIn ($o-onboarding-dot-timing*2);
display: block;
}
.o_onboarding_step_content_info {
animation: o_onb_fadeIn ($o-onboarding-dot-timing*3);
}
}
}
@keyframes o_onb_fadeIn {
0% {opacity: 0}
33% {opacity: 0}
100% {opacity: 1}
}
// ========= Color Variations =========
// ======================================
// ========= Variation Mixin ==========
@mixin o-onboarding-variation($bg1, $bg2, $ui1, $ui2) {
&, .o_onboarding_step_title, .o_onboarding_step_action, a.o_onboarding_all_done, .o_onboarding_all_done > .fa, .o_onboarding_btn_close {
color: white !important;
}
.o_onboarding_wrap {
@include o-onboarding-vertical-gradient(fade-out($bg1, 0.5), $bg2);
box-shadow: inset 0 -7px 20px -5px fade-out(black, 0.7);
}
.o_onboarding_dot, .o_onboarding_progress {
background-color: fade-out(white, 0.5);
width: $o-onboarding-step-width;
}
.o_onboarding_step_action {
border-color: fade-out(white, 0.5);
min-width: $o-onboarding-step-width * .5;
}
.progress-bar {
background-image: linear-gradient(90deg, $ui1, $ui2);
.o_onboarding_progress {
height: $o-onboarding-progress-size;
width: calc(100% - #{$o-onboarding-dot-size});
background: var(--o-onboarding-todo-color, #{$o-brand-odoo});
transform:
translateX(-100%)
translateY($o-onboarding-dot-size * .5 - $o-onboarding-progress-size * .5);
}
.o_onboarding_step {
&.o_onboarding_done, .o_onboarding_done + .o_onboarding_done {
.o_onboarding_dot, .o_onboarding_progress {
background: $ui1;
}
.o_onboarding_dot {
width: $o-onboarding-dot-size;
height: $o-onboarding-dot-size;
padding-top: .5em;
background-color: var(--o-onboarding-todo-color, $o-brand-odoo);
color: transparent;
transition: all $o-onboarding-base-time ease;
transform: scale3d(.5, .5, .5);
}
&:first-of-type .o_onboarding_progress {
display: none;
}
// = "To do" Step Design
// --------------------------------------------------------------------
&[data-step-state="not_done"] {
.o_onboarding_step_content_info {
animation: o_onboarding_zoomIn ($o-onboarding-base-time * 1.5) both;
animation-delay: var(--o-onboarding-animation-delay, 0);
}
&.o_onboarding_current .o_onboarding_dot {
background: $ui2;
.o_onboarding_step_action {
animation: o_onboarding_slideInUp ($o-onboarding-base-time * 2) both;
animation-delay: var(--o-onboarding-animation-delay, 0);
}
}
// = "Done" Step Design
// --------------------------------------------------------------------
&:not([data-step-state="not_done"]) {
.o_onboarding_dot, + .o_onboarding_step:not([data-step-state="not_done"]) .o_onboarding_progress {
background: var(--o-onboarding-done-color, #{$o-brand-primary});
}
.o_onboarding_dot {
transform: scale3d(1, 1, 1);
}
}
// = "Just Done" Step Design
// --------------------------------------------------------------------
&[data-step-state="just_done"] {
.o_onboarding_step_content_info {
animation: o_onboarding_fadeIn ($o-onboarding-base-time * 3);
}
.o_onboarding_step_action__done {
animation: bounceIn ($o-onboarding-base-time * 2);
}
.o_onboarding_confetti {
animation: o_onboarding_fadeInOut ($o-onboarding-base-time * 3) ease 0s 1 forwards;
}
}
}
// ========= Variation Templates ==========
&.o_onboarding_blue {
@include o-onboarding-variation($o-onboarding-blue-bg-1, $o-onboarding-blue-bg-2, $o-onboarding-blue-ui-1, $o-onboarding-blue-ui-2);
}
&.o_onboarding_orange {
@include o-onboarding-variation($o-onboarding-orange-bg-1, $o-onboarding-orange-bg-2, $o-onboarding-orange-ui-1, $o-onboarding-orange-ui-2);
}
&.o_onboarding_violet {
@include o-onboarding-variation($o-onboarding-violet-bg-1, $o-onboarding-violet-bg-2, $o-onboarding-violet-ui-1, $o-onboarding-violet-ui-2);
}
// ========= "Cannon Confetti" animation ==========
.o_onboarding_confetti {
animation: cannon-explosion ($o-onboarding-dot-timing*3) ease-out 0s 1 normal both;
@include o-position-absolute(0, 50%, 30px);
transform-origin: 50% 100%;
display: none;
width: 1px;
@keyframes cannon-explosion {
0% {
transform: scale(0);
}
70% {
opacity: 1;
}
100% {
opacity: 0;
}
}
> div {
@include o-position-absolute(auto, 0, 5px,0);
transform-origin: 50% 100%;
display: flex;
flex-flow: column nowrap;
justify-content: space-around;
align-content: center;
padding-bottom: 30%;
&:nth-child(1), &:nth-child(5) {
height: 90%;
transform: rotate(-20deg);
}
&:nth-child(2), &:nth-child(4) {
height: 95%;
transform: rotate(-10deg);
}
&:nth-child(3) {
height: 100%;
}
&:nth-child(4) {
transform: rotate(10deg);
}
&:nth-child(5) {
transform: rotate(20deg);
}
> div {
flex: 0 1 auto;
animation: confetti-rotate-l ($o-onboarding-dot-timing*3) ease-out 0s 1 normal both;
&:nth-child(odd) {
animation: confetti-rotate-r ($o-onboarding-dot-timing*3) ease-out 0s 1 normal both;
}
@keyframes confetti-rotate-l {
0% {
transform: rotate(0) scaleY(1);
}
50% {
transform: rotate(2turn) scaleY(1.5);
opacity: 1;
}
100% {
transform: rotate(2.05turn) scaleY(1);
opacity: 0;
}
}
@keyframes confetti-rotate-r {
0% {
transform: rotate(0) scaleY(1);
}
50% {
transform: rotate(-2turn) scaleY(1.5);
opacity: 1;
}
100% {
transform: rotate(-2.05turn) scaleY(1);
opacity: 0;
}
}
&.ribbon {
width: .3em;
height: .7em;
border-radius: .1em;
}
&.flake {
width: .3em;
height: .3em;
border-radius: 50%;
}
// Confetti Colors
&.color-1 {
background-color: #feb535;
}
&.color-2 {
background-color: #bea4ff;
}
&.color-3 {
background-color: #ff6e83;
}
&.color-4 {
background-color: #58cafe;
}
}
// = Animations
// ------------------------------------------------------------------------
@keyframes o_onboarding_slideInUp {
from {
transform: translate3d(0, 20%, 0);
opacity: 0;
}
}
.o_onboarding_just_done {
// Activate confetti cannon when step is done
.o_onboarding_confetti {
display: block;
@keyframes o_onboarding_zoomIn {
from {
transform: scale3d(0.8, 0.8, 0.8);
opacity: 0;
}
50% {
opacity: 1;
}
}
@keyframes o_onboarding_fadeIn {
10%, 66% { opacity: 0; }
0%, 100% { opacity: 1; }
}
@keyframes o_onboarding_fadeInOut {
10%, 66% { opacity: 1; }
0%, 100% { opacity: 0; }
}
}
+41 -85
View File
@@ -24,110 +24,66 @@
</div>
</div>
</div>
<div class="o_onboarding_container collapse show">
<div t-att-class="'o_onboarding ' + ('o_onboarding_completed ' if steps_completed else ' ') + classes"
<div t-att-class="'o_onboarding_main position-relative overflow-hidden ' + classes"
t-att-style="'background-image:url(' + bg_image + ')'">
<div class="o_onboarding_wrap">
<a href="#" data-toggle="modal" data-target=".o_onboarding_modal"
class="float-right o_onboarding_btn_close">
<i class="fa fa-times" title="Close the onboarding panel" />
</a>
<div class="o_onboarding_steps">
<t t-out="0" />
</div>
<div t-att-class="'o_onboarding_completed_message text-center' + (' o_onboarding_steps_done' if state.get('onboarding_state') in ('done', 'just_done') else '') + (' o_onboarding_steps_just_done' if state.get('onboarding_state') == 'just_done' else '')">
<i class="fa fa-check text-success mr8" />
<span class="h3 mr16">
<t t-if="text_completed" t-esc="text_completed" />
<div class="o_onboarding_wrap py-5">
<a href="#" data-toggle="modal" data-target=".o_onboarding_modal" class="o_onboarding_btn_close position-absolute top-0 end-0 py-2 px-3 h2 text-white" title="Close the onboarding panel"><i class="oi oi-close"/></a>
<div class="o_onboarding_steps d-flex" t-out="0"/>
<div t-if="state.get('onboarding_state') in ('done', 'just_done')"
t-att-state="state.get('onboarding_state')"
class="o_onboarding_completed_message position-absolute end-0 bottom-0 left-0 border-bottom py-4 bg-white d-flex align-items-center justify-content-center">
<span class="h3 m-0">
<i class="fa fa-check text-success me-3" />
<t t-if="text_completed" t-out="text_completed" />
<t t-else="">Nice work! Your configuration is done.</t>
</span>
<a type="action" class="btn btn-primary" data-toggle="collapse" href=".o_onboarding_container"
t-att-data-model="close_model" t-att-data-method="close_method">
Close
</a>
<a type="action" class="btn btn-primary ms-4" data-toggle="collapse" href=".o_onboarding_container" t-att-data-model="close_model" t-att-data-method="close_method">
Close
</a>
</div>
</div>
</div>
</div>
</template>
<template id="onboarding_step">
<div t-att-class="'o_onboarding_step ' + ('o_onboarding_done' if state in ('done', 'just_done') else 'o_onboarding_current') + (' o_onboarding_just_done' if state == 'just_done' else '')">
<t t-call="base.onboarding_confetti" />
<div class="o_onboarding_progress d-inline-block progress">
<div class="progress-bar"></div>
<div class="o_onboarding_step position-relative d-flex flex-column align-items-center justify-content-start text-center" t-att-data-step-state="state">
<img t-if="state == 'just_done'" class="o_onboarding_confetti position-absolute w-100" src="/base/static/img/onboarding_confetti.svg" alt="o_onboarding_confetti"/>
<div class="o_onboarding_step_side d-flex pt-0 flex-grow-1">
<div class="o_onboarding_progress position-absolute"/>
<span t-attf-class="o_onboarding_dot fa fa-check d-inline-block rounded-circle small {{state != 'not_done' and 'text-white' or ''}}"/>
</div>
<span class="o_onboarding_dot d-inline-block fa fa-check" />
<div class="o_onboarding_step_content">
<div class="o_onboarding_step_content_info">
<h4 class="o_onboarding_step_title mt16">
<a type="action" data-reload-on-close="true" role="button"
t-att-data-method="method" t-att-data-model="model">
<t t-esc="title" />
</a>
</h4>
<p class="mb16">
<t t-esc="description" />
</p>
<div class="o_onboarding_step_content py-3 flex-grow-1 d-flex flex-column align-items-center justify-content-around">
<div class="o_onboarding_step_content_info mb-3">
<a type="action" data-reload-on-close="true" role="button" t-att-data-method="method" t-att-data-model="model">
<h4 class="o_onboarding_step_title text-white" t-out="title"/>
</a>
<p class="text-white-75 m-0" t-out="description"/>
</div>
<a class="o_onboarding_step_action btn" type="action"
data-reload-on-close="true" role="button" t-att-data-method="method"
t-att-data-model="model">
<t t-if="btn_text" t-esc="btn_text" />
<t t-else="">Let's do it</t>
<a t-if="state == 'not_done'" class="o_onboarding_step_action btn px-4 border border-white" type="action" data-reload-on-close="true" role="button" t-att-data-method="method" t-att-data-model="model">
<span class="text-white">
<t t-if="btn_text" t-out="btn_text" />
<t t-else="">Let's do it</t>
</span>
</a>
<a class="o_onboarding_all_done mt16" type="action"
data-reload-on-close="true" role="button" t-att-data-method="method"
t-att-data-model="model">
<i t-attf-class="text-success mr6 fa #{done_icon if done_icon else 'fa-check'}" />
<span>
<t t-if="done_text" t-esc="done_text" />
<a t-else="" class="o_onboarding_step_action__done btn text-white" type="action" data-reload-on-close="true" role="button" t-att-data-method="method" t-att-data-model="model">
<span class="text-white">
<i t-attf-class="me-2 fa #{done_icon if done_icon else 'fa-check'}" />
<t t-if="done_text" t-out="done_text" />
<t t-else="">All done!</t>
</span>
</a>
</div>
</div>
</template>
<template id="onboarding_confetti">
<div class="o_onboarding_confetti">
<div>
<div class="flake color-3" />
<div class="ribbon color-1" />
<div class="ribbon color-2" />
<div class="flake color-1" />
<div /> <!-- spacer -->
</div>
<div>
<div class="ribbon color-2" />
<div class="flake color-2" />
<div class="flake color-3" />
<div class="ribbon color-1" />
<div class="flake color-4" />
<div /> <!-- spacer -->
</div>
<div>
<div class="ribbon color-1" />
<div class="ribbon color-4" />
<div class="ribbon color-2" />
<div class="flake color-3" />
<div /> <!-- spacer -->
</div>
<div>
<div class="flake color-3" />
<div class="ribbon color-1" />
<div class="ribbon color-4" />
<div class="flake color-3" />
<div class="ribbon color-2" />
<div /> <!-- spacer -->
</div>
<div>
<div class="ribbon color-2" />
<div class="flake color-3" />
<div class="flake color-4" />
<div class="ribbon color-1" />
<div /> <!-- spacer -->
</div>
</div>
</template>
<!-- ONBOARDING STEPS -->
<template id="onboarding_company_step">
<t t-call="base.onboarding_step">