[REF][MOV] documentation apocalypse

Prior to this commit, the Odoo documentation was mainly split between
two repositories: odoo/odoo/doc and odoo/documentation-user. Some bits
of documentation were also hosted elsewhere (e.g., wiki, upgrade, ...).
This was causing several problems among which:
  - The theme, config, Makefile, and similar technical resources had to
    be duplicated. This resulted in inconsistent layout, features, and
    build environments from one documentation to another.
  - Some pages did not fit either documentation as they were relevant
    for both users and developers. Some were relevant to neither of the
    two (e.g., DB management).
  - Cross-doc references had to be absolute links and they broke often.
  - Merging large image files in the developer documentation would bloat
    the odoo/odoo repository. Some contributions had to be lightened to
    avoid merging too many images (e.g., Odoo development tutorials).
  - Long-time contributors to the user documentation were chilly about
    going through the merging process of the developer documentation
    because of the runbot, mergebot, `odoo-dev` repository, etc.
  - Some contributors would look for the developer documentation in the
    `odoo/documentation-user` repository.
  - Community issues about the user documentation were submitted on the
    `odoo/odoo` repository and vice-versa.

Merging all documentations in one repository will allow us to have one
place, one theme, one work process, and one set of tools (build
environment, ...) for all of the Odoo docs.

As this is a good opportunity to revamp the layout of the documentation,
a brand new theme replaces the old one. It features a new way to
navigate the documentation, centered on the idea of always letting the
reader know what is the context (enclosing section, child pages, page
structure ...) of the page they are reading. The previous theme would
quickly confuse readers as they navigated the documentation and followed
cross-application links.

The chance is also taken to get rid of all the technical dangling parts,
performance issues, and left-overs. Except for some page-specific JS
scripts, the Odoo theme Sphinx extension is re-written from scratch
based on the latest Sphinx release to benefit from the improvements and
ease future contributions.

task-2351938
task-2352371
task-2205684
task-2352544

Closes #945
This commit is contained in:
Antoine Vandevenne (anv)
2021-04-30 12:40:29 +02:00
committed by Antoine Vandevenne (anv)
parent eac5e9f865
commit e3fee2cf46
2471 changed files with 39885 additions and 60126 deletions
@@ -0,0 +1,26 @@
from docutils.parsers.rst import Directive, directives
class PlaceHolder(Directive):
""" Placeholder class for directives that must be skipped. """
has_content = True
def run(self):
return [] # Return an empty list of nodes
def setup(app):
directives.register_directive('automodule', PlaceHolder)
directives.register_directive('autoclass', PlaceHolder)
directives.register_directive('autoexception', PlaceHolder)
directives.register_directive('autofunction', PlaceHolder)
directives.register_directive('autodecorator', PlaceHolder)
directives.register_directive('autodata', PlaceHolder)
directives.register_directive('automethod', PlaceHolder)
directives.register_directive('autoattribute', PlaceHolder)
return {
'parallel_read_safe': False,
'parallel_write_safe': True
}
+71
View File
@@ -0,0 +1,71 @@
# -*- coding: utf-8 -*-
"""
ReST directive for embedding Youtube and Vimeo videos.
There are two directives added: ``youtube`` and ``vimeo``. The only
argument is the video id of the video to include.
Both directives have three optional arguments: ``height``, ``width``
and ``align``. Default height is 281 and default width is 500.
Example::
.. youtube:: anwy2MPT5RE
:height: 315
:width: 560
:align: left
:copyright: (c) 2012 by Danilo Bargen.
:license: BSD 3-clause
"""
from __future__ import absolute_import
from docutils import nodes
from docutils.parsers.rst import Directive, directives
def align(argument):
"""Conversion function for the "align" option."""
return directives.choice(argument, ('left', 'center', 'right'))
class IframeVideo(Directive):
has_content = False
required_arguments = 1
optional_arguments = 0
final_argument_whitespace = False
option_spec = {
'height': directives.nonnegative_int,
'width': directives.nonnegative_int,
'align': align,
}
default_width = 500
default_height = 281
def run(self):
self.options['video_id'] = directives.uri(self.arguments[0])
if not self.options.get('width'):
self.options['width'] = self.default_width
if not self.options.get('height'):
self.options['height'] = self.default_height
if not self.options.get('align'):
self.options['align'] = 'left'
return [nodes.raw('', self.html % self.options, format='html')]
class Youtube(IframeVideo):
html = '<iframe src="https://www.youtube.com/embed/%(video_id)s" \
width="%(width)u" height="%(height)u" frameborder="0" \
webkitAllowFullScreen mozallowfullscreen allowfullscreen \
class="align-%(align)s"></iframe>'
class Vimeo(IframeVideo):
html = '<iframe src="https://player.vimeo.com/video/%(video_id)s" \
width="%(width)u" height="%(height)u" frameborder="0" \
webkitAllowFullScreen mozallowfullscreen allowFullScreen \
class="align-%(align)s"></iframe>'
def setup(app):
directives.register_directive('youtube', Youtube)
directives.register_directive('vimeo', Vimeo)
return {
'parallel_read_safe': False,
'parallel_write_safe': True
}
@@ -0,0 +1,29 @@
""" Add a new "exercise" admonition directive. """
from docutils import nodes
from docutils.parsers.rst.directives import admonitions
from sphinx.locale import admonitionlabels
class exercise(nodes.Admonition, nodes.Element):
pass
class Exercise(admonitions.BaseAdmonition):
node_class = exercise
def setup(app):
app.add_directive('exercise', Exercise)
app.add_node(exercise, html=(
lambda self, node: self.visit_admonition(node, 'exercise'),
lambda self, node: self.depart_admonition(node),
))
return {
'parallel_read_safe': False,
'parallel_write_safe': True
}
admonitionlabels['exercise'] = 'Exercise'
+118
View File
@@ -0,0 +1,118 @@
"""
* adds github_link(mode) context variable: provides URL (in relevant mode) of
current document on github
* if sphinx.ext.linkcode is enabled, automatically generates github linkcode
links (by setting config.linkcode_resolve)
Settings
========
* ``github_user``, username/organisation under which the project lives
* ``github_project``, name of the project on github
* (optional) ``version``, github branch to link to (default: master)
Notes
=====
* provided ``linkcode_resolve`` only supports Python domain
* generates https github links
* explicitly imports ``odoo``, so useless for anyone else
"""
import inspect
import importlib
import os.path
import werkzeug
def setup(app):
app.add_config_value('github_user', None, 'env')
app.add_config_value('github_project', None, 'env')
app.connect('html-page-context', add_doc_link)
def linkcode_resolve(domain, info):
""" Resolves provided object to corresponding github URL """
# TODO: js?
if domain != 'py':
return None
if not (app.config.github_user and app.config.github_project):
return None
module, fullname = info['module'], info['fullname']
# TODO: attributes/properties don't have modules, maybe try to look
# them up based on their cached host object?
if not module:
return None
obj = importlib.import_module(module)
for item in fullname.split('.'):
obj = getattr(obj, item, None)
if obj is None:
return None
# get original from decorated methods
try:
obj = getattr(obj, '_orig')
except AttributeError:
pass
try:
obj_source_path = inspect.getsourcefile(obj)
_, line = inspect.getsourcelines(obj)
except (TypeError, IOError):
# obj doesn't have a module, or something
return None
import odoo
# FIXME: make finding project root project-independent
project_root = os.path.join(os.path.dirname(odoo.__file__), '..')
return make_github_link(
app,
os.path.relpath(obj_source_path, project_root),
line,
odoo_repository=True)
app.config.linkcode_resolve = linkcode_resolve
return {
'parallel_read_safe': False,
'parallel_write_safe': True
}
def make_github_link(app, path, line=None, mode="blob", odoo_repository=False):
config = app.config
user = config.github_user
project = config.github_project
if odoo_repository:
user = 'odoo'
project = 'odoo'
urlpath = "/{user}/{project}/{mode}/{branch}/{path}".format(
user=user,
project=project,
branch=config.version or 'master',
path=path,
mode=mode,
)
return werkzeug.urls.url_unparse((
'https',
'github.com',
urlpath,
'',
'' if line is None else 'L%d' % line
))
def add_doc_link(app, pagename, templatename, context, doctree):
""" Add github_link function linking to the current (.rst) page on github """
if not app.config.github_user and app.config.github_project:
return
# FIXME: find other way to recover current document's source suffix
# in Sphinx 1.3 it's possible to have mutliple source suffixes and that
# may be useful in the future
source_suffix = app.config.source_suffix
source_suffix = next(iter(source_suffix))
context['github_link'] = lambda mode='edit': make_github_link(
app, 'content/%s%s' % (pagename, source_suffix), mode=mode)
+185
View File
@@ -0,0 +1,185 @@
# -*- coding: utf-8 -*-
"""
Defines a "raw HTML" domain with a ``div[classes]`` and a number of roles
rendered more or less directly to HTML.
.. warning::
the purpose of this domain is *not* to document HTML or components
NOTE: this extension is only used by special accounting pages (memento, valuation, ...)
for directives likes .. h:div::
TO REMOVE AS SOON AS WE DROP MEMENTOES
"""
from docutils import nodes, utils
from docutils.parsers.rst import Directive, directives
from docutils.parsers.rst.directives.body import LineBlock
import sphinx
import sphinx.roles
from sphinx.domains import Domain
def setup(app):
app.add_domain(HtmlDomain)
app.add_node(div, html=(
lambda self, node: self.body.append(self.starttag(node, 'div')),
lambda self, node: self.body.append('</div>\n')))
# override parameter was added for version sphinx >= 1.4, TypeError before
kw = {'override': True} if sphinx.version_info >= (1, 4) else {}
app.add_node(address, html=(
lambda self, node: self.body.append(self.starttag(node, 'address')),
lambda self, node: self.body.append('</address>\n')
), **kw) # docutils.nodes.address exists and is a bibliographic element
app.add_node(cite, html=(visit_cite, depart_cite))
for name, node in [('mark', mark), ('ins', insert), ('del', delete),
('s', strikethrough), ('u', underline), ('small', small),
('kbd', kbd), ('var', var), ('samp', samp)]:
addnode(app, node, name)
return {
'parallel_read_safe': False,
'parallel_write_safe': True
}
class div(nodes.General, nodes.Element):
pass
class Div(Directive):
optional_arguments = 1
final_argument_whitespace = 1
has_content = True
def run(self):
self.assert_has_content()
text = '\n'.join(self.content)
try:
if self.arguments:
classes = directives.class_option(self.arguments[0])
else:
classes = []
except ValueError:
raise self.error(
'Invalid class attribute value for "%s" directive: "%s".'
% (self.name, self.arguments[0]))
node = div(text)
node['classes'].extend(classes)
self.add_name(node)
self.state.nested_parse(self.content, self.content_offset, node)
return [node]
class address(nodes.General, nodes.Element):
pass
class Address(LineBlock):
def run(self):
[node] = super(Address, self).run()
ad = address(node.rawsource, *node.children)
return [ad]
class mark(nodes.Inline, nodes.TextElement):
pass
class insert(nodes.Inline, nodes.TextElement):
pass
class delete(nodes.Inline, nodes.TextElement):
pass
class strikethrough(nodes.Inline, nodes.TextElement):
pass
class underline(nodes.Inline, nodes.TextElement):
pass
class small(nodes.Inline, nodes.TextElement):
pass
class kbd(nodes.Inline, nodes.FixedTextElement):
pass
class var(nodes.Inline, nodes.FixedTextElement):
pass
class samp(nodes.Inline, nodes.FixedTextElement):
pass
def makerole(node):
return lambda name, rawtext, text, lineno, inliner, options=None, content=None:\
([node(rawtext.strip(), text.strip())], [])
def addnode(app, node, nodename):
app.add_node(node, html=(
lambda self, n: self.body.append(self.starttag(n, nodename)),
lambda self, n: self.body.append('</%s>' % nodename)
))
def initialism(*args, **kwargs):
nodes, _ = sphinx.roles.abbr_role(*args, **kwargs)
[abbr] = nodes
abbr.attributes.setdefault('classes', []).append('initialism')
return [abbr], []
def cite_role(typ, rawtext, text, lineno, inliner, options=None, content=None):
text = utils.unescape(text)
m = sphinx.roles._abbr_re.search(text)
if m is None:
return [cite(text, text, **(options or {}))], []
content = text[:m.start()].strip()
source = m.group(1)
return [cite(content, content, source=source)], []
class cite(nodes.Inline, nodes.TextElement):
pass
def visit_cite(self, node):
attrs = {}
if node.hasattr('source'):
attrs['title'] = node['source']
self.body.append(self.starttag(node, 'cite', '', **attrs))
def depart_cite(self, node):
self.body.append('</abbr>')
class HtmlDomain(Domain):
name = 'h'
label = 'HTML'
directives = {
'div': Div,
'address': Address,
}
roles = {
'mark': makerole(mark),
'ins': makerole(insert),
'del': makerole(delete),
's': makerole(strikethrough),
'u': makerole(underline),
'small': makerole(small),
'initialism': initialism,
'cite': cite_role,
'kbd': makerole(kbd),
'var': makerole(var),
'samp': makerole(samp),
}
+101
View File
@@ -0,0 +1,101 @@
from docutils import nodes
from sphinx import addnodes
from sphinx.environment.adapters import toctree
from . import pygments_override, translator
def setup(app):
app.set_translator('html', translator.BootstrapTranslator)
app.connect('html-page-context', set_missing_meta)
app.add_js_file('js/utils.js') # Keep in first position
app.add_js_file('js/layout.js')
app.add_js_file('js/menu.js')
app.add_js_file('js/page_toc.js')
return {
'parallel_read_safe': False,
'parallel_write_safe': True
}
def set_missing_meta(app, pagename, templatename, context, doctree):
if context.get('meta') is None: # Pages without title (used with `include::`) have no meta
context['meta'] = {}
class Monkey(object):
""" Replace patched method of an object by a new method receiving the old one in argument. """
def __init__(self, obj):
self.obj = obj
def __call__(self, fn):
name = fn.__name__
old = getattr(self.obj, name)
setattr(self.obj, name, lambda self_, *args, **kwargs: fn(old, self_, *args, **kwargs))
@Monkey(toctree.TocTree)
def resolve(old_resolve, tree, docname, *args, **kwargs):
def _update_toctree_nodes(_node) -> None:
""" Make necessary changes to Docutils' nodes of the toc.
Internal structure of toc nodes:
<ul>
<li>
<p><a/></p>
<ul>
...
</ul>
</li>
<li/>
<ul/>
"""
if isinstance(_node, nodes.reference): # The node is a reference (<a/>)
_node_docname = _get_docname(_node)
_clear_reference_if_empty_page(_node, _node_docname)
_set_docname_as_class(_node, _node_docname)
elif isinstance(_node, (addnodes.compact_paragraph, nodes.bullet_list, nodes.list_item)):
for _subnode in _node.children:
_update_toctree_nodes(_subnode)
def _get_docname(_node):
"""
docname = a/b/c/the_page_being_rendered
_ref = ../../contributing/documentation
_path_parts = ['..', '..', 'contributing', 'documentation']
_res = ['a', 'contributing', 'documentation']
_docname = a/contributing/documentation
"""
_ref = _node['refuri'].replace('.html', '')
_parent_directory_occurrences = _ref.count('..')
if not _parent_directory_occurrences: # The ref is already the docname
_docname = _ref
else:
_path_parts = _ref.split('/')
_res = docname.split('/')[:-(_parent_directory_occurrences+1)] \
+ _path_parts[_parent_directory_occurrences:]
_docname = '/'.join(_res)
return _docname
def _clear_reference_if_empty_page(_reference_node, _node_docname):
""" Clear reference of 'empty' toctree pages.
Inspect parent node's siblings to determine whether the node references a toc and, if so,
clear its reference URL. (<a href="#"/>)
If the page has the `show-content` metadata, don't clear the reference.
"""
if _node_docname and any(
isinstance(_subnode, nodes.bullet_list)
for _subnode in _reference_node.parent.parent.children
): # The node references a toc
if 'show-content' not in tree.env.metadata[_node_docname]:
_reference_node['refuri'] = '#' # The page must not be accessible
def _set_docname_as_class(_reference_node, _node_docname):
_node_docname = _node_docname or docname # refuri==None <-> href="#"
_reference_node.parent.parent['classes'].append(f'o_menu_{_node_docname.replace("/", "_")}')
resolved_toc = old_resolve(tree, docname, *args, **kwargs)
if resolved_toc: # `resolve` returns None if the depth of the TOC to resolve is too high
_update_toctree_nodes(resolved_toc)
return resolved_toc
+125
View File
@@ -0,0 +1,125 @@
{%- extends "basic/layout.html" %}
{%- set html5_doctype = True %}
{%- block css %}
{{ super() }}
{%- if 'custom-css' in meta %} {# Allow custom css style import for specific pages #}
{%- set css_files = meta['custom-css'].split(',') %}
{%- for css_file in css_files %}
{%- set link = '_static/css/' + css_file %}
<link rel="stylesheet" href="{{ pathto(link, 1) }}" type="text/css"/>
{%- endfor %}
{%- endif %}
{%- endblock %}
{%- block scripts %}
{%- if 'custom-js' in meta %} {# Allow custom js import for specific pages #}
{# Before the custom files using React & Immutable (accounting mementos) #}
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.min.js"
integrity="sha512-myCdDiGJRYrvRb/VuJ67ljifYTJdc1jdEvL4c4ftX9o3N6EAnmD83c/7l2/91RCINZ7c8w21tiXDT7RDFjdc3g=="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.0/react-with-addons.min.js"
integrity="sha512-wsnDgOxfyn4lhblRMHPMuJh+9CnLcwcisda1zLRGNWKh6OiQynebYTyRZYgH+eWLEdNTKak0OD2GAd/S51UhTw=="
crossorigin="anonymous"></script>
<script src="{{ pathto('_static/js/atom.js', 1) }}"></script>
{%- set js_files = meta['custom-js'].split(',') %}
{%- for js_file in js_files %}
{%- set link = '_static/js/' + js_file %}
<script src="{{ pathto(link, 1) }}"></script>
{%- endfor %}
{%- endif %}
{{ super() }} {# Load the scripts specified in the extensions/themes #}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0"
crossorigin="anonymous"></script>
{%- endblock %}
{%- block linktags %}
{%- for alternate_language, language_code, url in alternate_languages %}
<link rel="alternate" hreflang="{{ language_code }}" href="{{ url }}" />
{%- endfor %}
<link rel="canonical" href="{{ canonical }}" />
{{ super() }}
{%- endblock %}
{#
Google analytics key logic.
We do not want to call super here since our custom footer logic is defined in the content block.
#}
{%- block footer %}
{%- if google_analytics_key -%}
{%- include "layout_templates/google_analytics.html" %}
{%- endif -%}
{%- endblock %}
{%- block header %}
<noscript>
<nav class="o_side_nav border-end">
{%- include "layout_templates/menu.html" %}
</nav>
</noscript>
{# Shown when the JS has properly set all the classes on the TOC elements #}
<nav id="o_main_toctree" class="o_side_nav border-end" hidden>
{%- include "layout_templates/menu.html" %}
</nav>
<header class="o_main_header border-bottom navbar navbar-light navbar-expand-lg">
{%- include "layout_templates/header.html" %}
<button class="navbar-toggler pe-3 border-0" type="button" data-bs-toggle="collapse" data-bs-target="#o_main_toctree" aria-label="Toggle navigation">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</header>
{%- endblock %}
{%- block content %}
<div id="wrap">
{%- set main_classes = [] %}
{%- if pagename == master_doc %} {# The current page is the homepage #}
{%- set main_classes = main_classes + ['o_index'] %}
{%- endif %}
{%- if 'code-column' in meta %} {# The page contains a 'memento' (dynamic side block) #}
{%- set main_classes = main_classes + ['o_has_code_column'] %}
{%- endif %}
{%- if 'classes' in meta %} {# The page source defines custom classes #}
{%- set main_classes = main_classes + meta['classes'].split() %}
{%- endif %}
{%- if 'hide-page-toc' in meta %}
{%- set main_classes = main_classes + ['o_fullwidth_page'] %}
{%- endif %}
<div class="px-3 py-4 d-lg-none">
<!-- Searchbox only visible in mobile -->
{%- include "layout_templates/searchbox.html" %}
</div>
<main class="container-fluid {{ ' '.join(main_classes) }}">
{%- if pagename == master_doc %}
{# Custom landing page on the root of the documentation #}
{%- include "layout_templates/homepage.html" %}
{%- else %}
<article id="o_content" class="doc-body">
<div role="main"> {# Beacon used by the Sphinx search to know where to look for a string #}
{%- block body %} {%- endblock %}
</div>
{%- if github_link and pagename != 'search' %}
<a href="{{ github_link(mode='edit') }}"
class="o_git_link d-none d-lg-inline-block">
<i class="i-edit"></i> Edit on GitHub
</a>
{%- endif %}
</article>
{%- endif %}
</main>
{%- if 'hide-page-toc' not in meta %}
<aside id="o_page_toc" class="o_page_toc">
{%- include "layout_templates/page_toc.html" %}
</aside>
{%- endif %}
</div>
<footer>
{%- include "layout_templates/footer.html" %}
</footer>
{%- endblock %}
@@ -0,0 +1,30 @@
<section class="o_changelog">
<h2 class="pt-5">Changelog</h2>
{# For each changelog display a row #}
<div class="row pt-4">
<div class="col-lg-1">
<p class="small align-right">Apr 14, 2021</p>
</div>
<div class="col-lg-11 border-bottom">
<h3>Addition of this article and this one</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur vehicula nibh in malesuada suscipit. Nulla est neque, euismod sed facilisis vel, mollis et sapien.</p>
<div class="pb-4">
<span class="badge bg-info text-uppercase">New Article</span>
<span class="badge bg-primary text-uppercase">Administration</span>
</div>
</div>
</div>
<div class="row pt-4">
<div class="col-lg-1">
<p class="small align-right">Apr 03, 2021</p>
</div>
<div class="col-lg-11 border-bottom">
<h3>Update of this article and also the one after</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur vehicula nibh in malesuada suscipit. Nulla est neque, euismod sed facilisis vel, mollis et sapien.</p>
<div class="pb-4">
<span class="badge bg-success text-uppercase">Update</span>
<span class="badge bg-primary text-uppercase">Administration</span>
</div>
</div>
</div>
</section>
@@ -0,0 +1,14 @@
<div class="o_get_help container-fluid d-lg-flex">
<div class="col-12 col-lg-10">
<h5><i class="i-o-help me-2"></i>Get Help</h5>
<div>
<a href="https://odoo.com/help" target="_blank" class="btn btn-outline-secondary mb-2">Contact Support</a>
<a href="https://www.odoo.com/forum/help-1" target="_blank" class="btn btn-outline-secondary mb-2">Ask the Odoo Community</a>
</div>
</div>
<div class="col-12 col-lg-2 mt-5 mt-lg-0 text-center">
<a class="o_logo" href="https://www.odoo.com">
<img src="{{ pathto('_static/img/logos/odoo_logo.svg', 1) }}" height="20" alt="Odoo"/>
</a>
</div>
</div>
@@ -0,0 +1,10 @@
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', '{{ google_analytics_key }}', 'auto');
ga('set', 'anonymizeIp', true);
ga('send','pageview');
</script>
@@ -0,0 +1,12 @@
<div class="o_logo_wrapper">
<a href="{{ pathto(master_doc) }}" class="o_logo">
<img src="{{ pathto('_static/img/logos/odoo_logo.svg', 1) }}" height="20" alt="Odoo"/>
<span>docs</span>
</a>
</div>
{%- include "layout_templates/searchbox.html" %}
<div class="d-none d-lg-flex">
{%- include "layout_templates/language_switcher.html" %}
{%- include "layout_templates/version_switcher.html" %}
<a class="btn btn-primary fw_semibold" href="https://odoo.com/trial">Try Odoo for FREE</a>
</div>
@@ -0,0 +1,155 @@
<div id="o_content">
<section class="o_content_fw_banner row">
<div class="col-lg-6">
<h2 class="text-white">Odoo Documentation</h2>
<p class="text-white">The comprehensive guide for Odoo users. Easily find the tutorial and helpful tips that suit your needs.</p>
<div class="mt-3">
<a href="https://odoo.com/trial" class="btn btn-primary mb-2">Try Odoo for FREE</a>
</div>
</div>
</section>
<section>
<div class="row gx-lg-5 border-bottom">
<div class="col-lg-6 order-lg-2">
<div class="o_cat_banner mb-5">
<img src="{{ pathto('_static/img/banner-applications.png', 1) }}" alt="">
</div>
</div>
<div class="col-lg-6 order-lg-1">
<h3>Applications</h3>
<p>Master any app thanks to their end-user guides. Our wide array of functional workflows and processes are designed to help you unleash Odoo's potential.</p>
<h5 class="pt-3 text-uppercase fw_semibold">Top Links</h5>
<ul class="list-unstyled">
<li>
<a href="{{ pathto('applications/finance/accounting/overview/main_concepts/intro') }}" class="stretched-link">
Introduction to Odoo Accounting
</a>
</li>
<li>
<a href="{{ pathto('applications/inventory_and_mrp/inventory/overview/concepts/double-entry') }}" class="stretched-link">
Introduction to Inventory Management
</a>
</li>
<li>
<a href="{{ pathto('applications/general/base_import/import_faq') }}" class="stretched-link">Import data into Odoo
</a>
</li>
<li>
<a href="{{ pathto('applications/productivity/discuss/email_servers') }}" class="stretched-link">
Use my mail server to send and receive emails in Odoo
</a>
</li>
</ul>
</div>
</div>
<div class="row gx-lg-5">
<div class="col-lg-6 py-5 border-bottom">
<div class="o_cat_banner mb-4 p-lg-4">
<i class="i-doc-admin"></i>
</div>
<h3>Administration</h3>
<p>Easily setup your first Odoo installation. From downloads to day-to-day database administration, the dedicated tutorials have got you covered.</p>
<h5 class="pt-3 text-uppercase fw_semibold">Top Links</h5>
<ul class="list-unstyled">
<li>
<a href=" {{ pathto('administration/install') }} " class="stretched-link">
Installing Odoo
</a>
</li>
<li>
<a href="{{ pathto('administration/deployment/deploy') }}" class="stretched-link">
Deploying Odoo
</a>
</li>
<li>
<a href="{{ pathto('administration/update') }}" class="stretched-link">
Updating Odoo
</a>
</li>
<li>
<a href="{{ pathto('administration/odoo_sh/overview/introduction') }}" class="stretched-link">
Introduction to Odoo.sh
</a>
</li>
</ul>
</div>
<div class="col-lg-6 py-5 border-bottom">
<div class="o_cat_banner mb-4 p-lg-4 o-bg-violet-light">
<i class="i-doc-dev"></i>
</div>
<h3>Developer</h3>
<p>Learn to develop in Odoo by reading the framework references and programmer tutorials.</p>
<h5 class="pt-3 text-uppercase fw_semibold">Top Links</h5>
<ul class="list-unstyled">
<li>
<a href="{{ pathto('developer/reference/orm') }}" class="stretched-link">
ORM API
</a>
</li>
<li>
<a href="{{ pathto('developer/howtos/backend') }}" class="stretched-link">
Building a Module
</a>
</li>
<li>
<a href="{{ pathto('developer/webservices/odoo') }}" class="stretched-link">
External API
</a>
</li>
<li>
<a href="{{ pathto('developer/reference/cmdline') }}" class="stretched-link">
Command-line interface
</a>
</li>
</ul>
</div>
</div>
<div class="row gx-lg-5">
{# If changelog exists add class border-bottom #}
<div class="col-lg-6 pt-5">
<div class="o_cat_banner mb-4 p-lg-4 o-bg-violet-light">
<i class="i-doc-services"></i>
</div>
<h3>Services</h3>
<p>Find out how to open a support ticket should you need to contact a Customer Service Representative.</p>
<h5 class="pt-3 text-uppercase fw_semibold">Top Links</h5>
<ul class="list-unstyled">
<li>
<a href="{{ pathto('services/support/where_can_i_get_support') }}" class="stretched-link">
Where to find help?
</a>
</li>
<li>
<a href="{{ pathto('services/support/supported_versions') }}" class="stretched-link">
Supported versions
</a>
</li>
<li>
<a href="{{ pathto('legal') }}" class="stretched-link">
Legal
</a>
</li>
</ul>
</div>
{# If changelog exists add class border-bottom #}
<div class="col-lg-6 pt-5">
<div class="o_cat_banner mb-4 p-lg-4">
<i class="i-doc-contribute"></i>
</div>
<h3>Contributing</h3>
<p>You want to contribute to Odoo but don't know where to start? The tutorials and guidelines are there to help you make Odoo even better.</p>
<h5 class="pt-3 text-uppercase fw_semibold">Top Links</h5>
<ul class="list-unstyled">
<li>
<a href="{{ pathto('contributing/documentation/introduction_guide') }}" class="stretched-link">
Introduction guide
</a>
</li>
</ul>
</div>
</div>
</section>
{# If changelog exists import it here}
{% include "layout_templates/changelog.html" %}
{#}
</div>
@@ -0,0 +1,22 @@
<div class="o_languages me-3">
<div class="dropdown">
{%- if alternate_languages|length > 0 %}
<button class="btn border dropdown-toggle"
id="languages"
data-bs-toggle="dropdown">
{{ language }} {# The current language #}
</button>
{%- else %}
<button class="btn border"
id="languages"
disabled="">
{{ language }} {# The current language #}
</button>
{%- endif %}
<ul class="dropdown-menu" aria-labelledby="languages">
{%- for alternate_language, language_code, url in alternate_languages %}
<li><a class="dropdown-item" href="{{ url }}">{{ alternate_language }}</a></li>
{%- endfor %}
</ul>
</div>
</div>
@@ -0,0 +1,12 @@
{# Global TOC of the doc #}
{#
See: https://www.sphinx-doc.org/en/master/templating.html#toctree
collapse: Whether only menu items included in the breadcrumb should be rendered
title_only: Whether menu items for content pages (without toctree) should be hidden
includehidden: Whether menu items of pages inside a hidden toctree should be rendered
#}
{#
`collapse_menu` is passed directly to Jinja with sphinx-build's option `-A collapse_menu=True`.
It it evaluated as a string, so what we're really evaluating here is `collapse_menu != None`.
#}
{{ toctree(collapse=collapse_menu, titles_only=True, includehidden=False)}}
@@ -0,0 +1,4 @@
<div class="o_page_toc_nav mt-1">
<h3>On this page</h3>
{{ toc }} {# this is the page TOC (or local toc) #}
</div>
@@ -0,0 +1,11 @@
{# NOTE: the 'searchbox' id is used to hook the "Hide Search Matches" button #}
{# NOTE: currently renamed to '_searchbox' to hide the button until it receives proper styling #}
<div id="_searchbox" class="o_search_wrapper flex-grow-1 justify-content-stretch justify-content-lg-start pe-lg-2" role="search">
<form class="o_search" action="{{ pathto('search') }}" method="get">
<input type="text" name="q" id="q" class="form-control rounded-pill" placeholder="What are you looking for?">
<input type="hidden" name="area" value="default">
<input type="hidden" name="check_keywords" value="yes">
<button type="submit" class="btn"><i class="i-search"></i></button>
</form>
</div>
<script type="text/javascript">$('.o_search_wrapper').show(0);</script>
@@ -0,0 +1,27 @@
<div class="o_versions row gx-2 me-3">
<div class="col col-form-label">
<label class="fw_bold small me-2">Version</label>
</div>
<div class="col">
<div class="dropdown">
{%- if alternate_versions|length > 0 %}
<button class="btn border dropdown-toggle"
id="versions"
data-bs-toggle="dropdown">
{{ version }} {# The current version #}
</button>
{%- else %}
<button class="btn border"
id="versions"
disabled="">
{{ version }} {# The current version #}
</button>
{%- endif %}
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="versions">
{%- for alternate_version, url in alternate_versions %}
<li><a class="dropdown-item" href="{{ url }}">{{ alternate_version }}</a></li>
{%- endfor %}
</ul>
</div>
</div>
</div>
@@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
from pygments.style import Style
from pygments.token import Keyword, Name, Comment, String, Error, \
Number, Other, Whitespace, Generic
class OdooStyle(Style):
"""
Style inspired by SAS' enhanced program editor. Note This is not
meant to be a complete style. It's merely meant to mimic SAS'
program editor syntax highlighting.
:copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
default_style = ''
background_color = '#F8F8F8'
highlight_color = '#EAEAEA'
styles = {
Whitespace: '#bbbbbb',
Comment: 'italic #8c8c8c',
String: '#800080',
Number: 'bold',
Other: 'bg:#ffffe0',
Keyword: '#2c2cff',
Keyword.Reserved: 'bold #353580',
Keyword.Constant: 'bold',
Name.Builtin: '#2c2cff',
Name.Function: 'bold italic',
Name.Class: "bold #0000FF",
Name.Namespace: "bold #0000FF",
Name.Exception: 'bg:#e3d2d2 #a61717',
Name.Variable: 'bold #2c2cff',
Name.Attribute: '#2c2cff',
Name.Tag: "bold #008000",
Generic: '#2c2cff',
Generic.Emph: '#008800',
Generic.Error: '#d30202',
Error: 'bg:#ffe2e2 #a61717'
}
import types
import sys
modname = 'pygments.styles.odoo'
m = types.ModuleType(modname)
m.OdooStyle = OdooStyle
sys.modules[modname] = m
+14
View File
@@ -0,0 +1,14 @@
{%- extends "basic/search.html" %}
<!-- This is an override of the search page of the basic theme.
The original page included a static "Search Result" section that would always be replaced by
the JS, so it's not reproduced here. -->
{%- block body %}
<div id="fallback" class="alert alert-warning">
<script>$('#fallback').hide();</script>
<p>
{%- trans %}Please activate JavaScript to enable the search functionality.{%- endtrans %}
</p>
</div>
<div id="search-results"></div>
{%- endblock %}
Binary file not shown.
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

@@ -0,0 +1,16 @@
<svg width="408" height="146" viewBox="0 0 408 146" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="7.4931" y="8.40134" width="13" height="3" rx="1.5" transform="rotate(-38.7743 7.4931 8.40134)" fill="#A67B9A"/>
<rect x="29.1213" y="86.0001" width="13" height="3" rx="1.5" transform="rotate(45 29.1213 86.0001)" fill="#A67B9A"/>
<rect x="100" y="117" width="13" height="3" rx="1.5" transform="rotate(90 100 117)" fill="#A67B9A"/>
<rect x="105" y="125" width="13" height="3" rx="1.5" transform="rotate(-180 105 125)" fill="#A67B9A"/>
<rect x="123" y="0.00012207" width="13" height="3" rx="1.5" transform="rotate(90 123 0.00012207)" fill="#A67B9A"/>
<rect x="128" y="8.00012" width="13" height="3" rx="1.5" transform="rotate(-180 128 8.00012)" fill="#A67B9A"/>
<rect x="403" y="118" width="13" height="3" rx="1.5" transform="rotate(90 403 118)" fill="#A67B9A"/>
<rect x="408" y="126" width="13" height="3" rx="1.5" transform="rotate(-180 408 126)" fill="#A67B9A"/>
<rect x="386.314" y="58.1214" width="13" height="3" rx="1.5" transform="rotate(135 386.314 58.1214)" fill="#A67B9A"/>
<circle cx="65" cy="45.0001" r="5" fill="#A67B9A"/>
<circle cx="313" cy="21.0001" r="5" fill="#A67B9A"/>
<circle cx="5" cy="141" r="4" stroke="#A67B9A" stroke-width="2"/>
<circle cx="337" cy="97.0001" r="4" stroke="#A67B9A" stroke-width="2"/>
<circle cx="396" cy="10.0001" r="4" stroke="#A67B9A" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,771 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin:auto;background:#f1f2f3;display:block;z-index:1;position:relative" width="1920" height="944" preserveAspectRatio="xMidYMid" viewBox="0 0 1920 944">
<g transform="translate(960,472) scale(1,1) translate(-960,-472)"><g id="bk-0.16217486445175422"><path d="M 968 446 L 809 414 L 899 507 Z" stroke="#735169" fill="#735169">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 968 446 L 809 414 L 899 507 Z;M 992 436 L 841 441 L 911 512 Z;M 968 446 L 809 414 L 899 507 Z"></animate>
</path><path d="M 809 414 L 766 530 L 899 507 Z" stroke="#725069" fill="#725069">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 809 414 L 766 530 L 899 507 Z;M 841 441 L 756 535 L 911 512 Z;M 809 414 L 766 530 L 899 507 Z"></animate>
</path><path d="M 968 446 L 811 310 L 809 414 Z" stroke="#705067" fill="#705067">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 968 446 L 811 310 L 809 414 Z;M 992 436 L 808 269 L 841 441 Z;M 968 446 L 811 310 L 809 414 Z"></animate>
</path><path d="M 809 414 L 625 393 L 766 530 Z" stroke="#6f4f66" fill="#6f4f66">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 809 414 L 625 393 L 766 530 Z;M 841 441 L 572 344 L 756 535 Z;M 809 414 L 625 393 L 766 530 Z"></animate>
</path><path d="M 1110 607 L 1094 384 L 968 446 Z" stroke="#77536d" fill="#77536d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1110 607 L 1094 384 L 968 446 Z;M 1132 560 L 1080 419 L 992 436 Z;M 1110 607 L 1094 384 L 968 446 Z"></animate>
</path><path d="M 968 446 L 916 250 L 811 310 Z" stroke="#704f67" fill="#704f67">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 968 446 L 916 250 L 811 310 Z;M 992 436 L 913 204 L 808 269 Z;M 968 446 L 916 250 L 811 310 Z"></animate>
</path><path d="M 1031 221 L 916 250 L 968 446 Z" stroke="#705067" fill="#705067">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1031 221 L 916 250 L 968 446 Z;M 1038 274 L 913 204 L 992 436 Z;M 1031 221 L 916 250 L 968 446 Z"></animate>
</path><path d="M 957 708 L 1110 607 L 899 507 Z" stroke="#79536f" fill="#79536f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 957 708 L 1110 607 L 899 507 Z;M 955 721 L 1132 560 L 911 512 Z;M 957 708 L 1110 607 L 899 507 Z"></animate>
</path><path d="M 899 507 L 1110 607 L 968 446 Z" stroke="#77536d" fill="#77536d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 899 507 L 1110 607 L 968 446 Z;M 911 512 L 1132 560 L 992 436 Z;M 899 507 L 1110 607 L 968 446 Z"></animate>
</path><path d="M 1094 384 L 1031 221 L 968 446 Z" stroke="#73516a" fill="#73516a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1094 384 L 1031 221 L 968 446 Z;M 1080 419 L 1038 274 L 992 436 Z;M 1094 384 L 1031 221 L 968 446 Z"></animate>
</path><path d="M 766 530 L 821 737 L 899 507 Z" stroke="#74516b" fill="#74516b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 766 530 L 821 737 L 899 507 Z;M 756 535 L 837 710 L 911 512 Z;M 766 530 L 821 737 L 899 507 Z"></animate>
</path><path d="M 821 737 L 957 708 L 899 507 Z" stroke="#77536d" fill="#77536d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 821 737 L 957 708 L 899 507 Z;M 837 710 L 955 721 L 911 512 Z;M 821 737 L 957 708 L 899 507 Z"></animate>
</path><path d="M 642 220 L 625 393 L 811 310 Z" stroke="#6a4d62" fill="#6a4d62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 642 220 L 625 393 L 811 310 Z;M 604 253 L 572 344 L 808 269 Z;M 642 220 L 625 393 L 811 310 Z"></animate>
</path><path d="M 811 310 L 625 393 L 809 414 Z" stroke="#6d4e65" fill="#6d4e65">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 811 310 L 625 393 L 809 414 Z;M 808 269 L 572 344 L 841 441 Z;M 811 310 L 625 393 L 809 414 Z"></animate>
</path><path d="M 766 530 L 608 654 L 821 737 Z" stroke="#735169" fill="#735169">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 766 530 L 608 654 L 821 737 Z;M 756 535 L 588 700 L 837 710 Z;M 766 530 L 608 654 L 821 737 Z"></animate>
</path><path d="M 957 708 L 1097 727 L 1110 607 Z" stroke="#7c5571" fill="#7c5571">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 957 708 L 1097 727 L 1110 607 Z;M 955 721 L 1098 695 L 1132 560 Z;M 957 708 L 1097 727 L 1110 607 Z"></animate>
</path><path d="M 1203 540 L 1222 412 L 1094 384 Z" stroke="#79546f" fill="#79546f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1203 540 L 1222 412 L 1094 384 Z;M 1205 518 L 1229 390 L 1080 419 Z;M 1203 540 L 1222 412 L 1094 384 Z"></animate>
</path><path d="M 1094 384 L 1222 412 L 1031 221 Z" stroke="#74526b" fill="#74526b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1094 384 L 1222 412 L 1031 221 Z;M 1080 419 L 1229 390 L 1038 274 Z;M 1094 384 L 1222 412 L 1031 221 Z"></animate>
</path><path d="M 1203 540 L 1094 384 L 1110 607 Z" stroke="#7a5470" fill="#7a5470">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1203 540 L 1094 384 L 1110 607 Z;M 1205 518 L 1080 419 L 1132 560 Z;M 1203 540 L 1094 384 L 1110 607 Z"></animate>
</path><path d="M 1133 165 L 938 134 L 1031 221 Z" stroke="#6e4e65" fill="#6e4e65">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1133 165 L 938 134 L 1031 221 Z;M 1113 131 L 949 103 L 1038 274 Z;M 1133 165 L 938 134 L 1031 221 Z"></animate>
</path><path d="M 1031 221 L 938 134 L 916 250 Z" stroke="#6d4e65" fill="#6d4e65">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1031 221 L 938 134 L 916 250 Z;M 1038 274 L 949 103 L 913 204 Z;M 1031 221 L 938 134 L 916 250 Z"></animate>
</path><path d="M 775 131 L 642 220 L 811 310 Z" stroke="#694c61" fill="#694c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 775 131 L 642 220 L 811 310 Z;M 806 117 L 604 253 L 808 269 Z;M 775 131 L 642 220 L 811 310 Z"></animate>
</path><path d="M 1236 722 L 1203 540 L 1110 607 Z" stroke="#7e5673" fill="#7e5673">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1236 722 L 1203 540 L 1110 607 Z;M 1237 678 L 1205 518 L 1132 560 Z;M 1236 722 L 1203 540 L 1110 607 Z"></animate>
</path><path d="M 775 131 L 811 310 L 916 250 Z" stroke="#6b4d63" fill="#6b4d63">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 775 131 L 811 310 L 916 250 Z;M 806 117 L 808 269 L 913 204 Z;M 775 131 L 811 310 L 916 250 Z"></animate>
</path><path d="M 453 385 L 571 473 L 625 393 Z" stroke="#694c61" fill="#694c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 453 385 L 571 473 L 625 393 Z;M 464 339 L 579 478 L 572 344 Z;M 453 385 L 571 473 L 625 393 Z"></animate>
</path><path d="M 625 393 L 571 473 L 766 530 Z" stroke="#6d4e65" fill="#6d4e65">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 625 393 L 571 473 L 766 530 Z;M 572 344 L 579 478 L 756 535 Z;M 625 393 L 571 473 L 766 530 Z"></animate>
</path><path d="M 821 737 L 900 791 L 957 708 Z" stroke="#79546f" fill="#79546f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 821 737 L 900 791 L 957 708 Z;M 837 710 L 836 771 L 955 721 Z;M 821 737 L 900 791 L 957 708 Z"></animate>
</path><path d="M 957 708 L 1018 762 L 1097 727 Z" stroke="#7c5572" fill="#7c5572">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 957 708 L 1018 762 L 1097 727 Z;M 955 721 L 994 781 L 1098 695 Z;M 957 708 L 1018 762 L 1097 727 Z"></animate>
</path><path d="M 938 134 L 775 131 L 916 250 Z" stroke="#6a4d62" fill="#6a4d62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 938 134 L 775 131 L 916 250 Z;M 949 103 L 806 117 L 913 204 Z;M 938 134 L 775 131 L 916 250 Z"></animate>
</path><path d="M 1222 412 L 1165 154 L 1031 221 Z" stroke="#735169" fill="#735169">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1222 412 L 1165 154 L 1031 221 Z;M 1229 390 L 1179 190 L 1038 274 Z;M 1222 412 L 1165 154 L 1031 221 Z"></animate>
</path><path d="M 525 621 L 608 654 L 766 530 Z" stroke="#6f4f66" fill="#6f4f66">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 525 621 L 608 654 L 766 530 Z;M 529 613 L 588 700 L 756 535 Z;M 525 621 L 608 654 L 766 530 Z"></animate>
</path><path d="M 821 737 L 789 886 L 900 791 Z" stroke="#78536e" fill="#78536e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 821 737 L 789 886 L 900 791 Z;M 837 710 L 831 881 L 836 771 Z;M 821 737 L 789 886 L 900 791 Z"></animate>
</path><path d="M 1165 154 L 1133 165 L 1031 221 Z" stroke="#6f4f67" fill="#6f4f67">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1165 154 L 1133 165 L 1031 221 Z;M 1179 190 L 1113 131 L 1038 274 Z;M 1165 154 L 1133 165 L 1031 221 Z"></animate>
</path><path d="M 900 791 L 1018 762 L 957 708 Z" stroke="#7b5470" fill="#7b5470">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 900 791 L 1018 762 L 957 708 Z;M 836 771 L 994 781 L 955 721 Z;M 900 791 L 1018 762 L 957 708 Z"></animate>
</path><path d="M 1097 727 L 1236 722 L 1110 607 Z" stroke="#7e5674" fill="#7e5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1097 727 L 1236 722 L 1110 607 Z;M 1098 695 L 1237 678 L 1132 560 Z;M 1097 727 L 1236 722 L 1110 607 Z"></animate>
</path><path d="M 571 473 L 525 621 L 766 530 Z" stroke="#6e4f65" fill="#6e4f65">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 571 473 L 525 621 L 766 530 Z;M 579 478 L 529 613 L 756 535 Z;M 571 473 L 525 621 L 766 530 Z"></animate>
</path><path d="M 1166 809 L 1236 722 L 1097 727 Z" stroke="#805775" fill="#805775">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1166 809 L 1236 722 L 1097 727 Z;M 1173 797 L 1237 678 L 1098 695 Z;M 1166 809 L 1236 722 L 1097 727 Z"></animate>
</path><path d="M 1203 540 L 1305 509 L 1222 412 Z" stroke="#7c5571" fill="#7c5571">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1203 540 L 1305 509 L 1222 412 Z;M 1205 518 L 1301 545 L 1229 390 Z;M 1203 540 L 1305 509 L 1222 412 Z"></animate>
</path><path d="M 775 131 L 640 106 L 642 220 Z" stroke="#664b5e" fill="#664b5e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 775 131 L 640 106 L 642 220 Z;M 806 117 L 634 129 L 604 253 Z;M 775 131 L 640 106 L 642 220 Z"></animate>
</path><path d="M 642 220 L 453 385 L 625 393 Z" stroke="#684c60" fill="#684c60">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 642 220 L 453 385 L 625 393 Z;M 604 253 L 464 339 L 572 344 Z;M 642 220 L 453 385 L 625 393 Z"></animate>
</path><path d="M 584 772 L 789 886 L 821 737 Z" stroke="#75526c" fill="#75526c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 584 772 L 789 886 L 821 737 Z;M 579 787 L 831 881 L 837 710 Z;M 584 772 L 789 886 L 821 737 Z"></animate>
</path><path d="M 900 791 L 827 889 L 1018 762 Z" stroke="#7b5470" fill="#7b5470">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 900 791 L 827 889 L 1018 762 Z;M 836 771 L 845 931 L 994 781 Z;M 900 791 L 827 889 L 1018 762 Z"></animate>
</path><path d="M 1236 722 L 1305 509 L 1203 540 Z" stroke="#7f5674" fill="#7f5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1236 722 L 1305 509 L 1203 540 Z;M 1237 678 L 1301 545 L 1205 518 Z;M 1236 722 L 1305 509 L 1203 540 Z"></animate>
</path><path d="M 1327 199 L 1178 104 L 1165 154 Z" stroke="#715068" fill="#715068">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1327 199 L 1178 104 L 1165 154 Z;M 1344 197 L 1167 59 L 1179 190 Z;M 1327 199 L 1178 104 L 1165 154 Z"></animate>
</path><path d="M 1018 762 L 1166 809 L 1097 727 Z" stroke="#7f5674" fill="#7f5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1018 762 L 1166 809 L 1097 727 Z;M 994 781 L 1173 797 L 1098 695 Z;M 1018 762 L 1166 809 L 1097 727 Z"></animate>
</path><path d="M 1236 722 L 1387 704 L 1305 509 Z" stroke="#825876" fill="#825876">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1236 722 L 1387 704 L 1305 509 Z;M 1237 678 L 1371 745 L 1301 545 Z;M 1236 722 L 1387 704 L 1305 509 Z"></animate>
</path><path d="M 1168 879 L 1166 809 L 1018 762 Z" stroke="#805775" fill="#805775">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1168 879 L 1166 809 L 1018 762 Z;M 1163 894 L 1173 797 L 994 781 Z;M 1168 879 L 1166 809 L 1018 762 Z"></animate>
</path><path d="M 396 178 L 453 385 L 642 220 Z" stroke="#644a5d" fill="#644a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 396 178 L 453 385 L 642 220 Z;M 428 216 L 464 339 L 604 253 Z;M 396 178 L 453 385 L 642 220 Z"></animate>
</path><path d="M 337 502 L 434 627 L 525 621 Z" stroke="#6a4d62" fill="#6a4d62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 337 502 L 434 627 L 525 621 Z;M 301 498 L 406 638 L 529 613 Z;M 337 502 L 434 627 L 525 621 Z"></animate>
</path><path d="M 434 627 L 584 772 L 608 654 Z" stroke="#6e4f66" fill="#6e4f66">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 434 627 L 584 772 L 608 654 Z;M 406 638 L 579 787 L 588 700 Z;M 434 627 L 584 772 L 608 654 Z"></animate>
</path><path d="M 608 654 L 584 772 L 821 737 Z" stroke="#725169" fill="#725169">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 608 654 L 584 772 L 821 737 Z;M 588 700 L 579 787 L 837 710 Z;M 608 654 L 584 772 L 821 737 Z"></animate>
</path><path d="M 434 627 L 608 654 L 525 621 Z" stroke="#6d4e64" fill="#6d4e64">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 434 627 L 608 654 L 525 621 Z;M 406 638 L 588 700 L 529 613 Z;M 434 627 L 608 654 L 525 621 Z"></animate>
</path><path d="M 1327 199 L 1165 154 L 1222 412 Z" stroke="#74526b" fill="#74526b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1327 199 L 1165 154 L 1222 412 Z;M 1344 197 L 1179 190 L 1229 390 Z;M 1327 199 L 1165 154 L 1222 412 Z"></animate>
</path><path d="M 1165 154 L 1178 104 L 1133 165 Z" stroke="#6f4f66" fill="#6f4f66">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1165 154 L 1178 104 L 1133 165 Z;M 1179 190 L 1167 59 L 1113 131 Z;M 1165 154 L 1178 104 L 1133 165 Z"></animate>
</path><path d="M 1133 165 L 1059 -46 L 938 134 Z" stroke="#6b4d63" fill="#6b4d63">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1133 165 L 1059 -46 L 938 134 Z;M 1113 131 L 1025 -34 L 949 103 Z;M 1133 165 L 1059 -46 L 938 134 Z"></animate>
</path><path d="M 938 134 L 820 -48 L 775 131 Z" stroke="#674b5f" fill="#674b5f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 938 134 L 820 -48 L 775 131 Z;M 949 103 L 788 8 L 806 117 Z;M 938 134 L 820 -48 L 775 131 Z"></animate>
</path><path d="M 775 131 L 663 6 L 640 106 Z" stroke="#644a5d" fill="#644a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 775 131 L 663 6 L 640 106 Z;M 806 117 L 652 6 L 634 129 Z;M 775 131 L 663 6 L 640 106 Z"></animate>
</path><path d="M 1305 509 L 1380 387 L 1222 412 Z" stroke="#7b5571" fill="#7b5571">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1305 509 L 1380 387 L 1222 412 Z;M 1301 545 L 1346 411 L 1229 390 Z;M 1305 509 L 1380 387 L 1222 412 Z"></animate>
</path><path d="M 888 -86 L 820 -48 L 938 134 Z" stroke="#654a5e" fill="#654a5e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 888 -86 L 820 -48 L 938 134 Z;M 858 -65 L 788 8 L 949 103 Z;M 888 -86 L 820 -48 L 938 134 Z"></animate>
</path><path d="M 734 950 L 827 889 L 789 886 Z" stroke="#78536e" fill="#78536e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 734 950 L 827 889 L 789 886 Z;M 697 929 L 845 931 L 831 881 Z;M 734 950 L 827 889 L 789 886 Z"></animate>
</path><path d="M 789 886 L 827 889 L 900 791 Z" stroke="#79546f" fill="#79546f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 789 886 L 827 889 L 900 791 Z;M 831 881 L 845 931 L 836 771 Z;M 789 886 L 827 889 L 900 791 Z"></animate>
</path><path d="M 1380 387 L 1327 199 L 1222 412 Z" stroke="#78536e" fill="#78536e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1380 387 L 1327 199 L 1222 412 Z;M 1346 411 L 1344 197 L 1229 390 Z;M 1380 387 L 1327 199 L 1222 412 Z"></animate>
</path><path d="M 820 -48 L 663 6 L 775 131 Z" stroke="#644a5c" fill="#644a5c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 820 -48 L 663 6 L 775 131 Z;M 788 8 L 652 6 L 806 117 Z;M 820 -48 L 663 6 L 775 131 Z"></animate>
</path><path d="M 640 106 L 396 178 L 642 220 Z" stroke="#634a5c" fill="#634a5c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 640 106 L 396 178 L 642 220 Z;M 634 129 L 428 216 L 604 253 Z;M 640 106 L 396 178 L 642 220 Z"></animate>
</path><path d="M 337 502 L 525 621 L 571 473 Z" stroke="#6a4d62" fill="#6a4d62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 337 502 L 525 621 L 571 473 Z;M 301 498 L 529 613 L 579 478 Z;M 337 502 L 525 621 L 571 473 Z"></animate>
</path><path d="M 584 772 L 734 950 L 789 886 Z" stroke="#75526c" fill="#75526c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 584 772 L 734 950 L 789 886 Z;M 579 787 L 697 929 L 831 881 Z;M 584 772 L 734 950 L 789 886 Z"></animate>
</path><path d="M 1077 1001 L 1168 879 L 1018 762 Z" stroke="#805775" fill="#805775">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1077 1001 L 1168 879 L 1018 762 Z;M 1103 1035 L 1163 894 L 994 781 Z;M 1077 1001 L 1168 879 L 1018 762 Z"></animate>
</path><path d="M 1166 809 L 1330 797 L 1236 722 Z" stroke="#835877" fill="#835877">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1166 809 L 1330 797 L 1236 722 Z;M 1173 797 L 1296 786 L 1237 678 Z;M 1166 809 L 1330 797 L 1236 722 Z"></animate>
</path><path d="M 1077 1001 L 1018 762 L 827 889 Z" stroke="#7d5673" fill="#7d5673">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1077 1001 L 1018 762 L 827 889 Z;M 1103 1035 L 994 781 L 845 931 Z;M 1077 1001 L 1018 762 L 827 889 Z"></animate>
</path><path d="M 1220 -58 L 1059 -46 L 1178 104 Z" stroke="#6a4d62" fill="#6a4d62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1220 -58 L 1059 -46 L 1178 104 Z;M 1217 -25 L 1025 -34 L 1167 59 Z;M 1220 -58 L 1059 -46 L 1178 104 Z"></animate>
</path><path d="M 1178 104 L 1059 -46 L 1133 165 Z" stroke="#6c4e64" fill="#6c4e64">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1178 104 L 1059 -46 L 1133 165 Z;M 1167 59 L 1025 -34 L 1113 131 Z;M 1178 104 L 1059 -46 L 1133 165 Z"></animate>
</path><path d="M 820 -48 L 697 -175 L 663 6 Z" stroke="#644d63" fill="#644d63">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 820 -48 L 697 -175 L 663 6 Z;M 788 8 L 675 -126 L 652 6 Z;M 820 -48 L 697 -175 L 663 6 Z"></animate>
</path><path d="M 1342 976 L 1330 797 L 1166 809 Z" stroke="#85597a" fill="#85597a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1342 976 L 1330 797 L 1166 809 Z;M 1338 944 L 1296 786 L 1173 797 Z;M 1342 976 L 1330 797 L 1166 809 Z"></animate>
</path><path d="M 1487 573 L 1488 357 L 1380 387 Z" stroke="#7f5674" fill="#7f5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1487 573 L 1488 357 L 1380 387 Z;M 1491 534 L 1452 352 L 1346 411 Z;M 1487 573 L 1488 357 L 1380 387 Z"></animate>
</path><path d="M 500 -23 L 396 178 L 640 106 Z" stroke="#644c62" fill="#644c62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 500 -23 L 396 178 L 640 106 Z;M 505 10 L 428 216 L 634 129 Z;M 500 -23 L 396 178 L 640 106 Z"></animate>
</path><path d="M 453 385 L 371 416 L 571 473 Z" stroke="#674c60" fill="#674c60">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 453 385 L 371 416 L 571 473 Z;M 464 339 L 346 419 L 579 478 Z;M 453 385 L 371 416 L 571 473 Z"></animate>
</path><path d="M 374 249 L 371 416 L 453 385 Z" stroke="#644a5d" fill="#644a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 374 249 L 371 416 L 453 385 Z;M 362 270 L 346 419 L 464 339 Z;M 374 249 L 371 416 L 453 385 Z"></animate>
</path><path d="M 1059 -46 L 888 -86 L 938 134 Z" stroke="#674b5f" fill="#674b5f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1059 -46 L 888 -86 L 938 134 Z;M 1025 -34 L 858 -65 L 949 103 Z;M 1059 -46 L 888 -86 L 938 134 Z"></animate>
</path><path d="M 434 627 L 513 878 L 584 772 Z" stroke="#6f4f66" fill="#6f4f66">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 434 627 L 513 878 L 584 772 Z;M 406 638 L 511 878 L 579 787 Z;M 434 627 L 513 878 L 584 772 Z"></animate>
</path><path d="M 584 772 L 513 878 L 734 950 Z" stroke="#735169" fill="#735169">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 584 772 L 513 878 L 734 950 Z;M 579 787 L 511 878 L 697 929 Z;M 584 772 L 513 878 L 734 950 Z"></animate>
</path><path d="M 1327 199 L 1264 35 L 1178 104 Z" stroke="#704f67" fill="#704f67">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1327 199 L 1264 35 L 1178 104 Z;M 1344 197 L 1290 17 L 1167 59 Z;M 1327 199 L 1264 35 L 1178 104 Z"></animate>
</path><path d="M 1509 875 L 1387 704 L 1452 957 Z" stroke="#855e85" fill="#855e85">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1509 875 L 1387 704 L 1452 957 Z;M 1542 839 L 1371 745 L 1495 983 Z;M 1509 875 L 1387 704 L 1452 957 Z"></animate>
</path><path d="M 1330 797 L 1387 704 L 1236 722 Z" stroke="#845978" fill="#845978">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1330 797 L 1387 704 L 1236 722 Z;M 1296 786 L 1371 745 L 1237 678 Z;M 1330 797 L 1387 704 L 1236 722 Z"></animate>
</path><path d="M 396 178 L 374 249 L 453 385 Z" stroke="#63495b" fill="#63495b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 396 178 L 374 249 L 453 385 Z;M 428 216 L 362 270 L 464 339 Z;M 396 178 L 374 249 L 453 385 Z"></animate>
</path><path d="M 1264 35 L 1220 -58 L 1178 104 Z" stroke="#6c4e64" fill="#6c4e64">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1264 35 L 1220 -58 L 1178 104 Z;M 1290 17 L 1217 -25 L 1167 59 Z;M 1264 35 L 1220 -58 L 1178 104 Z"></animate>
</path><path d="M 920 -184 L 778 -137 L 888 -86 Z" stroke="#644c61" fill="#644c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 920 -184 L 778 -137 L 888 -86 Z;M 884 -175 L 791 -188 L 858 -65 Z;M 920 -184 L 778 -137 L 888 -86 Z"></animate>
</path><path d="M 194 369 L 337 502 L 371 416 Z" stroke="#634a5c" fill="#634a5c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 194 369 L 337 502 L 371 416 Z;M 177 373 L 301 498 L 346 419 Z;M 194 369 L 337 502 L 371 416 Z"></animate>
</path><path d="M 371 416 L 337 502 L 571 473 Z" stroke="#674b60" fill="#674b60">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 371 416 L 337 502 L 571 473 Z;M 346 419 L 301 498 L 579 478 Z;M 371 416 L 337 502 L 571 473 Z"></animate>
</path><path d="M 434 627 L 276 750 L 513 878 Z" stroke="#6c4e63" fill="#6c4e63">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 434 627 L 276 750 L 513 878 Z;M 406 638 L 261 768 L 511 878 Z;M 434 627 L 276 750 L 513 878 Z"></animate>
</path><path d="M 1487 573 L 1380 387 L 1305 509 Z" stroke="#7f5674" fill="#7f5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1487 573 L 1380 387 L 1305 509 Z;M 1491 534 L 1346 411 L 1301 545 Z;M 1487 573 L 1380 387 L 1305 509 Z"></animate>
</path><path d="M 1380 387 L 1488 357 L 1327 199 Z" stroke="#79546f" fill="#79546f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1380 387 L 1488 357 L 1327 199 Z;M 1346 411 L 1452 352 L 1344 197 Z;M 1380 387 L 1488 357 L 1327 199 Z"></animate>
</path><path d="M 1478 37 L 1396 -43 L 1264 35 Z" stroke="#6e4f66" fill="#6e4f66">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1478 37 L 1396 -43 L 1264 35 Z;M 1462 75 L 1386 13 L 1290 17 Z;M 1478 37 L 1396 -43 L 1264 35 Z"></animate>
</path><path d="M 697 -175 L 500 -23 L 663 6 Z" stroke="#66506a" fill="#66506a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 697 -175 L 500 -23 L 663 6 Z;M 675 -126 L 505 10 L 652 6 Z;M 697 -175 L 500 -23 L 663 6 Z"></animate>
</path><path d="M 663 6 L 500 -23 L 640 106 Z" stroke="#644c61" fill="#644c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 663 6 L 500 -23 L 640 106 Z;M 652 6 L 505 10 L 634 129 Z;M 663 6 L 500 -23 L 640 106 Z"></animate>
</path><path d="M 396 178 L 377 143 L 374 249 Z" stroke="#644c62" fill="#644c62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 396 178 L 377 143 L 374 249 Z;M 428 216 L 365 110 L 362 270 Z;M 396 178 L 377 143 L 374 249 Z"></animate>
</path><path d="M 375 4 L 377 143 L 396 178 Z" stroke="#66506a" fill="#66506a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 375 4 L 377 143 L 396 178 Z;M 414 36 L 365 110 L 428 216 Z;M 375 4 L 377 143 L 396 178 Z"></animate>
</path><path d="M 1014 1109 L 1077 1001 L 827 889 Z" stroke="#7e5674" fill="#7e5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1014 1109 L 1077 1001 L 827 889 Z;M 1048 1113 L 1103 1035 L 845 931 Z;M 1014 1109 L 1077 1001 L 827 889 Z"></animate>
</path><path d="M 1168 879 L 1342 976 L 1166 809 Z" stroke="#845979" fill="#845979">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1168 879 L 1342 976 L 1166 809 Z;M 1163 894 L 1338 944 L 1173 797 Z;M 1168 879 L 1342 976 L 1166 809 Z"></animate>
</path><path d="M 920 -184 L 888 -86 L 1059 -46 Z" stroke="#63495c" fill="#63495c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 920 -184 L 888 -86 L 1059 -46 Z;M 884 -175 L 858 -65 L 1025 -34 Z;M 920 -184 L 888 -86 L 1059 -46 Z"></animate>
</path><path d="M 888 -86 L 778 -137 L 820 -48 Z" stroke="#634a5e" fill="#634a5e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 888 -86 L 778 -137 L 820 -48 Z;M 858 -65 L 791 -188 L 788 8 Z;M 888 -86 L 778 -137 L 820 -48 Z"></animate>
</path><path d="M 337 502 L 330 678 L 434 627 Z" stroke="#684c60" fill="#684c60">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 337 502 L 330 678 L 434 627 Z;M 301 498 L 324 674 L 406 638 Z;M 337 502 L 330 678 L 434 627 Z"></animate>
</path><path d="M 513 878 L 652 1011 L 734 950 Z" stroke="#74516b" fill="#74516b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 513 878 L 652 1011 L 734 950 Z;M 511 878 L 666 997 L 697 929 Z;M 513 878 L 652 1011 L 734 950 Z"></animate>
</path><path d="M 734 950 L 691 1050 L 827 889 Z" stroke="#78536e" fill="#78536e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 734 950 L 691 1050 L 827 889 Z;M 697 929 L 733 1077 L 845 931 Z;M 734 950 L 691 1050 L 827 889 Z"></animate>
</path><path d="M 1476 681 L 1487 573 L 1305 509 Z" stroke="#835877" fill="#835877">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1476 681 L 1487 573 L 1305 509 Z;M 1519 664 L 1491 534 L 1301 545 Z;M 1476 681 L 1487 573 L 1305 509 Z"></animate>
</path><path d="M 778 -137 L 697 -175 L 820 -48 Z" stroke="#654e66" fill="#654e66">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 778 -137 L 697 -175 L 820 -48 Z;M 791 -188 L 675 -126 L 788 8 Z;M 778 -137 L 697 -175 L 820 -48 Z"></animate>
</path><path d="M 1041 -213 L 920 -184 L 1059 -46 Z" stroke="#62495b" fill="#62495b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1041 -213 L 920 -184 L 1059 -46 Z;M 1087 -201 L 884 -175 L 1025 -34 Z;M 1041 -213 L 920 -184 L 1059 -46 Z"></animate>
</path><path d="M 778 -137 L 473 -196 L 697 -175 Z" stroke="#665574" fill="#665574">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 778 -137 L 473 -196 L 697 -175 Z;M 791 -188 L 473 -174 L 675 -126 Z;M 778 -137 L 473 -196 L 697 -175 Z"></animate>
</path><path d="M 652 1011 L 691 1050 L 734 950 Z" stroke="#76526d" fill="#76526d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 652 1011 L 691 1050 L 734 950 Z;M 666 997 L 733 1077 L 697 929 Z;M 652 1011 L 691 1050 L 734 950 Z"></animate>
</path><path d="M 691 1050 L 895 1116 L 827 889 Z" stroke="#7a546f" fill="#7a546f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 691 1050 L 895 1116 L 827 889 Z;M 733 1077 L 902 1110 L 845 931 Z;M 691 1050 L 895 1116 L 827 889 Z"></animate>
</path><path d="M 1509 875 L 1476 681 L 1387 704 Z" stroke="#875b7e" fill="#875b7e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1509 875 L 1476 681 L 1387 704 Z;M 1542 839 L 1519 664 L 1371 745 Z;M 1509 875 L 1476 681 L 1387 704 Z"></animate>
</path><path d="M 1387 704 L 1476 681 L 1305 509 Z" stroke="#835878" fill="#835878">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1387 704 L 1476 681 L 1305 509 Z;M 1371 745 L 1519 664 L 1301 545 Z;M 1387 704 L 1476 681 L 1305 509 Z"></animate>
</path><path d="M 500 -23 L 375 4 L 396 178 Z" stroke="#66516c" fill="#66516c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 500 -23 L 375 4 L 396 178 Z;M 505 10 L 414 36 L 428 216 Z;M 500 -23 L 375 4 L 396 178 Z"></animate>
</path><path d="M 473 -196 L 375 4 L 500 -23 Z" stroke="#665878" fill="#665878">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 473 -196 L 375 4 L 500 -23 Z;M 473 -174 L 414 36 L 505 10 Z;M 473 -196 L 375 4 L 500 -23 Z"></animate>
</path><path d="M 1190 -250 L 1041 -213 L 1220 -58 Z" stroke="#644a5d" fill="#644a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1190 -250 L 1041 -213 L 1220 -58 Z;M 1191 -248 L 1087 -201 L 1217 -25 Z;M 1190 -250 L 1041 -213 L 1220 -58 Z"></animate>
</path><path d="M 1220 -58 L 1041 -213 L 1059 -46 Z" stroke="#664b5e" fill="#664b5e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1220 -58 L 1041 -213 L 1059 -46 Z;M 1217 -25 L 1087 -201 L 1025 -34 Z;M 1220 -58 L 1041 -213 L 1059 -46 Z"></animate>
</path><path d="M 895 1116 L 1014 1109 L 827 889 Z" stroke="#7d5572" fill="#7d5572">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 895 1116 L 1014 1109 L 827 889 Z;M 902 1110 L 1048 1113 L 845 931 Z;M 895 1116 L 1014 1109 L 827 889 Z"></animate>
</path><path d="M 1077 1001 L 1342 976 L 1168 879 Z" stroke="#845979" fill="#845979">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1077 1001 L 1342 976 L 1168 879 Z;M 1103 1035 L 1338 944 L 1163 894 Z;M 1077 1001 L 1342 976 L 1168 879 Z"></animate>
</path><path d="M 1601 332 L 1556 289 L 1488 357 Z" stroke="#7d5572" fill="#7d5572">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1601 332 L 1556 289 L 1488 357 Z;M 1588 354 L 1552 296 L 1452 352 Z;M 1601 332 L 1556 289 L 1488 357 Z"></animate>
</path><path d="M 1488 357 L 1556 289 L 1327 199 Z" stroke="#79546f" fill="#79546f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1488 357 L 1556 289 L 1327 199 Z;M 1452 352 L 1552 296 L 1344 197 Z;M 1488 357 L 1556 289 L 1327 199 Z"></animate>
</path><path d="M 1264 35 L 1396 -43 L 1220 -58 Z" stroke="#6c4e63" fill="#6c4e63">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1264 35 L 1396 -43 L 1220 -58 Z;M 1290 17 L 1386 13 L 1217 -25 Z;M 1264 35 L 1396 -43 L 1220 -58 Z"></animate>
</path><path d="M 1591 467 L 1488 357 L 1487 573 Z" stroke="#815776" fill="#815776">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1591 467 L 1488 357 L 1487 573 Z;M 1584 436 L 1452 352 L 1491 534 Z;M 1591 467 L 1488 357 L 1487 573 Z"></animate>
</path><path d="M 276 750 L 430 957 L 513 878 Z" stroke="#6d4e64" fill="#6d4e64">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 276 750 L 430 957 L 513 878 Z;M 261 768 L 447 911 L 511 878 Z;M 276 750 L 430 957 L 513 878 Z"></animate>
</path><path d="M 513 878 L 430 957 L 652 1011 Z" stroke="#715068" fill="#715068">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 513 878 L 430 957 L 652 1011 Z;M 511 878 L 447 911 L 666 997 Z;M 513 878 L 430 957 L 652 1011 Z"></animate>
</path><path d="M 652 1011 L 617 1105 L 691 1050 Z" stroke="#75526c" fill="#75526c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 652 1011 L 617 1105 L 691 1050 Z;M 666 997 L 615 1125 L 733 1077 Z;M 652 1011 L 617 1105 L 691 1050 Z"></animate>
</path><path d="M 1478 37 L 1264 35 L 1327 199 Z" stroke="#715068" fill="#715068">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1478 37 L 1264 35 L 1327 199 Z;M 1462 75 L 1290 17 L 1344 197 Z;M 1478 37 L 1264 35 L 1327 199 Z"></animate>
</path><path d="M 1584 578 L 1591 467 L 1487 573 Z" stroke="#845978" fill="#845978">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1584 578 L 1591 467 L 1487 573 Z;M 1582 586 L 1584 436 L 1491 534 Z;M 1584 578 L 1591 467 L 1487 573 Z"></animate>
</path><path d="M 1556 289 L 1478 37 L 1327 199 Z" stroke="#75526c" fill="#75526c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1556 289 L 1478 37 L 1327 199 Z;M 1552 296 L 1462 75 L 1344 197 Z;M 1556 289 L 1478 37 L 1327 199 Z"></animate>
</path><path d="M 212 98 L 242 261 L 374 249 Z" stroke="#66506b" fill="#66506b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 212 98 L 242 261 L 374 249 Z;M 197 96 L 190 283 L 362 270 Z;M 212 98 L 242 261 L 374 249 Z"></animate>
</path><path d="M 374 249 L 242 261 L 371 416 Z" stroke="#634a5d" fill="#634a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 374 249 L 242 261 L 371 416 Z;M 362 270 L 190 283 L 346 419 Z;M 374 249 L 242 261 L 371 416 Z"></animate>
</path><path d="M 174 720 L 276 750 L 330 678 Z" stroke="#674b5f" fill="#674b5f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 174 720 L 276 750 L 330 678 Z;M 169 708 L 261 768 L 324 674 Z;M 174 720 L 276 750 L 330 678 Z"></animate>
</path><path d="M 212 98 L 374 249 L 377 143 Z" stroke="#66506a" fill="#66506a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 212 98 L 374 249 L 377 143 Z;M 197 96 L 362 270 L 365 110 Z;M 212 98 L 374 249 L 377 143 Z"></animate>
</path><path d="M 1249 1111 L 1342 976 L 1077 1001 Z" stroke="#865a7a" fill="#865a7a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1249 1111 L 1342 976 L 1077 1001 Z;M 1192 1127 L 1338 944 L 1103 1035 Z;M 1249 1111 L 1342 976 L 1077 1001 Z"></animate>
</path><path d="M 174 720 L 330 678 L 337 502 Z" stroke="#664b5f" fill="#664b5f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 174 720 L 330 678 L 337 502 Z;M 169 708 L 324 674 L 301 498 Z;M 174 720 L 330 678 L 337 502 Z"></animate>
</path><path d="M 330 678 L 276 750 L 434 627 Z" stroke="#694c61" fill="#694c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 330 678 L 276 750 L 434 627 Z;M 324 674 L 261 768 L 406 638 Z;M 330 678 L 276 750 L 434 627 Z"></animate>
</path><path d="M 1634 838 L 1584 578 L 1476 681 Z" stroke="#865d83" fill="#865d83">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1634 838 L 1584 578 L 1476 681 Z;M 1631 849 L 1582 586 L 1519 664 Z;M 1634 838 L 1584 578 L 1476 681 Z"></animate>
</path><path d="M 1476 681 L 1584 578 L 1487 573 Z" stroke="#85597a" fill="#85597a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1476 681 L 1584 578 L 1487 573 Z;M 1519 664 L 1582 586 L 1491 534 Z;M 1476 681 L 1584 578 L 1487 573 Z"></animate>
</path><path d="M 1591 467 L 1601 332 L 1488 357 Z" stroke="#7f5674" fill="#7f5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1591 467 L 1601 332 L 1488 357 Z;M 1584 436 L 1588 354 L 1452 352 Z;M 1591 467 L 1601 332 L 1488 357 Z"></animate>
</path><path d="M 1556 289 L 1630 199 L 1478 37 Z" stroke="#77536d" fill="#77536d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1556 289 L 1630 199 L 1478 37 Z;M 1552 296 L 1652 201 L 1462 75 Z;M 1556 289 L 1630 199 L 1478 37 Z"></animate>
</path><path d="M 1630 199 L 1858 458 L 1719 213 Z" stroke="#7e5673" fill="#7e5673">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1630 199 L 1858 458 L 1719 213 Z;M 1652 201 L 1849 454 L 1731 184 Z;M 1630 199 L 1858 458 L 1719 213 Z"></animate>
</path><path d="M 242 261 L 194 369 L 371 416 Z" stroke="#634b5f" fill="#634b5f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 242 261 L 194 369 L 371 416 Z;M 190 283 L 177 373 L 346 419 Z;M 242 261 L 194 369 L 371 416 Z"></animate>
</path><path d="M 1367 -209 L 1190 -250 L 1220 -58 Z" stroke="#664b5e" fill="#664b5e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1367 -209 L 1190 -250 L 1220 -58 Z;M 1379 -211 L 1191 -248 L 1217 -25 Z;M 1367 -209 L 1190 -250 L 1220 -58 Z"></animate>
</path><path d="M 1041 -213 L 1190 -250 L 920 -184 Z" stroke="#634b5f" fill="#634b5f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1041 -213 L 1190 -250 L 920 -184 Z;M 1087 -201 L 1191 -248 L 884 -175 Z;M 1041 -213 L 1190 -250 L 920 -184 Z"></animate>
</path><path d="M 1367 -209 L 1220 -58 L 1396 -43 Z" stroke="#694c61" fill="#694c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1367 -209 L 1220 -58 L 1396 -43 Z;M 1379 -211 L 1217 -25 L 1386 13 Z;M 1367 -209 L 1220 -58 L 1396 -43 Z"></animate>
</path><path d="M 251 -268 L 473 -196 L 778 -137 Z" stroke="#635e83" fill="#635e83">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 251 -268 L 473 -196 L 778 -137 Z;M 242 -252 L 473 -174 L 791 -188 Z;M 251 -268 L 473 -196 L 778 -137 Z"></animate>
</path><path d="M 697 -175 L 473 -196 L 500 -23 Z" stroke="#665776" fill="#665776">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 697 -175 L 473 -196 L 500 -23 Z;M 675 -126 L 473 -174 L 505 10 Z;M 697 -175 L 473 -196 L 500 -23 Z"></animate>
</path><path d="M 375 4 L 212 98 L 377 143 Z" stroke="#665472" fill="#665472">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 375 4 L 212 98 L 377 143 Z;M 414 36 L 197 96 L 365 110 Z;M 375 4 L 212 98 L 377 143 Z"></animate>
</path><path d="M 251 -268 L 778 -137 L 920 -184 Z" stroke="#665777" fill="#665777">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 251 -268 L 778 -137 L 920 -184 Z;M 242 -252 L 791 -188 L 884 -175 Z;M 251 -268 L 778 -137 L 920 -184 Z"></animate>
</path><path d="M 465 1102 L 617 1105 L 652 1011 Z" stroke="#73516a" fill="#73516a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 465 1102 L 617 1105 L 652 1011 Z;M 409 1075 L 615 1125 L 666 997 Z;M 465 1102 L 617 1105 L 652 1011 Z"></animate>
</path><path d="M 691 1050 L 617 1105 L 895 1116 Z" stroke="#78536e" fill="#78536e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 691 1050 L 617 1105 L 895 1116 Z;M 733 1077 L 615 1125 L 902 1110 Z;M 691 1050 L 617 1105 L 895 1116 Z"></animate>
</path><path d="M 895 1116 L 1249 1111 L 1014 1109 Z" stroke="#815776" fill="#815776">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 895 1116 L 1249 1111 L 1014 1109 Z;M 902 1110 L 1192 1127 L 1048 1113 Z;M 895 1116 L 1249 1111 L 1014 1109 Z"></animate>
</path><path d="M 276 750 L 273 882 L 430 957 Z" stroke="#6b4d62" fill="#6b4d62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 276 750 L 273 882 L 430 957 Z;M 261 768 L 243 875 L 447 911 Z;M 276 750 L 273 882 L 430 957 Z"></animate>
</path><path d="M 148 496 L 174 720 L 337 502 Z" stroke="#644a5d" fill="#644a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 148 496 L 174 720 L 337 502 Z;M 90 487 L 169 708 L 301 498 Z;M 148 496 L 174 720 L 337 502 Z"></animate>
</path><path d="M 1452 957 L 1387 704 L 1330 797 Z" stroke="#875b7d" fill="#875b7d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1452 957 L 1387 704 L 1330 797 Z;M 1495 983 L 1371 745 L 1296 786 Z;M 1452 957 L 1387 704 L 1330 797 Z"></animate>
</path><path d="M 617 1105 L 1249 1111 L 895 1116 Z" stroke="#7e5673" fill="#7e5673">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 617 1105 L 1249 1111 L 895 1116 Z;M 615 1125 L 1192 1127 L 902 1110 Z;M 617 1105 L 1249 1111 L 895 1116 Z"></animate>
</path><path d="M 1014 1109 L 1249 1111 L 1077 1001 Z" stroke="#835878" fill="#835878">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1014 1109 L 1249 1111 L 1077 1001 Z;M 1048 1113 L 1192 1127 L 1103 1035 Z;M 1014 1109 L 1249 1111 L 1077 1001 Z"></animate>
</path><path d="M 1342 976 L 1452 957 L 1330 797 Z" stroke="#865d82" fill="#865d82">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1342 976 L 1452 957 L 1330 797 Z;M 1338 944 L 1495 983 L 1296 786 Z;M 1342 976 L 1452 957 L 1330 797 Z"></animate>
</path><path d="M 1630 199 L 1601 332 L 1858 458 Z" stroke="#7f5674" fill="#7f5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1630 199 L 1601 332 L 1858 458 Z;M 1652 201 L 1588 354 L 1849 454 Z;M 1630 199 L 1601 332 L 1858 458 Z"></animate>
</path><path d="M 1601 332 L 1630 199 L 1556 289 Z" stroke="#7b5571" fill="#7b5571">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1601 332 L 1630 199 L 1556 289 Z;M 1588 354 L 1652 201 L 1552 296 Z;M 1601 332 L 1630 199 L 1556 289 Z"></animate>
</path><path d="M 1697 97 L 1630 199 L 1719 213 Z" stroke="#79546f" fill="#79546f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1697 97 L 1630 199 L 1719 213 Z;M 1690 148 L 1652 201 L 1731 184 Z;M 1697 97 L 1630 199 L 1719 213 Z"></animate>
</path><path d="M 188 -26 L 212 98 L 375 4 Z" stroke="#655b7d" fill="#655b7d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 188 -26 L 212 98 L 375 4 Z;M 203 -7 L 197 96 L 414 36 Z;M 188 -26 L 212 98 L 375 4 Z"></animate>
</path><path d="M 242 261 L 16 209 L 194 369 Z" stroke="#66536f" fill="#66536f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 242 261 L 16 209 L 194 369 Z;M 190 283 L 52 252 L 177 373 Z;M 242 261 L 16 209 L 194 369 Z"></animate>
</path><path d="M -8 346 L 148 496 L 194 369 Z" stroke="#665069" fill="#665069">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -8 346 L 148 496 L 194 369 Z;M -19 361 L 90 487 L 177 373 Z;M -8 346 L 148 496 L 194 369 Z"></animate>
</path><path d="M 194 369 L 148 496 L 337 502 Z" stroke="#62495b" fill="#62495b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 194 369 L 148 496 L 337 502 Z;M 177 373 L 90 487 L 301 498 Z;M 194 369 L 148 496 L 337 502 Z"></animate>
</path><path d="M 1379 1159 L 1452 957 L 1342 976 Z" stroke="#846089" fill="#846089">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1379 1159 L 1452 957 L 1342 976 Z;M 1402 1193 L 1495 983 L 1338 944 Z;M 1379 1159 L 1452 957 L 1342 976 Z"></animate>
</path><path d="M 473 -196 L 323 -70 L 375 4 Z" stroke="#655b7e" fill="#655b7e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 473 -196 L 323 -70 L 375 4 Z;M 473 -174 L 295 -84 L 414 36 Z;M 473 -196 L 323 -70 L 375 4 Z"></animate>
</path><path d="M 197 854 L 276 750 L 174 720 Z" stroke="#674b5f" fill="#674b5f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 197 854 L 276 750 L 174 720 Z;M 177 809 L 261 768 L 169 708 Z;M 197 854 L 276 750 L 174 720 Z"></animate>
</path><path d="M 197 854 L 273 882 L 276 750 Z" stroke="#684c60" fill="#684c60">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 197 854 L 273 882 L 276 750 Z;M 177 809 L 243 875 L 261 768 Z;M 197 854 L 273 882 L 276 750 Z"></animate>
</path><path d="M 430 957 L 465 1102 L 652 1011 Z" stroke="#715068" fill="#715068">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 430 957 L 465 1102 L 652 1011 Z;M 447 911 L 409 1075 L 666 997 Z;M 430 957 L 465 1102 L 652 1011 Z"></animate>
</path><path d="M 295 1118 L 465 1102 L 430 957 Z" stroke="#6e4f65" fill="#6e4f65">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 295 1118 L 465 1102 L 430 957 Z;M 314 1077 L 409 1075 L 447 911 Z;M 295 1118 L 465 1102 L 430 957 Z"></animate>
</path><path d="M 1530 4 L 1396 -43 L 1478 37 Z" stroke="#6f4f66" fill="#6f4f66">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1530 4 L 1396 -43 L 1478 37 Z;M 1498 -2 L 1386 13 L 1462 75 Z;M 1530 4 L 1396 -43 L 1478 37 Z"></animate>
</path><path d="M 1530 4 L 1367 -209 L 1396 -43 Z" stroke="#6b4d63" fill="#6b4d63">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1530 4 L 1367 -209 L 1396 -43 Z;M 1498 -2 L 1379 -211 L 1386 13 Z;M 1530 4 L 1367 -209 L 1396 -43 Z"></animate>
</path><path d="M 1697 97 L 1530 4 L 1478 37 Z" stroke="#725169" fill="#725169">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1697 97 L 1530 4 L 1478 37 Z;M 1690 148 L 1498 -2 L 1462 75 Z;M 1697 97 L 1530 4 L 1478 37 Z"></animate>
</path><path d="M 31 837 L 197 854 L 174 720 Z" stroke="#654a5d" fill="#654a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 31 837 L 197 854 L 174 720 Z;M 63 850 L 177 809 L 169 708 Z;M 31 837 L 197 854 L 174 720 Z"></animate>
</path><path d="M 273 882 L 295 1118 L 430 957 Z" stroke="#6c4e63" fill="#6c4e63">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 273 882 L 295 1118 L 430 957 Z;M 243 875 L 314 1077 L 447 911 Z;M 273 882 L 295 1118 L 430 957 Z"></animate>
</path><path d="M 240 -174 L 188 -26 L 323 -70 Z" stroke="#616389" fill="#616389">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 240 -174 L 188 -26 L 323 -70 Z;M 218 -165 L 203 -7 L 295 -84 Z;M 240 -174 L 188 -26 L 323 -70 Z"></animate>
</path><path d="M 323 -70 L 188 -26 L 375 4 Z" stroke="#645c80" fill="#645c80">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 323 -70 L 188 -26 L 375 4 Z;M 295 -84 L 203 -7 L 414 36 Z;M 323 -70 L 188 -26 L 375 4 Z"></animate>
</path><path d="M 212 98 L 16 209 L 242 261 Z" stroke="#665777" fill="#665777">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 212 98 L 16 209 L 242 261 Z;M 197 96 L 52 252 L 190 283 Z;M 212 98 L 16 209 L 242 261 Z"></animate>
</path><path d="M 1601 332 L 1591 467 L 1858 458 Z" stroke="#825877" fill="#825877">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1601 332 L 1591 467 L 1858 458 Z;M 1588 354 L 1584 436 L 1849 454 Z;M 1601 332 L 1591 467 L 1858 458 Z"></animate>
</path><path d="M 1630 199 L 1697 97 L 1478 37 Z" stroke="#75526c" fill="#75526c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1630 199 L 1697 97 L 1478 37 Z;M 1652 201 L 1690 148 L 1462 75 Z;M 1630 199 L 1697 97 L 1478 37 Z"></animate>
</path><path d="M 1704 993 L 1634 838 L 1509 875 Z" stroke="#7c6898" fill="#7c6898">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1704 993 L 1634 838 L 1509 875 Z;M 1655 1012 L 1631 849 L 1542 839 Z;M 1704 993 L 1634 838 L 1509 875 Z"></animate>
</path><path d="M 1509 875 L 1634 838 L 1476 681 Z" stroke="#84608a" fill="#84608a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1509 875 L 1634 838 L 1476 681 Z;M 1542 839 L 1631 849 L 1519 664 Z;M 1509 875 L 1634 838 L 1476 681 Z"></animate>
</path><path d="M 1704 993 L 1509 875 L 1452 957 Z" stroke="#7e6695" fill="#7e6695">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1704 993 L 1509 875 L 1452 957 Z;M 1655 1012 L 1542 839 L 1495 983 Z;M 1704 993 L 1509 875 L 1452 957 Z"></animate>
</path><path d="M 133 1068 L 295 1118 L 273 882 Z" stroke="#694c61" fill="#694c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 133 1068 L 295 1118 L 273 882 Z;M 120 1045 L 314 1077 L 243 875 Z;M 133 1068 L 295 1118 L 273 882 Z"></animate>
</path><path d="M 465 1102 L 295 1118 L 617 1105 Z" stroke="#705067" fill="#705067">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 465 1102 L 295 1118 L 617 1105 Z;M 409 1075 L 314 1077 L 615 1125 Z;M 465 1102 L 295 1118 L 617 1105 Z"></animate>
</path><path d="M 1784 552 L 1591 467 L 1584 578 Z" stroke="#86597a" fill="#86597a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1784 552 L 1591 467 L 1584 578 Z;M 1789 554 L 1584 436 L 1582 586 Z;M 1784 552 L 1591 467 L 1584 578 Z"></animate>
</path><path d="M 1562 -289 L 1415 -257 L 1530 4 Z" stroke="#694c61" fill="#694c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1562 -289 L 1415 -257 L 1530 4 Z;M 1560 -241 L 1461 -256 L 1498 -2 Z;M 1562 -289 L 1415 -257 L 1530 4 Z"></animate>
</path><path d="M 1648 -82 L 1530 4 L 1697 97 Z" stroke="#725068" fill="#725068">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1648 -82 L 1530 4 L 1697 97 Z;M 1623 -87 L 1498 -2 L 1690 148 Z;M 1648 -82 L 1530 4 L 1697 97 Z"></animate>
</path><path d="M 1530 4 L 1415 -257 L 1367 -209 Z" stroke="#694c61" fill="#694c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1530 4 L 1415 -257 L 1367 -209 Z;M 1498 -2 L 1461 -256 L 1379 -211 Z;M 1530 4 L 1415 -257 L 1367 -209 Z"></animate>
</path><path d="M 1367 -209 L 1415 -257 L 1190 -250 Z" stroke="#644a5d" fill="#644a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1367 -209 L 1415 -257 L 1190 -250 Z;M 1379 -211 L 1461 -256 L 1191 -248 Z;M 1367 -209 L 1415 -257 L 1190 -250 Z"></animate>
</path><path d="M 1190 -250 L 251 -268 L 920 -184 Z" stroke="#665572" fill="#665572">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1190 -250 L 251 -268 L 920 -184 Z;M 1191 -248 L 242 -252 L 884 -175 Z;M 1190 -250 L 251 -268 L 920 -184 Z"></animate>
</path><path d="M 1784 627 L 1784 552 L 1584 578 Z" stroke="#865d82" fill="#865d82">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1784 627 L 1784 552 L 1584 578 Z;M 1763 672 L 1789 554 L 1582 586 Z;M 1784 627 L 1784 552 L 1584 578 Z"></animate>
</path><path d="M 42 97 L 16 209 L 212 98 Z" stroke="#645d82" fill="#645d82">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 42 97 L 16 209 L 212 98 Z;M 54 132 L 52 252 L 197 96 Z;M 42 97 L 16 209 L 212 98 Z"></animate>
</path><path d="M 148 496 L -41 658 L 174 720 Z" stroke="#634a5d" fill="#634a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 148 496 L -41 658 L 174 720 Z;M 90 487 L -19 643 L 169 708 Z;M 148 496 L -41 658 L 174 720 Z"></animate>
</path><path d="M -8 346 L -3 493 L 148 496 Z" stroke="#66526d" fill="#66526d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -8 346 L -3 493 L 148 496 Z;M -19 361 L -14 467 L 90 487 Z;M -8 346 L -3 493 L 148 496 Z"></animate>
</path><path d="M 197 854 L 121 904 L 273 882 Z" stroke="#674b5f" fill="#674b5f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 197 854 L 121 904 L 273 882 Z;M 177 809 L 116 917 L 243 875 Z;M 197 854 L 121 904 L 273 882 Z"></animate>
</path><path d="M 1762 80 L 1648 -82 L 1697 97 Z" stroke="#73516a" fill="#73516a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1762 80 L 1648 -82 L 1697 97 Z;M 1771 31 L 1623 -87 L 1690 148 Z;M 1762 80 L 1648 -82 L 1697 97 Z"></animate>
</path><path d="M 251 -268 L 240 -174 L 323 -70 Z" stroke="#5d6890" fill="#5d6890">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 251 -268 L 240 -174 L 323 -70 Z;M 242 -252 L 218 -165 L 295 -84 Z;M 251 -268 L 240 -174 L 323 -70 Z"></animate>
</path><path d="M 188 -26 L 42 97 L 212 98 Z" stroke="#635f84" fill="#635f84">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 188 -26 L 42 97 L 212 98 Z;M 203 -7 L 54 132 L 197 96 Z;M 188 -26 L 42 97 L 212 98 Z"></animate>
</path><path d="M 251 -268 L 323 -70 L 473 -196 Z" stroke="#60648b" fill="#60648b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 251 -268 L 323 -70 L 473 -196 Z;M 242 -252 L 295 -84 L 473 -174 Z;M 251 -268 L 323 -70 L 473 -196 Z"></animate>
</path><path d="M 617 1105 L 1379 1159 L 1249 1111 Z" stroke="#825877" fill="#825877">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 617 1105 L 1379 1159 L 1249 1111 Z;M 615 1125 L 1402 1193 L 1192 1127 Z;M 617 1105 L 1379 1159 L 1249 1111 Z"></animate>
</path><path d="M 1249 1111 L 1379 1159 L 1342 976 Z" stroke="#855d84" fill="#855d84">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1249 1111 L 1379 1159 L 1342 976 Z;M 1192 1127 L 1402 1193 L 1338 944 Z;M 1249 1111 L 1379 1159 L 1342 976 Z"></animate>
</path><path d="M 16 209 L -8 346 L 194 369 Z" stroke="#665675" fill="#665675">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 16 209 L -8 346 L 194 369 Z;M 52 252 L -19 361 L 177 373 Z;M 16 209 L -8 346 L 194 369 Z"></animate>
</path><path d="M 1634 838 L 1784 627 L 1584 578 Z" stroke="#846089" fill="#846089">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1634 838 L 1784 627 L 1584 578 Z;M 1631 849 L 1763 672 L 1582 586 Z;M 1634 838 L 1784 627 L 1584 578 Z"></animate>
</path><path d="M 31 837 L 121 904 L 197 854 Z" stroke="#654a5d" fill="#654a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 31 837 L 121 904 L 197 854 Z;M 63 850 L 116 917 L 177 809 Z;M 31 837 L 121 904 L 197 854 Z"></animate>
</path><path d="M 10 -83 L 42 97 L 188 -26 Z" stroke="#5e678e" fill="#5e678e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 10 -83 L 42 97 L 188 -26 Z;M -7 -96 L 54 132 L 203 -7 Z;M 10 -83 L 42 97 L 188 -26 Z"></animate>
</path><path d="M 16 209 L -98 265 L -8 346 Z" stroke="#645d81" fill="#645d81">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 16 209 L -98 265 L -8 346 Z;M 52 252 L -76 259 L -19 361 Z;M 16 209 L -98 265 L -8 346 Z"></animate>
</path><path d="M -171 502 L -41 658 L -3 493 Z" stroke="#665472" fill="#665472">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -171 502 L -41 658 L -3 493 Z;M -124 462 L -19 643 L -14 467 Z;M -171 502 L -41 658 L -3 493 Z"></animate>
</path><path d="M -3 493 L -41 658 L 148 496 Z" stroke="#654f67" fill="#654f67">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -3 493 L -41 658 L 148 496 Z;M -14 467 L -19 643 L 90 487 Z;M -3 493 L -41 658 L 148 496 Z"></animate>
</path><path d="M 1918 480 L 1858 458 L 1784 552 Z" stroke="#875b7f" fill="#875b7f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1918 480 L 1858 458 L 1784 552 Z;M 1926 491 L 1849 454 L 1789 554 Z;M 1918 480 L 1858 458 L 1784 552 Z"></animate>
</path><path d="M 1784 552 L 1858 458 L 1591 467 Z" stroke="#865a7a" fill="#865a7a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1784 552 L 1858 458 L 1591 467 Z;M 1789 554 L 1849 454 L 1584 436 Z;M 1784 552 L 1858 458 L 1591 467 Z"></animate>
</path><path d="M -41 658 L 31 837 L 174 720 Z" stroke="#62495c" fill="#62495c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -41 658 L 31 837 L 174 720 Z;M -19 643 L 63 850 L 169 708 Z;M -41 658 L 31 837 L 174 720 Z"></animate>
</path><path d="M 121 904 L 133 1068 L 273 882 Z" stroke="#674b5f" fill="#674b5f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 121 904 L 133 1068 L 273 882 Z;M 116 917 L 120 1045 L 243 875 Z;M 121 904 L 133 1068 L 273 882 Z"></animate>
</path><path d="M 1813 -39 L 1762 80 L 1862 13 Z" stroke="#74516b" fill="#74516b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1813 -39 L 1762 80 L 1862 13 Z;M 1828 -2 L 1771 31 L 1844 39 Z;M 1813 -39 L 1762 80 L 1862 13 Z"></animate>
</path><path d="M 1719 213 L 1762 80 L 1697 97 Z" stroke="#78536e" fill="#78536e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1719 213 L 1762 80 L 1697 97 Z;M 1731 184 L 1771 31 L 1690 148 Z;M 1719 213 L 1762 80 L 1697 97 Z"></animate>
</path><path d="M 1415 -257 L 251 -268 L 1190 -250 Z" stroke="#66516b" fill="#66516b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1415 -257 L 251 -268 L 1190 -250 Z;M 1461 -256 L 242 -252 L 1191 -248 Z;M 1415 -257 L 251 -268 L 1190 -250 Z"></animate>
</path><path d="M 240 -174 L 10 -83 L 188 -26 Z" stroke="#5c6991" fill="#5c6991">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 240 -174 L 10 -83 L 188 -26 Z;M 218 -165 L -7 -96 L 203 -7 Z;M 240 -174 L 10 -83 L 188 -26 Z"></animate>
</path><path d="M 1379 1159 L 1534 1165 L 1452 957 Z" stroke="#806492" fill="#806492">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1379 1159 L 1534 1165 L 1452 957 Z;M 1402 1193 L 1554 1174 L 1495 983 Z;M 1379 1159 L 1534 1165 L 1452 957 Z"></animate>
</path><path d="M 1634 838 L 1806 800 L 1784 627 Z" stroke="#7d6796" fill="#7d6796">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1634 838 L 1806 800 L 1784 627 Z;M 1631 849 L 1804 852 L 1763 672 Z;M 1634 838 L 1806 800 L 1784 627 Z"></animate>
</path><path d="M 1612 1074 L 1704 993 L 1452 957 Z" stroke="#796a9c" fill="#796a9c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1612 1074 L 1704 993 L 1452 957 Z;M 1599 1112 L 1655 1012 L 1495 983 Z;M 1612 1074 L 1704 993 L 1452 957 Z"></animate>
</path><path d="M 1927 630 L 1918 480 L 1784 552 Z" stroke="#845f88" fill="#845f88">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1927 630 L 1918 480 L 1784 552 Z;M 1887 662 L 1926 491 L 1789 554 Z;M 1927 630 L 1918 480 L 1784 552 Z"></animate>
</path><path d="M 1648 -82 L 1562 -289 L 1530 4 Z" stroke="#6c4e64" fill="#6c4e64">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1648 -82 L 1562 -289 L 1530 4 Z;M 1623 -87 L 1560 -241 L 1498 -2 Z;M 1648 -82 L 1562 -289 L 1530 4 Z"></animate>
</path><path d="M 1748 -269 L 1562 -289 L 1648 -82 Z" stroke="#694c61" fill="#694c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1748 -269 L 1562 -289 L 1648 -82 Z;M 1711 -218 L 1560 -241 L 1623 -87 Z;M 1748 -269 L 1562 -289 L 1648 -82 Z"></animate>
</path><path d="M -29 911 L 133 1068 L 121 904 Z" stroke="#644a5d" fill="#644a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -29 911 L 133 1068 L 121 904 Z;M -18 950 L 120 1045 L 116 917 Z;M -29 911 L 133 1068 L 121 904 Z"></animate>
</path><path d="M 1704 993 L 1806 800 L 1634 838 Z" stroke="#776c9f" fill="#776c9f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1704 993 L 1806 800 L 1634 838 Z;M 1655 1012 L 1804 852 L 1631 849 Z;M 1704 993 L 1806 800 L 1634 838 Z"></animate>
</path><path d="M 1534 1165 L 1612 1074 L 1452 957 Z" stroke="#7c6898" fill="#7c6898">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1534 1165 L 1612 1074 L 1452 957 Z;M 1554 1174 L 1599 1112 L 1495 983 Z;M 1534 1165 L 1612 1074 L 1452 957 Z"></animate>
</path><path d="M 1926 812 L 1784 627 L 1806 800 Z" stroke="#796b9c" fill="#796b9c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1926 812 L 1784 627 L 1806 800 Z;M 1890 767 L 1763 672 L 1804 852 Z;M 1926 812 L 1784 627 L 1806 800 Z"></animate>
</path><path d="M -54 -133 L 10 -83 L -45 -295 Z" stroke="#4979a1" fill="#4979a1">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -54 -133 L 10 -83 L -45 -295 Z;M -72 -167 L -7 -96 L -67 -263 Z;M -54 -133 L 10 -83 L -45 -295 Z"></animate>
</path><path d="M -104 61 L -98 265 L 16 209 Z" stroke="#60648b" fill="#60648b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -104 61 L -98 265 L 16 209 Z;M -134 62 L -76 259 L 52 252 Z;M -104 61 L -98 265 L 16 209 Z"></animate>
</path><path d="M -104 61 L 16 209 L 42 97 Z" stroke="#60648b" fill="#60648b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -104 61 L 16 209 L 42 97 Z;M -134 62 L 52 252 L 54 132 Z;M -104 61 L 16 209 L 42 97 Z"></animate>
</path><path d="M -8 346 L -171 502 L -3 493 Z" stroke="#665777" fill="#665777">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -8 346 L -171 502 L -3 493 Z;M -19 361 L -124 462 L -14 467 Z;M -8 346 L -171 502 L -3 493 Z"></animate>
</path><path d="M -138 818 L -29 911 L 31 837 Z" stroke="#644c62" fill="#644c62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -138 818 L -29 911 L 31 837 Z;M -178 785 L -18 950 L 63 850 Z;M -138 818 L -29 911 L 31 837 Z"></animate>
</path><path d="M 31 837 L -29 911 L 121 904 Z" stroke="#63495c" fill="#63495c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 31 837 L -29 911 L 121 904 Z;M 63 850 L -18 950 L 116 917 Z;M 31 837 L -29 911 L 121 904 Z"></animate>
</path><path d="M -138 818 L 31 837 L -41 658 Z" stroke="#654e65" fill="#654e65">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -138 818 L 31 837 L -41 658 Z;M -178 785 L 63 850 L -19 643 Z;M -138 818 L 31 837 L -41 658 Z"></animate>
</path><path d="M 1927 630 L 1784 552 L 1784 627 Z" stroke="#83618c" fill="#83618c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1927 630 L 1784 552 L 1784 627 Z;M 1887 662 L 1789 554 L 1763 672 Z;M 1927 630 L 1784 552 L 1784 627 Z"></animate>
</path><path d="M 1862 13 L 1762 80 L 1719 213 Z" stroke="#77536d" fill="#77536d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1862 13 L 1762 80 L 1719 213 Z;M 1844 39 L 1771 31 L 1731 184 Z;M 1862 13 L 1762 80 L 1719 213 Z"></animate>
</path><path d="M 1959 275 L 1719 213 L 1858 458 Z" stroke="#815776" fill="#815776">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1959 275 L 1719 213 L 1858 458 Z;M 1938 254 L 1731 184 L 1849 454 Z;M 1959 275 L 1719 213 L 1858 458 Z"></animate>
</path><path d="M 1762 80 L 1813 -39 L 1648 -82 Z" stroke="#725069" fill="#725069">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1762 80 L 1813 -39 L 1648 -82 Z;M 1771 31 L 1828 -2 L 1623 -87 Z;M 1762 80 L 1813 -39 L 1648 -82 Z"></animate>
</path><path d="M -126 315 L -171 502 L -8 346 Z" stroke="#645c7f" fill="#645c7f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -126 315 L -171 502 L -8 346 Z;M -130 330 L -124 462 L -19 361 Z;M -126 315 L -171 502 L -8 346 Z"></animate>
</path><path d="M 1926 812 L 1806 800 L 1882 934 Z" stroke="#6d73a7" fill="#6d73a7">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1926 812 L 1806 800 L 1882 934 Z;M 1890 767 L 1804 852 L 1909 908 Z;M 1926 812 L 1806 800 L 1882 934 Z"></animate>
</path><path d="M 1926 812 L 1927 630 L 1784 627 Z" stroke="#7b6999" fill="#7b6999">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1926 812 L 1927 630 L 1784 627 Z;M 1890 767 L 1887 662 L 1763 672 Z;M 1926 812 L 1927 630 L 1784 627 Z"></animate>
</path><path d="M -297 153 L -126 315 L -98 265 Z" stroke="#5d6790" fill="#5d6790">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -297 153 L -126 315 L -98 265 Z;M -284 166 L -130 330 L -76 259 Z;M -297 153 L -126 315 L -98 265 Z"></animate>
</path><path d="M -98 265 L -126 315 L -8 346 Z" stroke="#635e83" fill="#635e83">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -98 265 L -126 315 L -8 346 Z;M -76 259 L -130 330 L -19 361 Z;M -98 265 L -126 315 L -8 346 Z"></animate>
</path><path d="M 2070 375 L 1979 418 L 2123 523 Z" stroke="#865c80" fill="#865c80">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2070 375 L 1979 418 L 2123 523 Z;M 2046 404 L 1983 422 L 2064 562 Z;M 2070 375 L 1979 418 L 2123 523 Z"></animate>
</path><path d="M 1918 480 L 1979 418 L 1858 458 Z" stroke="#875a7c" fill="#875a7c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1918 480 L 1979 418 L 1858 458 Z;M 1926 491 L 1983 422 L 1849 454 Z;M 1918 480 L 1979 418 L 1858 458 Z"></animate>
</path><path d="M -69 -27 L -104 61 L 42 97 Z" stroke="#5a6b94" fill="#5a6b94">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -69 -27 L -104 61 L 42 97 Z;M -39 -27 L -134 62 L 54 132 Z;M -69 -27 L -104 61 L 42 97 Z"></animate>
</path><path d="M 1959 275 L 1862 13 L 1719 213 Z" stroke="#7b5470" fill="#7b5470">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1959 275 L 1862 13 L 1719 213 Z;M 1938 254 L 1844 39 L 1731 184 Z;M 1959 275 L 1862 13 L 1719 213 Z"></animate>
</path><path d="M 1813 -39 L 1748 -269 L 1648 -82 Z" stroke="#6d4e65" fill="#6d4e65">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1813 -39 L 1748 -269 L 1648 -82 Z;M 1828 -2 L 1711 -218 L 1623 -87 Z;M 1813 -39 L 1748 -269 L 1648 -82 Z"></animate>
</path><path d="M -54 -133 L -69 -27 L 10 -83 Z" stroke="#51739c" fill="#51739c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -54 -133 L -69 -27 L 10 -83 Z;M -72 -167 L -39 -27 L -7 -96 Z;M -54 -133 L -69 -27 L 10 -83 Z"></animate>
</path><path d="M 10 -83 L -69 -27 L 42 97 Z" stroke="#596c95" fill="#596c95">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 10 -83 L -69 -27 L 42 97 Z;M -7 -96 L -39 -27 L 54 132 Z;M 10 -83 L -69 -27 L 42 97 Z"></animate>
</path><path d="M -302 511 L -152 625 L -171 502 Z" stroke="#645d80" fill="#645d80">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -302 511 L -152 625 L -171 502 Z;M -309 500 L -146 664 L -124 462 Z;M -302 511 L -152 625 L -171 502 Z"></animate>
</path><path d="M -171 502 L -152 625 L -41 658 Z" stroke="#665675" fill="#665675">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -171 502 L -152 625 L -41 658 Z;M -124 462 L -146 664 L -19 643 Z;M -171 502 L -152 625 L -41 658 Z"></animate>
</path><path d="M 1979 418 L 1959 275 L 1858 458 Z" stroke="#855979" fill="#855979">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1979 418 L 1959 275 L 1858 458 Z;M 1983 422 L 1938 254 L 1849 454 Z;M 1979 418 L 1959 275 L 1858 458 Z"></animate>
</path><path d="M 1806 1036 L 1806 800 L 1704 993 Z" stroke="#6e73a6" fill="#6e73a6">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1806 1036 L 1806 800 L 1704 993 Z;M 1817 1016 L 1804 852 L 1655 1012 Z;M 1806 1036 L 1806 800 L 1704 993 Z"></animate>
</path><path d="M 2123 523 L 1979 418 L 1918 480 Z" stroke="#865d83" fill="#865d83">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2123 523 L 1979 418 L 1918 480 Z;M 2064 562 L 1983 422 L 1926 491 Z;M 2123 523 L 1979 418 L 1918 480 Z"></animate>
</path><path d="M 1534 1165 L 1787 1107 L 1612 1074 Z" stroke="#7270a3" fill="#7270a3">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1534 1165 L 1787 1107 L 1612 1074 Z;M 1554 1174 L 1771 1116 L 1599 1112 Z;M 1534 1165 L 1787 1107 L 1612 1074 Z"></animate>
</path><path d="M 1612 1074 L 1787 1107 L 1704 993 Z" stroke="#6e72a6" fill="#6e72a6">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1612 1074 L 1787 1107 L 1704 993 Z;M 1599 1112 L 1771 1116 L 1655 1012 Z;M 1612 1074 L 1787 1107 L 1704 993 Z"></animate>
</path><path d="M -30 1005 L 133 1068 L -29 911 Z" stroke="#634a5c" fill="#634a5c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -30 1005 L 133 1068 L -29 911 Z;M -73 1035 L 120 1045 L -18 950 Z;M -30 1005 L 133 1068 L -29 911 Z"></animate>
</path><path d="M -30 1005 L 92 1160 L 133 1068 Z" stroke="#654a5d" fill="#654a5d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -30 1005 L 92 1160 L 133 1068 Z;M -73 1035 L 77 1166 L 120 1045 Z;M -30 1005 L 92 1160 L 133 1068 Z"></animate>
</path><path d="M 133 1068 L 92 1160 L 295 1118 Z" stroke="#684c60" fill="#684c60">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 133 1068 L 92 1160 L 295 1118 Z;M 120 1045 L 77 1166 L 314 1077 Z;M 133 1068 L 92 1160 L 295 1118 Z"></animate>
</path><path d="M 295 1118 L 92 1160 L 617 1105 Z" stroke="#6c4e64" fill="#6c4e64">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 295 1118 L 92 1160 L 617 1105 Z;M 314 1077 L 77 1166 L 615 1125 Z;M 295 1118 L 92 1160 L 617 1105 Z"></animate>
</path><path d="M 617 1105 L 92 1160 L 1379 1159 Z" stroke="#77536d" fill="#77536d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 617 1105 L 92 1160 L 1379 1159 Z;M 615 1125 L 77 1166 L 1402 1193 Z;M 617 1105 L 92 1160 L 1379 1159 Z"></animate>
</path><path d="M 1961 -193 L 1748 -269 L 1813 -39 Z" stroke="#6d4e64" fill="#6d4e64">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1961 -193 L 1748 -269 L 1813 -39 Z;M 1935 -189 L 1711 -218 L 1828 -2 Z;M 1961 -193 L 1748 -269 L 1813 -39 Z"></animate>
</path><path d="M -152 625 L -138 818 L -41 658 Z" stroke="#66526e" fill="#66526e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -152 625 L -138 818 L -41 658 Z;M -146 664 L -178 785 L -19 643 Z;M -152 625 L -138 818 L -41 658 Z"></animate>
</path><path d="M 1787 1107 L 1806 1036 L 1704 993 Z" stroke="#6876aa" fill="#6876aa">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1787 1107 L 1806 1036 L 1704 993 Z;M 1771 1116 L 1817 1016 L 1655 1012 Z;M 1787 1107 L 1806 1036 L 1704 993 Z"></animate>
</path><path d="M 1806 1036 L 1882 934 L 1806 800 Z" stroke="#6a75a9" fill="#6a75a9">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1806 1036 L 1882 934 L 1806 800 Z;M 1817 1016 L 1909 908 L 1804 852 Z;M 1806 1036 L 1882 934 L 1806 800 Z"></animate>
</path><path d="M 2123 523 L 1918 480 L 1927 630 Z" stroke="#82628d" fill="#82628d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2123 523 L 1918 480 L 1927 630 Z;M 2064 562 L 1926 491 L 1887 662 Z;M 2123 523 L 1918 480 L 1927 630 Z"></animate>
</path><path d="M -138 818 L -30 1005 L -29 911 Z" stroke="#644c62" fill="#644c62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -138 818 L -30 1005 L -29 911 Z;M -178 785 L -73 1035 L -18 950 Z;M -138 818 L -30 1005 L -29 911 Z"></animate>
</path><path d="M -370 273 L -257 432 L -126 315 Z" stroke="#5d6890" fill="#5d6890">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -370 273 L -257 432 L -126 315 Z;M -351 277 L -203 385 L -130 330 Z;M -370 273 L -257 432 L -126 315 Z"></animate>
</path><path d="M -126 315 L -257 432 L -171 502 Z" stroke="#626085" fill="#626085">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -126 315 L -257 432 L -171 502 Z;M -130 330 L -203 385 L -124 462 Z;M -126 315 L -257 432 L -171 502 Z"></animate>
</path><path d="M -152 625 L -208 712 L -138 818 Z" stroke="#665573" fill="#665573">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -152 625 L -208 712 L -138 818 Z;M -146 664 L -213 701 L -178 785 Z;M -152 625 L -208 712 L -138 818 Z"></animate>
</path><path d="M -45 -295 L 10 -83 L 240 -174 Z" stroke="#4f749d" fill="#4f749d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -45 -295 L 10 -83 L 240 -174 Z;M -67 -263 L -7 -96 L 218 -165 Z;M -45 -295 L 10 -83 L 240 -174 Z"></animate>
</path><path d="M -69 -27 L -227 126 L -104 61 Z" stroke="#547099" fill="#547099">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -69 -27 L -227 126 L -104 61 Z;M -39 -27 L -216 123 L -134 62 Z;M -69 -27 L -227 126 L -104 61 Z"></animate>
</path><path d="M -104 61 L -227 126 L -98 265 Z" stroke="#5a6b93" fill="#5a6b93">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -104 61 L -227 126 L -98 265 Z;M -134 62 L -216 123 L -76 259 Z;M -104 61 L -227 126 L -98 265 Z"></animate>
</path><path d="M -302 511 L -208 712 L -152 625 Z" stroke="#655b7e" fill="#655b7e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -302 511 L -208 712 L -152 625 Z;M -309 500 L -213 701 L -146 664 Z;M -302 511 L -208 712 L -152 625 Z"></animate>
</path><path d="M -138 818 L -270 974 L -30 1005 Z" stroke="#66506a" fill="#66506a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -138 818 L -270 974 L -30 1005 Z;M -178 785 L -297 940 L -73 1035 Z;M -138 818 L -270 974 L -30 1005 Z"></animate>
</path><path d="M 2065 71 L 1929 -40 L 1862 13 Z" stroke="#75526c" fill="#75526c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2065 71 L 1929 -40 L 1862 13 Z;M 2107 124 L 1941 -69 L 1844 39 Z;M 2065 71 L 1929 -40 L 1862 13 Z"></animate>
</path><path d="M 1862 13 L 1929 -40 L 1813 -39 Z" stroke="#73516a" fill="#73516a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1862 13 L 1929 -40 L 1813 -39 Z;M 1844 39 L 1941 -69 L 1828 -2 Z;M 1862 13 L 1929 -40 L 1813 -39 Z"></animate>
</path><path d="M 2065 71 L 1862 13 L 1959 275 Z" stroke="#7a5470" fill="#7a5470">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2065 71 L 1862 13 L 1959 275 Z;M 2107 124 L 1844 39 L 1938 254 Z;M 2065 71 L 1862 13 L 1959 275 Z"></animate>
</path><path d="M -307 -117 L -227 126 L -69 -27 Z" stroke="#4a78a0" fill="#4a78a0">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -307 -117 L -227 126 L -69 -27 Z;M -295 -110 L -216 123 L -39 -27 Z;M -307 -117 L -227 126 L -69 -27 Z"></animate>
</path><path d="M -257 432 L -302 511 L -171 502 Z" stroke="#626187" fill="#626187">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -257 432 L -302 511 L -171 502 Z;M -203 385 L -309 500 L -124 462 Z;M -257 432 L -302 511 L -171 502 Z"></animate>
</path><path d="M 251 -268 L -45 -295 L 240 -174 Z" stroke="#4f749d" fill="#4f749d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 251 -268 L -45 -295 L 240 -174 Z;M 242 -252 L -67 -263 L 218 -165 Z;M 251 -268 L -45 -295 L 240 -174 Z"></animate>
</path><path d="M -54 -133 L -262 -170 L -69 -27 Z" stroke="#467ba2" fill="#467ba2">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -54 -133 L -262 -170 L -69 -27 Z;M -72 -167 L -258 -220 L -39 -27 Z;M -54 -133 L -262 -170 L -69 -27 Z"></animate>
</path><path d="M 1415 -257 L -45 -295 L 251 -268 Z" stroke="#616288" fill="#616288">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1415 -257 L -45 -295 L 251 -268 Z;M 1461 -256 L -67 -263 L 242 -252 Z;M 1415 -257 L -45 -295 L 251 -268 Z"></animate>
</path><path d="M -370 273 L -302 511 L -257 432 Z" stroke="#5c6991" fill="#5c6991">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -370 273 L -302 511 L -257 432 Z;M -351 277 L -309 500 L -203 385 Z;M -370 273 L -302 511 L -257 432 Z"></animate>
</path><path d="M 2099 694 L 1927 630 L 2062 800 Z" stroke="#736fa3" fill="#736fa3">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2099 694 L 1927 630 L 2062 800 Z;M 2068 685 L 1887 662 L 2040 780 Z;M 2099 694 L 1927 630 L 2062 800 Z"></animate>
</path><path d="M 1979 418 L 2070 375 L 1959 275 Z" stroke="#845979" fill="#845979">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1979 418 L 2070 375 L 1959 275 Z;M 1983 422 L 2046 404 L 1938 254 Z;M 1979 418 L 2070 375 L 1959 275 Z"></animate>
</path><path d="M 2062 800 L 1927 630 L 1926 812 Z" stroke="#7170a4" fill="#7170a4">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2062 800 L 1927 630 L 1926 812 Z;M 2040 780 L 1887 662 L 1890 767 Z;M 2062 800 L 1927 630 L 1926 812 Z"></animate>
</path><path d="M 2070 375 L 2044 211 L 1959 275 Z" stroke="#825876" fill="#825876">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2070 375 L 2044 211 L 1959 275 Z;M 2046 404 L 2087 229 L 1938 254 Z;M 2070 375 L 2044 211 L 1959 275 Z"></animate>
</path><path d="M 1979 1056 L 2002 911 L 1882 934 Z" stroke="#587eb0" fill="#587eb0">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1979 1056 L 2002 911 L 1882 934 Z;M 2024 1041 L 2039 926 L 1909 908 Z;M 1979 1056 L 2002 911 L 1882 934 Z"></animate>
</path><path d="M 1882 934 L 2002 911 L 1926 812 Z" stroke="#6478ac" fill="#6478ac">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1882 934 L 2002 911 L 1926 812 Z;M 1909 908 L 2039 926 L 1890 767 Z;M 1882 934 L 2002 911 L 1926 812 Z"></animate>
</path><path d="M 1913 1102 L 1882 934 L 1806 1036 Z" stroke="#5e7baf" fill="#5e7baf">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1913 1102 L 1882 934 L 1806 1036 Z;M 1915 1117 L 1909 908 L 1817 1016 Z;M 1913 1102 L 1882 934 L 1806 1036 Z"></animate>
</path><path d="M 2099 694 L 2123 523 L 1927 630 Z" stroke="#7b6999" fill="#7b6999">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2099 694 L 2123 523 L 1927 630 Z;M 2068 685 L 2064 562 L 1887 662 Z;M 2099 694 L 2123 523 L 1927 630 Z"></animate>
</path><path d="M 2274 296 L 2065 71 L 2044 211 Z" stroke="#7e5674" fill="#7e5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2274 296 L 2065 71 L 2044 211 Z;M 2268 255 L 2107 124 L 2087 229 Z;M 2274 296 L 2065 71 L 2044 211 Z"></animate>
</path><path d="M 2002 911 L 2062 800 L 1926 812 Z" stroke="#6478ac" fill="#6478ac">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2002 911 L 2062 800 L 1926 812 Z;M 2039 926 L 2040 780 L 1890 767 Z;M 2002 911 L 2062 800 L 1926 812 Z"></animate>
</path><path d="M 2099 694 L 2163 634 L 2123 523 Z" stroke="#796b9c" fill="#796b9c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2099 694 L 2163 634 L 2123 523 Z;M 2068 685 L 2136 600 L 2064 562 Z;M 2099 694 L 2163 634 L 2123 523 Z"></animate>
</path><path d="M -390 829 L -271 803 L -208 712 Z" stroke="#655b7e" fill="#655b7e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -390 829 L -271 803 L -208 712 Z;M -421 846 L -258 797 L -213 701 Z;M -390 829 L -271 803 L -208 712 Z"></animate>
</path><path d="M -208 712 L -271 803 L -138 818 Z" stroke="#665675" fill="#665675">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -208 712 L -271 803 L -138 818 Z;M -213 701 L -258 797 L -178 785 Z;M -208 712 L -271 803 L -138 818 Z"></animate>
</path><path d="M -30 1005 L -122 1047 L 92 1160 Z" stroke="#62495b" fill="#62495b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -30 1005 L -122 1047 L 92 1160 Z;M -73 1035 L -149 1055 L 77 1166 Z;M -30 1005 L -122 1047 L 92 1160 Z"></animate>
</path><path d="M 1787 1107 L 1913 1102 L 1806 1036 Z" stroke="#5e7baf" fill="#5e7baf">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1787 1107 L 1913 1102 L 1806 1036 Z;M 1771 1116 L 1915 1117 L 1817 1016 Z;M 1787 1107 L 1913 1102 L 1806 1036 Z"></animate>
</path><path d="M 1534 1165 L 1913 1102 L 1787 1107 Z" stroke="#6776aa" fill="#6776aa">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1534 1165 L 1913 1102 L 1787 1107 Z;M 1554 1174 L 1915 1117 L 1771 1116 Z;M 1534 1165 L 1913 1102 L 1787 1107 Z"></animate>
</path><path d="M 2361 1113 L 1913 1102 L 1534 1165 Z" stroke="#4e82b3" fill="#4e82b3">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2361 1113 L 1913 1102 L 1534 1165 Z;M 2336 1093 L 1915 1117 L 1554 1174 Z;M 2361 1113 L 1913 1102 L 1534 1165 Z"></animate>
</path><path d="M -270 974 L -122 1047 L -30 1005 Z" stroke="#654f68" fill="#654f68">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -270 974 L -122 1047 L -30 1005 Z;M -297 940 L -149 1055 L -73 1035 Z;M -270 974 L -122 1047 L -30 1005 Z"></animate>
</path><path d="M 2052 -137 L 1961 -193 L 1929 -40 Z" stroke="#704f67" fill="#704f67">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2052 -137 L 1961 -193 L 1929 -40 Z;M 2036 -107 L 1935 -189 L 1941 -69 Z;M 2052 -137 L 1961 -193 L 1929 -40 Z"></animate>
</path><path d="M 1929 -40 L 1961 -193 L 1813 -39 Z" stroke="#705068" fill="#705068">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1929 -40 L 1961 -193 L 1813 -39 Z;M 1941 -69 L 1935 -189 L 1828 -2 Z;M 1929 -40 L 1961 -193 L 1813 -39 Z"></animate>
</path><path d="M -406 52 L -297 153 L -227 126 Z" stroke="#4a78a0" fill="#4a78a0">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -406 52 L -297 153 L -227 126 Z;M -434 59 L -284 166 L -216 123 Z;M -406 52 L -297 153 L -227 126 Z"></animate>
</path><path d="M -227 126 L -297 153 L -98 265 Z" stroke="#586d96" fill="#586d96">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -227 126 L -297 153 L -98 265 Z;M -216 123 L -284 166 L -76 259 Z;M -227 126 L -297 153 L -98 265 Z"></animate>
</path><path d="M -390 829 L -270 974 L -271 803 Z" stroke="#655b7d" fill="#655b7d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -390 829 L -270 974 L -271 803 Z;M -421 846 L -297 940 L -258 797 Z;M -390 829 L -270 974 L -271 803 Z"></animate>
</path><path d="M -297 153 L -370 273 L -126 315 Z" stroke="#576d96" fill="#576d96">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -297 153 L -370 273 L -126 315 Z;M -284 166 L -351 277 L -130 330 Z;M -297 153 L -370 273 L -126 315 Z"></animate>
</path><path d="M 2168 15 L 2065 71 L 2274 296 Z" stroke="#7c5571" fill="#7c5571">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2168 15 L 2065 71 L 2274 296 Z;M 2149 43 L 2107 124 L 2268 255 Z;M 2168 15 L 2065 71 L 2274 296 Z"></animate>
</path><path d="M 2044 211 L 2065 71 L 1959 275 Z" stroke="#7d5673" fill="#7d5673">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2044 211 L 2065 71 L 1959 275 Z;M 2087 229 L 2107 124 L 1938 254 Z;M 2044 211 L 2065 71 L 1959 275 Z"></animate>
</path><path d="M 2065 71 L 2052 -137 L 1929 -40 Z" stroke="#74516a" fill="#74516a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2065 71 L 2052 -137 L 1929 -40 Z;M 2107 124 L 2036 -107 L 1941 -69 Z;M 2065 71 L 2052 -137 L 1929 -40 Z"></animate>
</path><path d="M 1913 1102 L 1979 1056 L 1882 934 Z" stroke="#567fb1" fill="#567fb1">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1913 1102 L 1979 1056 L 1882 934 Z;M 1915 1117 L 2024 1041 L 1909 908 Z;M 1913 1102 L 1979 1056 L 1882 934 Z"></animate>
</path><path d="M 2176 966 L 2196 828 L 2062 800 Z" stroke="#5480b2" fill="#5480b2">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2176 966 L 2196 828 L 2062 800 Z;M 2190 942 L 2234 802 L 2040 780 Z;M 2176 966 L 2196 828 L 2062 800 Z"></animate>
</path><path d="M 2196 828 L 2163 634 L 2099 694 Z" stroke="#6b74a8" fill="#6b74a8">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2196 828 L 2163 634 L 2099 694 Z;M 2234 802 L 2136 600 L 2068 685 Z;M 2196 828 L 2163 634 L 2099 694 Z"></animate>
</path><path d="M -271 803 L -270 974 L -138 818 Z" stroke="#665675" fill="#665675">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -271 803 L -270 974 L -138 818 Z;M -258 797 L -297 940 L -178 785 Z;M -271 803 L -270 974 L -138 818 Z"></animate>
</path><path d="M -400 544 L -208 712 L -302 511 Z" stroke="#626187" fill="#626187">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -400 544 L -208 712 L -302 511 Z;M -414 560 L -213 701 L -309 500 Z;M -400 544 L -208 712 L -302 511 Z"></animate>
</path><path d="M 2196 828 L 2099 694 L 2062 800 Z" stroke="#6578ac" fill="#6578ac">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2196 828 L 2099 694 L 2062 800 Z;M 2234 802 L 2068 685 L 2040 780 Z;M 2196 828 L 2099 694 L 2062 800 Z"></animate>
</path><path d="M 2123 523 L 2282 435 L 2070 375 Z" stroke="#855e84" fill="#855e84">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2123 523 L 2282 435 L 2070 375 Z;M 2064 562 L 2262 406 L 2046 404 Z;M 2123 523 L 2282 435 L 2070 375 Z"></animate>
</path><path d="M -475 340 L -302 511 L -370 273 Z" stroke="#556f98" fill="#556f98">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -475 340 L -302 511 L -370 273 Z;M -427 326 L -309 500 L -351 277 Z;M -475 340 L -302 511 L -370 273 Z"></animate>
</path><path d="M -475 340 L -400 544 L -302 511 Z" stroke="#596c95" fill="#596c95">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -475 340 L -400 544 L -302 511 Z;M -427 326 L -414 560 L -309 500 Z;M -475 340 L -400 544 L -302 511 Z"></animate>
</path><path d="M -45 -295 L -262 -170 L -54 -133 Z" stroke="#3c81a5" fill="#3c81a5">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -45 -295 L -262 -170 L -54 -133 Z;M -67 -263 L -258 -220 L -72 -167 Z;M -45 -295 L -262 -170 L -54 -133 Z"></animate>
</path><path d="M -297 153 L -475 340 L -370 273 Z" stroke="#4e759e" fill="#4e759e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -297 153 L -475 340 L -370 273 Z;M -284 166 L -427 326 L -351 277 Z;M -297 153 L -475 340 L -370 273 Z"></animate>
</path><path d="M -262 -170 L -307 -117 L -69 -27 Z" stroke="#3e80a4" fill="#3e80a4">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -262 -170 L -307 -117 L -69 -27 Z;M -258 -220 L -295 -110 L -39 -27 Z;M -262 -170 L -307 -117 L -69 -27 Z"></animate>
</path><path d="M -347 1004 L -228 1109 L -270 974 Z" stroke="#665777" fill="#665777">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -347 1004 L -228 1109 L -270 974 Z;M -366 1049 L -240 1150 L -297 940 Z;M -347 1004 L -228 1109 L -270 974 Z"></animate>
</path><path d="M -270 974 L -228 1109 L -122 1047 Z" stroke="#66526f" fill="#66526f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -270 974 L -228 1109 L -122 1047 Z;M -297 940 L -240 1150 L -149 1055 Z;M -270 974 L -228 1109 L -122 1047 Z"></animate>
</path><path d="M -122 1047 L -228 1109 L 92 1160 Z" stroke="#644c61" fill="#644c61">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -122 1047 L -228 1109 L 92 1160 Z;M -149 1055 L -240 1150 L 77 1166 Z;M -122 1047 L -228 1109 L 92 1160 Z"></animate>
</path><path d="M -406 52 L -475 340 L -297 153 Z" stroke="#477aa1" fill="#477aa1">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -406 52 L -475 340 L -297 153 Z;M -434 59 L -427 326 L -284 166 Z;M -406 52 L -475 340 L -297 153 Z"></animate>
</path><path d="M 2274 296 L 2044 211 L 2070 375 Z" stroke="#835877" fill="#835877">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2274 296 L 2044 211 L 2070 375 Z;M 2268 255 L 2087 229 L 2046 404 Z;M 2274 296 L 2044 211 L 2070 375 Z"></animate>
</path><path d="M 2065 71 L 2168 15 L 2052 -137 Z" stroke="#75526b" fill="#75526b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2065 71 L 2168 15 L 2052 -137 Z;M 2107 124 L 2149 43 L 2036 -107 Z;M 2065 71 L 2168 15 L 2052 -137 Z"></animate>
</path><path d="M -432 634 L -208 712 L -400 544 Z" stroke="#61638a" fill="#61638a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -432 634 L -208 712 L -400 544 Z;M -464 667 L -213 701 L -414 560 Z;M -432 634 L -208 712 L -400 544 Z"></animate>
</path><path d="M -432 634 L -390 829 L -208 712 Z" stroke="#626086" fill="#626086">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -432 634 L -390 829 L -208 712 Z;M -464 667 L -421 846 L -213 701 Z;M -432 634 L -390 829 L -208 712 Z"></animate>
</path><path d="M 2227 -65 L 2064 -187 L 2052 -137 Z" stroke="#705067" fill="#705067">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2227 -65 L 2064 -187 L 2052 -137 Z;M 2194 -90 L 2060 -205 L 2036 -107 Z;M 2227 -65 L 2064 -187 L 2052 -137 Z"></animate>
</path><path d="M 2052 -137 L 2064 -187 L 1961 -193 Z" stroke="#6e4f65" fill="#6e4f65">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2052 -137 L 2064 -187 L 1961 -193 Z;M 2036 -107 L 2060 -205 L 1935 -189 Z;M 2052 -137 L 2064 -187 L 1961 -193 Z"></animate>
</path><path d="M 1961 -193 L 2138 -262 L 1748 -269 Z" stroke="#6b4d62" fill="#6b4d62">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1961 -193 L 2138 -262 L 1748 -269 Z;M 1935 -189 L 2157 -279 L 1711 -218 Z;M 1961 -193 L 2138 -262 L 1748 -269 Z"></animate>
</path><path d="M -475 340 L -432 634 L -400 544 Z" stroke="#576e97" fill="#576e97">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -475 340 L -432 634 L -400 544 Z;M -427 326 L -464 667 L -414 560 Z;M -475 340 L -432 634 L -400 544 Z"></animate>
</path><path d="M 2290 454 L 2282 435 L 2163 634 Z" stroke="#816491" fill="#816491">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2290 454 L 2282 435 L 2163 634 Z;M 2279 434 L 2262 406 L 2136 600 Z;M 2290 454 L 2282 435 L 2163 634 Z"></animate>
</path><path d="M 2163 634 L 2282 435 L 2123 523 Z" stroke="#806592" fill="#806592">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2163 634 L 2282 435 L 2123 523 Z;M 2136 600 L 2262 406 L 2064 562 Z;M 2163 634 L 2282 435 L 2123 523 Z"></animate>
</path><path d="M 2176 966 L 2062 800 L 2002 911 Z" stroke="#557fb1" fill="#557fb1">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2176 966 L 2062 800 L 2002 911 Z;M 2190 942 L 2040 780 L 2039 926 Z;M 2176 966 L 2062 800 L 2002 911 Z"></animate>
</path><path d="M -423 -64 L -406 52 L -227 126 Z" stroke="#3e7fa4" fill="#3e7fa4">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -423 -64 L -406 52 L -227 126 Z;M -424 -54 L -434 59 L -216 123 Z;M -423 -64 L -406 52 L -227 126 Z"></animate>
</path><path d="M -390 829 L -347 1004 L -270 974 Z" stroke="#655b7e" fill="#655b7e">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -390 829 L -347 1004 L -270 974 Z;M -421 846 L -366 1049 L -297 940 Z;M -390 829 L -347 1004 L -270 974 Z"></animate>
</path><path d="M -418 1092 L -347 1004 L -390 829 Z" stroke="#635e83" fill="#635e83">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -418 1092 L -347 1004 L -390 829 Z;M -413 1074 L -366 1049 L -421 846 Z;M -418 1092 L -347 1004 L -390 829 Z"></animate>
</path><path d="M -400 -177 L -423 -64 L -307 -117 Z" stroke="#278ba7" fill="#278ba7">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -400 -177 L -423 -64 L -307 -117 Z;M -429 -200 L -424 -54 L -295 -110 Z;M -400 -177 L -423 -64 L -307 -117 Z"></animate>
</path><path d="M -307 -117 L -423 -64 L -227 126 Z" stroke="#3c81a5" fill="#3c81a5">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -307 -117 L -423 -64 L -227 126 Z;M -295 -110 L -424 -54 L -216 123 Z;M -307 -117 L -423 -64 L -227 126 Z"></animate>
</path><path d="M 2294 310 L 2274 296 L 2282 435 Z" stroke="#865a7a" fill="#865a7a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2294 310 L 2274 296 L 2282 435 Z;M 2354 309 L 2268 255 L 2262 406 Z;M 2294 310 L 2274 296 L 2282 435 Z"></animate>
</path><path d="M 2282 435 L 2274 296 L 2070 375 Z" stroke="#875a7b" fill="#875a7b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2282 435 L 2274 296 L 2070 375 Z;M 2262 406 L 2268 255 L 2046 404 Z;M 2282 435 L 2274 296 L 2070 375 Z"></animate>
</path><path d="M 2168 15 L 2227 -65 L 2052 -137 Z" stroke="#73516a" fill="#73516a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2168 15 L 2227 -65 L 2052 -137 Z;M 2149 43 L 2194 -90 L 2036 -107 Z;M 2168 15 L 2227 -65 L 2052 -137 Z"></animate>
</path><path d="M 1979 1056 L 2131 1065 L 2002 911 Z" stroke="#4984b3" fill="#4984b3">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1979 1056 L 2131 1065 L 2002 911 Z;M 2024 1041 L 2171 1059 L 2039 926 Z;M 1979 1056 L 2131 1065 L 2002 911 Z"></animate>
</path><path d="M 1913 1102 L 2131 1065 L 1979 1056 Z" stroke="#4785b3" fill="#4785b3">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1913 1102 L 2131 1065 L 1979 1056 Z;M 1915 1117 L 2171 1059 L 2024 1041 Z;M 1913 1102 L 2131 1065 L 1979 1056 Z"></animate>
</path><path d="M 2131 1065 L 2176 966 L 2002 911 Z" stroke="#4586b4" fill="#4586b4">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2131 1065 L 2176 966 L 2002 911 Z;M 2171 1059 L 2190 942 L 2039 926 Z;M 2131 1065 L 2176 966 L 2002 911 Z"></animate>
</path><path d="M 2330 596 L 2284 593 L 2163 634 Z" stroke="#776d9f" fill="#776d9f">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2330 596 L 2284 593 L 2163 634 Z;M 2273 623 L 2308 606 L 2136 600 Z;M 2330 596 L 2284 593 L 2163 634 Z"></animate>
</path><path d="M 2330 596 L 2163 634 L 2196 828 Z" stroke="#6d73a7" fill="#6d73a7">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2330 596 L 2163 634 L 2196 828 Z;M 2273 623 L 2136 600 L 2234 802 Z;M 2330 596 L 2163 634 L 2196 828 Z"></animate>
</path><path d="M 2284 593 L 2290 454 L 2163 634 Z" stroke="#7c6898" fill="#7c6898">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2284 593 L 2290 454 L 2163 634 Z;M 2308 606 L 2279 434 L 2136 600 Z;M 2284 593 L 2290 454 L 2163 634 Z"></animate>
</path><path d="M 2328 33 L 2168 15 L 2388 236 Z" stroke="#7b5571" fill="#7b5571">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2328 33 L 2168 15 L 2388 236 Z;M 2272 50 L 2149 43 L 2362 239 Z;M 2328 33 L 2168 15 L 2388 236 Z"></animate>
</path><path d="M 2328 33 L 2227 -65 L 2168 15 Z" stroke="#76526d" fill="#76526d">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2328 33 L 2227 -65 L 2168 15 Z;M 2272 50 L 2194 -90 L 2149 43 Z;M 2328 33 L 2227 -65 L 2168 15 Z"></animate>
</path><path d="M 2284 593 L 2330 596 L 2290 454 Z" stroke="#7c6898" fill="#7c6898">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2284 593 L 2330 596 L 2290 454 Z;M 2308 606 L 2273 623 L 2279 434 Z;M 2284 593 L 2330 596 L 2290 454 Z"></animate>
</path><path d="M 2399 828 L 2330 596 L 2196 828 Z" stroke="#5f7bae" fill="#5f7bae">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2399 828 L 2330 596 L 2196 828 Z;M 2342 797 L 2273 623 L 2234 802 Z;M 2399 828 L 2330 596 L 2196 828 Z"></animate>
</path><path d="M 2399 828 L 2294 310 L 2290 454 Z" stroke="#7e6796" fill="#7e6796">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2399 828 L 2294 310 L 2290 454 Z;M 2342 797 L 2354 309 L 2279 434 Z;M 2399 828 L 2294 310 L 2290 454 Z"></animate>
</path><path d="M 2290 454 L 2294 310 L 2282 435 Z" stroke="#865c80" fill="#865c80">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2290 454 L 2294 310 L 2282 435 Z;M 2279 434 L 2354 309 L 2262 406 Z;M 2290 454 L 2294 310 L 2282 435 Z"></animate>
</path><path d="M -45 -295 L -400 -177 L -262 -170 Z" stroke="#2c89a7" fill="#2c89a7">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -45 -295 L -400 -177 L -262 -170 Z;M -67 -263 L -429 -200 L -258 -220 Z;M -45 -295 L -400 -177 L -262 -170 Z"></animate>
</path><path d="M -262 -170 L -400 -177 L -307 -117 Z" stroke="#298aa7" fill="#298aa7">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -262 -170 L -400 -177 L -307 -117 Z;M -258 -220 L -429 -200 L -295 -110 Z;M -262 -170 L -400 -177 L -307 -117 Z"></animate>
</path><path d="M -423 -64 L -400 -177 L -406 52 Z" stroke="#2b89a7" fill="#2b89a7">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -423 -64 L -400 -177 L -406 52 Z;M -424 -54 L -429 -200 L -434 59 Z;M -423 -64 L -400 -177 L -406 52 Z"></animate>
</path><path d="M 2440 -125 L 2138 -262 L 2227 -65 Z" stroke="#705067" fill="#705067">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2440 -125 L 2138 -262 L 2227 -65 Z;M 2416 -190 L 2157 -279 L 2194 -90 Z;M 2440 -125 L 2138 -262 L 2227 -65 Z"></animate>
</path><path d="M 2227 -65 L 2138 -262 L 2064 -187 Z" stroke="#6f4f66" fill="#6f4f66">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2227 -65 L 2138 -262 L 2064 -187 Z;M 2194 -90 L 2157 -279 L 2060 -205 Z;M 2227 -65 L 2138 -262 L 2064 -187 Z"></animate>
</path><path d="M 2064 -187 L 2138 -262 L 1961 -193 Z" stroke="#6c4e64" fill="#6c4e64">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2064 -187 L 2138 -262 L 1961 -193 Z;M 2060 -205 L 2157 -279 L 1935 -189 Z;M 2064 -187 L 2138 -262 L 1961 -193 Z"></animate>
</path><path d="M 1748 -269 L 2138 -262 L 1562 -289 Z" stroke="#684c60" fill="#684c60">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1748 -269 L 2138 -262 L 1562 -289 Z;M 1711 -218 L 2157 -279 L 1560 -241 Z;M 1748 -269 L 2138 -262 L 1562 -289 Z"></animate>
</path><path d="M 1562 -289 L 2138 -262 L 1415 -257 Z" stroke="#674b60" fill="#674b60">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1562 -289 L 2138 -262 L 1415 -257 Z;M 1560 -241 L 2157 -279 L 1461 -256 Z;M 1562 -289 L 2138 -262 L 1415 -257 Z"></animate>
</path><path d="M 2388 236 L 2168 15 L 2274 296 Z" stroke="#7f5674" fill="#7f5674">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2388 236 L 2168 15 L 2274 296 Z;M 2362 239 L 2149 43 L 2268 255 Z;M 2388 236 L 2168 15 L 2274 296 Z"></animate>
</path><path d="M -432 634 L -418 1092 L -390 829 Z" stroke="#616288" fill="#616288">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -432 634 L -418 1092 L -390 829 Z;M -464 667 L -413 1074 L -421 846 Z;M -432 634 L -418 1092 L -390 829 Z"></animate>
</path><path d="M -347 1004 L -418 1092 L -228 1109 Z" stroke="#655a7c" fill="#655a7c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M -347 1004 L -418 1092 L -228 1109 Z;M -366 1049 L -413 1074 L -240 1150 Z;M -347 1004 L -418 1092 L -228 1109 Z"></animate>
</path><path d="M 2399 828 L 2388 236 L 2294 310 Z" stroke="#83618b" fill="#83618b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2399 828 L 2388 236 L 2294 310 Z;M 2342 797 L 2362 239 L 2354 309 Z;M 2399 828 L 2388 236 L 2294 310 Z"></animate>
</path><path d="M 2294 310 L 2388 236 L 2274 296 Z" stroke="#835878" fill="#835878">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2294 310 L 2388 236 L 2274 296 Z;M 2354 309 L 2362 239 L 2268 255 Z;M 2294 310 L 2388 236 L 2274 296 Z"></animate>
</path><path d="M 2361 1113 L 2354 949 L 2176 966 Z" stroke="#2790b2" fill="#2790b2">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2361 1113 L 2354 949 L 2176 966 Z;M 2336 1093 L 2314 933 L 2190 942 Z;M 2361 1113 L 2354 949 L 2176 966 Z"></animate>
</path><path d="M 2176 966 L 2354 949 L 2196 828 Z" stroke="#4287b4" fill="#4287b4">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2176 966 L 2354 949 L 2196 828 Z;M 2190 942 L 2314 933 L 2234 802 Z;M 2176 966 L 2354 949 L 2196 828 Z"></animate>
</path><path d="M 2330 596 L 2399 828 L 2290 454 Z" stroke="#736fa3" fill="#736fa3">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2330 596 L 2399 828 L 2290 454 Z;M 2273 623 L 2342 797 L 2279 434 Z;M 2330 596 L 2399 828 L 2290 454 Z"></animate>
</path><path d="M 2354 949 L 2399 828 L 2196 828 Z" stroke="#4785b3" fill="#4785b3">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2354 949 L 2399 828 L 2196 828 Z;M 2314 933 L 2342 797 L 2234 802 Z;M 2354 949 L 2399 828 L 2196 828 Z"></animate>
</path><path d="M 2388 236 L 2420 -36 L 2328 33 Z" stroke="#7a5470" fill="#7a5470">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2388 236 L 2420 -36 L 2328 33 Z;M 2362 239 L 2386 -34 L 2272 50 Z;M 2388 236 L 2420 -36 L 2328 33 Z"></animate>
</path><path d="M 2328 33 L 2440 -125 L 2227 -65 Z" stroke="#75526b" fill="#75526b">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2328 33 L 2440 -125 L 2227 -65 Z;M 2272 50 L 2416 -190 L 2194 -90 Z;M 2328 33 L 2440 -125 L 2227 -65 Z"></animate>
</path><path d="M 2399 828 L 2420 -36 L 2388 236 Z" stroke="#865a7a" fill="#865a7a">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2399 828 L 2420 -36 L 2388 236 Z;M 2342 797 L 2386 -34 L 2362 239 Z;M 2399 828 L 2420 -36 L 2388 236 Z"></animate>
</path><path d="M 2354 949 L 2361 1113 L 2399 828 Z" stroke="#2c8eb3" fill="#2c8eb3">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2354 949 L 2361 1113 L 2399 828 Z;M 2314 933 L 2336 1093 L 2342 797 Z;M 2354 949 L 2361 1113 L 2399 828 Z"></animate>
</path><path d="M 2399 828 L 2361 1113 L 2420 -36 Z" stroke="#7171a4" fill="#7171a4">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2399 828 L 2361 1113 L 2420 -36 Z;M 2342 797 L 2336 1093 L 2386 -34 Z;M 2399 828 L 2361 1113 L 2420 -36 Z"></animate>
</path><path d="M 2131 1065 L 2361 1113 L 2176 966 Z" stroke="#298fb2" fill="#298fb2">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2131 1065 L 2361 1113 L 2176 966 Z;M 2171 1059 L 2336 1093 L 2190 942 Z;M 2131 1065 L 2361 1113 L 2176 966 Z"></animate>
</path><path d="M 1913 1102 L 2361 1113 L 2131 1065 Z" stroke="#318db3" fill="#318db3">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1913 1102 L 2361 1113 L 2131 1065 Z;M 1915 1117 L 2336 1093 L 2171 1059 Z;M 1913 1102 L 2361 1113 L 2131 1065 Z"></animate>
</path><path d="M 1379 1159 L 2361 1113 L 1534 1165 Z" stroke="#6577ab" fill="#6577ab">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 1379 1159 L 2361 1113 L 1534 1165 Z;M 1402 1193 L 2336 1093 L 1554 1174 Z;M 1379 1159 L 2361 1113 L 1534 1165 Z"></animate>
</path><path d="M 2420 -36 L 2440 -125 L 2328 33 Z" stroke="#75526c" fill="#75526c">
<animate attributeName="d" repeatDur="indefinite" dur="3.2258064516129035s" keyTimes="0;0.5;1" values="M 2420 -36 L 2440 -125 L 2328 33 Z;M 2386 -34 L 2416 -190 L 2272 50 Z;M 2420 -36 L 2440 -125 L 2328 33 Z"></animate>
</path></g><style type="text/css"> #bk-0.16217486445175422 path { stroke-width: 1 } </style></g>
</svg>

After

Width:  |  Height:  |  Size: 117 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 141.5 132.2"><path d="M140.35,43.52c-3-3-6.36-.86-11.07,1.64-12.5,6.65-27.41,6.66-41.59,7.18-1.22,0-2.86.77-3.54-.85,7.63-14.21,6.15-32.81-6.77-44.18C67.15,1.13,54.82-1.66,44,1,36.77,2.78,18.6,9.58,18.6,27.31c0,5.37-1,7.78-.63,13.67.49,7,7.85,12.07,9,13.65s1.33,2.66-.81,3.24C3.69,67.23,6.68,96.84,19.85,113c16.42,17.92,35.43,20,58.68,18.94C123.82,126.34,147.08,87,140.35,43.52ZM22.78,23.18v.06l-.15,0h0A.8.8,0,0,0,22.78,23.18Z" style="fill:#ffcf00"/><path d="M19.73,20.25a163.35,163.35,0,0,0-1.62,21.43C13.79,41,5.69,42,3.11,39c-1.36-1.58-1.82-3.56,0-5.43S4.89,30.25,3,28.41c-1.14-1.1-5.39-5.29-1.14-10.55,1.77-2.18,4-.72,5.79.58C10.5,20.47,16.35,20.9,19.73,20.25Z" style="fill:#ee7406"/><circle cx="42.74" cy="26.94" r="5.77" style="fill:#160f03"/></svg>

After

Width:  |  Height:  |  Size: 809 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 126.2 40" style="enable-background:new 0 0 126.2 40;" xml:space="preserve">
<style type="text/css">
.st0{fill:#939598;}
.st1{fill:#875A7B;}
</style>
<g id="Group_982" transform="translate(-13.729 -4.35)">
<path id="Path_172" class="st0" d="M60.9,38c4.9,0,8.9-4,8.9-8.9c0-4.9-4-8.9-8.9-8.9c-4.9,0-8.9,4-8.9,8.9c0,0,0,0,0,0
C51.9,34,55.9,38,60.9,38 M76.1,28.8c0.1,8.4-6.6,15.4-15,15.5c-8.4,0.1-15.4-6.6-15.5-15c0-0.2,0-0.3,0-0.5
c0.3-8.6,7.6-15.4,16.2-15.1c2.9,0.1,5.6,1,8,2.6V7.4c0.1-1.7,1.5-3.1,3.3-3.1c1.7,0,3,1.4,3.1,3.1L76.1,28.8z M92.7,38
c4.9,0,8.9-4,8.9-8.9c0-4.9-4-8.9-8.9-8.9c-4.9,0-8.9,4-8.9,8.9c0,0,0,0,0,0C83.8,34,87.8,38,92.7,38L92.7,38 M92.7,44.3
c-8.4,0-15.2-6.8-15.2-15.2c0-8.4,6.8-15.2,15.2-15.2c8.4,0,15.2,6.8,15.2,15.2c0,0,0,0,0,0C108,37.4,101.2,44.3,92.7,44.3
M124.6,38c4.9,0,8.9-4,8.9-8.9s-4-8.9-8.9-8.9c-4.9,0-8.9,4-8.9,8.9c0,0,0,0,0,0C115.7,34,119.7,38,124.6,38 M124.6,44.3
c-8.4,0-15.2-6.8-15.2-15.2c0-8.4,6.8-15.2,15.2-15.2c8.4,0,15.2,6.8,15.2,15.2c0,0,0,0,0,0C139.9,37.4,133,44.3,124.6,44.3"/>
<path id="Path_173" class="st1" d="M29,38c4.9,0,8.9-4,8.9-8.9c0-4.9-4-8.9-8.9-8.9c-4.9,0-8.9,4-8.9,8.9c0,0,0,0,0,0
C20,34,24,38,29,38 M29,44.3c-8.4,0-15.2-6.8-15.2-15.2S20.5,13.8,29,13.8S44.2,20.6,44.2,29c0,0,0,0,0,0
C44.2,37.4,37.4,44.3,29,44.3C29,44.3,29,44.3,29,44.3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360.77 418.86"><path d="M87.35,39.16a14.52,14.52,0,0,0,2.3-6.33c1.15-6.68-.85-14.11-6.2-18.52-7.6-6.26-20.93-4.1-25.25,4.76.15-4.76-.48-9.75-3.16-13.69S47.2-1.08,42.69.46c-3.77,1.29-6.25,5.07-7.09,9s-.32,7.94.2,11.9C33.64,14.68,29.37,8,22.65,6.08,14.85,3.85,6.37,9.18,2.79,16.46S-.43,32.34,1.13,40.3c.93,4.75,2.3,9.52,5,13.53a20.81,20.81,0,0,0,3.68,4.1,24.29,24.29,0,0,0,18.44,5.52c4.18-.5,7.54-2.64,11.47-3.85,9-2.73,17.86-5.68,26.53-9.2,3.63-1.48,7.29-2.9,10.77-4.71,3-1.54,6-3.34,8.79-5.12A6.05,6.05,0,0,0,87.35,39.16Z" style="fill:#ff1d00"/><path d="M186.63,387.43a6,6,0,0,0,2.26-11.79l-11.3-2.81v-45a6.17,6.17,0,0,0-5.81-6.25,6,6,0,0,0-6.19,6V372l-23.53.81a6.18,6.18,0,0,0-6.05,5.87,6,6,0,0,0,5.1,6.07,3.44,3.44,0,0,0,.81-.34,30.22,30.22,0,0,1,15.43-3.19h.29l-12.8,5.86a6,6,0,0,0-2,8.25l0,.05a5.15,5.15,0,0,0,6.92,1.79l.4-.22a74.29,74.29,0,0,1,35.93-9.52Z" style="fill:#fbb03b"/><path d="M215.65,408.45a6,6,0,1,0,2.27-11.78l-11.31-2.82v-45a6.16,6.16,0,0,0-5.81-6.25,6,6,0,0,0-6.19,6V393l-23.52.81A6.19,6.19,0,0,0,165,399.7a6,6,0,0,0,5.1,6.06,3,3,0,0,0,.81-.34,30.34,30.34,0,0,1,15.43-3.19l.29,0-12.8,5.85a6,6,0,0,0-2,8.25l0,0a5.18,5.18,0,0,0,6.93,1.8l.4-.23a74.37,74.37,0,0,1,35.93-9.52Z" style="fill:#fbb03b"/><path d="M22,75.36l-7,36.56a4.12,4.12,0,0,0,6.52,4c5.75-4.25,10.93-5.32,23-6.36C44.52,109.53,49,86,22,75.36Z" style="fill:#fbb03b"/><path d="M31.56,118.35c-1.36,3.1-1.17,7.63,2,8.85,2.82,1.08,5.91-1.52,6.69-4.44a7.39,7.39,0,0,0,2.91,7.67,5.52,5.52,0,0,0,5.15.76c2.13-.88,3.24-3.35,3.22-5.66a17.68,17.68,0,0,0-1.84-6.61l-4.22-9.87c-.18-.41-.43-.89-.87-.94a1.33,1.33,0,0,0-.84.3C42.43,109.29,33.38,114.22,31.56,118.35Z" style="fill:#ff1d00"/><path d="M348.82,197.14c-12.21,5.57-22.53,7.81-22.53,7.53,14.23-6.42,27.22-46.89,27.22-46.89A7.18,7.18,0,0,0,343,149.21c-11.44,7.16-24.49,15.55-24.22,15.27,7.26-13.95,10.88-49.94,10.88-49.94A11.25,11.25,0,0,0,313,102.42c-53.28,31-187.31,98.17-181.07,14.59C139.46,15.91,29.55,14.74,22,75.54c0,0,3.17.12,9.43,8.18,1.78,2.28,3.7,4.91,5.72,7.88a53.14,53.14,0,0,1,5,50.87C23.88,185-6.68,300.53,119.13,330.36a287.31,287.31,0,0,0,52.6,7.73A31.79,31.79,0,0,0,198.93,353c13.67,0,25.29-8.26,29.63-19.81,60.58-14.62,103.75-59.41,131.58-127.28C363,198.91,355.65,194,348.82,197.14Z" style="fill:#d5af94"/><path d="M242.82,157a4.68,4.68,0,0,1,6.93,5.05s-1.51,15-4.53,20.77c-.11.12,5.32-3.37,10.08-6.35a3,3,0,0,1,4.38,3.56s-5.4,16.84-11.32,19.51a39.37,39.37,0,0,0,9.89-3.38,3.07,3.07,0,0,1,4.17,3.93c-17.63,42.94-50,63.65-100.24,51.74-18-4.27-28.29-12.75-33.76-22.76-13.49-24.7,3.47-55.07,31.53-57.28C188.41,169.59,229,165.1,242.82,157Z" style="fill:#b57c52"/><path d="M68.31,79a7.78,7.78,0,1,1-7.78-7.77A7.78,7.78,0,0,1,68.31,79Z"/></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

+12
View File
@@ -0,0 +1,12 @@
(function ($) {
document.addEventListener('DOMContentLoaded', function () {
const content = document.getElementById('o_content');
// Enforce the presence of the `img-fluid` class on all images in the body
content.querySelectorAll('img').forEach(image => {
image.classList.add('img-fluid');
});
});
})();
+60
View File
@@ -0,0 +1,60 @@
/* global _prepareAccordion */ //see utils.js
(function ($) {
document.addEventListener('DOMContentLoaded', () => {
this.navigationMenu = document.getElementById('o_main_toctree');
// Allow to automatically collapse and expand TOC entries
_prepareAccordion(this.navigationMenu);
// Allow to respectively highlight and expand the TOC entries and their related TOC
// entry list whose page is displayed.
_flagActiveTocEntriesAndLists();
// Show hidden menu when the css classes have been properly specified
this.navigationMenu.removeAttribute('hidden');
});
/**
* Add the relevant classes on the TOC entries (and lists) whose page is displayed.
*
* TOC entries (<li> elements) that are on the path of the displayed page receive the
* `o_active_toc_entry` class, and their related (parent) TOC entry list (<ul> elements) receive
* the `show` (Bootstrap) class.
* Also, the deepest TOC entry receives the `o_deepest_active_toc_entry` class, and its child
* TOC entry list receives the `show` class.
*/
const _flagActiveTocEntriesAndLists = () => {
let deepestTocEntry = undefined;
this.navigationMenu.querySelectorAll('.current').forEach(element => {
if (element.tagName === 'UL') {
// Expand all related <ul>
element.classList.add('show');
} else if (element.tagName === 'LI') {
// Highlight all <li> in the active hierarchy
element.classList.add('o_active_toc_entry');
deepestTocEntry = element;
}
})
if (deepestTocEntry) {
const childTocEntryList = deepestTocEntry.querySelector('ul');
if (childTocEntryList) {
childTocEntryList.classList.add('show');
} else { // If the toc entry is not a TOC, add the class to its closest ancestor entry
deepestTocEntry = deepestTocEntry.parentElement.parentElement;
}
deepestTocEntry.classList.add('o_deepest_active_toc_entry');
}
};
/**
* Mobile: Toggle open/close sidebar on click of nav button (&& on swipe left to right?).
*
*
* `o_active_toc_entry` class, and their related (parent) TOC entry list (<ul> elements) receive
* the `show` (Bootstrap) class.
* Also, the deepest TOC entry receives the `o_deepest_active_toc_entry` class, and its child
* Sidebar receives the `o-mobile-show` class.
*/
})();
+127
View File
@@ -0,0 +1,127 @@
/* global _prepareAccordion */ //see utils.js
(function ($) {
// Customize the page TOC
document.addEventListener('DOMContentLoaded', () => {
this.pageToc = document.getElementById('o_page_toc'); // The tree of content of the page
if (this.pageToc) { // The local toctree is not included for toctree pages (see layout.html)
this.headingRefs = this.pageToc.querySelectorAll('a'); // The references to all headings
// If the page TOC has less than 2 headings, in addition to the title, hide it entirely
if (this.headingRefs.length <= 2) {
_hidePageToc();
return;
}
// Allow to automatically collapse and expand TOC entries
_prepareAccordion(this.pageToc);
// Allow to respectively highlight and expand the TOC entries and their related TOC
// entry list whose section is focused.
_flagActiveTocEntriesAndLists();
// Allow to hide the TOC entry referring the title (<h1> heading)
_flagFirstHeadingRef();
}
});
/**
* Entirely hide the local tree of contents.
*/
const _hidePageToc = () => this.pageToc.style.display = 'none';
/**
* Add the relevant classes on the TOC entries (and lists) whose section is focused.
*
* TOC entries whose section is focused (<li> elements) receive the `o_active_toc_entry` class
* and their related TOC entry list (<ul> elements) receive the `show` (Bootstrap) class.
*/
const _flagActiveTocEntriesAndLists = () => {
const _updateFlags = () => {
const activeHeadingRef = clickedHeadingRef || _findActiveHeadingRef();
if (
lastActiveHeadingRef // `undefined` on the first update
&& activeHeadingRef.href === lastActiveHeadingRef.href
) {
return; // The focus didn't change
}
_unflagAll();
_flagActiveHierarchy(activeHeadingRef);
// Store to avoid updating later if the focus didn't change
lastActiveHeadingRef = activeHeadingRef;
};
const _findActiveHeadingRef = () => {
let activeHeadingRef = this.headingRefs[0];
this.headingRefs.forEach(headingRef => {
const href = headingRef.getAttribute('href');
if (href !== '#') {
const sectionId = href.replace('#', '');
// The DOM is searched with querySelector rather than getElementById because
// auto-documented modules generate ids containing a '.' which would make the
// search fail.
const section = document.querySelector(`section[id="${sectionId}"]`);
if (window.pageYOffset >= section.offsetTop) {
// The focused section is the last one with a smaller offset from top than
// the current user scrolling offset.
activeHeadingRef = headingRef;
} else {
return activeHeadingRef; // Break
}
}
});
return activeHeadingRef;
};
const _unflagAll = () => {
this.pageToc.querySelectorAll('li,ul').forEach(element => {
element.classList.remove('o_active_toc_entry', 'show');
});
this.pageToc.querySelectorAll('i').forEach(element => {
element.setAttribute('aria-expanded', false);
});
};
const _flagActiveHierarchy = (headingRef) => {
let tocEntry = headingRef.parentElement;
while (tocEntry !== this.pageToc) {
if (tocEntry.tagName === 'LI') {
// Highlight all <li> in the active hierarchy
tocEntry.classList.add('o_active_toc_entry');
// Expand all related <ul>
const relatedTocEntryList = tocEntry.querySelector('ul');
if (relatedTocEntryList) {
relatedTocEntryList.classList.add('show');
}
}
tocEntry = tocEntry.parentElement;
}
};
let clickedHeadingRef = undefined;
this.pageToc.addEventListener('click', ev => {
clickedHeadingRef = ev.target.closest('a[href^="#"]'); // Highlight the clicked ref
});
let timeoutId = undefined;
document.addEventListener('scroll', () => {
clearTimeout(timeoutId); // For each scroll event, cancel the previous timeout callback
timeoutId = setTimeout(() => {
clickedHeadingRef = undefined; // Go back to highlighting the heading ref in view
}, 100);
_updateFlags();
});
let lastActiveHeadingRef = undefined; // Init as `undefined` to allow an initial update
_updateFlags(); // Flag initially active sections before the first scroll event
};
/**
* Add the class `o_page_toc_title` on the first heading reference.
*/
const _flagFirstHeadingRef = () => {
this.headingRefs[0].parentNode.classList.add('o_page_toc_title');
}
})();
+65
View File
@@ -0,0 +1,65 @@
let tocEntryListId = 0; // Used to generate IDs of toc entry lists for both the menu and page TOC
/**
* Update the provided TOC to allow collapsing its entries with Bootstrap's accordion.
*
* The typical structure of a TOC menu is a follows:
* <ul><li>
* <a href="#"/>
* <ul>
* <li><a href="#heading_without_child"/></li>
* <li>
* <a href="#heading_with_children"/>
* <ul>...</ul>
* </li>
* </ul>
* </li></ul>
*
* Since a <ul> is always preceded by a <a>, and since we only need to make change to <a>
* elements followed by a <ul>, we simply loop on <ul> elements to access all parts of the DOM
* that need to be modified.
*
* The final structure must look like this:
* <ul><li>
* <!-- Only <a> element with empty href must expand/collapse on click -->
* <a href="#" data-bs-target="#o_target_{id}>" data-bs-toggle="collapse"/>
* <ul>
* <li><a href="#heading_without_child"/></li>
* <li>
* <div class="o_toc_entry_wrapper">
* <i class="i-chevron-right" data-bs-target="#o_target_{id}" data-bs-toggle="collapse"/>
* <a href="#heading_with_children"/>
* </div>
* <ul id="o_target_{id}" class="collapse">...</ul>
* </li>
* </ul>
* </li></ul>
*
* @param {HTMLElement} tocElement - The element containing the TOC
*/
const _prepareAccordion = (tocElement) => {
// Start at the second TOC entry list (<ul>) to avoid collapsing the entire TOC
const tocRoot = tocElement.querySelector('ul');
tocRoot.querySelectorAll('ul').forEach(tocEntryList => {
// Modify the <ul> element
tocEntryList.id = `o_target_${tocEntryListId++}`;
tocEntryList.classList.add('collapse');
// Create and configure an <i> element
const arrowButton = document.createElement('I');
arrowButton.setAttribute('data-bs-target', `#${tocEntryList.id}`);
arrowButton.setAttribute('data-bs-toggle', 'collapse');
arrowButton.classList.add('i-chevron-right');
// Modify the <a> element (only if it has no href, otherwise let the redirection happen)
const relatedHeadingRef = tocEntryList.previousSibling;
if (relatedHeadingRef.getAttribute('href') === '#') {
relatedHeadingRef.setAttribute('data-bs-target', `#${tocEntryList.id}`);
relatedHeadingRef.setAttribute('data-bs-toggle', 'collapse');
}
// Create a <div> element
const tocEntryWrapper = document.createElement('DIV');
tocEntryWrapper.classList.add('o_toc_entry_wrapper');
// Insert the <i> and <a> elements inside the <div> and prepend the <div> to the <ul>
tocEntryWrapper.append(arrowButton, relatedHeadingRef);
tocEntryList.parentNode.insertBefore(tocEntryWrapper, tocEntryList);
});
};
@@ -0,0 +1,419 @@
//------------------------------------------------------------------------------
// icomoon icons
//------------------------------------------------------------------------------
[class^="i-"], [class*=" i-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'icomoon' !important;
speak: never;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
}
.i-arrow-up {
&:before {
content: $i-arrow-up;
}
}
.i-arrow-down {
&:before {
content: $i-arrow-down;
}
}
.i-arrow-left {
&:before {
content: $i-arrow-left;
}
}
.i-arrow-right {
&:before {
content: $i-arrow-right;
}
}
.i-chevron-up {
&:before {
content: $i-chevron-up;
}
}
.i-chevron-down {
&:before {
content: $i-chevron-down;
}
}
.i-chevron-left {
&:before {
content: $i-chevron-left;
}
}
.i-chevron-right {
&:before {
content: $i-chevron-right;
}
}
.i-link {
&:before {
content: $i-link;
}
}
.i-websites {
&:before {
content: $i-websites;
}
}
.i-sales {
&:before {
content: $i-sales;
}
}
.i-sales_2 {
&:before {
content: $i-sales_2;
}
}
.i-marketing {
&:before {
content: $i-marketing;
}
}
.i-apps_1 {
&:before {
content: $i-apps_1;
}
}
.i-apps_2 {
&:before {
content: $i-apps_2;
}
}
.i-app_features {
&:before {
content: $i-app_features;
}
}
.i-app-favorites {
&:before {
content: $i-app-favorites;
}
}
.i-basics {
&:before {
content: $i-basics;
}
}
.i-cart {
&:before {
content: $i-cart;
}
}
.i-shop {
&:before {
content: $i-shop;
}
}
.i-accountant {
&:before {
content: $i-accountant;
}
}
.i-customer-reviews {
&:before {
content: $i-customer-reviews;
}
}
.i-hr {
&:before {
content: $i-hr;
}
}
.i-developer {
&:before {
content: $i-developer;
}
}
.i-users {
&:before {
content: $i-users;
}
}
.i-doc-hr {
&:before {
content: $i-doc-hr;
}
}
.i-doc-apps {
&:before {
content: $i-doc-apps;
}
}
.i-doc-contribute {
&:before {
content: $i-doc-contribute;
}
}
.i-doc-admin_2 {
&:before {
content: $i-doc-admin_2;
}
}
.i-doc-dev {
&:before {
content: $i-doc-dev;
}
}
.i-doc-services {
&:before {
content: $i-doc-services;
}
}
.i-doc-admin {
&:before {
content: $i-doc-admin;
}
}
.i-documentation {
&:before {
content: $i-documentation;
}
}
.i-scaleup {
&:before {
content: $i-scaleup;
}
}
.i-knowledge {
&:before {
content: $i-knowledge;
}
}
.i-tutorial {
&:before {
content: $i-tutorial;
}
}
.i-elearning_1 {
&:before {
content: $i-elearning_1;
}
}
.i-elearning_2 {
&:before {
content: $i-elearning_2;
}
}
.i-install {
&:before {
content: $i-install;
}
}
.i-o-edu {
&:before {
content: $i-o-edu;
}
}
.i-certifications {
&:before {
content: $i-certifications;
}
}
.i-events {
&:before {
content: $i-events;
}
}
.i-showcase {
&:before {
content: $i-showcase;
}
}
.i-jobs {
&:before {
content: $i-jobs;
}
}
.i-finances {
&:before {
content: $i-finances;
}
}
.i-money-bag {
&:before {
content: $i-money-bag;
}
}
.i-money-plant {
&:before {
content: $i-money-plant;
}
}
.i-o-help {
&:before {
content: $i-o-help;
}
}
.i-o-logo {
&:before {
content: $i-o-logo;
}
}
.i-o-services {
&:before {
content: $i-o-services;
}
}
.i-o-tour {
&:before {
content: $i-o-tour;
}
}
.i-services {
&:before {
content: $i-services;
}
}
.i-operations_1 {
&:before {
content: $i-operations_1;
}
}
.i-operations_2 {
&:before {
content: $i-operations_2;
}
}
.i-performance {
&:before {
content: $i-performance;
}
}
.i-time-management_2 {
&:before {
content: $i-time-management_2;
}
}
.i-time-management {
&:before {
content: $i-time-management;
}
}
.i-advanced {
&:before {
content: $i-advanced;
}
}
.i-search {
&:before {
content: $i-search;
}
}
.i-view {
&:before {
content: $i-view;
}
}
.i-view-more {
&:before {
content: $i-view-more;
}
}
.i-view-next {
&:before {
content: $i-view-next;
}
}
.i-partners {
&:before {
content: $i-partners;
}
}
.i-contact {
&:before {
content: $i-contact;
}
}
.i-forums {
&:before {
content: $i-forums;
}
}
.i-github {
&:before {
content: $i-github;
}
}
.i-support {
&:before {
content: $i-support;
}
}
.i-collaborating {
&:before {
content: $i-collaborating;
}
}
.i-compare {
&:before {
content: $i-compare;
}
}
.i-themes {
&:before {
content: $i-themes;
}
}
.i-translate {
&:before {
content: $i-translate;
}
}
.i-release {
&:before {
content: $i-release;
}
}
.i-info {
&:before {
content: $i-info;
}
}
.i-warning {
&:before {
content: $i-warning;
}
}
.i-danger {
&:before {
content: $i-danger;
}
}
.i-note {
&:before {
content: $i-note;
}
}
.i-exercise {
&:before {
content: $i-exercise;
}
}
.i-lightbulb {
&:before {
content: $i-lightbulb;
}
}
.i-check {
&:before {
content: $i-check;
}
}
.i-edit {
&:before {
content: $i-edit;
}
}
.i-article {
&:before {
content: $i-article;
}
}
@@ -0,0 +1,164 @@
// ================================================
// ================ Mixins =======================
// ================================================
// Utilities
// ------------------------------------------------------------------
.o-no-select {
pointer-events: none;
cursor: default;
&, & * {
&::selection {
background: transparent;
}
&::-moz-selection {
background: transparent;
}
}
}
@mixin o-position-absolute($top: auto, $right: auto, $bottom: auto, $left: auto){
position: absolute;
top: $top;
left: $left;
bottom: $bottom;
right: $right;
}
@mixin o-transform-origin($x: 50%, $y: 50%, $z: 0){
-ms-transform-origin: $x $y $z;
-webkit-transform-origin: $x $y $z;
-moz-transform-origin: $x $y $z;
transform-origin: $x $y $z;
}
@mixin o-transition($property: all, $duration: 0s, $timing-function: ease, $transition-delay: 0s){
-webkit-transition: $property $duration $timing-function $transition-delay;
-moz-transition: $property $duration $timing-function $transition-delay;
-o-transition: $property $duration $timing-function $transition-delay;
transition: $property $duration $timing-function $transition-delay;
}
// Backgrounds
// ------------------------------------------------------------------
@mixin o-svg-bg($file_name,$file_ext,$x:50%, $y:50%, $repeat: no-repeat, $folder: ''){
$std-url: url("img/${folder}${file_name}.${file_ext}");
$svg-url: url("img/${folder}${file_name}.svg");
background-image: $std-url;
background-image: $svg-url;
background-position: $x $y;
background-repeat: $repeat;
}
@mixin o-retina-bg($img,$x:50%, $y:50%, $repeat: no-repeat, $folder: ''){
$std-url: url("img/${folder}${img}");
background-image: $std-url;
background-position: $x $y;
background-repeat: $repeat;
@media
only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and ( min--moz-device-pixel-ratio: 2),
only screen and ( -o-min-device-pixel-ratio: 2/1),
only screen and ( min-device-pixel-ratio: 2),
only screen and ( min-resolution: 192dpi),
only screen and ( min-resolution: 2dppx) {
// $2x-url: url("img/${folder}${website-2x-prefix}${img}");
background-image: url("img/${folder}${website-2x-prefix}${img}");
}
}
@mixin o-gradient($deg: 99deg , $startColor: $o-violet, $endColor: #62495B, $startOffset: 10%, $endOffset: 90%){
background: mix($startColor, $endColor);
background: -webkit-linear-gradient($deg, $startColor $startOffset, $endColor $endOffset);
background: -moz-linear-gradient($deg, $startColor $startOffset, $endColor $endOffset);
background: -ms-linear-gradient($deg, $startColor $startOffset, $endColor $endOffset);
background: -o-linear-gradient($deg, $startColor $startOffset, $endColor $endOffset);
background: linear-gradient($deg, $startColor $startOffset, $endColor $endOffset);
}
@mixin o-transform($args){
-webkit-transform : $args;
-moz-transform : $args;
-ms-transform : $args;
-o-transform : $args;
transform : $args;
}
//-- add icon
@mixin o-inline-icon($icon-content, $margin, $v-align: middle, $font-size: 1.5rem, $font-weight: $fw_regular) {
content: '#{$icon-content}';
font-family: 'icomoon' !important;
@include font-size($font-size);
font-weight: $font-weight;
vertical-align: $v-align;
margin: $margin;
}
//-- fix scroll issue
@mixin o-scroll-padding() {
content: '';
display: block;
width: 0;
height: 0;
padding-top: $o-header-height + 10px;
margin-top: -$o-header-height - 10px;
}
//-- has_col
@mixin o-pseudo-col(){
position: relative;
min-height: 1px;
padding-right: 15px;
padding-left: 15px;
float: left;
width: 100%;
}
@mixin o-code-col(){
/* content: ""; Deactivating o_has_code_column background */
background: $doc_code-bg;
/* @include box-shadow(inset 40px 0 40px -18px rgba(22, 24, 29, 0.3)); */
@include o-position-absolute($top: 3rem, $right:0);
width: 43%;
height: calc(100% - 3rem);
}
@mixin o-easter-egg($width: 100%, $height: 100%, $img: 'img/poule.svg' ){
position: relative;
// Easter Egg on hover 5s
&:after {
content: '';
display: block;
width: $width;
height: $height;
@include o-position-absolute(auto, 0, 0, 0);
background-image: url('#{$img}');
background-color: $white;
background-repeat: no-repeat;
opacity: 0;
visibility: hidden;
@include o-transition(all, .5s, ease-out, .5s);
}
&:hover:after {
opacity: 1;
visibility: visible;
@include o-transition(all, .5s, ease-in, 5s);
}
}
@function valid-radius($radius) {
$return: ();
@each $value in $radius {
@if type-of($value) == number {
$return: append($return, max($value, 0));
} @else {
$return: append($return, $value);
}
}
@return $return;
}
@@ -0,0 +1,787 @@
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
div.section::after {
display: block;
content: '';
clear: left;
}
/* -- relbar ---------------------------------------------------------------- */
/*
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
} */
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
/* ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
} */
ul.search li a {
font-weight: bold;
}
ul.search li p.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
/* div.body {
min-width: {{ theme_body_min_width|todim }};
max-width: {{ theme_body_max_width|todim }};
} */
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.brackets:before,
span.brackets > a:before{
content: "[";
}
a.brackets:after,
span.brackets > a:after {
content: "]";
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
img.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
/* .align-default {
text-align: center;
} */
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px;
background-color: #ffe;
width: 40%;
float: right;
clear: right;
overflow-x: auto;
}
p.sidebar-title {
font-weight: bold;
}
/* div.admonition, div.topic, blockquote {
clear: left;
} */
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- content of sidebars/topics/admonitions -------------------------------- */
/* div.sidebar > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
} */
/* div.sidebar::after,
div.topic::after,
div.admonition::after,
blockquote::after {
display: block;
content: '';
clear: both;
} */
/* -- tables ---------------------------------------------------------------- */
/* table.docutils {
margin-top: 10px;
margin-bottom: 10px;
border: 0;
border-collapse: collapse;
} */
table.align-center {
margin-left: auto;
margin-right: auto;
}
table.align-default {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
/* table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
} */
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
th > :first-child,
td > :first-child {
margin-top: 0px;
}
th > :last-child,
td > :last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
div.figure {
margin: 0.5em;
padding: 0.5em;
}
/* div.figure p.caption {
padding: 0.3em;
} */
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- hlist styles ---------------------------------------------------------- */
table.hlist {
margin: 1em 0;
}
table.hlist td {
vertical-align: top;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
:not(li) > ol > li:first-child > :first-child,
:not(li) > ul > li:first-child > :first-child {
margin-top: 0px;
}
:not(li) > ol > li:last-child > :last-child,
:not(li) > ul > li:last-child > :last-child {
margin-bottom: 0px;
}
ol.simple ol p,
ol.simple ul p,
ul.simple ol p,
ul.simple ul p {
margin-top: 0;
}
ol.simple > li:not(:first-child) > p,
ul.simple > li:not(:first-child) > p {
margin-top: 0;
}
ol.simple p,
ul.simple p {
margin-bottom: 0;
}
dl.footnote > dt,
dl.citation > dt {
float: left;
margin-right: 0.5em;
}
dl.footnote > dd,
dl.citation > dd {
margin-bottom: 0em;
}
dl.footnote > dd:after,
dl.citation > dd:after {
content: "";
clear: both;
}
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;
}
dl.field-list > dt {
font-weight: bold;
word-break: break-word;
padding-left: 0.5em;
padding-right: 5px;
}
dl.field-list > dt:after {
content: ":";
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
margin-left: 0em;
margin-bottom: 0em;
}
dl {
margin-bottom: 15px;
}
dd > :first-child {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dl > dd:last-child,
dl > dd:last-child > :last-child {
margin-bottom: 0;
}
/* dt:target, span.highlighted {
background-color: #fbe54e;
} */
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
/* .guilabel, .menuselection {
font-family: sans-serif;
} */
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
.classifier:before {
font-style: normal;
margin: 0.5em;
content: ":";
}
/* abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
} */
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
/* pre, div[class*="highlight-"] {
clear: both;
} */
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
}
/* div[class*="highlight-"] {
margin: 1em 0;
} */
td.linenos pre {
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
display: block;
}
table.highlighttable tbody {
display: block;
}
table.highlighttable tr {
display: flex;
}
table.highlighttable td {
margin: 0;
padding: 0;
}
table.highlighttable td.linenos {
padding-right: 0.5em;
}
table.highlighttable td.code {
flex: 1;
overflow: hidden;
}
/* .highlight .hll {
display: block;
} */
div.highlight pre,
table.highlighttable pre {
margin: 0;
}
div.code-block-caption + div {
margin-top: 0;
}
div.code-block-caption {
margin-top: 1em;
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
table.highlighttable td.linenos,
span.linenos,
div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none;
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
margin: 1em 0;
}
code.descname {
background-color: transparent;
font-weight: bold;
/* font-size: 1.2em; */
}
code.descclassname {
background-color: transparent;
}
/* code.xref, a code {
background-color: transparent;
font-weight: bold;
} */
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: absolute;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}
@@ -0,0 +1,81 @@
// =============================================================================
// Typography
// =============================================================================
//------------------------------------------------------------------------------
// Fonts
//------------------------------------------------------------------------------
@import url('https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@500&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap');
@font-face {
font-family: 'icomoon';
src: url('fonts/icomoon.woff2') format('woff2'),
url('fonts/icomoon.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: block;
}
html body{
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
//------------------------------------------------------------------------------
// Headings
//------------------------------------------------------------------------------
// Increase Inter's readability when used for huge titles.
@for $i from 1 through 4 {
.display-#{$i}, h#{$i}, .h#{$i} {
letter-spacing: (3 - $i) * -0.01em; // eg: display-1 -> -0.02em;
}
}
//------------------------------------------------------------------------------
// Font weight
//------------------------------------------------------------------------------
b, strong{
font-weight: $fw_bold;
}
a {
font-weight: $fw_semibold;
}
.fw_extralight {
font-weight: $fw_extralight;
}
.fw_light {
font-weight: $fw_light;
}
.fw_extralight, .fw_light{
label, b, strong, a {
font-weight: $fw_regular;
}
}
.fw_regular {
font-weight: $fw_regular;
}
.fw_medium {
font-weight: $fw_medium;
}
.fw_semibold {
font-weight: $fw_semibold;
}
.fw_bold {
font-weight: $fw_bold;
}
.fw_extrabold {
font-weight: $fw_extrabold;
}
.fw_black {
font-weight: $fw_black;
}
@@ -0,0 +1,252 @@
$o-pagination-main-border: #d8d8d8;
$grid-breakpoint-xxl: 1400px;
$grid-breakpoint-xxxl: 1680px;
$container-max-width-xxl:1380px;
$container-max-width-xxxl: 1560px;
// Paths and Prefixes
// ==============================================
$website-img-base-url : "../img";
$website-loading-url : "openerp_website/static/src/img/2016/gif/ring.gif";
$website-2x-prefix : "2x_";
// Animations and Transitions
// =====================
$o-ease: cubic-bezier(.55,0,.1,1);
// Events
// ===============================================
$country-events-list-gap : 15px;
// Odoo Colours
// ==============================================
$o-violet-dark : #875A7B;
$o-violet-darker : #603c5e;
$o-inverse-lightest : #98A6B0;
$o-inverse-light : #8B979F;
$o-inverse : #47738F;
$o-inverse-dark : #5B7687;
$o-inverse-darker : #485761;
//== Apps' Families Colours
$color-alpha : #00A09D;
$color-alpha-dark : #18856F;
$color-alpha-light : #26D1AF;
$color-alpha-lightest : #2AEBC4;
$color-beta : #5B899E;
$color-beta-dark : #3D5D6B;
$color-beta-light : #699FB8;
$color-beta-lightest : #77B5D1;
$color-gamma : #E46F78;
$color-gamma-dark : #B0565C;
$color-gamma-light : #FC7C84;
$color-gamma-lightest : #FC959C;
$color-delta : #5C5B80;
$color-delta-dark : #37364D;
$color-delta-light : #6E6D99;
$color-delta-lightest : #807FB3;
$color-epsilon : #D5653E;
$color-epsilon-dark : #A34E2F;
$color-epsilon-light : #F07346;
$color-epsilon-lightest : #FF8D63;
// Typography
// ===============================================
$font-family-serif: 'Roboto Slab', Georgia, "Times New Roman", Times, serif;
$fw_extralight: 200;
$fw_light: 300;
$fw_regular: 400;
$fw_medium: 500;
$fw_semibold: 600;
$fw_bold: 700;
$fw_extrabold: 800;
$fw_black: 900;
$font-size-secondary: .875rem;
//------------------------------------------------------------------------------
// icomoon icons
//------------------------------------------------------------------------------
$i-arrow-up: "\e948";
$i-arrow-down: "\e945";
$i-arrow-left: "\e946";
$i-arrow-right: "\e947";
$i-chevron-up: "\e94c";
$i-chevron-down: "\e949";
$i-chevron-left: "\e94a";
$i-chevron-right: "\e94b";
$i-link: "\e94f";
$i-websites: "\e944";
$i-sales: "\e953";
$i-sales_2: "\e931";
$i-marketing: "\e922";
$i-apps_1: "\e904";
$i-apps_2: "\e905";
$i-app_features: "\e902";
$i-app-favorites: "\e903";
$i-basics: "\e906";
$i-cart: "\e907";
$i-shop: "\e937";
$i-accountant: "\e900";
$i-customer-reviews: "\e90d";
$i-hr: "\e91c";
$i-developer: "\e90e";
$i-users: "\e93f";
$i-doc-hr: "\e90f";
$i-doc-apps: "\e910";
$i-doc-contribute: "\e911";
$i-doc-admin_2: "\e912";
$i-doc-dev: "\e92d";
$i-doc-services: "\e913";
$i-doc-admin: "\e933";
$i-documentation: "\e914";
$i-scaleup: "\e934";
$i-knowledge: "\e920";
$i-tutorial: "\e93e";
$i-elearning_1: "\e915";
$i-elearning_2: "\e916";
$i-install: "\e91e";
$i-o-edu: "\e926";
$i-certifications: "\e908";
$i-events: "\e917";
$i-showcase: "\e938";
$i-jobs: "\e91f";
$i-finances: "\e919";
$i-money-bag: "\e923";
$i-money-plant: "\e924";
$i-o-help: "\e927";
$i-o-logo: "\e928";
$i-o-services: "\e929";
$i-o-tour: "\e92a";
$i-services: "\e936";
$i-operations_1: "\e92b";
$i-operations_2: "\e92c";
$i-performance: "\e92f";
$i-time-management_2: "\e93b";
$i-time-management: "\e93c";
$i-advanced: "\e901";
$i-search: "\e935";
$i-view: "\e952";
$i-view-more: "\e950";
$i-view-next: "\e951";
$i-partners: "\e92e";
$i-contact: "\e90c";
$i-forums: "\e91a";
$i-github: "\e91b";
$i-support: "\e939";
$i-collaborating: "\e90a";
$i-compare: "\e90b";
$i-themes: "\e93a";
$i-translate: "\e93d";
$i-release: "\e930";
$i-info: "\e91d";
$i-warning: "\e943";
$i-danger: "\e94d";
$i-note: "\e925";
$i-exercise: "\e918";
$i-lightbulb: "\e921";
$i-check: "\e909";
$i-edit: "\e932";
$i-article: "\e94e";
//------------------------------------------------------------------------------
// Colors
//------------------------------------------------------------------------------
$o-violet: #875a7b;
$o-violet-dark: #7A436B;
$o-violet-darkest: #64305E;
$o-inverse-lightest: #98a6b0;
$o-inverse-light: #8b979f;
$o-inverse: #47738f;
$o-inverse-dark: #5b7687;
$o-inverse-darker: #485761;
$color-alpha: #00A19B;
$color-alpha-dark: #00807D;
$color-alpha-light: #26d1af;
$color-alpha-lightest: #2aebc4;
$color-beta: #5b899e;
$color-beta-dark: #3d5d6b;
$color-beta-light: #699fb8;
$color-beta-lightest: #77b5d1;
$color-gamma: #e46f78;
$color-gamma-dark: #b0565c;
$color-gamma-light: #fc7c84;
$color-gamma-lightest: #fc959c;
$color-delta: #5c5b80;
$color-delta-dark: #37364d;
$color-delta-light: #6e6d99;
$color-delta-lightest: #807fb3;
$color-epsilon: #d5653e;
$color-epsilon-dark: #a34e2f;
$color-epsilon-light: #f07346;
$color-epsilon-lightest: #ff8d63;
$header-link-normal: #343a40;
$gray-lightest: #F9F9F9;
$gray-lighter: #F2F2F2;
$gray-light: #d5d5d5;
$gray: #888888;
$gray-dark: #707070;
$gray-darker: #282F33;
$gray-darkest: shade-color($gray-darker, 30%);
$primary: $color-alpha-dark;
$secondary: $o-violet-dark;
$brand-primary : $o-violet;
$brand-success : #50AF51;
$brand-info: #4B9EB6;
$brand-warning : #f39c1e;
$brand-danger : #D9534F;
$doc_paper_dark: $gray-lighter;
$doc_paper: #ffffff;
$doc_exercise: #938E94;
$doc_code-bg: #F8F8F8;
$doc_lime: #CDDC39;
$doc_orange: #FF5722;
$doc_cyan: $color-alpha;
//------------------------------------------------------------------------------
// Misc
//------------------------------------------------------------------------------
// Header
$o-header-mobile-height: 50px;
$o-header-height: 90px;
$o-header-white: #ffffff;
// Navigation
$o-side-nav-width: 350px;
$o-on-page-width: 25%;
// o_has_code_column pages
$o-halfpage-width: 54%;
$o-codecol-width: 43%;
// Paths and Prefixes
$website-img-base-url: "../img/";
$website-2x-prefix: "2x_";
// Animations and Transitions
$o-ease: cubic-bezier(.55,0,.1,1);
@@ -0,0 +1,24 @@
//
// BS Variables
//
/* $enable-responsive-font-sizes: true; */
// Fonts
// Font, line-height, and color for body text, headings, and more.
$font-family-base: "Inter", "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif !default;
$h1-font-size: 1.875rem;
$h2-font-size: 1.5rem;
$h3-font-size: 1.125rem;
$h4-font-size: 1rem;
$h5-font-size: 1rem;
$h6-font-size: $font-size-secondary;
// Buttons
// For each of Bootstrap's buttons, define text, background, and border color.
$btn-font-size: $font-size-secondary;
$btn-font-weight: $fw_semibold;
$btn-focus-box-shadow: 0 0 0 transparent;
// Dropdowns
$dropdown-min-width: 4.5rem;
@@ -0,0 +1,125 @@
//
// Base styles
//
.accordion-button {
position: relative;
display: flex;
align-items: center;
width: 100%;
padding: $accordion-button-padding-y $accordion-button-padding-x;
@include font-size($font-size-base);
color: $accordion-button-color;
background-color: $accordion-button-bg;
border: $accordion-border-width solid $accordion-border-color;
@include border-radius(0);
overflow-anchor: none;
@include transition($accordion-transition);
&.collapsed {
border-bottom-width: 0;
}
&:not(.collapsed) {
color: $accordion-button-active-color;
background-color: $accordion-button-active-bg;
&::after {
background-image: escape-svg($accordion-button-active-icon);
transform: $accordion-icon-transform;
}
}
// Accordion icon
&::after {
flex-shrink: 0;
width: $accordion-icon-width;
height: $accordion-icon-width;
margin-left: auto;
content: "";
background-image: escape-svg($accordion-button-icon);
background-repeat: no-repeat;
background-size: $accordion-icon-width;
@include transition($accordion-icon-transition);
}
&:hover {
z-index: 2;
}
&:focus {
z-index: 3;
border-color: $accordion-button-focus-border-color;
outline: 0;
box-shadow: $accordion-button-focus-box-shadow;
}
}
.accordion-header {
margin-bottom: 0;
}
.accordion-item {
&:first-of-type {
.accordion-button {
@include border-top-radius($accordion-border-radius);
}
}
&:last-of-type {
.accordion-button {
// Only set a border-radius on the last item if the accordion is collapsed
&.collapsed {
border-bottom-width: $accordion-border-width;
@include border-bottom-radius($accordion-border-radius);
}
}
.accordion-collapse {
border-bottom-width: $accordion-border-width;
@include border-bottom-radius($accordion-border-radius);
}
}
}
.accordion-collapse {
border: solid $accordion-border-color;
border-width: 0 $accordion-border-width;
}
.accordion-body {
padding: $accordion-body-padding-y $accordion-body-padding-x;
}
// Flush accordion items
//
// Remove borders and border-radius to keep accordion items edge-to-edge.
.accordion-flush {
.accordion-button {
border-right: 0;
border-left: 0;
@include border-radius(0);
}
.accordion-collapse {
border-width: 0;
}
.accordion-item {
&:first-of-type {
.accordion-button {
border-top-width: 0;
@include border-top-radius(0);
}
}
&:last-of-type {
.accordion-button.collapsed {
border-bottom-width: 0;
@include border-bottom-radius(0);
}
}
}
}
@@ -0,0 +1,57 @@
//
// Base styles
//
.alert {
position: relative;
padding: $alert-padding-y $alert-padding-x;
margin-bottom: $alert-margin-bottom;
border: $alert-border-width solid transparent;
@include border-radius($alert-border-radius);
}
// Headings for larger alerts
.alert-heading {
// Specified to prevent conflicts of changing $headings-color
color: inherit;
}
// Provide class for links that match alerts
.alert-link {
font-weight: $alert-link-font-weight;
}
// Dismissible alerts
//
// Expand the right padding and account for the close button's positioning.
.alert-dismissible {
padding-right: $alert-dismissible-padding-r;
// Adjust close link position
.btn-close {
position: absolute;
top: 0;
right: 0;
z-index: $stretched-link-z-index + 1;
padding: $alert-padding-y * 1.25 $alert-padding-x;
}
}
// scss-docs-start alert-modifiers
// Generate contextual modifier classes for colorizing the alert.
@each $state, $value in $theme-colors {
$background: shift-color($value, $alert-bg-scale);
$border: shift-color($value, $alert-border-scale);
$color: shift-color($value, $alert-color-scale);
@if (contrast-ratio($background, $color) < $min-contrast-ratio) {
$color: mix($value, color-contrast($background), abs($alert-color-scale));
}
.alert-#{$state} {
@include alert-variant($background, $border, $color);
}
}
// scss-docs-end alert-modifiers
@@ -0,0 +1,29 @@
// Base class
//
// Requires one of the contextual, color modifier classes for `color` and
// `background-color`.
.badge {
display: inline-block;
padding: $badge-padding-y $badge-padding-x;
@include font-size($badge-font-size);
font-weight: $badge-font-weight;
line-height: 1;
color: $badge-color;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
@include border-radius($badge-border-radius);
@include gradient-bg();
// Empty badges collapse automatically
&:empty {
display: none;
}
}
// Quick fix for badges in buttons
.btn .badge {
position: relative;
top: -1px;
}
@@ -0,0 +1,28 @@
.breadcrumb {
display: flex;
flex-wrap: wrap;
padding: $breadcrumb-padding-y $breadcrumb-padding-x;
margin-bottom: $breadcrumb-margin-bottom;
@include font-size($breadcrumb-font-size);
list-style: none;
background-color: $breadcrumb-bg;
@include border-radius($breadcrumb-border-radius);
}
.breadcrumb-item {
// The separator between breadcrumbs (by default, a forward-slash: "/")
+ .breadcrumb-item {
padding-left: $breadcrumb-item-padding-x;
&::before {
float: left; // Suppress inline spacings and underlining of the separator
padding-right: $breadcrumb-item-padding-x;
color: $breadcrumb-divider-color;
content: var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"};
}
}
&.active {
color: $breadcrumb-active-color;
}
}
@@ -0,0 +1,139 @@
// Make the div behave like a button
.btn-group,
.btn-group-vertical {
position: relative;
display: inline-flex;
vertical-align: middle; // match .btn alignment given font-size hack above
> .btn {
position: relative;
flex: 1 1 auto;
}
// Bring the hover, focused, and "active" buttons to the front to overlay
// the borders properly
> .btn-check:checked + .btn,
> .btn-check:focus + .btn,
> .btn:hover,
> .btn:focus,
> .btn:active,
> .btn.active {
z-index: 1;
}
}
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
.input-group {
width: auto;
}
}
.btn-group {
// Prevent double borders when buttons are next to each other
> .btn:not(:first-child),
> .btn-group:not(:first-child) {
margin-left: -$btn-border-width;
}
// Reset rounded corners
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn-group:not(:last-child) > .btn {
@include border-end-radius(0);
}
// The left radius should be 0 if the button is:
// - the "third or more" child
// - the second child and the previous element isn't `.btn-check` (making it the first child visually)
// - part of a btn-group which isn't the first child
> .btn:nth-child(n + 3),
> :not(.btn-check) + .btn,
> .btn-group:not(:first-child) > .btn {
@include border-start-radius(0);
}
}
// Sizing
//
// Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-sm > .btn { @extend .btn-sm; }
.btn-group-lg > .btn { @extend .btn-lg; }
//
// Split button dropdowns
//
.dropdown-toggle-split {
padding-right: $btn-padding-x * .75;
padding-left: $btn-padding-x * .75;
&::after,
.dropup &::after,
.dropend &::after {
margin-left: 0;
}
.dropstart &::before {
margin-right: 0;
}
}
.btn-sm + .dropdown-toggle-split {
padding-right: $btn-padding-x-sm * .75;
padding-left: $btn-padding-x-sm * .75;
}
.btn-lg + .dropdown-toggle-split {
padding-right: $btn-padding-x-lg * .75;
padding-left: $btn-padding-x-lg * .75;
}
// The clickable button for toggling the menu
// Set the same inset shadow as the :active state
.btn-group.show .dropdown-toggle {
@include box-shadow($btn-active-box-shadow);
// Show no shadow for `.btn-link` since it has no other button styles.
&.btn-link {
@include box-shadow(none);
}
}
//
// Vertical button groups
//
.btn-group-vertical {
flex-direction: column;
align-items: flex-start;
justify-content: center;
> .btn,
> .btn-group {
width: 100%;
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) {
margin-top: -$btn-border-width;
}
// Reset rounded corners
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn-group:not(:last-child) > .btn {
@include border-bottom-radius(0);
}
> .btn ~ .btn,
> .btn-group:not(:first-child) > .btn {
@include border-top-radius(0);
}
}
@@ -0,0 +1,109 @@
//
// Base styles
//
.btn {
display: inline-block;
font-family: $btn-font-family;
font-weight: $btn-font-weight;
line-height: $btn-line-height;
color: $body-color;
text-align: center;
text-decoration: if($link-decoration == none, null, none);
white-space: $btn-white-space;
vertical-align: middle;
cursor: if($enable-button-pointers, pointer, null);
user-select: none;
background-color: transparent;
border: $btn-border-width solid transparent;
@include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-border-radius);
@include transition($btn-transition);
&:hover {
color: $body-color;
text-decoration: if($link-hover-decoration == underline, none, null);
}
.btn-check:focus + &,
&:focus {
outline: 0;
box-shadow: $btn-focus-box-shadow;
}
.btn-check:checked + &,
.btn-check:active + &,
&:active,
&.active {
@include box-shadow($btn-active-box-shadow);
&:focus {
@include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
}
}
&:disabled,
&.disabled,
fieldset:disabled & {
pointer-events: none;
opacity: $btn-disabled-opacity;
@include box-shadow(none);
}
}
//
// Alternate buttons
//
@each $color, $value in $theme-colors {
.btn-#{$color} {
@include button-variant($value, $value);
}
}
@each $color, $value in $theme-colors {
.btn-outline-#{$color} {
@include button-outline-variant($value);
}
}
//
// Link buttons
//
// Make a button look and behave like a link
.btn-link {
font-weight: $font-weight-normal;
color: $btn-link-color;
text-decoration: $link-decoration;
&:hover {
color: $btn-link-hover-color;
text-decoration: $link-hover-decoration;
}
&:focus {
text-decoration: $link-hover-decoration;
}
&:disabled,
&.disabled {
color: $btn-link-disabled-color;
}
// No need for an active state here
}
//
// Button Sizes
//
.btn-lg {
@include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);
}
.btn-sm {
@include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);
}
@@ -0,0 +1,215 @@
//
// Base styles
//
.card {
position: relative;
display: flex;
flex-direction: column;
min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
height: $card-height;
word-wrap: break-word;
background-color: $card-bg;
background-clip: border-box;
border: $card-border-width solid $card-border-color;
@include border-radius($card-border-radius);
> hr {
margin-right: 0;
margin-left: 0;
}
> .list-group {
border-top: inherit;
border-bottom: inherit;
&:first-child {
border-top-width: 0;
@include border-top-radius($card-inner-border-radius);
}
&:last-child {
border-bottom-width: 0;
@include border-bottom-radius($card-inner-border-radius);
}
}
// Due to specificity of the above selector (`.card > .list-group`), we must
// use a child selector here to prevent double borders.
> .card-header + .list-group,
> .list-group + .card-footer {
border-top: 0;
}
}
.card-body {
// Enable `flex-grow: 1` for decks and groups so that card blocks take up
// as much space as possible, ensuring footers are aligned to the bottom.
flex: 1 1 auto;
padding: $card-spacer-y $card-spacer-x;
color: $card-color;
}
.card-title {
margin-bottom: $card-title-spacer-y;
}
.card-subtitle {
margin-top: -$card-title-spacer-y / 2;
margin-bottom: 0;
}
.card-text:last-child {
margin-bottom: 0;
}
.card-link {
&:hover {
text-decoration: none;
}
+ .card-link {
margin-left: $card-spacer-x #{"/* rtl:ignore */"};
}
}
//
// Optional textual caps
//
.card-header {
padding: $card-cap-padding-y $card-cap-padding-x;
margin-bottom: 0; // Removes the default margin-bottom of <hN>
color: $card-cap-color;
background-color: $card-cap-bg;
border-bottom: $card-border-width solid $card-border-color;
&:first-child {
@include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
}
}
.card-footer {
padding: $card-cap-padding-y $card-cap-padding-x;
color: $card-cap-color;
background-color: $card-cap-bg;
border-top: $card-border-width solid $card-border-color;
&:last-child {
@include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
}
}
//
// Header navs
//
.card-header-tabs {
margin-right: -$card-cap-padding-x / 2;
margin-bottom: -$card-cap-padding-y;
margin-left: -$card-cap-padding-x / 2;
border-bottom: 0;
@if $nav-tabs-link-active-bg != $card-bg {
.nav-link.active {
background-color: $card-bg;
border-bottom-color: $card-bg;
}
}
}
.card-header-pills {
margin-right: -$card-cap-padding-x / 2;
margin-left: -$card-cap-padding-x / 2;
}
// Card image
.card-img-overlay {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
padding: $card-img-overlay-padding;
@include border-radius($card-inner-border-radius);
}
.card-img,
.card-img-top,
.card-img-bottom {
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
}
.card-img,
.card-img-top {
@include border-top-radius($card-inner-border-radius);
}
.card-img,
.card-img-bottom {
@include border-bottom-radius($card-inner-border-radius);
}
//
// Card groups
//
.card-group {
// The child selector allows nested `.card` within `.card-group`
// to display properly.
> .card {
margin-bottom: $card-group-margin;
}
@include media-breakpoint-up(sm) {
display: flex;
flex-flow: row wrap;
// The child selector allows nested `.card` within `.card-group`
// to display properly.
> .card {
// Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
flex: 1 0 0%;
margin-bottom: 0;
+ .card {
margin-left: 0;
border-left: 0;
}
// Handle rounded corners
@if $enable-rounded {
&:not(:last-child) {
@include border-end-radius(0);
.card-img-top,
.card-header {
// stylelint-disable-next-line property-disallowed-list
border-top-right-radius: 0;
}
.card-img-bottom,
.card-footer {
// stylelint-disable-next-line property-disallowed-list
border-bottom-right-radius: 0;
}
}
&:not(:first-child) {
@include border-start-radius(0);
.card-img-top,
.card-header {
// stylelint-disable-next-line property-disallowed-list
border-top-left-radius: 0;
}
.card-img-bottom,
.card-footer {
// stylelint-disable-next-line property-disallowed-list
border-bottom-left-radius: 0;
}
}
}
}
}
}
@@ -0,0 +1,223 @@
// Notes on the classes:
//
// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)
// even when their scroll action started on a carousel, but for compatibility (with Firefox)
// we're preventing all actions instead
// 2. The .carousel-item-start and .carousel-item-end is used to indicate where
// the active slide is heading.
// 3. .active.carousel-item is the current slide.
// 4. .active.carousel-item-start and .active.carousel-item-end is the current
// slide in its in-transition state. Only one of these occurs at a time.
// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end
// is the upcoming slide in transition.
.carousel {
position: relative;
}
.carousel.pointer-event {
touch-action: pan-y;
}
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
@include clearfix();
}
.carousel-item {
position: relative;
display: none;
float: left;
width: 100%;
margin-right: -100%;
backface-visibility: hidden;
@include transition($carousel-transition);
}
.carousel-item.active,
.carousel-item-next,
.carousel-item-prev {
display: block;
}
/* rtl:begin:ignore */
.carousel-item-next:not(.carousel-item-start),
.active.carousel-item-end {
transform: translateX(100%);
}
.carousel-item-prev:not(.carousel-item-end),
.active.carousel-item-start {
transform: translateX(-100%);
}
/* rtl:end:ignore */
//
// Alternate transitions
//
.carousel-fade {
.carousel-item {
opacity: 0;
transition-property: opacity;
transform: none;
}
.carousel-item.active,
.carousel-item-next.carousel-item-start,
.carousel-item-prev.carousel-item-end {
z-index: 1;
opacity: 1;
}
.active.carousel-item-start,
.active.carousel-item-end {
z-index: 0;
opacity: 0;
@include transition(opacity 0s $carousel-transition-duration);
}
}
//
// Left/right controls for nav
//
.carousel-control-prev,
.carousel-control-next {
position: absolute;
top: 0;
bottom: 0;
z-index: 1;
// Use flex for alignment (1-3)
display: flex; // 1. allow flex styles
align-items: center; // 2. vertically center contents
justify-content: center; // 3. horizontally center contents
width: $carousel-control-width;
color: $carousel-control-color;
text-align: center;
opacity: $carousel-control-opacity;
@include transition($carousel-control-transition);
// Hover/focus state
&:hover,
&:focus {
color: $carousel-control-color;
text-decoration: none;
outline: 0;
opacity: $carousel-control-hover-opacity;
}
}
.carousel-control-prev {
left: 0;
background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null);
}
.carousel-control-next {
right: 0;
background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null);
}
// Icons for within
.carousel-control-prev-icon,
.carousel-control-next-icon {
display: inline-block;
width: $carousel-control-icon-width;
height: $carousel-control-icon-width;
background-repeat: no-repeat;
background-position: 50%;
background-size: 100% 100%;
}
/* rtl:options: {
"autoRename": true,
"stringMap":[ {
"name" : "prev-next",
"search" : "prev",
"replace" : "next"
} ]
} */
.carousel-control-prev-icon {
background-image: escape-svg($carousel-control-prev-icon-bg);
}
.carousel-control-next-icon {
background-image: escape-svg($carousel-control-next-icon-bg);
}
// Optional indicator pips
//
// Add an ordered list with the following class and add a list item for each
// slide your carousel holds.
.carousel-indicators {
position: absolute;
right: 0;
bottom: 0;
left: 0;
z-index: 2;
display: flex;
justify-content: center;
padding-left: 0; // override <ol> default
// Use the .carousel-control's width as margin so we don't overlay those
margin-right: $carousel-control-width;
margin-left: $carousel-control-width;
list-style: none;
li {
box-sizing: content-box;
flex: 0 1 auto;
width: $carousel-indicator-width;
height: $carousel-indicator-height;
margin-right: $carousel-indicator-spacer;
margin-left: $carousel-indicator-spacer;
text-indent: -999px;
cursor: pointer;
background-color: $carousel-indicator-active-bg;
background-clip: padding-box;
// Use transparent borders to increase the hit area by 10px on top and bottom.
border-top: $carousel-indicator-hit-area-height solid transparent;
border-bottom: $carousel-indicator-hit-area-height solid transparent;
opacity: $carousel-indicator-opacity;
@include transition($carousel-indicator-transition);
}
.active {
opacity: $carousel-indicator-active-opacity;
}
}
// Optional captions
//
//
.carousel-caption {
position: absolute;
right: (100% - $carousel-caption-width) / 2;
bottom: $carousel-caption-spacer;
left: (100% - $carousel-caption-width) / 2;
padding-top: $carousel-caption-padding-y;
padding-bottom: $carousel-caption-padding-y;
color: $carousel-caption-color;
text-align: center;
}
// Dark mode carousel
.carousel-dark {
.carousel-control-prev-icon,
.carousel-control-next-icon {
filter: $carousel-dark-control-icon-filter;
}
.carousel-indicators li {
background-color: $carousel-dark-indicator-active-bg;
}
.carousel-caption {
color: $carousel-dark-caption-color;
}
}
@@ -0,0 +1,40 @@
// transparent background and border properties included for button version.
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
.btn-close {
box-sizing: content-box;
width: $btn-close-width;
height: $btn-close-height;
padding: $btn-close-padding-y $btn-close-padding-x;
color: $btn-close-color;
background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements
border: 0; // for button elements
@include border-radius();
opacity: $btn-close-opacity;
// Override <a>'s hover style
&:hover {
color: $btn-close-color;
text-decoration: none;
opacity: $btn-close-hover-opacity;
}
&:focus {
outline: none;
box-shadow: $btn-close-focus-shadow;
opacity: $btn-close-focus-opacity;
}
&:disabled,
&.disabled {
pointer-events: none;
user-select: none;
opacity: $btn-close-disabled-opacity;
}
}
.btn-close-white {
filter: $btn-close-white-filter;
}
@@ -0,0 +1,41 @@
// Container widths
//
// Set the container width, and override it for fixed navbars in media queries.
@if $enable-grid-classes {
// Single container class with breakpoint max-widths
.container,
// 100% wide container at all breakpoints
.container-fluid {
@include make-container();
}
// Responsive containers that are 100% wide until a breakpoint
@each $breakpoint, $container-max-width in $container-max-widths {
.container-#{$breakpoint} {
@extend .container-fluid;
}
@include media-breakpoint-up($breakpoint, $grid-breakpoints) {
%responsive-container-#{$breakpoint} {
max-width: $container-max-width;
}
// Extend each breakpoint which is smaller or equal to the current breakpoint
$extend-breakpoint: true;
@each $name, $width in $grid-breakpoints {
@if ($extend-breakpoint) {
.container#{breakpoint-infix($name, $grid-breakpoints)} {
@extend %responsive-container-#{$breakpoint};
}
// Once the current breakpoint is reached, stop extending
@if ($breakpoint == $name) {
$extend-breakpoint: false;
}
}
}
}
}
}
@@ -0,0 +1,235 @@
// The dropdown wrapper (`<div>`)
.dropup,
.dropend,
.dropdown,
.dropstart {
position: relative;
}
.dropdown-toggle {
white-space: nowrap;
// Generate the caret automatically
@include caret();
}
// The dropdown menu
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: $zindex-dropdown;
display: none; // none by default, but block on "open" of the menu
min-width: $dropdown-min-width;
padding: $dropdown-padding-y $dropdown-padding-x;
margin: $dropdown-spacer 0 0; // override default ul
@include font-size($dropdown-font-size);
color: $dropdown-color;
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
list-style: none;
background-color: $dropdown-bg;
background-clip: padding-box;
border: $dropdown-border-width solid $dropdown-border-color;
@include border-radius($dropdown-border-radius);
@include box-shadow($dropdown-box-shadow);
// Reset positioning when positioned with Popper
&[style] {
right: auto !important; // stylelint-disable-line declaration-no-important
}
}
// scss-docs-start responsive-breakpoints
// We deliberately hardcode the `bs-` prefix because we check
// this custom property in JS to determine Popper's positioning
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.dropdown-menu#{$infix}-start {
--bs-position: start;
right: auto #{"/* rtl:ignore */"};
left: 0 #{"/* rtl:ignore */"};
}
.dropdown-menu#{$infix}-end {
--bs-position: end;
right: 0 #{"/* rtl:ignore */"};
left: auto #{"/* rtl:ignore */"};
}
}
}
// scss-docs-end responsive-breakpoints
// Allow for dropdowns to go bottom up (aka, dropup-menu)
// Just add .dropup after the standard .dropdown class and you're set.
.dropup {
.dropdown-menu {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(up);
}
}
.dropend {
.dropdown-menu {
top: 0;
right: auto;
left: 100%;
margin-top: 0;
margin-left: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(end);
&::after {
vertical-align: 0;
}
}
}
.dropstart {
.dropdown-menu {
top: 0;
right: 100%;
left: auto;
margin-top: 0;
margin-right: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(start);
&::before {
vertical-align: 0;
}
}
}
// Dividers (basically an `<hr>`) within the dropdown
.dropdown-divider {
height: 0;
margin: $dropdown-divider-margin-y 0;
overflow: hidden;
border-top: 1px solid $dropdown-divider-bg;
}
// Links, buttons, and more within the dropdown menu
//
// `<button>`-specific styles are denoted with `// For <button>s`
.dropdown-item {
display: block;
width: 100%; // For `<button>`s
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
clear: both;
font-weight: $font-weight-normal;
color: $dropdown-link-color;
text-align: inherit; // For `<button>`s
text-decoration: if($link-decoration == none, null, none);
white-space: nowrap; // prevent links from randomly breaking onto new lines
background-color: transparent; // For `<button>`s
border: 0; // For `<button>`s
// Prevent dropdown overflow if there's no padding
// See https://github.com/twbs/bootstrap/pull/27703
@if $dropdown-padding-y == 0 {
&:first-child {
@include border-top-radius($dropdown-inner-border-radius);
}
&:last-child {
@include border-bottom-radius($dropdown-inner-border-radius);
}
}
&:hover,
&:focus {
color: $dropdown-link-hover-color;
text-decoration: if($link-hover-decoration == underline, none, null);
@include gradient-bg($dropdown-link-hover-bg);
}
&.active,
&:active {
color: $dropdown-link-active-color;
text-decoration: none;
@include gradient-bg($dropdown-link-active-bg);
}
&.disabled,
&:disabled {
color: $dropdown-link-disabled-color;
pointer-events: none;
background-color: transparent;
// Remove CSS gradients if they're enabled
background-image: if($enable-gradients, none, null);
}
}
.dropdown-menu.show {
display: block;
}
// Dropdown section headers
.dropdown-header {
display: block;
padding: $dropdown-header-padding;
margin-bottom: 0; // for use with heading elements
@include font-size($font-size-sm);
color: $dropdown-header-color;
white-space: nowrap; // as with > li > a
}
// Dropdown text
.dropdown-item-text {
display: block;
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
color: $dropdown-link-color;
}
// Dark dropdowns
.dropdown-menu-dark {
color: $dropdown-dark-color;
background-color: $dropdown-dark-bg;
border-color: $dropdown-dark-border-color;
@include box-shadow($dropdown-dark-box-shadow);
.dropdown-item {
color: $dropdown-dark-link-color;
&:hover,
&:focus {
color: $dropdown-dark-link-hover-color;
@include gradient-bg($dropdown-dark-link-hover-bg);
}
&.active,
&:active {
color: $dropdown-dark-link-active-color;
@include gradient-bg($dropdown-dark-link-active-bg);
}
&.disabled,
&:disabled {
color: $dropdown-dark-link-disabled-color;
}
}
.dropdown-divider {
border-color: $dropdown-dark-divider-bg;
}
.dropdown-item-text {
color: $dropdown-dark-link-color;
}
.dropdown-header {
color: $dropdown-dark-header-color;
}
}
@@ -0,0 +1,9 @@
@import "forms/labels";
@import "forms/form-text";
@import "forms/form-control";
@import "forms/form-select";
@import "forms/form-check";
@import "forms/form-range";
@import "forms/floating-labels";
@import "forms/input-group";
@import "forms/validation";
@@ -0,0 +1,205 @@
// Bootstrap functions
//
// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
// Ascending
// Used to evaluate Sass maps like our grid breakpoints.
@mixin _assert-ascending($map, $map-name) {
$prev-key: null;
$prev-num: null;
@each $key, $num in $map {
@if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" {
// Do nothing
} @else if not comparable($prev-num, $num) {
@warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
} @else if $prev-num >= $num {
@warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
}
$prev-key: $key;
$prev-num: $num;
}
}
// Starts at zero
// Used to ensure the min-width of the lowest breakpoint starts at 0.
@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
@if length($map) > 0 {
$values: map-values($map);
$first-value: nth($values, 1);
@if $first-value != 0 {
@warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
}
}
}
// Internal Bootstrap function to turn maps into its negative variant.
// It prefixes the keys with `n` and makes the value negative.
@function negativify-map($map) {
$result: ();
@each $key, $value in $map {
@if $key != 0 {
$result: map-merge($result, ("n" + $key: (-$value)));
}
}
@return $result;
}
// Get multiple keys from a sass map
@function map-get-multiple($map, $values) {
$result: ();
@each $key, $value in $map {
@if (index($values, $key) != null) {
$result: map-merge($result, ($key: $value));
}
}
@return $result;
}
// Replace `$search` with `$replace` in `$string`
// Used on our SVG icon backgrounds for custom forms.
//
// @author Hugo Giraudel
// @param {String} $string - Initial string
// @param {String} $search - Substring to replace
// @param {String} $replace ('') - New value
// @return {String} - Updated string
@function str-replace($string, $search, $replace: "") {
$index: str-index($string, $search);
@if $index {
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
}
@return $string;
}
// See https://codepen.io/kevinweber/pen/dXWoRw
//
// Requires the use of quotes around data URIs.
@function escape-svg($string) {
@if str-index($string, "data:image/svg+xml") {
@each $char, $encoded in $escaped-characters {
// Do not escape the url brackets
@if str-index($string, "url(") == 1 {
$string: url("#{str-replace(str-slice($string, 6, -3), $char, $encoded)}");
} @else {
$string: str-replace($string, $char, $encoded);
}
}
}
@return $string;
}
// Color contrast
// See https://github.com/twbs/bootstrap/pull/30168
// A list of pre-calculated numbers of pow(($value / 255 + .055) / 1.055, 2.4). (from 0 to 255)
// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern
$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;
@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {
$foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;
$max-ratio: 0;
$max-ratio-color: null;
@each $color in $foregrounds {
$contrast-ratio: contrast-ratio($background, $color);
@if $contrast-ratio > $min-contrast-ratio {
@return $color;
} @else if $contrast-ratio > $max-ratio {
$max-ratio: $contrast-ratio;
$max-ratio-color: $color;
}
}
@warn "Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...";
@return $max-ratio-color;
}
@function contrast-ratio($background, $foreground: $color-contrast-light) {
$l1: luminance($background);
$l2: luminance(opaque($background, $foreground));
@return if($l1 > $l2, ($l1 + .05) / ($l2 + .05), ($l2 + .05) / ($l1 + .05));
}
// Return WCAG2.0 relative luminance
// See https://www.w3.org/WAI/GL/wiki/Relative_luminance
// See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
@function luminance($color) {
$rgb: (
"r": red($color),
"g": green($color),
"b": blue($color)
);
@each $name, $value in $rgb {
$value: if($value / 255 < .03928, $value / 255 / 12.92, nth($_luminance-list, $value + 1));
$rgb: map-merge($rgb, ($name: $value));
}
@return (map-get($rgb, "r") * .2126) + (map-get($rgb, "g") * .7152) + (map-get($rgb, "b") * .0722);
}
// Return opaque color
// opaque(#fff, rgba(0, 0, 0, .5)) => #808080
@function opaque($background, $foreground) {
@return mix(rgba($foreground, 1), $background, opacity($foreground) * 100);
}
// scss-docs-start color-functions
// Tint a color: mix a color with white
@function tint-color($color, $weight) {
@return mix(white, $color, $weight);
}
// Shade a color: mix a color with black
@function shade-color($color, $weight) {
@return mix(black, $color, $weight);
}
// Shade the color if the weight is positive, else tint it
@function shift-color($color, $weight) {
@return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));
}
// scss-docs-end color-functions
// Return valid calc
@function add($value1, $value2, $return-calc: true) {
@if $value1 == null {
@return $value2;
}
@if $value2 == null {
@return $value1;
}
@if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
@return $value1 + $value2;
}
@return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(" + ") + $value2);
}
@function subtract($value1, $value2, $return-calc: true) {
@if $value1 == null and $value2 == null {
@return null;
}
@if $value1 == null {
@return -$value2;
}
@if $value2 == null {
@return $value1;
}
@if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
@return $value1 - $value2;
}
@return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2);
}
@@ -0,0 +1,22 @@
// Row
//
// Rows contain your columns.
@if $enable-grid-classes {
.row {
@include make-row();
> * {
@include make-col-ready();
}
}
}
// Columns
//
// Common styles for small and large grid columns
@if $enable-grid-classes {
@include make-grid-columns();
}
@@ -0,0 +1,7 @@
@import "helpers/clearfix";
@import "helpers/colored-links";
@import "helpers/ratio";
@import "helpers/position";
@import "helpers/visually-hidden";
@import "helpers/stretched-link";
@import "helpers/text-truncation";
@@ -0,0 +1,42 @@
// Responsive images (ensure images don't scale beyond their parents)
//
// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
// We previously tried the "images are responsive by default" approach in Bootstrap v2,
// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
// which weren't expecting the images within themselves to be involuntarily resized.
// See also https://github.com/twbs/bootstrap/issues/18178
.img-fluid {
@include img-fluid();
}
// Image thumbnails
.img-thumbnail {
padding: $thumbnail-padding;
background-color: $thumbnail-bg;
border: $thumbnail-border-width solid $thumbnail-border-color;
@include border-radius($thumbnail-border-radius);
@include box-shadow($thumbnail-box-shadow);
// Keep them at most 100% wide
@include img-fluid();
}
//
// Figures
//
.figure {
// Ensures the caption's text aligns with the image.
display: inline-block;
}
.figure-img {
margin-bottom: $spacer / 2;
line-height: 1;
}
.figure-caption {
@include font-size($figure-caption-font-size);
color: $figure-caption-color;
}
@@ -0,0 +1,163 @@
// Base class
//
// Easily usable on <ul>, <ol>, or <div>.
.list-group {
display: flex;
flex-direction: column;
// No need to set list-style: none; since .list-group-item is block level
padding-left: 0; // reset padding because ul and ol
margin-bottom: 0;
@include border-radius($list-group-border-radius);
}
// Interactive list items
//
// Use anchor or button elements instead of `li`s or `div`s to create interactive
// list items. Includes an extra `.active` modifier class for selected items.
.list-group-item-action {
width: 100%; // For `<button>`s (anchors become 100% by default though)
color: $list-group-action-color;
text-align: inherit; // For `<button>`s (anchors inherit)
// Hover state
&:hover,
&:focus {
z-index: 1; // Place hover/focus items above their siblings for proper border styling
color: $list-group-action-hover-color;
text-decoration: none;
background-color: $list-group-hover-bg;
}
&:active {
color: $list-group-action-active-color;
background-color: $list-group-action-active-bg;
}
}
// Individual list items
//
// Use on `li`s or `div`s within the `.list-group` parent.
.list-group-item {
position: relative;
display: block;
padding: $list-group-item-padding-y $list-group-item-padding-x;
color: $list-group-color;
text-decoration: if($link-decoration == none, null, none);
background-color: $list-group-bg;
border: $list-group-border-width solid $list-group-border-color;
&:first-child {
@include border-top-radius(inherit);
}
&:last-child {
@include border-bottom-radius(inherit);
}
&.disabled,
&:disabled {
color: $list-group-disabled-color;
pointer-events: none;
background-color: $list-group-disabled-bg;
}
// Include both here for `<a>`s and `<button>`s
&.active {
z-index: 2; // Place active items above their siblings for proper border styling
color: $list-group-active-color;
background-color: $list-group-active-bg;
border-color: $list-group-active-border-color;
}
& + & {
border-top-width: 0;
&.active {
margin-top: -$list-group-border-width;
border-top-width: $list-group-border-width;
}
}
}
// Horizontal
//
// Change the layout of list group items from vertical (default) to horizontal.
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.list-group-horizontal#{$infix} {
flex-direction: row;
> .list-group-item {
&:first-child {
@include border-bottom-start-radius($list-group-border-radius);
@include border-top-end-radius(0);
}
&:last-child {
@include border-top-end-radius($list-group-border-radius);
@include border-bottom-start-radius(0);
}
&.active {
margin-top: 0;
}
+ .list-group-item {
border-top-width: $list-group-border-width;
border-left-width: 0;
&.active {
margin-left: -$list-group-border-width;
border-left-width: $list-group-border-width;
}
}
}
}
}
}
// Flush list items
//
// Remove borders and border-radius to keep list group items edge-to-edge. Most
// useful within other components (e.g., cards).
.list-group-flush {
@include border-radius(0);
> .list-group-item {
border-width: 0 0 $list-group-border-width;
&:last-child {
border-bottom-width: 0;
}
}
}
// scss-docs-start list-group-modifiers
// List group contextual variants
//
// Add modifier classes to change text and background color on individual items.
// Organizationally, this must come after the `:hover` states.
@each $state, $value in $theme-colors {
$background: shift-color($value, $list-group-item-bg-scale);
$color: shift-color($value, $list-group-item-color-scale);
@if (contrast-ratio($background, $color) < $min-contrast-ratio) {
$color: mix($value, color-contrast($background), abs($alert-color-scale));
}
@include list-group-item-variant($state, $background, $color);
}
// scss-docs-end list-group-modifiers
@@ -0,0 +1,41 @@
// Toggles
//
// Used in conjunction with global variables to enable certain theme features.
// Vendor
@import "vendor/rfs";
// Deprecate
@import "mixins/deprecate";
// Helpers
@import "mixins/breakpoints";
@import "mixins/image";
@import "mixins/resize";
@import "mixins/visually-hidden";
@import "mixins/reset-text";
@import "mixins/text-truncate";
// Utilities
@import "mixins/utilities";
// Components
@import "mixins/alert";
@import "mixins/buttons";
@import "mixins/caret";
@import "mixins/pagination";
@import "mixins/lists";
@import "mixins/list-group";
@import "mixins/forms";
@import "mixins/table-variants";
// Skins
@import "mixins/border-radius";
@import "mixins/box-shadow";
@import "mixins/gradients";
@import "mixins/transition";
// Layout
@import "mixins/clearfix";
@import "mixins/container";
@import "mixins/grid";
@@ -0,0 +1,235 @@
// .modal-open - body class for killing the scroll
// .modal - container to scroll within
// .modal-dialog - positioning shell for the actual modal
// .modal-content - actual modal w/ bg and corners and stuff
.modal-open {
// Kill the scroll on the body
overflow: hidden;
.modal {
overflow-x: hidden;
overflow-y: auto;
}
}
// Container that the modal scrolls within
.modal {
position: fixed;
top: 0;
left: 0;
z-index: $zindex-modal;
display: none;
width: 100%;
height: 100%;
overflow: hidden;
// Prevent Chrome on Windows from adding a focus outline. For details, see
// https://github.com/twbs/bootstrap/pull/10951.
outline: 0;
// We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a
// gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342
// See also https://github.com/twbs/bootstrap/issues/17695
}
// Shell div to position the modal with bottom padding
.modal-dialog {
position: relative;
width: auto;
margin: $modal-dialog-margin;
// allow clicks to pass through for custom click handling to close modal
pointer-events: none;
// When fading in the modal, animate it to slide down
.modal.fade & {
@include transition($modal-transition);
transform: $modal-fade-transform;
}
.modal.show & {
transform: $modal-show-transform;
}
// When trying to close, animate focus to scale
.modal.modal-static & {
transform: $modal-scale-transform;
}
}
.modal-dialog-scrollable {
height: subtract(100%, $modal-dialog-margin * 2);
.modal-content {
max-height: 100%;
overflow: hidden;
}
.modal-body {
overflow-y: auto;
}
}
.modal-dialog-centered {
display: flex;
align-items: center;
min-height: subtract(100%, $modal-dialog-margin * 2);
}
// Actual modal
.modal-content {
position: relative;
display: flex;
flex-direction: column;
width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`
// counteract the pointer-events: none; in the .modal-dialog
color: $modal-content-color;
pointer-events: auto;
background-color: $modal-content-bg;
background-clip: padding-box;
border: $modal-content-border-width solid $modal-content-border-color;
@include border-radius($modal-content-border-radius);
@include box-shadow($modal-content-box-shadow-xs);
// Remove focus outline from opened modal
outline: 0;
}
// Modal background
.modal-backdrop {
position: fixed;
top: 0;
left: 0;
z-index: $zindex-modal-backdrop;
width: 100vw;
height: 100vh;
background-color: $modal-backdrop-bg;
// Fade for backdrop
&.fade { opacity: 0; }
&.show { opacity: $modal-backdrop-opacity; }
}
// Modal header
// Top section of the modal w/ title and dismiss
.modal-header {
display: flex;
flex-shrink: 0;
align-items: center;
justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
padding: $modal-header-padding;
border-bottom: $modal-header-border-width solid $modal-header-border-color;
@include border-top-radius($modal-content-inner-border-radius);
.btn-close {
padding: ($modal-header-padding-y / 2) ($modal-header-padding-x / 2);
margin: ($modal-header-padding-y / -2) ($modal-header-padding-x / -2) ($modal-header-padding-y / -2) auto;
}
}
// Title text within header
.modal-title {
margin-bottom: 0;
line-height: $modal-title-line-height;
}
// Modal body
// Where all modal content resides (sibling of .modal-header and .modal-footer)
.modal-body {
position: relative;
// Enable `flex-grow: 1` so that the body take up as much space as possible
// when there should be a fixed height on `.modal-dialog`.
flex: 1 1 auto;
padding: $modal-inner-padding;
}
// Footer (for actions)
.modal-footer {
display: flex;
flex-wrap: wrap;
flex-shrink: 0;
align-items: center; // vertically center
justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
padding: $modal-inner-padding - $modal-footer-margin-between / 2;
border-top: $modal-footer-border-width solid $modal-footer-border-color;
@include border-bottom-radius($modal-content-inner-border-radius);
// Place margin between footer elements
// This solution is far from ideal because of the universal selector usage,
// but is needed to fix https://github.com/twbs/bootstrap/issues/24800
> * {
margin: $modal-footer-margin-between / 2;
}
}
// Measure scrollbar width for padding body during modal show/hide
.modal-scrollbar-measure {
position: absolute;
top: -9999px;
width: 50px;
height: 50px;
overflow: scroll;
}
// Scale up the modal
@include media-breakpoint-up(sm) {
// Automatically set modal's width for larger viewports
.modal-dialog {
max-width: $modal-md;
margin: $modal-dialog-margin-y-sm-up auto;
}
.modal-dialog-scrollable {
height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
}
.modal-dialog-centered {
min-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
}
.modal-content {
@include box-shadow($modal-content-box-shadow-sm-up);
}
.modal-sm { max-width: $modal-sm; }
}
@include media-breakpoint-up(lg) {
.modal-lg,
.modal-xl {
max-width: $modal-lg;
}
}
@include media-breakpoint-up(xl) {
.modal-xl { max-width: $modal-xl; }
}
@each $breakpoint in map-keys($grid-breakpoints) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
$postfix: if($infix != "", $infix + "-down", "");
@include media-breakpoint-down($breakpoint) {
.modal-fullscreen#{$postfix} {
width: 100vw;
max-width: none;
height: 100%;
margin: 0;
.modal-content {
height: 100%;
border: 0;
@include border-radius(0);
}
.modal-header {
@include border-radius(0);
}
.modal-body {
overflow-y: auto;
}
.modal-footer {
@include border-radius(0);
}
}
}
}
@@ -0,0 +1,127 @@
// Base class
//
// Kickstart any navigation component with a set of style resets. Works with
// `<nav>`s, `<ul>`s or `<ol>`s.
.nav {
display: flex;
flex-wrap: wrap;
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.nav-link {
display: block;
padding: $nav-link-padding-y $nav-link-padding-x;
@include font-size($nav-link-font-size);
font-weight: $nav-link-font-weight;
color: $nav-link-color;
text-decoration: if($link-decoration == none, null, none);
@include transition($nav-link-transition);
&:hover,
&:focus {
color: $nav-link-hover-color;
text-decoration: if($link-hover-decoration == underline, none, null);
}
// Disabled state lightens text
&.disabled {
color: $nav-link-disabled-color;
pointer-events: none;
cursor: default;
}
}
//
// Tabs
//
.nav-tabs {
border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
.nav-link {
margin-bottom: -$nav-tabs-border-width;
border: $nav-tabs-border-width solid transparent;
@include border-top-radius($nav-tabs-border-radius);
&:hover,
&:focus {
border-color: $nav-tabs-link-hover-border-color;
}
&.disabled {
color: $nav-link-disabled-color;
background-color: transparent;
border-color: transparent;
}
}
.nav-link.active,
.nav-item.show .nav-link {
color: $nav-tabs-link-active-color;
background-color: $nav-tabs-link-active-bg;
border-color: $nav-tabs-link-active-border-color;
}
.dropdown-menu {
// Make dropdown border overlap tab border
margin-top: -$nav-tabs-border-width;
// Remove the top rounded corners here since there is a hard edge above the menu
@include border-top-radius(0);
}
}
//
// Pills
//
.nav-pills {
.nav-link {
@include border-radius($nav-pills-border-radius);
}
.nav-link.active,
.show > .nav-link {
color: $nav-pills-link-active-color;
@include gradient-bg($nav-pills-link-active-bg);
}
}
//
// Justified variants
//
.nav-fill {
> .nav-link,
.nav-item {
flex: 1 1 auto;
text-align: center;
}
}
.nav-justified {
> .nav-link,
.nav-item {
flex-basis: 0;
flex-grow: 1;
text-align: center;
}
}
// Tabbable tabs
//
// Hide tabbable panes to start, show them when `.active`
.tab-content {
> .tab-pane {
display: none;
}
> .active {
display: block;
}
}
@@ -0,0 +1,293 @@
// Contents
//
// Navbar
// Navbar brand
// Navbar nav
// Navbar text
// Responsive navbar
// Navbar position
// Navbar themes
// Navbar
//
// Provide a static navbar from which we expand to create full-width, fixed, and
// other navbar variations.
.navbar {
position: relative;
display: flex;
flex-wrap: wrap; // allow us to do the line break for collapsing content
align-items: center;
justify-content: space-between; // space out brand from logo
padding-top: $navbar-padding-y;
padding-right: $navbar-padding-x; // default: null
padding-bottom: $navbar-padding-y;
padding-left: $navbar-padding-x; // default: null
@include gradient-bg();
// Because flex properties aren't inherited, we need to redeclare these first
// few properties so that content nested within behave properly.
// The `flex-wrap` property is inherited to simplify the expanded navbars
%container-flex-properties {
display: flex;
flex-wrap: inherit;
align-items: center;
justify-content: space-between;
}
> .container,
> .container-fluid {
@extend %container-flex-properties;
}
@each $breakpoint, $container-max-width in $container-max-widths {
> .container#{breakpoint-infix($breakpoint, $container-max-widths)} {
@extend %container-flex-properties;
}
}
}
// Navbar brand
//
// Used for brand, project, or site names.
.navbar-brand {
padding-top: $navbar-brand-padding-y;
padding-bottom: $navbar-brand-padding-y;
margin-right: $navbar-brand-margin-end;
@include font-size($navbar-brand-font-size);
text-decoration: if($link-decoration == none, null, none);
white-space: nowrap;
&:hover,
&:focus {
text-decoration: if($link-hover-decoration == underline, none, null);
}
}
// Navbar nav
//
// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
.navbar-nav {
display: flex;
flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
padding-left: 0;
margin-bottom: 0;
list-style: none;
.nav-link {
padding-right: 0;
padding-left: 0;
}
.dropdown-menu {
position: static;
}
}
// Navbar text
//
//
.navbar-text {
padding-top: $nav-link-padding-y;
padding-bottom: $nav-link-padding-y;
}
// Responsive navbar
//
// Custom styles for responsive collapsing and toggling of navbar contents.
// Powered by the collapse Bootstrap JavaScript plugin.
// When collapsed, prevent the toggleable navbar contents from appearing in
// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`
// on the `.navbar` parent.
.navbar-collapse {
// For always expanded or extra full navbars, ensure content aligns itself
// properly vertically. Can be easily overridden with flex utilities.
align-items: center;
width: 100%;
}
// Button for toggling the navbar when in its collapsed state
.navbar-toggler {
padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
@include font-size($navbar-toggler-font-size);
line-height: 1;
background-color: transparent; // remove default button style
border: $border-width solid transparent; // remove default button style
@include border-radius($navbar-toggler-border-radius);
@include transition($navbar-toggler-transition);
&:hover {
text-decoration: none;
}
&:focus {
text-decoration: none;
outline: 0;
box-shadow: 0 0 0 $navbar-toggler-focus-width;
}
}
// Keep as a separate element so folks can easily override it with another icon
// or image file as needed.
.navbar-toggler-icon {
display: inline-block;
width: 1.5em;
height: 1.5em;
vertical-align: middle;
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
}
// Generate series of `.navbar-expand-*` responsive classes for configuring
// where your navbar collapses.
.navbar-expand {
@each $breakpoint in map-keys($grid-breakpoints) {
$next: breakpoint-next($breakpoint, $grid-breakpoints);
$infix: breakpoint-infix($next, $grid-breakpoints);
// stylelint-disable-next-line scss/selector-no-union-class-name
&#{$infix} {
@include media-breakpoint-up($next) {
flex-wrap: nowrap;
justify-content: flex-start;
.navbar-nav {
flex-direction: row;
.dropdown-menu {
position: absolute;
}
.nav-link {
padding-right: $navbar-nav-link-padding-x;
padding-left: $navbar-nav-link-padding-x;
}
}
.navbar-collapse {
display: flex !important; // stylelint-disable-line declaration-no-important
}
.navbar-toggler {
display: none;
}
}
}
}
}
// Navbar themes
//
// Styles for switching between navbars with light or dark background.
// Dark links against a light background
.navbar-light {
.navbar-brand {
color: $navbar-light-brand-color;
&:hover,
&:focus {
color: $navbar-light-brand-hover-color;
}
}
.navbar-nav {
.nav-link {
color: $navbar-light-color;
&:hover,
&:focus {
color: $navbar-light-hover-color;
}
&.disabled {
color: $navbar-light-disabled-color;
}
}
.show > .nav-link,
.nav-link.active {
color: $navbar-light-active-color;
}
}
.navbar-toggler {
color: $navbar-light-color;
border-color: $navbar-light-toggler-border-color;
}
.navbar-toggler-icon {
background-image: escape-svg($navbar-light-toggler-icon-bg);
}
.navbar-text {
color: $navbar-light-color;
a,
a:hover,
a:focus {
color: $navbar-light-active-color;
}
}
}
// White links against a dark background
.navbar-dark {
.navbar-brand {
color: $navbar-dark-brand-color;
&:hover,
&:focus {
color: $navbar-dark-brand-hover-color;
}
}
.navbar-nav {
.nav-link {
color: $navbar-dark-color;
&:hover,
&:focus {
color: $navbar-dark-hover-color;
}
&.disabled {
color: $navbar-dark-disabled-color;
}
}
.show > .nav-link,
.nav-link.active {
color: $navbar-dark-active-color;
}
}
.navbar-toggler {
color: $navbar-dark-color;
border-color: $navbar-dark-toggler-border-color;
}
.navbar-toggler-icon {
background-image: escape-svg($navbar-dark-toggler-icon-bg);
}
.navbar-text {
color: $navbar-dark-color;
a,
a:hover,
a:focus {
color: $navbar-dark-active-color;
}
}
}
@@ -0,0 +1,64 @@
.pagination {
display: flex;
@include list-unstyled();
}
.page-link {
position: relative;
display: block;
color: $pagination-color;
text-decoration: if($link-decoration == none, null, none);
background-color: $pagination-bg;
border: $pagination-border-width solid $pagination-border-color;
@include transition($pagination-transition);
&:hover {
z-index: 2;
color: $pagination-hover-color;
text-decoration: if($link-hover-decoration == underline, none, null);
background-color: $pagination-hover-bg;
border-color: $pagination-hover-border-color;
}
&:focus {
z-index: 3;
color: $pagination-focus-color;
background-color: $pagination-focus-bg;
outline: $pagination-focus-outline;
box-shadow: $pagination-focus-box-shadow;
}
}
.page-item {
&:not(:first-child) .page-link {
margin-left: $pagination-margin-start;
}
&.active .page-link {
z-index: 3;
color: $pagination-active-color;
@include gradient-bg($pagination-active-bg);
border-color: $pagination-active-border-color;
}
&.disabled .page-link {
color: $pagination-disabled-color;
pointer-events: none;
background-color: $pagination-disabled-bg;
border-color: $pagination-disabled-border-color;
}
}
//
// Sizing
//
@include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius);
.pagination-lg {
@include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $border-radius-lg);
}
.pagination-sm {
@include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $border-radius-sm);
}
@@ -0,0 +1,173 @@
.popover {
position: absolute;
top: 0;
left: 0 #{"/* rtl:ignore */"};
z-index: $zindex-popover;
display: block;
max-width: $popover-max-width;
// Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
// So reset our font and text properties to avoid inheriting weird values.
@include reset-text();
@include font-size($popover-font-size);
// Allow breaking very long words so they don't overflow the popover's bounds
word-wrap: break-word;
background-color: $popover-bg;
background-clip: padding-box;
border: $popover-border-width solid $popover-border-color;
@include border-radius($popover-border-radius);
@include box-shadow($popover-box-shadow);
.popover-arrow {
position: absolute;
display: block;
width: $popover-arrow-width;
height: $popover-arrow-height;
margin: 0 $popover-border-radius;
&::before,
&::after {
position: absolute;
display: block;
content: "";
border-color: transparent;
border-style: solid;
}
}
}
.bs-popover-top {
// Overrule margin set by popper.js
margin-bottom: $popover-arrow-height !important; // stylelint-disable-line declaration-no-important
> .popover-arrow {
bottom: subtract(-$popover-arrow-height, $popover-border-width);
&::before {
bottom: 0;
border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
border-top-color: $popover-arrow-outer-color;
}
&::after {
bottom: $popover-border-width;
border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
border-top-color: $popover-arrow-color;
}
}
}
.bs-popover-end {
// Overrule margin set by popper.js
margin-left: $popover-arrow-height !important; // stylelint-disable-line declaration-no-important
> .popover-arrow {
left: subtract(-$popover-arrow-height, $popover-border-width);
width: $popover-arrow-height;
height: $popover-arrow-width;
margin: $popover-border-radius 0; // make sure the arrow does not touch the popover's rounded corners
&::before {
left: 0;
border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
border-right-color: $popover-arrow-outer-color;
}
&::after {
left: $popover-border-width;
border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
border-right-color: $popover-arrow-color;
}
}
}
.bs-popover-bottom {
// Overrule margin set by popper.js
margin-top: $popover-arrow-height !important; // stylelint-disable-line declaration-no-important
> .popover-arrow {
top: subtract(-$popover-arrow-height, $popover-border-width);
&::before {
top: 0;
border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
border-bottom-color: $popover-arrow-outer-color;
}
&::after {
top: $popover-border-width;
border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
border-bottom-color: $popover-arrow-color;
}
}
// This will remove the popover-header's border just below the arrow
.popover-header::before {
position: absolute;
top: 0;
left: 50%;
display: block;
width: $popover-arrow-width;
margin-left: -$popover-arrow-width / 2;
content: "";
border-bottom: $popover-border-width solid $popover-header-bg;
}
}
.bs-popover-start {
// Overrule margin set by popper.js
margin-right: $popover-arrow-height !important; // stylelint-disable-line declaration-no-important
> .popover-arrow {
right: subtract(-$popover-arrow-height, $popover-border-width);
width: $popover-arrow-height;
height: $popover-arrow-width;
margin: $popover-border-radius 0; // make sure the arrow does not touch the popover's rounded corners
&::before {
right: 0;
border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
border-left-color: $popover-arrow-outer-color;
}
&::after {
right: $popover-border-width;
border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
border-left-color: $popover-arrow-color;
}
}
}
.bs-popover-auto {
&[data-popper-placement^="top"] {
@extend .bs-popover-top;
}
&[data-popper-placement^="right"] {
@extend .bs-popover-end;
}
&[data-popper-placement^="bottom"] {
@extend .bs-popover-bottom;
}
&[data-popper-placement^="left"] {
@extend .bs-popover-start;
}
}
// Offset the popover to account for the popover arrow
.popover-header {
padding: $popover-header-padding-y $popover-header-padding-x;
margin-bottom: 0; // Reset the default from Reboot
@include font-size($font-size-base);
color: $popover-header-color;
background-color: $popover-header-bg;
border-bottom: $popover-border-width solid shade-color($popover-header-bg, 10%);
@include border-top-radius($popover-inner-border-radius);
&:empty {
display: none;
}
}
.popover-body {
padding: $popover-body-padding-y $popover-body-padding-x;
color: $popover-body-color;
}
@@ -0,0 +1,45 @@
// Disable animation if transitions are disabled
@if $enable-transitions {
@keyframes progress-bar-stripes {
0% { background-position-x: $progress-height; }
}
}
.progress {
display: flex;
height: $progress-height;
overflow: hidden; // force rounded corners by cropping it
@include font-size($progress-font-size);
background-color: $progress-bg;
@include border-radius($progress-border-radius);
@include box-shadow($progress-box-shadow);
}
.progress-bar {
display: flex;
flex-direction: column;
justify-content: center;
overflow: hidden;
color: $progress-bar-color;
text-align: center;
white-space: nowrap;
background-color: $progress-bar-bg;
@include transition($progress-bar-transition);
}
.progress-bar-striped {
@include gradient-striped();
background-size: $progress-height $progress-height;
}
@if $enable-transitions {
.progress-bar-animated {
animation: $progress-bar-animation-timing progress-bar-stripes;
@if $enable-reduced-motion {
@media (prefers-reduced-motion: reduce) {
animation: none;
}
}
}
}
@@ -0,0 +1,635 @@
// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
// Reboot
//
// Normalization of HTML elements, manually forked from Normalize.css to remove
// styles targeting irrelevant browsers while applying new styles.
//
// Normalize is licensed MIT. https://github.com/necolas/normalize.css
// Document
//
// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
*,
*::before,
*::after {
box-sizing: border-box;
}
// Root
//
// Ability to the value of the root font sizes, affecting the value of `rem`.
// null by default, thus nothing is generated.
:root {
font-size: $font-size-root;
@if $enable-smooth-scroll {
@media (prefers-reduced-motion: no-preference) {
scroll-behavior: smooth;
}
}
}
// Body
//
// 1. Remove the margin in all browsers.
// 2. As a best practice, apply a default `background-color`.
// 3. Prevent adjustments of font size after orientation changes in iOS.
// 4. Change the default tap highlight to be completely transparent in iOS.
body {
margin: 0; // 1
font-family: $font-family-base;
@include font-size($font-size-base);
font-weight: $font-weight-base;
line-height: $line-height-base;
color: $body-color;
text-align: $body-text-align;
background-color: $body-bg; // 2
-webkit-text-size-adjust: 100%; // 3
-webkit-tap-highlight-color: rgba($black, 0); // 4
}
// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline
// on elements that programmatically receive focus but wouldn't normally show a visible
// focus outline. In general, this would mean that the outline is only applied if the
// interaction that led to the element receiving programmatic focus was a keyboard interaction,
// or the browser has somehow determined that the user is primarily a keyboard user and/or
// wants focus outlines to always be presented.
// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible
// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/
[tabindex="-1"]:focus:not(:focus-visible) {
outline: 0 !important;
}
// Content grouping
//
// 1. Reset Firefox's gray color
// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field
hr {
margin: $hr-margin-y 0;
color: $hr-color; // 1
background-color: currentColor;
border: 0;
opacity: $hr-opacity;
}
hr:not([size]) {
height: $hr-height; // 2
}
// Typography
//
// 1. Remove top margins from headings
// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top
// margin for easier control within type scales as it avoids margin collapsing.
%heading {
margin-top: 0; // 1
margin-bottom: $headings-margin-bottom;
font-family: $headings-font-family;
font-style: $headings-font-style;
font-weight: $headings-font-weight;
line-height: $headings-line-height;
color: $headings-color;
}
h1 {
@extend %heading;
@include font-size($h1-font-size);
}
h2 {
@extend %heading;
@include font-size($h2-font-size);
}
h3 {
@extend %heading;
@include font-size($h3-font-size);
}
h4 {
@extend %heading;
@include font-size($h4-font-size);
}
h5 {
@extend %heading;
@include font-size($h5-font-size);
}
h6 {
@extend %heading;
@include font-size($h6-font-size);
}
// Reset margins on paragraphs
//
// Similarly, the top margin on `<p>`s get reset. However, we also reset the
// bottom margin to use `rem` units instead of `em`.
p {
margin-top: 0;
margin-bottom: $paragraph-margin-bottom;
}
// Abbreviations
//
// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin
// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.
// 3. Add explicit cursor to indicate changed behavior.
// 4. Prevent the text-decoration to be skipped.
abbr[title],
abbr[data-bs-original-title] { // 1
text-decoration: underline; // 2
text-decoration: underline dotted; // 2
cursor: help; // 3
text-decoration-skip-ink: none; // 4
}
// Address
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
// Lists
ol,
ul {
padding-left: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: $dt-font-weight;
}
// 1. Undo browser default
dd {
margin-bottom: .5rem;
margin-left: 0; // 1
}
// Blockquote
blockquote {
margin: 0 0 1rem;
}
// Strong
//
// Add the correct font weight in Chrome, Edge, and Safari
b,
strong {
font-weight: $font-weight-bolder;
}
// Small
//
// Add the correct font size in all browsers
small {
@include font-size($small-font-size);
}
// Mark
mark {
padding: $mark-padding;
background-color: $mark-bg;
}
// Sub and Sup
//
// Prevent `sub` and `sup` elements from affecting the line height in
// all browsers.
sub,
sup {
position: relative;
@include font-size($sub-sup-font-size);
line-height: 0;
vertical-align: baseline;
}
sub { bottom: -.25em; }
sup { top: -.5em; }
// Links
a {
color: $link-color;
text-decoration: $link-decoration;
&:hover {
color: $link-hover-color;
text-decoration: $link-hover-decoration;
}
}
// And undo these styles for placeholder links/named anchors (without href).
// It would be more straightforward to just use a[href] in previous block, but that
// causes specificity issues in many other styles that are too complex to fix.
// See https://github.com/twbs/bootstrap/issues/19402
a:not([href]):not([class]) {
&,
&:hover {
color: inherit;
text-decoration: none;
}
}
// Code
pre,
code,
kbd,
samp {
font-family: $font-family-code;
@include font-size(1em); // Correct the odd `em` font sizing in all browsers.
direction: ltr #{"/* rtl:ignore */"};
unicode-bidi: bidi-override;
}
// 1. Remove browser default top margin
// 2. Reset browser default of `1em` to use `rem`s
// 3. Don't allow content to break outside
pre {
display: block;
margin-top: 0; // 1
margin-bottom: 1rem; // 2
overflow: auto; // 3
@include font-size($code-font-size);
color: $pre-color;
// Account for some code outputs that place code tags in pre tags
code {
@include font-size(inherit);
color: inherit;
word-break: normal;
}
}
code {
@include font-size($code-font-size);
color: $code-color;
word-wrap: break-word;
// Streamline the style when inside anchors to avoid broken underline and more
a > & {
color: inherit;
}
}
kbd {
padding: $kbd-padding-y $kbd-padding-x;
@include font-size($kbd-font-size);
color: $kbd-color;
background-color: $kbd-bg;
@include border-radius($border-radius-sm);
kbd {
padding: 0;
@include font-size(1em);
font-weight: $nested-kbd-font-weight;
}
}
// Figures
//
// Apply a consistent margin strategy (matches our type styles).
figure {
margin: 0 0 1rem;
}
// Images and content
img,
svg {
vertical-align: middle;
}
// Tables
//
// Prevent double borders
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: $table-cell-padding-y;
padding-bottom: $table-cell-padding-y;
color: $table-caption-color;
text-align: left;
}
// 1. Removes font-weight bold by inheriting
// 2. Matches default `<td>` alignment by inheriting `text-align`.
// 3. Fix alignment for Safari
th {
font-weight: $table-th-font-weight; // 1
text-align: inherit; // 2
text-align: -webkit-match-parent; // 3
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
// Forms
//
// 1. Allow labels to use `margin` for spacing.
label {
display: inline-block; // 1
}
// Remove the default `border-radius` that macOS Chrome adds.
// See https://github.com/twbs/bootstrap/issues/24093
button {
// stylelint-disable-next-line property-disallowed-list
border-radius: 0;
}
// Work around a Firefox bug where the transparent `button` background
// results in a loss of the default `button` focus styles.
// Credit https://github.com/suitcss/base/
button:focus {
outline: dotted 1px;
outline: -webkit-focus-ring-color auto 5px;
}
// 1. Remove the margin in Firefox and Safari
input,
button,
select,
optgroup,
textarea {
margin: 0; // 1
font-family: inherit;
@include font-size(inherit);
line-height: inherit;
}
// Remove the inheritance of text transform in Firefox
button,
select {
text-transform: none;
}
// Set the cursor for non-`<button>` buttons
//
// Details at https://github.com/twbs/bootstrap/pull/30562
[role="button"] {
cursor: pointer;
}
// Remove the inheritance of word-wrap in Safari.
// See https://github.com/twbs/bootstrap/issues/24990
select {
word-wrap: normal;
}
// Remove the dropdown arrow in Chrome from inputs built with datalists.
// See https://stackoverflow.com/a/54997118
[list]::-webkit-calendar-picker-indicator {
display: none;
}
// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
// controls in Android 4.
// 2. Correct the inability to style clickable types in iOS and Safari.
// 3. Opinionated: add "hand" cursor to non-disabled button elements.
button,
[type="button"], // 1
[type="reset"],
[type="submit"] {
-webkit-appearance: button; // 2
@if $enable-button-pointers {
&:not(:disabled) {
cursor: pointer; // 3
}
}
}
// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
::-moz-focus-inner {
padding: 0;
border-style: none;
}
// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.
textarea {
resize: vertical; // 1
}
// 1. Browsers set a default `min-width: min-content;` on fieldsets,
// unlike e.g. `<div>`s, which have `min-width: 0;` by default.
// So we reset that to ensure fieldsets behave more like a standard block element.
// See https://github.com/twbs/bootstrap/issues/12359
// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.
fieldset {
min-width: 0; // 1
padding: 0; // 2
margin: 0; // 2
border: 0; // 2
}
// 1. By using `float: left`, the legend will behave like a block element.
// This way the border of a fieldset wraps around the legend if present.
// 2. Fix wrapping bug.
// See https://github.com/twbs/bootstrap/issues/29712
legend {
float: left; // 1
width: 100%;
padding: 0;
margin-bottom: $legend-margin-bottom;
@include font-size($legend-font-size);
font-weight: $legend-font-weight;
line-height: inherit;
+ * {
clear: left; // 2
}
}
// Fix height of inputs with a type of datetime-local, date, month, week, or time
// See https://github.com/twbs/bootstrap/issues/18842
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
// 1. Correct the outline style in Safari.
// 2. This overrides the extra rounded corners on search inputs in iOS so that our
// `.form-control` class can properly style them. Note that this cannot simply
// be added to `.form-control` as it's not specific enough. For details, see
// https://github.com/twbs/bootstrap/issues/11586.
[type="search"] {
outline-offset: -2px; // 1
-webkit-appearance: textfield; // 2
}
// 1. A few input types should stay LTR
// See https://rtlstyling.com/posts/rtl-styling#form-inputs
// 2. RTL only output
// See https://rtlcss.com/learn/usage-guide/control-directives/#raw
/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
*/
// Remove the inner padding in Chrome and Safari on macOS.
::-webkit-search-decoration {
-webkit-appearance: none;
}
// Remove padding around color pickers in webkit browsers
::-webkit-color-swatch-wrapper {
padding: 0;
}
// Inherit font family and line height for file input buttons
// stylelint-disable-next-line selector-pseudo-element-no-unknown
::file-selector-button {
font: inherit;
}
// 1. Change font properties to `inherit`
// 2. Correct the inability to style clickable types in iOS and Safari.
::-webkit-file-upload-button {
font: inherit; // 1
-webkit-appearance: button; // 2
}
// Correct element displays
output {
display: inline-block;
}
// Remove border from iframe
iframe {
border: 0;
}
// Summary
//
// 1. Add the correct display in all browsers
summary {
display: list-item; // 1
cursor: pointer;
}
// Progress
//
// Add the correct vertical alignment in Chrome, Firefox, and Opera.
progress {
vertical-align: baseline;
}
// Hidden attribute
//
// Always hide an element with the `hidden` HTML attribute.
[hidden] {
display: none !important;
}
@@ -0,0 +1,16 @@
:root {
// Custom variable values only support SassScript inside `#{}`.
@each $color, $value in $colors {
--#{$variable-prefix}#{$color}: #{$value};
}
@each $color, $value in $theme-colors {
--#{$variable-prefix}#{$color}: #{$value};
}
// Use `inspect` for lists so that quoted items keep the quotes.
// See https://github.com/sass/sass/issues/2383#issuecomment-336349172
--#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};
--#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};
--#{$variable-prefix}gradient: #{$gradient};
}
@@ -0,0 +1,65 @@
//
// Rotating border
//
@keyframes spinner-border {
to { transform: rotate(360deg) #{"/* rtl:ignore */"}; }
}
.spinner-border {
display: inline-block;
width: $spinner-width;
height: $spinner-height;
vertical-align: text-bottom;
border: $spinner-border-width solid currentColor;
border-right-color: transparent;
// stylelint-disable-next-line property-disallowed-list
border-radius: 50%;
animation: $spinner-animation-speed linear infinite spinner-border;
}
.spinner-border-sm {
width: $spinner-width-sm;
height: $spinner-height-sm;
border-width: $spinner-border-width-sm;
}
//
// Growing circle
//
@keyframes spinner-grow {
0% {
transform: scale(0);
}
50% {
opacity: 1;
transform: none;
}
}
.spinner-grow {
display: inline-block;
width: $spinner-width;
height: $spinner-height;
vertical-align: text-bottom;
background-color: currentColor;
// stylelint-disable-next-line property-disallowed-list
border-radius: 50%;
opacity: 0;
animation: $spinner-animation-speed linear infinite spinner-grow;
}
.spinner-grow-sm {
width: $spinner-width-sm;
height: $spinner-height-sm;
}
@if $enable-reduced-motion {
@media (prefers-reduced-motion: reduce) {
.spinner-border,
.spinner-grow {
animation-duration: $spinner-animation-speed * 2;
}
}
}
@@ -0,0 +1,150 @@
//
// Basic Bootstrap table
//
.table {
--#{$variable-prefix}table-bg: #{$table-bg};
--#{$variable-prefix}table-striped-color: #{$table-striped-color};
--#{$variable-prefix}table-striped-bg: #{$table-striped-bg};
--#{$variable-prefix}table-active-color: #{$table-active-color};
--#{$variable-prefix}table-active-bg: #{$table-active-bg};
--#{$variable-prefix}table-hover-color: #{$table-hover-color};
--#{$variable-prefix}table-hover-bg: #{$table-hover-bg};
width: 100%;
margin-bottom: $spacer;
color: $table-color;
vertical-align: $table-cell-vertical-align;
border-color: $table-border-color;
// Target th & td
// We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.
// We use the universal selectors here to simplify the selector (else we would need 6 different selectors).
// Another advantage is that this generates less code and makes the selector less specific making it easier to override.
// stylelint-disable-next-line selector-max-universal
> :not(caption) > * > * {
padding: $table-cell-padding-y $table-cell-padding-x;
background-color: var(--#{$variable-prefix}table-bg);
background-image: linear-gradient(var(--#{$variable-prefix}table-accent-bg), var(--#{$variable-prefix}table-accent-bg));
border-bottom-width: $table-border-width;
}
> tbody {
vertical-align: inherit;
}
> thead {
vertical-align: bottom;
}
// Highlight border color between thead, tbody and tfoot.
> :not(:last-child) > :last-child > * {
border-bottom-color: $table-group-separator-color;
}
}
//
// Change placement of captions with a class
//
.caption-top {
caption-side: top;
}
//
// Condensed table w/ half padding
//
.table-sm {
// stylelint-disable-next-line selector-max-universal
> :not(caption) > * > * {
padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;
}
}
// Border versions
//
// Add or remove borders all around the table and between all the columns.
//
// When borders are added on all sides of the cells, the corners can render odd when
// these borders do not have the same color or if they are semi-transparent.
// Therefor we add top and border bottoms to the `tr`s and left and right borders
// to the `td`s or `th`s
.table-bordered {
> :not(caption) > * {
border-width: $table-border-width 0;
// stylelint-disable-next-line selector-max-universal
> * {
border-width: 0 $table-border-width;
}
}
}
.table-borderless {
// stylelint-disable-next-line selector-max-universal
> :not(caption) > * > * {
border-bottom-width: 0;
}
}
// Zebra-striping
//
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
.table-striped {
> tbody > tr:nth-of-type(#{$table-striped-order}) {
--#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-striped-bg);
color: var(--#{$variable-prefix}table-striped-color);
}
}
// Active table
//
// The `.table-active` class can be added to highlight rows or cells
.table-active {
--#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-active-bg);
color: var(--#{$variable-prefix}table-active-color);
}
// Hover effect
//
// Placed here since it has to come after the potential zebra striping
.table-hover {
> tbody > tr:hover {
--#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-hover-bg);
color: var(--#{$variable-prefix}table-hover-color);
}
}
// Table variants
//
// Table variants set the table cell backgrounds, border colors
// and the colors of the striped, hovered & active tables
@each $color, $value in $table-variants {
@include table-variant($color, $value);
}
// Responsive tables
//
// Generate series of `.table-responsive-*` classes for configuring the screen
// size of where your table will overflow.
@each $breakpoint in map-keys($grid-breakpoints) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
@include media-breakpoint-down($breakpoint) {
.table-responsive#{$infix} {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
}
}
@@ -0,0 +1,50 @@
.toast {
width: $toast-max-width;
max-width: 100%;
@include font-size($toast-font-size);
color: $toast-color;
pointer-events: auto;
background-color: $toast-background-color;
background-clip: padding-box;
border: $toast-border-width solid $toast-border-color;
box-shadow: $toast-box-shadow;
@include border-radius($toast-border-radius);
&:not(.showing):not(.show) {
opacity: 0;
}
&.hide {
display: none;
}
}
.toast-container {
width: max-content;
max-width: 100%;
pointer-events: none;
> :not(:last-child) {
margin-bottom: $toast-spacing;
}
}
.toast-header {
display: flex;
align-items: center;
padding: $toast-padding-y $toast-padding-x;
color: $toast-header-color;
background-color: $toast-header-background-color;
background-clip: padding-box;
border-bottom: $toast-border-width solid $toast-header-border-color;
@include border-top-radius(subtract($toast-border-radius, $toast-border-width));
.btn-close {
margin-right: $toast-padding-x / -2;
margin-left: $toast-padding-x;
}
}
.toast-body {
padding: $toast-padding-x; // apply to both vertical and horizontal
}
@@ -0,0 +1,115 @@
// Base class
.tooltip {
position: absolute;
z-index: $zindex-tooltip;
display: block;
margin: $tooltip-margin;
// Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
// So reset our font and text properties to avoid inheriting weird values.
@include reset-text();
@include font-size($tooltip-font-size);
// Allow breaking very long words so they don't overflow the tooltip's bounds
word-wrap: break-word;
opacity: 0;
&.show { opacity: $tooltip-opacity; }
.tooltip-arrow {
position: absolute;
display: block;
width: $tooltip-arrow-width;
height: $tooltip-arrow-height;
&::before {
position: absolute;
content: "";
border-color: transparent;
border-style: solid;
}
}
}
.bs-tooltip-top {
padding: $tooltip-arrow-height 0;
.tooltip-arrow {
bottom: 0;
&::before {
top: -1px;
border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
border-top-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-end {
padding: 0 $tooltip-arrow-height;
.tooltip-arrow {
left: 0;
width: $tooltip-arrow-height;
height: $tooltip-arrow-width;
&::before {
right: -1px;
border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
border-right-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-bottom {
padding: $tooltip-arrow-height 0;
.tooltip-arrow {
top: 0;
&::before {
bottom: -1px;
border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
border-bottom-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-start {
padding: 0 $tooltip-arrow-height;
.tooltip-arrow {
right: 0;
width: $tooltip-arrow-height;
height: $tooltip-arrow-width;
&::before {
left: -1px;
border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
border-left-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-auto {
&[data-popper-placement^="top"] {
@extend .bs-tooltip-top;
}
&[data-popper-placement^="right"] {
@extend .bs-tooltip-end;
}
&[data-popper-placement^="bottom"] {
@extend .bs-tooltip-bottom;
}
&[data-popper-placement^="left"] {
@extend .bs-tooltip-start;
}
}
// Wrapper for the tooltip content
.tooltip-inner {
max-width: $tooltip-max-width;
padding: $tooltip-padding-y $tooltip-padding-x;
color: $tooltip-color;
text-align: center;
background-color: $tooltip-bg;
@include border-radius($tooltip-border-radius);
}
@@ -0,0 +1,19 @@
.fade {
@include transition($transition-fade);
&:not(.show) {
opacity: 0;
}
}
.collapse {
&:not(.show) {
display: none;
}
}
.collapsing {
height: 0;
overflow: hidden;
@include transition($transition-collapse);
}
@@ -0,0 +1,104 @@
//
// Headings
//
.h1 {
@extend h1;
}
.h2 {
@extend h2;
}
.h3 {
@extend h3;
}
.h4 {
@extend h4;
}
.h5 {
@extend h5;
}
.h6 {
@extend h6;
}
.lead {
@include font-size($lead-font-size);
font-weight: $lead-font-weight;
}
// Type display classes
@each $display, $font-size in $display-font-sizes {
.display-#{$display} {
@include font-size($font-size);
font-weight: $display-font-weight;
line-height: $display-line-height;
}
}
//
// Emphasis
//
.small {
@extend small;
}
.mark {
@extend mark;
}
//
// Lists
//
.list-unstyled {
@include list-unstyled();
}
// Inline turns list items into inline-block
.list-inline {
@include list-unstyled();
}
.list-inline-item {
display: inline-block;
&:not(:last-child) {
margin-right: $list-inline-padding;
}
}
//
// Misc
//
// Builds on `abbr`
.initialism {
@include font-size($initialism-font-size);
text-transform: uppercase;
}
// Blockquotes
.blockquote {
margin-bottom: $blockquote-margin-y;
@include font-size($blockquote-font-size);
> :last-child {
margin-bottom: 0;
}
}
.blockquote-footer {
margin-top: -$blockquote-margin-y;
margin-bottom: $blockquote-margin-y;
@include font-size($blockquote-footer-font-size);
color: $blockquote-footer-color;
&::before {
content: "\2014\00A0"; // em dash, nbsp
}
}
@@ -0,0 +1,560 @@
// Utilities
$utilities: () !default;
// stylelint-disable-next-line scss/dollar-variable-default
$utilities: map-merge(
(
"align": (
property: vertical-align,
class: align,
values: baseline top middle bottom text-bottom text-top
),
"float": (
responsive: true,
property: float,
values: (
start: left,
end: right,
none: none,
)
),
"overflow": (
property: overflow,
values: auto hidden visible scroll,
),
"display": (
responsive: true,
print: true,
property: display,
class: d,
values: inline inline-block block grid table table-row table-cell flex inline-flex none
),
"shadow": (
property: box-shadow,
class: shadow,
values: (
null: $box-shadow,
sm: $box-shadow-sm,
lg: $box-shadow-lg,
none: none,
)
),
"position": (
property: position,
values: static relative absolute fixed sticky
),
"top": (
property: top,
values: $position-values
),
"bottom": (
property: bottom,
values: $position-values
),
"start": (
property: left,
class: start,
values: $position-values
),
"end": (
property: right,
class: end,
values: $position-values
),
"translate-middle": (
property: transform,
class: translate-middle,
values: (
null: translate(-50%, -50%),
x: translateX(-50%),
y: translateY(-50%),
)
),
"border": (
property: border,
values: (
null: $border-width solid $border-color,
0: 0,
)
),
"border-top": (
property: border-top,
values: (
null: $border-width solid $border-color,
0: 0,
)
),
"border-end": (
property: border-right,
class: border-end,
values: (
null: $border-width solid $border-color,
0: 0,
)
),
"border-bottom": (
property: border-bottom,
values: (
null: $border-width solid $border-color,
0: 0,
)
),
"border-start": (
property: border-left,
class: border-start,
values: (
null: $border-width solid $border-color,
0: 0,
)
),
"border-color": (
property: border-color,
class: border,
values: map-merge($theme-colors, ("white": $white))
),
"border-width": (
property: border-width,
class: border,
values: $border-widths
),
// Sizing utilities
"width": (
property: width,
class: w,
values: (
25: 25%,
50: 50%,
75: 75%,
100: 100%,
auto: auto
)
),
"max-width": (
property: max-width,
class: mw,
values: (100: 100%)
),
"viewport-width": (
property: width,
class: vw,
values: (100: 100vw)
),
"min-viewport-width": (
property: min-width,
class: min-vw,
values: (100: 100vw)
),
"height": (
property: height,
class: h,
values: (
25: 25%,
50: 50%,
75: 75%,
100: 100%,
auto: auto
)
),
"max-height": (
property: max-height,
class: mh,
values: (100: 100%)
),
"viewport-height": (
property: height,
class: vh,
values: (100: 100vh)
),
"min-viewport-height": (
property: min-height,
class: min-vh,
values: (100: 100vh)
),
// Flex utilities
"flex": (
responsive: true,
property: flex,
values: (fill: 1 1 auto)
),
"flex-direction": (
responsive: true,
property: flex-direction,
class: flex,
values: row column row-reverse column-reverse
),
"flex-grow": (
responsive: true,
property: flex-grow,
class: flex,
values: (
grow-0: 0,
grow-1: 1,
)
),
"flex-shrink": (
responsive: true,
property: flex-shrink,
class: flex,
values: (
shrink-0: 0,
shrink-1: 1,
)
),
"flex-wrap": (
responsive: true,
property: flex-wrap,
class: flex,
values: wrap nowrap wrap-reverse
),
"gap": (
responsive: true,
property: gap,
class: gap,
values: $spacers
),
"justify-content": (
responsive: true,
property: justify-content,
values: (
start: flex-start,
end: flex-end,
center: center,
between: space-between,
around: space-around,
evenly: space-evenly,
)
),
"align-items": (
responsive: true,
property: align-items,
values: (
start: flex-start,
end: flex-end,
center: center,
baseline: baseline,
stretch: stretch,
)
),
"align-content": (
responsive: true,
property: align-content,
values: (
start: flex-start,
end: flex-end,
center: center,
between: space-between,
around: space-around,
stretch: stretch,
)
),
"align-self": (
responsive: true,
property: align-self,
values: (
auto: auto,
start: flex-start,
end: flex-end,
center: center,
baseline: baseline,
stretch: stretch,
)
),
"order": (
responsive: true,
property: order,
values: (
first: -1,
0: 0,
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
last: 6,
),
),
// Margin utilities
"margin": (
responsive: true,
property: margin,
class: m,
values: map-merge($spacers, (auto: auto))
),
"margin-x": (
responsive: true,
property: margin-right margin-left,
class: mx,
values: map-merge($spacers, (auto: auto))
),
"margin-y": (
responsive: true,
property: margin-top margin-bottom,
class: my,
values: map-merge($spacers, (auto: auto))
),
"margin-top": (
responsive: true,
property: margin-top,
class: mt,
values: map-merge($spacers, (auto: auto))
),
"margin-end": (
responsive: true,
property: margin-right,
class: me,
values: map-merge($spacers, (auto: auto))
),
"margin-bottom": (
responsive: true,
property: margin-bottom,
class: mb,
values: map-merge($spacers, (auto: auto))
),
"margin-start": (
responsive: true,
property: margin-left,
class: ms,
values: map-merge($spacers, (auto: auto))
),
// Negative margin utilities
"negative-margin": (
responsive: true,
property: margin,
class: m,
values: $negative-spacers
),
"negative-margin-x": (
responsive: true,
property: margin-right margin-left,
class: mx,
values: $negative-spacers
),
"negative-margin-y": (
responsive: true,
property: margin-top margin-bottom,
class: my,
values: $negative-spacers
),
"negative-margin-top": (
responsive: true,
property: margin-top,
class: mt,
values: $negative-spacers
),
"negative-margin-end": (
responsive: true,
property: margin-right,
class: me,
values: $negative-spacers
),
"negative-margin-bottom": (
responsive: true,
property: margin-bottom,
class: mb,
values: $negative-spacers
),
"negative-margin-start": (
responsive: true,
property: margin-left,
class: ms,
values: $negative-spacers
),
// Padding utilities
"padding": (
responsive: true,
property: padding,
class: p,
values: $spacers
),
"padding-x": (
responsive: true,
property: padding-right padding-left,
class: px,
values: $spacers
),
"padding-y": (
responsive: true,
property: padding-top padding-bottom,
class: py,
values: $spacers
),
"padding-top": (
responsive: true,
property: padding-top,
class: pt,
values: $spacers
),
"padding-end": (
responsive: true,
property: padding-right,
class: pe,
values: $spacers
),
"padding-bottom": (
responsive: true,
property: padding-bottom,
class: pb,
values: $spacers
),
"padding-start": (
responsive: true,
property: padding-left,
class: ps,
values: $spacers
),
// Text
"font-size": (
rfs: true,
property: font-size,
class: fs,
values: $font-sizes
),
"font-style": (
property: font-style,
class: fst,
values: italic normal
),
"font-weight": (
property: font-weight,
class: fw,
values: (
light: $font-weight-light,
lighter: $font-weight-lighter,
normal: $font-weight-normal,
bold: $font-weight-bold,
bolder: $font-weight-bolder
)
),
"text-transform": (
property: text-transform,
class: text,
values: lowercase uppercase capitalize
),
"text-align": (
responsive: true,
property: text-align,
class: text,
values: (
start: left,
end: right,
center: center,
)
),
"color": (
property: color,
class: text,
values: map-merge(
$theme-colors,
(
"white": $white,
"body": $body-color,
"muted": $text-muted,
"black-50": rgba($black, .5),
"white-50": rgba($white, .5),
"reset": inherit,
)
)
),
"line-height": (
property: line-height,
class: lh,
values: (
1: 1,
sm: $line-height-sm,
base: $line-height-base,
lg: $line-height-lg,
)
),
"background-color": (
property: background-color,
class: bg,
values: map-merge(
$theme-colors,
(
"body": $body-bg,
"white": $white,
"transparent": transparent
)
)
),
"gradient": (
property: background-image,
class: bg,
values: (gradient: var(--#{$variable-prefix}gradient))
),
"white-space": (
property: white-space,
class: text,
values: (
wrap: normal,
nowrap: nowrap,
)
),
"text-decoration": (
property: text-decoration,
values: none underline line-through
),
"word-wrap": (
property: word-wrap word-break,
class: text,
values: (break: break-word),
rtl: false
),
"font-family": (
property: font-family,
class: font,
values: (monospace: var(--#{$variable-prefix}font-monospace))
),
"user-select": (
property: user-select,
values: all auto none
),
"pointer-events": (
property: pointer-events,
class: pe,
values: none auto,
),
"rounded": (
property: border-radius,
class: rounded,
values: (
null: $border-radius,
0: 0,
1: $border-radius-sm,
2: $border-radius,
3: $border-radius-lg,
circle: 50%,
pill: $border-radius-pill
)
),
"rounded-top": (
property: border-top-left-radius border-top-right-radius,
class: rounded-top,
values: (null: $border-radius)
),
"rounded-end": (
property: border-top-right-radius border-bottom-right-radius,
class: rounded-end,
values: (null: $border-radius)
),
"rounded-bottom": (
property: border-bottom-right-radius border-bottom-left-radius,
class: rounded-bottom,
values: (null: $border-radius)
),
"rounded-start": (
property: border-bottom-left-radius border-top-left-radius,
class: rounded-start,
values: (null: $border-radius)
),
"visibility": (
property: visibility,
class: null,
values: (
visible: visible,
invisible: hidden,
)
)
),
$utilities
);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,65 @@
/*!
* Bootstrap Grid v5.0.0-beta1 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
$include-column-box-sizing: true !default;
@import "functions";
@import "variables";
@import "mixins/lists";
@import "mixins/breakpoints";
@import "mixins/container";
@import "mixins/grid";
@import "mixins/utilities";
@import "vendor/rfs";
@import "containers";
@import "grid";
@import "utilities";
// Only use the utilities we need
// stylelint-disable-next-line scss/dollar-variable-default
$utilities: map-get-multiple(
$utilities,
(
"display",
"order",
"flex",
"flex-direction",
"flex-grow",
"flex-shrink",
"flex-wrap",
"justify-content",
"align-items",
"align-content",
"align-self",
"margin",
"margin-x",
"margin-y",
"margin-top",
"margin-end",
"margin-bottom",
"margin-start",
"negative-margin",
"negative-margin-x",
"negative-margin-y",
"negative-margin-top",
"negative-margin-end",
"negative-margin-bottom",
"negative-margin-start",
"padding",
"padding-x",
"padding-y",
"padding-top",
"padding-end",
"padding-bottom",
"padding-start",
)
);
@import "utilities/api";
@@ -0,0 +1,15 @@
/*!
* Bootstrap Reboot v5.0.0-beta1 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
@import "functions";
@import "variables";
// Prevent the usage of custom properties since we don't add them to `:root` in reboot
$font-family-base: $font-family-sans-serif; // stylelint-disable-line scss/dollar-variable-default
$font-family-code: $font-family-monospace; // stylelint-disable-line scss/dollar-variable-default
@import "mixins";
@import "reboot";
@@ -0,0 +1,18 @@
/*!
* Bootstrap Utilities v5.0.0-beta1 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
// Configuration
@import "functions";
@import "variables";
@import "mixins";
@import "utilities";
// Utilities
@import "utilities/api";
@@ -0,0 +1,51 @@
/*!
* Bootstrap v5.0.0-beta1 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
// scss-docs-start import-stack
// Configuration
@import "functions";
@import "variables";
@import "mixins";
@import "utilities";
// Layout & components
@import "root";
@import "reboot";
@import "type";
@import "images";
@import "containers";
@import "grid";
@import "tables";
@import "forms";
@import "buttons";
@import "transitions";
@import "dropdown";
@import "button-group";
@import "nav";
@import "navbar";
@import "card";
@import "accordion";
@import "breadcrumb";
@import "pagination";
@import "badge";
@import "alert";
@import "progress";
@import "list-group";
@import "close";
@import "toasts";
@import "modal";
@import "tooltip";
@import "popover";
@import "carousel";
@import "spinners";
// Helpers
@import "helpers";
// Utilities
@import "utilities/api";
// scss-docs-end import-stack
@@ -0,0 +1,61 @@
.form-floating {
position: relative;
> .form-control,
> .form-select {
height: $form-floating-height;
padding: $form-floating-padding-y $form-floating-padding-x;
}
> label {
position: absolute;
top: 0;
left: 0;
height: 100%; // allow textareas
padding: $form-floating-padding-y $form-floating-padding-x;
pointer-events: none;
border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model
transform-origin: 0 0;
@include transition($form-floating-transition);
}
// stylelint-disable no-duplicate-selectors
> .form-control {
&::placeholder {
color: transparent;
}
&:focus,
&:not(:placeholder-shown) {
padding-top: $form-floating-input-padding-t;
padding-bottom: $form-floating-input-padding-b;
}
// Duplicated because `:-webkit-autofill` invalidates other selectors when grouped
&:-webkit-autofill {
padding-top: $form-floating-input-padding-t;
padding-bottom: $form-floating-input-padding-b;
}
}
> .form-select {
padding-top: $form-floating-input-padding-t;
padding-bottom: $form-floating-input-padding-b;
}
> .form-control:focus,
> .form-control:not(:placeholder-shown),
> .form-select {
~ label {
opacity: $form-floating-label-opacity;
transform: $form-floating-label-transform;
}
}
// Duplicated because `:-webkit-autofill` invalidates other selectors when grouped
> .form-control:-webkit-autofill {
~ label {
opacity: $form-floating-label-opacity;
transform: $form-floating-label-transform;
}
}
// stylelint-enable no-duplicate-selectors
}
@@ -0,0 +1,151 @@
//
// Check/radio
//
.form-check {
display: block;
min-height: $form-check-min-height;
padding-left: $form-check-padding-start;
margin-bottom: $form-check-margin-bottom;
.form-check-input {
float: left;
margin-left: $form-check-padding-start * -1;
}
}
.form-check-input {
width: $form-check-input-width;
height: $form-check-input-width;
margin-top: ($line-height-base - $form-check-input-width) / 2; // line-height minus check height
vertical-align: top;
background-color: $form-check-input-bg;
background-repeat: no-repeat;
background-position: center;
background-size: contain;
border: $form-check-input-border;
appearance: none;
color-adjust: exact; // Keep themed appearance for print
@include transition($form-check-transition);
&[type="checkbox"] {
@include border-radius($form-check-input-border-radius);
}
&[type="radio"] {
// stylelint-disable-next-line property-disallowed-list
border-radius: $form-check-radio-border-radius;
}
&:active {
filter: $form-check-input-active-filter;
}
&:focus {
border-color: $form-check-input-focus-border;
outline: 0;
box-shadow: $form-check-input-focus-box-shadow;
}
&:checked {
background-color: $form-check-input-checked-bg-color;
border-color: $form-check-input-checked-border-color;
&[type="checkbox"] {
@if $enable-gradients {
background-image: escape-svg($form-check-input-checked-bg-image), var(--#{$variable-prefix}gradient);
} @else {
background-image: escape-svg($form-check-input-checked-bg-image);
}
}
&[type="radio"] {
@if $enable-gradients {
background-image: escape-svg($form-check-radio-checked-bg-image), var(--#{$variable-prefix}gradient);
} @else {
background-image: escape-svg($form-check-radio-checked-bg-image);
}
}
}
&[type="checkbox"]:indeterminate {
background-color: $form-check-input-indeterminate-bg-color;
border-color: $form-check-input-indeterminate-border-color;
@if $enable-gradients {
background-image: escape-svg($form-check-input-indeterminate-bg-image), var(--#{$variable-prefix}gradient);
} @else {
background-image: escape-svg($form-check-input-indeterminate-bg-image);
}
}
&:disabled {
pointer-events: none;
filter: none;
opacity: $form-check-input-disabled-opacity;
}
// Use disabled attribute in addition of :disabled pseudo-class
// See: https://github.com/twbs/bootstrap/issues/28247
&[disabled],
&:disabled {
~ .form-check-label {
opacity: $form-check-label-disabled-opacity;
}
}
}
.form-check-label {
color: $form-check-label-color;
cursor: $form-check-label-cursor;
}
//
// Switch
//
.form-switch {
padding-left: $form-switch-padding-start;
.form-check-input {
width: $form-switch-width;
margin-left: $form-switch-padding-start * -1;
background-image: escape-svg($form-switch-bg-image);
background-position: left center;
@include border-radius($form-switch-border-radius);
&:focus {
background-image: escape-svg($form-switch-focus-bg-image);
}
&:checked {
background-position: $form-switch-checked-bg-position;
@if $enable-gradients {
background-image: escape-svg($form-switch-checked-bg-image), var(--#{$variable-prefix}gradient);
} @else {
background-image: escape-svg($form-switch-checked-bg-image);
}
}
}
}
.form-check-inline {
display: inline-block;
margin-right: $form-check-inline-margin-end;
}
.btn-check {
position: absolute;
clip: rect(0, 0, 0, 0);
pointer-events: none;
&[disabled],
&:disabled {
+ .btn {
pointer-events: none;
filter: none;
opacity: $form-check-btn-check-disabled-opacity;
}
}
}
@@ -0,0 +1,223 @@
//
// General form controls (plus a few specific high-level interventions)
//
.form-control {
display: block;
width: 100%;
padding: $input-padding-y $input-padding-x;
font-family: $input-font-family;
@include font-size($input-font-size);
font-weight: $input-font-weight;
line-height: $input-line-height;
color: $input-color;
background-color: $input-bg;
background-clip: padding-box;
border: $input-border-width solid $input-border-color;
appearance: none; // Fix appearance for date inputs in Safari
// Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
@include border-radius($input-border-radius, 0);
@include box-shadow($input-box-shadow);
@include transition($input-transition);
&[type="file"] {
overflow: hidden; // prevent pseudo element button overlap
&:not(:disabled):not([readonly]) {
cursor: pointer;
}
}
// Customize the `:focus` state to imitate native WebKit styles.
&:focus {
color: $input-focus-color;
background-color: $input-focus-bg;
border-color: $input-focus-border-color;
outline: 0;
@if $enable-shadows {
@include box-shadow($input-box-shadow, $input-focus-box-shadow);
} @else {
// Avoid using mixin so we can pass custom focus shadow properly
box-shadow: $input-focus-box-shadow;
}
}
// Add some height to date inputs on iOS
// https://github.com/twbs/bootstrap/issues/23307
// TODO: we can remove this workaround once https://bugs.webkit.org/show_bug.cgi?id=198959 is resolved
&::-webkit-date-and-time-value {
// Multiply line-height by 1em if it has no unit
height: if(unit($input-line-height) == "", $input-line-height * 1em, $input-line-height);
}
// Placeholder
&::placeholder {
color: $input-placeholder-color;
// Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
opacity: 1;
}
// Disabled and read-only inputs
//
// HTML5 says that controls under a fieldset > legend:first-child won't be
// disabled if the fieldset is disabled. Due to implementation difficulty, we
// don't honor that edge case; we style them as disabled anyway.
&:disabled,
&[readonly] {
background-color: $input-disabled-bg;
border-color: $input-disabled-border-color;
// iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
opacity: 1;
}
// File input buttons theming
// stylelint-disable-next-line selector-pseudo-element-no-unknown
&::file-selector-button {
padding: $input-padding-y $input-padding-x;
margin: (-$input-padding-y) (-$input-padding-x);
margin-inline-end: $input-padding-x;
color: $form-file-button-color;
@include gradient-bg($form-file-button-bg);
pointer-events: none;
border-color: inherit;
border-style: solid;
border-width: 0;
border-inline-end-width: $input-border-width;
border-radius: 0; // stylelint-disable-line property-disallowed-list
@include transition($btn-transition);
}
// stylelint-disable-next-line selector-pseudo-element-no-unknown
&:hover:not(:disabled):not([readonly])::file-selector-button {
background-color: $form-file-button-hover-bg;
}
&::-webkit-file-upload-button {
padding: $input-padding-y $input-padding-x;
margin: (-$input-padding-y) (-$input-padding-x);
margin-inline-end: $input-padding-x;
color: $form-file-button-color;
@include gradient-bg($form-file-button-bg);
pointer-events: none;
border-color: inherit;
border-style: solid;
border-width: 0;
border-inline-end-width: $input-border-width;
border-radius: 0; // stylelint-disable-line property-disallowed-list
@include transition($btn-transition);
}
&:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
background-color: $form-file-button-hover-bg;
}
}
// Readonly controls as plain text
//
// Apply class to a readonly input to make it appear like regular plain
// text (without any border, background color, focus indicator)
.form-control-plaintext {
display: block;
width: 100%;
padding: $input-padding-y 0;
margin-bottom: 0; // match inputs if this class comes on inputs with default margins
line-height: $input-line-height;
color: $input-plaintext-color;
background-color: transparent;
border: solid transparent;
border-width: $input-border-width 0;
&.form-control-sm,
&.form-control-lg {
padding-right: 0;
padding-left: 0;
}
}
// Form control sizing
//
// Build on `.form-control` with modifier classes to decrease or increase the
// height and font-size of form controls.
//
// Repeated in `_input_group.scss` to avoid Sass extend issues.
.form-control-sm {
min-height: $input-height-sm;
padding: $input-padding-y-sm $input-padding-x-sm;
@include font-size($input-font-size-sm);
@include border-radius($input-border-radius-sm);
// stylelint-disable-next-line selector-pseudo-element-no-unknown
&::file-selector-button {
padding: $input-padding-y-sm $input-padding-x-sm;
margin: (-$input-padding-y-sm) (-$input-padding-x-sm);
margin-inline-end: $input-padding-x-sm;
}
&::-webkit-file-upload-button {
padding: $input-padding-y-sm $input-padding-x-sm;
margin: (-$input-padding-y-sm) (-$input-padding-x-sm);
margin-inline-end: $input-padding-x-sm;
}
}
.form-control-lg {
min-height: $input-height-lg;
padding: $input-padding-y-lg $input-padding-x-lg;
@include font-size($input-font-size-lg);
@include border-radius($input-border-radius-lg);
// stylelint-disable-next-line selector-pseudo-element-no-unknown
&::file-selector-button {
padding: $input-padding-y-lg $input-padding-x-lg;
margin: (-$input-padding-y-lg) (-$input-padding-x-lg);
margin-inline-end: $input-padding-x-lg;
}
&::-webkit-file-upload-button {
padding: $input-padding-y-lg $input-padding-x-lg;
margin: (-$input-padding-y-lg) (-$input-padding-x-lg);
margin-inline-end: $input-padding-x-lg;
}
}
// Make sure textareas don't shrink too much when resized
// https://github.com/twbs/bootstrap/pull/29124
// stylelint-disable selector-no-qualifying-type
textarea {
&.form-control {
min-height: $input-height;
}
&.form-control-sm {
min-height: $input-height-sm;
}
&.form-control-lg {
min-height: $input-height-lg;
}
}
// stylelint-enable selector-no-qualifying-type
.form-control-color {
max-width: 3rem;
height: auto; // Override fixed browser height
padding: $input-padding-y;
&:not(:disabled):not([readonly]) {
cursor: pointer;
}
&::-moz-color-swatch {
height: if(unit($input-line-height) == "", $input-line-height * 1em, $input-line-height);
@include border-radius($input-border-radius);
}
&::-webkit-color-swatch {
height: if(unit($input-line-height) == "", $input-line-height * 1em, $input-line-height);
@include border-radius($input-border-radius);
}
}
@@ -0,0 +1,91 @@
// Range
//
// Style range inputs the same across browsers. Vendor-specific rules for pseudo
// elements cannot be mixed. As such, there are no shared styles for focus or
// active states on prefixed selectors.
.form-range {
width: 100%;
height: add($form-range-thumb-height, $form-range-thumb-focus-box-shadow-width * 2);
padding: 0; // Need to reset padding
background-color: transparent;
appearance: none;
&:focus {
outline: none;
// Pseudo-elements must be split across multiple rulesets to have an effect.
// No box-shadow() mixin for focus accessibility.
&::-webkit-slider-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }
&::-moz-range-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }
}
&::-moz-focus-outer {
border: 0;
}
&::-webkit-slider-thumb {
width: $form-range-thumb-width;
height: $form-range-thumb-height;
margin-top: ($form-range-track-height - $form-range-thumb-height) / 2; // Webkit specific
@include gradient-bg($form-range-thumb-bg);
border: $form-range-thumb-border;
@include border-radius($form-range-thumb-border-radius);
@include box-shadow($form-range-thumb-box-shadow);
@include transition($form-range-thumb-transition);
appearance: none;
&:active {
@include gradient-bg($form-range-thumb-active-bg);
}
}
&::-webkit-slider-runnable-track {
width: $form-range-track-width;
height: $form-range-track-height;
color: transparent; // Why?
cursor: $form-range-track-cursor;
background-color: $form-range-track-bg;
border-color: transparent;
@include border-radius($form-range-track-border-radius);
@include box-shadow($form-range-track-box-shadow);
}
&::-moz-range-thumb {
width: $form-range-thumb-width;
height: $form-range-thumb-height;
@include gradient-bg($form-range-thumb-bg);
border: $form-range-thumb-border;
@include border-radius($form-range-thumb-border-radius);
@include box-shadow($form-range-thumb-box-shadow);
@include transition($form-range-thumb-transition);
appearance: none;
&:active {
@include gradient-bg($form-range-thumb-active-bg);
}
}
&::-moz-range-track {
width: $form-range-track-width;
height: $form-range-track-height;
color: transparent;
cursor: $form-range-track-cursor;
background-color: $form-range-track-bg;
border-color: transparent; // Firefox specific?
@include border-radius($form-range-track-border-radius);
@include box-shadow($form-range-track-box-shadow);
}
&:disabled {
pointer-events: none;
&::-webkit-slider-thumb {
background-color: $form-range-thumb-disabled-bg;
}
&::-moz-range-thumb {
background-color: $form-range-thumb-disabled-bg;
}
}
}
@@ -0,0 +1,68 @@
// Select
//
// Replaces the browser default select with a custom one, mostly pulled from
// https://primer.github.io/.
.form-select {
display: block;
width: 100%;
padding: $form-select-padding-y ($form-select-padding-x + $form-select-indicator-padding) $form-select-padding-y $form-select-padding-x;
font-family: $form-select-font-family;
@include font-size($form-select-font-size);
font-weight: $form-select-font-weight;
line-height: $form-select-line-height;
color: $form-select-color;
vertical-align: middle;
background-color: $form-select-bg;
background-image: escape-svg($form-select-indicator);
background-repeat: no-repeat;
background-position: $form-select-bg-position;
background-size: $form-select-bg-size;
border: $form-select-border-width solid $form-select-border-color;
@include border-radius($form-select-border-radius, 0);
@include box-shadow($form-select-box-shadow);
appearance: none;
&:focus {
border-color: $form-select-focus-border-color;
outline: 0;
@if $enable-shadows {
@include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);
} @else {
// Avoid using mixin so we can pass custom focus shadow properly
box-shadow: $form-select-focus-box-shadow;
}
}
&[multiple],
&[size]:not([size="1"]) {
padding-right: $form-select-padding-x;
background-image: none;
}
&:disabled {
color: $form-select-disabled-color;
background-color: $form-select-disabled-bg;
border-color: $form-select-disabled-border-color;
}
// Remove outline from select box in FF
&:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 $form-select-color;
}
}
.form-select-sm {
padding-top: $form-select-padding-y-sm;
padding-bottom: $form-select-padding-y-sm;
padding-left: $form-select-padding-x-sm;
@include font-size($form-select-font-size-sm);
}
.form-select-lg {
padding-top: $form-select-padding-y-lg;
padding-bottom: $form-select-padding-y-lg;
padding-left: $form-select-padding-x-lg;
@include font-size($form-select-font-size-lg);
}
@@ -0,0 +1,11 @@
//
// Form text
//
.form-text {
margin-top: $form-text-margin-top;
@include font-size($form-text-font-size);
font-style: $form-text-font-style;
font-weight: $form-text-font-weight;
color: $form-text-color;
}
@@ -0,0 +1,121 @@
//
// Base styles
//
.input-group {
position: relative;
display: flex;
flex-wrap: wrap; // For form validation feedback
align-items: stretch;
width: 100%;
> .form-control,
> .form-select {
position: relative; // For focus state's z-index
flex: 1 1 auto;
width: 1%;
min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size
}
// Bring the "active" form control to the top of surrounding elements
> .form-control:focus,
> .form-select:focus {
z-index: 3;
}
// Ensure buttons are always above inputs for more visually pleasing borders.
// This isn't needed for `.input-group-text` since it shares the same border-color
// as our inputs.
.btn {
position: relative;
z-index: 2;
&:focus {
z-index: 3;
}
}
}
// Textual addons
//
// Serves as a catch-all element for any text or radio/checkbox input you wish
// to prepend or append to an input.
.input-group-text {
display: flex;
align-items: center;
padding: $input-group-addon-padding-y $input-group-addon-padding-x;
@include font-size($input-font-size); // Match inputs
font-weight: $input-group-addon-font-weight;
line-height: $input-line-height;
color: $input-group-addon-color;
text-align: center;
white-space: nowrap;
background-color: $input-group-addon-bg;
border: $input-border-width solid $input-group-addon-border-color;
@include border-radius($input-border-radius);
}
// Sizing
//
// Remix the default form control sizing classes into new ones for easier
// manipulation.
.input-group-lg > .form-control,
.input-group-lg > .form-select,
.input-group-lg > .input-group-text,
.input-group-lg > .btn {
padding: $input-padding-y-lg $input-padding-x-lg;
@include font-size($input-font-size-lg);
@include border-radius($input-border-radius-lg);
}
.input-group-sm > .form-control,
.input-group-sm > .form-select,
.input-group-sm > .input-group-text,
.input-group-sm > .btn {
padding: $input-padding-y-sm $input-padding-x-sm;
@include font-size($input-font-size-sm);
@include border-radius($input-border-radius-sm);
}
.input-group-lg > .form-select,
.input-group-sm > .form-select {
padding-right: $form-select-padding-x + $form-select-indicator-padding;
}
// Rounded corners
//
// These rulesets must come after the sizing ones to properly override sm and lg
// border-radius values when extending. They're more specific than we'd like
// with the `.input-group >` part, but without it, we cannot override the sizing.
// stylelint-disable-next-line no-duplicate-selectors
.input-group {
&:not(.has-validation) {
> :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),
> .dropdown-toggle:nth-last-child(n + 3) {
@include border-end-radius(0);
}
}
&.has-validation {
> :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu),
> .dropdown-toggle:nth-last-child(n + 4) {
@include border-end-radius(0);
}
}
$validation-messages: "";
@each $state in map-keys($form-validation-states) {
$validation-messages: $validation-messages + ":not(." + unquote($state) + "-tooltip)" + ":not(." + unquote($state) + "-feedback)";
}
> :not(:first-child):not(.dropdown-menu)#{$validation-messages} {
margin-left: -$input-border-width;
@include border-start-radius(0);
}
}
@@ -0,0 +1,36 @@
//
// Labels
//
.form-label {
margin-bottom: $form-label-margin-bottom;
@include font-size($form-label-font-size);
font-style: $form-label-font-style;
font-weight: $form-label-font-weight;
color: $form-label-color;
}
// For use with horizontal and inline forms, when you need the label (or legend)
// text to align with the form controls.
.col-form-label {
padding-top: add($input-padding-y, $input-border-width);
padding-bottom: add($input-padding-y, $input-border-width);
margin-bottom: 0; // Override the `<legend>` default
@include font-size(inherit); // Override the `<legend>` default
font-style: $form-label-font-style;
font-weight: $form-label-font-weight;
line-height: $input-line-height;
color: $form-label-color;
}
.col-form-label-lg {
padding-top: add($input-padding-y-lg, $input-border-width);
padding-bottom: add($input-padding-y-lg, $input-border-width);
@include font-size($input-font-size-lg);
}
.col-form-label-sm {
padding-top: add($input-padding-y-sm, $input-border-width);
padding-bottom: add($input-padding-y-sm, $input-border-width);
@include font-size($input-font-size-sm);
}
@@ -0,0 +1,12 @@
// Form validation
//
// Provide feedback to users when form field values are valid or invalid. Works
// primarily for client-side validation via scoped `:invalid` and `:valid`
// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
// server-side validation.
// scss-docs-start form-validation-states-loop
@each $state, $data in $form-validation-states {
@include form-validation-state($state, map-get($data, color), map-get($data, icon));
}
// scss-docs-end form-validation-states-loop
@@ -0,0 +1,3 @@
.clearfix {
@include clearfix();
}

Some files were not shown because too many files have changed in this diff Show More