diff --git a/.gitignore b/.gitignore index 95af615e..241b2915 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,8 @@ bin/hugo public/** -# Hugo build output and caches +# Hugo build output and caches. resources/ covers the SCSS cache and the +# images the pipeline generates under resources/_gen/images. docs/ resources/ .hugo_build.lock diff --git a/README.md b/README.md index 476d100c..0c17bfbc 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,7 @@ To create a new sponsor data file, run `hugo new sponsors/my-new-sponsor.md`. Th The MarkDown file for the sponsor will have a FrontMatter section with the following fields: - `id`: Unique identifier of this sponsor. Should be a string without spaces, preferrably kebab-case. - `name`: Sponsor's name to be shown in all renderings. -- `logo`: URL for the sponsor logo. If present, this logo will be used. -- `logo_image`: File name for the sponsor logo if it's to be found under `/static/images/sponsors/`. +- `logo_image`: File name for the sponsor logo, which must be under `themes/pybcn_theme/assets/images/sponsors/`. An external URL is not accepted: copy the file into the repository. The template loads it with `resources.Get`, so a file under `static/` is not found, and `bin/check-content` reports it as an error. - `url`: URL for the sponsor web page. - `twitter`: URL for the sponsor's twitter account. @@ -206,6 +205,12 @@ Each event in the list can indicate: - the location where the event will take place (a room, or a url) - the topic of the event (e.g. Data Science, Security...) - the type of the event: talk, workshop, coffee, lunch, photo, group, qa, lightning +- `language`: the language the talk is given in, shown as text (e.g. `Spanish`) +- `title_lang`: set it only when the title itself is not in English, with + `Spanish`, `Castellano`, `Catalan`, `Català` or a BCP 47 code such as `es`. + It puts a `lang` attribute on the title, so a screen reader reads it with + the right voice. `language` never sets it: many talks given in Spanish have + an English title - `python_level` and `topic_level`: the experience the attendee needs. Use one of `beginner`, `intermediate` or `advanced` diff --git a/bin/check-content b/bin/check-content index b4e2aea1..880e21f4 100755 --- a/bin/check-content +++ b/bin/check-content @@ -2,8 +2,8 @@ """Validate the front matter in content/. Catches the mistakes that a Hugo build does not: a person id that does not -match its filename, a duplicate id, an event that points at a person or -sponsor page which does not exist, and a declared photo with no file behind it. +match its filename, a duplicate id, a page that lists a person or sponsor id +with no page behind it, and a declared photo with no file behind it. Exit code 1 if any error is found. Warnings do not fail the build. @@ -13,13 +13,26 @@ Usage: import pathlib import re +import struct import sys import yaml ROOT = pathlib.Path(__file__).resolve().parent.parent CONTENT = ROOT / "content" -PHOTOS = ROOT / "static" / "images" / "people" +# Person photos moved from static/ to the theme assets so Hugo can process +# them. Accept either location, so the check works before and after that move. +LOGO_DIRS = [ + ROOT / "themes" / "pybcn_theme" / "assets" / "images" / "sponsors", + ROOT / "assets" / "images" / "sponsors", +] +# Only the asset directories count. The template resolves a photo with +# resources.Get, which does not look in static/, so a file left there renders the +# anonymous avatar instead and the check used to pass. +PHOTO_DIRS = [ + ROOT / "themes" / "pybcn_theme" / "assets" / "images" / "people", + ROOT / "assets" / "images" / "people", +] FRONT_MATTER = re.compile(r"\A---\r?\n(.*?)\r?\n---[ \t]*(?:\r?\n|\Z)", re.S) @@ -35,9 +48,27 @@ def warn(path, message): warnings.append(f"{path.relative_to(ROOT)}: {message}") +def note(message): + """A warning about the collection rather than about one file.""" + warnings.append(message) + + +_front_matter = {} + + def front_matter(path): - """Return the parsed front matter, or None if the file has none.""" - text = path.read_text(encoding="utf-8") + """Return the parsed front matter, or None if the file has none. + + The result is kept per path: several checks walk the same files, and a + file with a YAML error should be reported once. + """ + if path not in _front_matter: + _front_matter[path] = _parse_front_matter(path) + return _front_matter[path] + + +def _parse_front_matter(path): + text = path.read_text(encoding="utf-8").lstrip("\ufeff") match = FRONT_MATTER.match(text) if not match: if text.lstrip().startswith("+++"): @@ -72,54 +103,236 @@ def collect_ids(section): return found +def bare_file_name(path, field, value): + """True when the value names a file inside its directory and nothing else. + + The templates build the asset path as images/people/ and + images/sponsors/, and resources.Get resolves a '..' segment. + So 'logo_image: ../people/x.jpg' showed a person's photo as a sponsor logo, + and the existence check passed because pathlib resolves '..' the same way. + A content-only pull request could show any image already in the repository + on any page. A value with a separator or a '..' segment is an error. + """ + if "/" in value or "\\" in value or ".." in value: + error(path, f"{field} '{value}' must be a file name, not a path") + return False + return True + + +def image_size(path): + """Return (width, height) for a PNG, GIF or JPEG, or None. + + Only the header is read, and only the three formats the people and the + sponsor directories hold. A format this cannot read returns None and the + caller skips the check rather than guessing. + """ + try: + with open(path, "rb") as handle: + head = handle.read(32) + if head[:8] == b"\x89PNG\r\n\x1a\n": + return struct.unpack(">II", head[16:24]) + if head[:6] in (b"GIF87a", b"GIF89a"): + return struct.unpack("HH", handle.read(4)) + return (width, height) + length = struct.unpack(">H", handle.read(2))[0] + handle.seek(length - 2, 1) + except (OSError, struct.error): + return None + return None + + def check_photos(people): + # A photo that is not square is cropped by the build rather than squashed, + # so it is not an error. It is reported once, with a count, because there + # are dozens of them and a line each would bury everything else. + cropped = [] + small = [] for page_id, path in people.items(): data = front_matter(path) or {} photo = data.get("photo") - if photo and not (PHOTOS / photo).exists(): - error(path, f"photo '{photo}' not found in static/images/people/") + if photo and not bare_file_name(path, "photo", photo): + continue + found = next((d / photo for d in PHOTO_DIRS if photo and (d / photo).exists()), None) + if photo and not found: + where = ", ".join(str(d.relative_to(ROOT)) for d in PHOTO_DIRS) + error(path, f"photo '{photo}' not found in any of: {where}") + elif found: + size = image_size(found) + if size and size[0] != size[1]: + cropped.append((photo, size)) + if size and min(size) < PHOTO_SIDE: + small.append((photo, size)) + report_cropped(cropped) + report_small(small) + + +PHOTO_SIDE = 400 + + +def report_small(small): + if not small: + return + shown = ", ".join(f"{name} ({w}x{h})" for name, (w, h) in sorted(small)[:3]) + note(f"{len(small)} of the person photos are smaller than {PHOTO_SIDE}px on " + f"their short side, so the build enlarges them and they look soft in " + f"the grid. Smallest: {shown}.") + + +def report_cropped(cropped): + if not cropped: + return + worst = sorted(cropped, key=lambda item: abs(item[1][0] / item[1][1] - 1), reverse=True)[:3] + shown = ", ".join(f"{name} ({w}x{h})" for name, (w, h) in worst) + note(f"{len(cropped)} of the person photos are not square, so the build " + f"crops them to fit the grid and part of each picture is lost. " + f"Furthest from square: {shown}. Crop one yourself to choose which " + f"part survives.") -def referenced_ids(data, key): - """Pull every id out of an event's people_sections or sponsor_levels.""" +def check_logos(sponsors): + """A sponsor whose declared logo file is missing renders a broken image, and + the Hugo build does not notice. A sponsor with no logo_image at all is only + a warning, because the template falls back to the name as text. + + The logo field, an external URL, is an error: the template no longer reads + it, because it accepted any scheme and any host and so let a pull request + load a third-party image on every page that lists the sponsor.""" + for page_id, path in sponsors.items(): + data = front_matter(path) or {} + if "logo" in data: + error(path, f"'logo' is not supported: copy the file under " + f"{LOGO_DIRS[0].relative_to(ROOT)} and use logo_image") + logo = data.get("logo_image") + if not logo: + warn(path, f"sponsor '{page_id}' declares no logo, so it renders as text") + continue + if not bare_file_name(path, "logo_image", logo): + continue + if not any((d / logo).exists() for d in LOGO_DIRS): + where = ", ".join(str(d.relative_to(ROOT)) for d in LOGO_DIRS) + error(path, f"logo '{logo}' not found in any of: {where}") + + +# The front matter keys the templates read to list people or sponsors by id, +# mapped to the name of the id list inside each level. event.html reads +# people_sections and sponsor_levels, people.html reads people_levels and +# sponsors.html reads sponsor_levels. +LISTING_KEYS = { + "people_sections": "people", + "people_levels": "people", + "sponsor_levels": "sponsors", +} + + +def referenced_ids(path, data, key): + """Pull every id out of one listing key of a page. + + people_levels and sponsor_levels hold a list of levels. people_sections + holds a list of sections, each with its own list of levels. + """ out = [] for section in data.get(key) or []: - for level in section.get("levels", [section]): - out.extend(level.get("people") or level.get("sponsors") or []) + if not isinstance(section, dict): + error(path, f"'{key}' holds {section!r}, which is not a level") + continue + for level in section.get("levels") or [section]: + if not isinstance(level, dict): + error(path, f"'{key}' holds {level!r}, which is not a level") + continue + out.extend(level.get(LISTING_KEYS[key]) or []) return out -def check_events(people, sponsors): - for path in sorted((CONTENT / "events").rglob("*.md")): +def check_listings(people, sponsors): + """Every page that lists people or sponsors by id must point at pages that exist. + + The template drops an unknown id without a word, so the page just shows one + sponsor or one person less. The check walks every file under content/ and + looks for the keys the templates read, instead of a fixed set of + directories or page names. The old events walk covered content/events/ + only, so a typo in content/sponsors/_index.md or in + content/pyladies_bcn/sponsors.md was never reported, and the organizers + pages were listed by name, so a rename switched that check off in silence. + + Returns the set of person ids that some page lists, for the orphan check. + """ + listed_people = set() + for path in sorted(CONTENT.rglob("*.md")): data = front_matter(path) if data is None: continue - for ref in referenced_ids(data, "people_sections"): - if ref not in people: - error(path, f"references unknown person id '{ref}'") - for ref in referenced_ids(data, "sponsor_levels"): - if ref not in sponsors: - error(path, f"references unknown sponsor id '{ref}'") - - -def check_orphans(people): - """A person page nothing links to renders, but nobody can reach it.""" - body = "\n".join( - p.read_text(encoding="utf-8") - for p in CONTENT.rglob("*.md") - if p.parent.name != "people" - ) + for key, kind in LISTING_KEYS.items(): + if key not in data: + continue + known = people if kind == "people" else sponsors + noun = "person" if kind == "people" else "sponsor" + for ref in referenced_ids(path, data, key): + if ref not in known: + error(path, f"'{key}' references unknown {noun} id '{ref}'") + elif kind == "people": + listed_people.add(ref) + return listed_people + + +# The colour classes agenda.scss defines for an entry of the schedule. The +# entry's color value lands in the class attribute as it is, so a missing or +# misspelt value gets the fallback background instead of a brand colour. +AGENDA_COLOURS = {"blue", "green", "grey", "orange", "pink", "purple", "red", "yellow"} + + +def check_agenda(): + """Every entry of a schedule must carry one of the agenda colour classes.""" + for path in sorted(CONTENT.rglob("*.md")): + data = front_matter(path) + if data is None or not data.get("events"): + continue + for entry in data["events"]: + if not isinstance(entry, dict): + error(path, f"'events' holds {entry!r}, which is not an entry") + continue + colour = entry.get("color") + title = entry.get("title") or entry.get("speaker") or "?" + if not colour: + error(path, f"agenda entry '{title}' has no color; use one of: " + f"{', '.join(sorted(AGENDA_COLOURS))}") + elif colour not in AGENDA_COLOURS: + error(path, f"agenda entry '{title}' has color '{colour}', which is " + f"not one of: {', '.join(sorted(AGENDA_COLOURS))}") + + +def check_orphans(people, listed_people): + """A person page no listing points at renders, but nobody can reach it. + + The check compares against the ids check_listings collected from the + front matter keys, so only a real listing counts. The old check searched + the text of every page with a word-boundary regex, and a regex boundary + sits between a letter and a hyphen: 'ricardo' matched inside + 'ricardo-ander-egg' and 'jordi' inside 'jordi-bosch', so those two pages + passed with no listing at all. Prose that happens to contain an id does + not count as a reference either. + """ for page_id, path in people.items(): - if not re.search(rf"\b{re.escape(page_id)}\b", body): - warn(path, f"person '{page_id}' is not referenced by any event or page") + if page_id not in listed_people: + warn(path, f"person '{page_id}' is not listed by any event or page") def main(): people = collect_ids("people") sponsors = collect_ids("sponsors") check_photos(people) - check_events(people, sponsors) - check_orphans(people) + check_logos(sponsors) + listed_people = check_listings(people, sponsors) + check_agenda() + check_orphans(people, listed_people) for line in warnings: print(f"WARNING {line}") diff --git a/bin/measure-images b/bin/measure-images new file mode 100755 index 00000000..a1db3d52 --- /dev/null +++ b/bin/measure-images @@ -0,0 +1,352 @@ +#!/usr/bin/env python3 +"""Measure the image payload of a built Hugo site. + +Reports, for a set of pages, the bytes of every local image the page +references, plus site-wide totals and attribute counts. Use it before and +after an image change to get reproducible numbers. + +Usage: + bin/measure-images [page-path ...] + bin/measure-images --list-images + +A page path is relative to the built directory, with or without index.html. +Without page paths, the script uses a default set of pages. + +Blind spot: the per-page figures count the images the HTML names, which +are img and source elements, link rel=icon, and url() values in an inline +style or data-bg attribute. A background that a stylesheet sets is not +counted. home.scss puts an archive JPEG of about 290 KB on the .banner of +the home page and monthly_events.scss adds two PNGs to its headers, so the +real payload of those pages is larger than the figure here. Parsing SCSS or +CSS is out of scope for this tool. + +The frozen copies under archives/ are left out of the site totals and the +attribute counts, because no template controls them. They are reported on +their own line. +""" + +import os +import re +import struct +import sys +from html.parser import HTMLParser +from urllib.parse import unquote, urlsplit + +DEFAULT_PAGES = [ + "index.html", + "pybcn_association/organizers/index.html", + "events/pyday_bcn/pyday_bcn_2025/index.html", + "sponsors/index.html", + "contact/index.html", + "events/monthly_events/index.html", +] + +IMAGE_EXT = { + ".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg", ".avif", ".ico", ".bmp", + ".tif", ".tiff", +} + +CSS_URL = re.compile(r"url\(\s*['\"]?([^'\")]+)['\"]?\s*\)") + +# Top-level directories of the build that hold a frozen copy of an old site. +# bin/archive writes them; no template controls what is in them. +FROZEN_DIRS = ("archives",) + + +def walk(root, frozen): + """Walk the build. With frozen True, walk only the frozen copies; with + frozen False, walk everything else, the root's own files included.""" + for dirpath, dirs, files in os.walk(root): + if dirpath == root: + dirs[:] = [d for d in dirs if (d in FROZEN_DIRS) == frozen] + if frozen: + continue + yield dirpath, files + + +class ImageCollector(HTMLParser): + """Collect image references and img-tag attribute statistics.""" + + def __init__(self): + super().__init__(convert_charrefs=True) + self.refs = [] # (url, kind) with kind in src|srcset|css|other + self.img_total = 0 + self.img_dimensions = 0 + self.img_lazy = 0 + self.img_srcset = 0 + + def handle_starttag(self, tag, attrs): + a = {k.lower(): (v or "") for k, v in attrs} + + if tag == "img": + self.img_total += 1 + if a.get("width") and a.get("height"): + self.img_dimensions += 1 + if a.get("loading", "").lower() == "lazy": + self.img_lazy += 1 + if a.get("srcset"): + self.img_srcset += 1 + + if tag in ("img", "source"): + if a.get("src"): + self.refs.append((a["src"], "src")) + for candidate in a.get("srcset", "").split(","): + candidate = candidate.strip().split() + if candidate: + self.refs.append((candidate[0], "srcset")) + + if tag == "link" and "icon" in a.get("rel", "").lower(): + if a.get("href"): + self.refs.append((a["href"], "other")) + + for value in (a.get("style", ""), a.get("data-bg", "")): + for url in CSS_URL.findall(value): + self.refs.append((url, "css")) + + +def local_path(root, page_rel, url): + """Map a URL found on a page to a file inside the built directory.""" + url = url.strip() + if not url or url.startswith(("data:", "#")): + return None + parts = urlsplit(url) + path = unquote(parts.path) + if parts.scheme or parts.netloc: + # An absolute URL that points at the site itself still costs bytes, so + # count it when the path resolves inside the built directory. + candidate = os.path.normpath(os.path.join(root, path.lstrip("/"))) + return candidate if os.path.isfile(candidate) else None + if path.startswith("/"): + candidate = os.path.join(root, path.lstrip("/")) + else: + candidate = os.path.join(root, os.path.dirname(page_rel), path) + candidate = os.path.normpath(candidate) + if os.path.isfile(candidate): + return candidate + return None + + +def png_size(fh): + fh.seek(16) + return struct.unpack(">II", fh.read(8)) + + +def gif_size(fh): + fh.seek(6) + return struct.unpack("H", data)[0] + if 0xC0 <= marker <= 0xCF and marker not in (0xC4, 0xC8, 0xCC): + body = fh.read(5) + height, width = struct.unpack(">HH", body[1:5]) + return width, height + fh.seek(length - 2, os.SEEK_CUR) + + +def webp_size(fh): + fh.seek(12) + chunk = fh.read(4) + if chunk == b"VP8 ": + fh.seek(26) + width, height = struct.unpack("> 14) & 0x3FFF) + 1 + if chunk == b"VP8X": + fh.seek(24) + raw = fh.read(6) + width = (raw[0] | raw[1] << 8 | raw[2] << 16) + 1 + height = (raw[3] | raw[4] << 8 | raw[5] << 16) + 1 + return width, height + return None + + +def dimensions(path): + """Return (width, height) of a raster image, or None.""" + try: + with open(path, "rb") as fh: + head = fh.read(16) + if head.startswith(b"\x89PNG\r\n\x1a\n"): + return png_size(fh) + if head.startswith(b"GIF8"): + return gif_size(fh) + if head.startswith(b"\xff\xd8"): + return jpeg_size(fh) + if head.startswith(b"RIFF") and head[8:12] == b"WEBP": + return webp_size(fh) + except (OSError, struct.error): + return None + return None + + +def page_report(root, page_rel): + path = os.path.join(root, page_rel) + if os.path.isdir(path): + page_rel = os.path.join(page_rel, "index.html") + path = os.path.join(root, page_rel) + if not os.path.isfile(path): + return None + + with open(path, encoding="utf-8", errors="replace") as fh: + collector = ImageCollector() + collector.feed(fh.read()) + + primary, every, remote = {}, {}, set() + for url, kind in collector.refs: + resolved = local_path(root, page_rel, url) + if resolved is None: + parts = urlsplit(url.strip()) + if parts.scheme in ("http", "https"): + remote.add(url.strip()) + continue + size = os.path.getsize(resolved) + every[resolved] = size + if kind != "srcset": + primary[resolved] = size + + return { + "page": page_rel, + "primary_bytes": sum(primary.values()), + "all_bytes": sum(every.values()), + "files": every, + "primary_files": primary, + "remote": sorted(remote), + "img_total": collector.img_total, + "img_dimensions": collector.img_dimensions, + "img_lazy": collector.img_lazy, + "img_srcset": collector.img_srcset, + } + + +def mb(value): + """Format a byte count as MiB, the unit every figure in this tool uses.""" + return "%.2f MiB" % (value / 1024 / 1024) + + +def site_totals(root, frozen=False): + total_bytes = 0 + images = [] + for dirpath, files in walk(root, frozen): + for name in files: + full = os.path.join(dirpath, name) + try: + size = os.path.getsize(full) + except OSError: + continue + total_bytes += size + if os.path.splitext(name)[1].lower() in IMAGE_EXT: + images.append((size, full)) + images.sort(reverse=True) + return total_bytes, images + + +def html_attribute_totals(root, frozen=False): + totals = {"img": 0, "dims": 0, "lazy": 0, "srcset": 0, "pages": 0} + for dirpath, files in walk(root, frozen): + for name in files: + if not name.endswith(".html"): + continue + totals["pages"] += 1 + with open(os.path.join(dirpath, name), encoding="utf-8", + errors="replace") as fh: + collector = ImageCollector() + collector.feed(fh.read()) + totals["img"] += collector.img_total + totals["dims"] += collector.img_dimensions + totals["lazy"] += collector.img_lazy + totals["srcset"] += collector.img_srcset + return totals + + +def main(argv): + if len(argv) < 2: + print(__doc__) + return 2 + root = argv[1].rstrip("/") + rest = argv[2:] + + if rest and rest[0] == "--list-images": + for page in rest[1:]: + report = page_report(root, page) + if report is None: + print("missing page: %s" % page, file=sys.stderr) + continue + for path in sorted(report["primary_files"]): + print(os.path.relpath(path, root)) + return 0 + + pages = rest or DEFAULT_PAGES + + print("built directory: %s" % root) + print() + print("%-52s %12s %12s %5s %5s %5s %5s" + % ("page", "1x payload", "all srcset", "img", "dim", "lazy", "set")) + for page in pages: + report = page_report(root, page) + if report is None: + print("%-52s %12s" % (page, "MISSING")) + continue + print("%-52s %12s %12s %5d %5d %5d %5d" % ( + report["page"][:52], + mb(report["primary_bytes"]), + mb(report["all_bytes"]), + report["img_total"], + report["img_dimensions"], + report["img_lazy"], + report["img_srcset"], + )) + for url in report["remote"]: + print("%-52s remote: %s" % ("", url)) + + total_bytes, images = site_totals(root) + attrs = html_attribute_totals(root) + frozen_bytes, frozen_images = site_totals(root, frozen=True) + frozen_attrs = html_attribute_totals(root, frozen=True) + + print() + print("site totals (without %s/)" % ", ".join(FROZEN_DIRS)) + print(" output directory size : %s" % mb(total_bytes)) + print(" image files : %d, %s" + % (len(images), mb(sum(size for size, _ in images)))) + print(" html pages : %d" % attrs["pages"]) + print(" img elements : %d" % attrs["img"]) + print(" with width + height : %d" % attrs["dims"]) + print(" with loading=lazy : %d" % attrs["lazy"]) + print(" with srcset : %d" % attrs["srcset"]) + print() + print("frozen copies under %s/, not counted above" % ", ".join(FROZEN_DIRS)) + print(" directory size : %s" % mb(frozen_bytes)) + print(" image files : %d, %s" + % (len(frozen_images), mb(sum(size for size, _ in frozen_images)))) + print(" html pages : %d" % frozen_attrs["pages"]) + print(" img elements : %d" % frozen_attrs["img"]) + print() + print("largest image files (without %s/)" % ", ".join(FROZEN_DIRS)) + for size, full in images[:10]: + dims = dimensions(full) + shape = "%dx%d" % dims if dims else "vector or unknown" + pixels = ("%.1f Mpx" % (dims[0] * dims[1] / 1e6)) if dims else "-" + print(" %9s %-18s %-10s %s" + % (mb(size), shape, pixels, os.path.relpath(full, root))) + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/config.toml b/config.toml index e9e4d68d..4959eda2 100644 --- a/config.toml +++ b/config.toml @@ -5,6 +5,10 @@ theme = "pybcn_theme" enableGitInfo = true enableRobotsTXT = true +# A cold build resizes every person photo and sponsor logo, which takes more +# than the 30s default that Hugo allows a single partial. +timeout = "300s" + # The site uses neither tags nor categories, and Hugo's defaults produced two # empty index pages in the sitemap. The archive work will add its own taxonomy. [taxonomies] diff --git a/content/contact/_index.md b/content/contact/_index.md index 1b58273c..b6cfbb31 100644 --- a/content/contact/_index.md +++ b/content/contact/_index.md @@ -6,7 +6,7 @@ layout: "contact" show_pybcn: "true" weight: 7 -heroBackground: https://images.unsplash.com/photo-1512626120412-faf41adb4874?ixlib=rb-1.2.1&auto=format&fit=crop&w=1500&q=80 +heroBackground: /images/photos/organize-with-us.jpg --- {{< bordered-col icon="fa-briefcase" title="For companies!" chevrons="true" >}} diff --git a/content/events/monthly_events.md b/content/events/monthly_events.md index f9d9b43c..fd184342 100644 --- a/content/events/monthly_events.md +++ b/content/events/monthly_events.md @@ -5,7 +5,7 @@ menu: main: parent: 'Events' layout: monthly_events -heroBackground: https://images.unsplash.com/photo-1603123656383-56d6fca2f506 +heroBackground: /images/photos/pyladies_meetups.jpeg meetupEvents: - name: PyBCN id: python-barcelona diff --git a/content/events/pydatabcn/pydatabcn_2023.md b/content/events/pydatabcn/pydatabcn_2023.md index c400f89c..1761053f 100644 --- a/content/events/pydatabcn/pydatabcn_2023.md +++ b/content/events/pydatabcn/pydatabcn_2023.md @@ -124,6 +124,7 @@ events: location: Sala d'actes Ada Lovelace requirements: "Experiencia con Python, conocimiento básico de Jupyter y pandas" language: "Spanish" + title_lang: Spanish - speaker: "Amalia Vradi" title: "Jupyter Notebooks 101" description: "This will be an interactive workshop on Jupyter Notebooks, the popular web application that enables you to create and share documents that contain live code, equations, visualizations and narrative text. In this beginner-friendly session, you'll discover what Jupyter Notebooks are and what you can do with them. We'll also introduce you to Google Colab and Kaggle, two platforms that offer free, cloud-based versions of Notebooks. You'll get hands-on experience with installing and using them, as well as experimenting with the features offered by the platforms. Bring your laptop and your curiosity and learn how to take your data science projects to the next level using Jupyter Notebooks!" @@ -166,6 +167,7 @@ events: location: Aula Hipàtia d'Alexandria requirements: "Solid knowledge of Python and some basic knowledge of web development (HTML). Virtual environment and editor already set up (https://github.com/polyrand/pydatabcn-imgapp-workshop1). Optional: Docker." language: "Spanish" + title_lang: Spanish - start_time_slot: 11:00 end_time_slot: 11:15 @@ -232,6 +234,7 @@ events: location: Aula Hipàtia d'Alexandria requirements: "Conocimiento de elementos de Python como funciones, clases, bucles, comprensiones de listas, generadores, etc. Conocer las estructuras de datos principales de Python (listas, sets, tuples, diccionarios...). Habilidades básicas de procesamiento de texto (manipular cadenas de texto y conocimiento básico de expresiones regulares (regex)). Para el taller solamente utilizaremos la librería estándar de Python. Se recomienda usar Python 3.7 o superior." language: "Spanish" + title_lang: Spanish - start_time_slot: 13:00 end_time_slot: 13:00 @@ -306,6 +309,7 @@ events: location: Aula Hipàtia d'Alexandria requirements: "Cal certa comoditat a l'hora de treballar amb Python, NumPy i Matplotlib. Tots els gràfics seran introduïts abans d'utilitzar-se, però és recomanable tenir coneixements bàsics d'estadística." language: "Catalan" + title_lang: Catalan topic: "Data Visualization" - start_time_slot: 15:30 diff --git a/content/events/pyday_bcn/pyday_bcn_2018.md b/content/events/pyday_bcn/pyday_bcn_2018.md index 73fa07ae..80ce9f80 100644 --- a/content/events/pyday_bcn/pyday_bcn_2018.md +++ b/content/events/pyday_bcn/pyday_bcn_2018.md @@ -5,7 +5,7 @@ menu: main: parent: 'PyDay BCN' weight: 8 -heroBackground: https://images.unsplash.com/photo-1504384764586-bb4cdc1707b0?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80 +heroBackground: /images/photos/people-pyday-2016.jpg ---
diff --git a/content/events/pyday_bcn/pyday_bcn_2020.md b/content/events/pyday_bcn/pyday_bcn_2020.md index 75f2a627..4375fd64 100644 --- a/content/events/pyday_bcn/pyday_bcn_2020.md +++ b/content/events/pyday_bcn/pyday_bcn_2020.md @@ -7,7 +7,7 @@ menu: weight: 6 aliases: - /pyday-bcn-2020 -heroBackground: https://images.unsplash.com/photo-1504384764586-bb4cdc1707b0?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80 +heroBackground: /images/photos/people-pyday-2019_1600_450.png layout: event @@ -158,6 +158,7 @@ events: title: "Ho sento, no ets el meu tipus" description: "Type Hints were introduced in Python 3 but you may have never used them, known that they exist, or seen code that uses them. Or you may have seen code with type hints and cringed because it didn't look like the Python you know. In this talk we will demistify type hints and show how they can actually help you find potential bugs." language: "Catalan" + title_lang: Catalan speaker: "Carles Barrobés" type: lightning python_level: intermediate @@ -172,6 +173,7 @@ events: title: "Alexa, te elijo a ti" description: "Algunos de nosotros tenemos un aparatito en casa escuchándonos 24/7 que usamos para escuchar música, preguntarle la hora y pedirle un temporizador o un chiste malo. En esta charla os voy a enseñar como programar a Alexa usando Python para que os ayude en vuestras tareas usando dos ejemplos: una skill que nos calculará equivalencias para ayudarnos en las recetas de cocina (entre otras cosas) y otra que nos aconsejará sobre qué tipo de Pokémon elegir para enfrentarnos a un oponente." language: "Spanish" + title_lang: Spanish speaker: "Elisabeth Ortega Carrasco" type: talk python_level: beginner diff --git a/content/events/pyday_bcn/pyday_bcn_2021.md b/content/events/pyday_bcn/pyday_bcn_2021.md index a5c2f83a..0d1296cc 100644 --- a/content/events/pyday_bcn/pyday_bcn_2021.md +++ b/content/events/pyday_bcn/pyday_bcn_2021.md @@ -7,7 +7,7 @@ menu: weight: 5 aliases: - /pyday-bcn-2021 -heroBackground: https://images.unsplash.com/photo-1504384764586-bb4cdc1707b0?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80 +heroBackground: /images/photos/pyday2021.jpeg layout: event @@ -227,6 +227,7 @@ events: track_length: 1 color: red language: "Spanish" + title_lang: Spanish type: workshop topic: Architecture python_level: beginner @@ -310,6 +311,7 @@ events: track_length: 1 color: yellow language: "Spanish" + title_lang: Spanish type: talk location: Room Raval diff --git a/content/events/pyday_bcn/pyday_bcn_2022.md b/content/events/pyday_bcn/pyday_bcn_2022.md index 65f9c317..0d4f14a3 100644 --- a/content/events/pyday_bcn/pyday_bcn_2022.md +++ b/content/events/pyday_bcn/pyday_bcn_2022.md @@ -151,6 +151,7 @@ events: color: red type: workshop language: "Spanish" + title_lang: Spanish python_level: intermediate topic_level: intermediate requirements: "
  • Laptop , requirements.txt installed.
  • VS Code IDE.
" @@ -278,6 +279,7 @@ events: color: blue type: workshop language: "Spanish" + title_lang: Spanish python_level: beginner topic_level: beginner topic: "Scrapy" diff --git a/content/events/pyday_bcn/pyday_bcn_2023.md b/content/events/pyday_bcn/pyday_bcn_2023.md index 3d260811..544f1eb1 100644 --- a/content/events/pyday_bcn/pyday_bcn_2023.md +++ b/content/events/pyday_bcn/pyday_bcn_2023.md @@ -287,6 +287,7 @@ events: color: yellow type: workshop language: "Spanish" + title_lang: Spanish python_level: intermediate topic_level: intermediate topic: "API requests" @@ -363,6 +364,7 @@ events: color: yellow type: workshop language: "Spanish" + title_lang: Spanish python_level: intermediate topic_level: intermediate requirements: "" diff --git a/content/events/pyday_bcn/pyday_bcn_2024.md b/content/events/pyday_bcn/pyday_bcn_2024.md index c09b00a0..f00a2f0a 100644 --- a/content/events/pyday_bcn/pyday_bcn_2024.md +++ b/content/events/pyday_bcn/pyday_bcn_2024.md @@ -264,6 +264,7 @@ During the talk, my idea is to present the tool and the technological solutions color: green type: workshop language: "Català" + title_lang: Catalan python_level: beginner topic_level: beginner requirements: "https://github.com/OriolAbril/pyday2024-xarray/blob/main/requirements.txt" @@ -456,6 +457,7 @@ During the talk, my idea is to present the tool and the technological solutions color: yellow type: workshop language: "Spanish" + title_lang: Spanish python_level: intermediate topic_level: beginner topic: "Web development, Videogames" diff --git a/content/events/pyday_bcn/pyday_bcn_2025.md b/content/events/pyday_bcn/pyday_bcn_2025.md index 31d2c2bf..fbe2acc6 100644 --- a/content/events/pyday_bcn/pyday_bcn_2025.md +++ b/content/events/pyday_bcn/pyday_bcn_2025.md @@ -237,6 +237,7 @@ events: color: orange type: workshop language: "Spanish" + title_lang: Spanish python_level: intermediate topic_level: intermediate requirements: "Python environment y IDE" @@ -262,6 +263,7 @@ events: color: blue type: workshop language: "Spanish" + title_lang: Spanish python_level: intermediate topic_level: beginner requirements: "Conexión a internet, cuenta de Google (para trabajar en Google Colab a través de librerías ya disponibles sin necesidad de usar consola de comandos (cmd) ni instalar Python en local." @@ -289,6 +291,7 @@ events: color: yellow type: workshop language: "Spanish/English" + title_lang: Spanish python_level: beginner topic_level: beginner requirements: "Conexión a internet. Python 3.10+. Tener la librería \"openai\" instalada. No se necesitará una API key para el taller. Se recomienda usar un gestor de entornos como uv o virtualenv, aunque no es obligatorio. Cada participante debe tener su entorno listo. Durante el taller se utilizará \"uv\" para gestionar dependencias." @@ -377,6 +380,7 @@ events: color: blue type: workshop language: "Spanish/English" + title_lang: Spanish python_level: intermediate topic_level: beginner requirements: "Python 3.10+ (cada participante puede decidir seguir el taller con un Jupyter Notebook, Google Colab, scripts de Python, etc). El taller se desarrollará utilizando archivos de texto de Python, pero es apto para seguirlo en un notebook también." @@ -406,6 +410,7 @@ events: color: yellow type: workshop language: "Catalan" + title_lang: Spanish python_level: intermediate topic_level: intermediate topic: "Computer vision" @@ -444,6 +449,7 @@ events: color: orange type: workshop language: "Catalan" + title_lang: Catalan python_level: intermediate topic_level: beginner requirements: "Utilitzarem la última versió de la llibreria bambi durant el taller. Es recomana tenir un virtual environment amb la llibreria ja instal·lada si es vol seguir el taller en directe. El taller també assumeix un nivell intermedi en l'ús de NumPy i Pandas." @@ -469,6 +475,7 @@ events: color: blue type: workshop language: "Spanish" + title_lang: Spanish python_level: intermediate topic_level: beginner requirements: "Portátil y acceso a internet, para poder clonar el repositorio y seguir las instrucciones." @@ -489,6 +496,7 @@ events: color: yellow type: workshop language: "English" + title_lang: Spanish python_level: beginner topic_level: beginner requirements: "" diff --git a/content/people/albert-franzi.md b/content/people/albert-franzi.md index e1a9ce0e..23d997be 100644 --- a/content/people/albert-franzi.md +++ b/content/people/albert-franzi.md @@ -3,6 +3,7 @@ id: albert-franzi name: Albert Franzi Cros short_bio: "Fell so in love with data that ended up as Head of Data Platform at Typeform.

I believe in a world where distributed organizations can work together to build common and reusable tools to empower their users and projects.

My main goal is to empower people, teams, and companies with the right data so we can make informed and data-driven decisions by having a clear understanding of each involved function and role.

In addition of having a secret plan to conquer the world with data, insights, and penguins." photo: albert-franzi.jpeg +photo_anchor: Left twitter: https://twitter.com/franzicros linkedin: https://www.linkedin.com/in/albertfranzi/ diff --git a/content/people/alejandro-nicolas.md b/content/people/alejandro-nicolas.md index df80bb74..7e963e6a 100644 --- a/content/people/alejandro-nicolas.md +++ b/content/people/alejandro-nicolas.md @@ -3,6 +3,7 @@ id: alejandro-nicolas name: Alejandro Nicolás short_bio: "Alejandro is a Full Stack developer who has seen his career gradually move towards data. With experience in multiple programming languages and frameworks. His path began, how the path of many developers begins, in Consulting and little by little he has been approaching Marketing and Advertising with an overview of all the platforms with which he has worked. He loves to develop by experimenting in his spare time and Python is a great friend to do so." photo: alejandro-nicolas.jpg +photo_anchor: Bottom twitter: https://twitter.com/sander_pm linkedin: www.linkedin.com/in/alejandro-nicolàs-ruiz-73915711a diff --git a/content/people/alexandre-savio.md b/content/people/alexandre-savio.md index c9450fd2..448ab7d0 100644 --- a/content/people/alexandre-savio.md +++ b/content/people/alexandre-savio.md @@ -3,6 +3,7 @@ id: alexandre-savio name: Alexandre Savio short_bio: Freelance Software Engineer, specializing in Python, Cloud, DevOps, neuroimaging and machine-learning. Organizer of PySS conference. photo: alexandre-savio.jpeg +photo_anchor: Top twitter: https://twitter.com/alex_savio linkedin: https://www.linkedin.com/in/alexsavio diff --git a/content/people/alicia-morales.md b/content/people/alicia-morales.md index 3998d71e..429a4aa8 100644 --- a/content/people/alicia-morales.md +++ b/content/people/alicia-morales.md @@ -3,6 +3,8 @@ id: alicia-morales name: Alicia Morales Carrasco short_bio: Data Engineer - Data enthusiast - Python and Scala lover - Home Automation Geek photo: alicia-morales.jpeg +# Smart cropped below the face on this portrait. +photo_anchor: Top pybcn_position: PyBCN Organizer diff --git a/content/people/alvaro-duran-barata.md b/content/people/alvaro-duran-barata.md index 6fe17bae..9fdfebfe 100644 --- a/content/people/alvaro-duran-barata.md +++ b/content/people/alvaro-duran-barata.md @@ -3,6 +3,7 @@ id: alvaro-duran-barata name: Alvaro Duran Barata short_bio: NLP/ML engineer photo: alvaro-duran-barata.jpeg +photo_anchor: Top linkedin: https://es.linkedin.com/in/alvaroduranbarata github: https://github.com/ohduran diff --git a/content/people/angel.md b/content/people/angel.md index f9aa090a..63cd50dc 100644 --- a/content/people/angel.md +++ b/content/people/angel.md @@ -6,5 +6,6 @@ twitter: "https://twitter.com/anxodio" linkedin: "https://www.linkedin.com/in/anxodio/" github: "https://www.github.com/anxodio" photo: angel.jpg +photo_anchor: Right pybcn_position: PyBCN Collaborator --- diff --git a/content/people/anton-caceres.md b/content/people/anton-caceres.md index bb04580c..1473b40f 100644 --- a/content/people/anton-caceres.md +++ b/content/people/anton-caceres.md @@ -3,6 +3,7 @@ id: anton-caceres name: Anton Caceres short_bio: Python dev running an agency in Munich and organizing tech events. photo: anton-caceres.jpg +photo_anchor: Top twitter: https://twitter.com/anton_caceres linkedin: https://www.linkedin.com/in/antoncaceres diff --git a/content/people/daniel-mesejo.md b/content/people/daniel-mesejo.md index ced632ff..6518f197 100644 --- a/content/people/daniel-mesejo.md +++ b/content/people/daniel-mesejo.md @@ -3,6 +3,7 @@ id: daniel-mesejo name: "Daniel Mesejo Leon" photo: dani-mesejo.jpeg +photo_anchor: Top pybcn_position: "PyBCN Secretary" diff --git a/content/people/eloi.md b/content/people/eloi.md index 2ddd6e99..e3d6cfc3 100644 --- a/content/people/eloi.md +++ b/content/people/eloi.md @@ -4,6 +4,7 @@ name: Eloi Puertas Prats short_bio: "Teaching Software Engineering, Distributed Software and Robotics in Universitat de Barcelona. Artificial Intelligence and Computer Vision Researcher. Python lover" pybcn_position: "PyBCN organizer" photo: eloi.jpg +photo_anchor: Bottom twitter: "https://twitter.com/eloipuertas" linkedin: "https://www.linkedin.com/in/eloipuertas/" github: "https://www.github.com/eloipuertas" diff --git a/content/people/esperanza-buitrago.md b/content/people/esperanza-buitrago.md index 9f22f040..fa51a333 100644 --- a/content/people/esperanza-buitrago.md +++ b/content/people/esperanza-buitrago.md @@ -3,6 +3,7 @@ id: esperanza-buitrago name: Esperanza Buitrago short_bio: "Esperanza is a mathematician with a specialty in logic. She has been working as entrepreneur, in different positions in tech areas, and lately she has been working as a Data Engineer in Agranimo, a company based in Germany that is interested in the agronomical models needed for the fields to be understood as they should be." photo: esperanza-buitrago.jpeg +photo_anchor: Top twitter: https://twitter.com/ebuitragod linkedin: https://www.linkedin.com/in/ebuitragod/ diff --git a/content/people/francesco-faraone.md b/content/people/francesco-faraone.md index 499bff64..1e45a642 100644 --- a/content/people/francesco-faraone.md +++ b/content/people/francesco-faraone.md @@ -3,6 +3,7 @@ id: francesco-faraone name: Francesco Faraone short_bio: "Neapolitan by birth, Barcelonian by adoption, I started programming back in 1986 (and I'm still alive: P)." photo: francesco-faraone.png +photo_anchor: Bottom twitter: https://twitter.com/cicfaraone linkedin: https://www.linkedin.com/in/francesco-faraone-01568a8/ diff --git a/content/people/gabriel-de-maeztu.md b/content/people/gabriel-de-maeztu.md index 4b68c4d6..9cb4af1a 100644 --- a/content/people/gabriel-de-maeztu.md +++ b/content/people/gabriel-de-maeztu.md @@ -3,6 +3,7 @@ id: gabriel-de-maeztu name: Gabriel de Maeztu short_bio: Medical doctor and mathematician, during my work as a researcher, I found out that I could fuse the two passions of mine, provide health care and pattern recognition. Today I work at the intersection of medicine and machine learning. That means that I use numbers to understand patients and diseases better. I work with large amounts of data to build tools that help us to contextualize all the information and make better decisions. I believe that the cross-section between medicine and data-driven technologies will define the medicine of the future. photo: gabriel-de-maeztu.jpg +photo_anchor: Bottom twitter: https://twitter.com/gabimaeztu github: https://github.com/merqurio diff --git a/content/people/joan-fontanals-martinez.md b/content/people/joan-fontanals-martinez.md index 9eb1818e..2c0a6cc9 100644 --- a/content/people/joan-fontanals-martinez.md +++ b/content/people/joan-fontanals-martinez.md @@ -5,6 +5,7 @@ short_bio: "Joan is an engineer with experience in different industries like Tra For the last years, he has been focused on developing Search Systems and since July 2020 he has been part of Jina AI to develop an open source framework to support the next generation of AI-powered Semantic Search Systems." photo: joan-fontanals-martinez.jpg +photo_anchor: Bottom linkedin: https://www.linkedin.com/in/joanfontanalsmartinez/ github: https://github.com/JoanFM diff --git a/content/people/jordi.md b/content/people/jordi.md index 5102e46e..f0bd1aef 100644 --- a/content/people/jordi.md +++ b/content/people/jordi.md @@ -2,6 +2,7 @@ id: jordi name: Jordi Soucheiron photo: jordi.jpg +photo_anchor: Top short_bio: I love music, computers, cinema, photography and mixing them pybcn_position: PyBCN Organizer diff --git a/content/people/jose_haro.md b/content/people/jose_haro.md index 801300ba..4902a51a 100644 --- a/content/people/jose_haro.md +++ b/content/people/jose_haro.md @@ -3,6 +3,7 @@ id: jose_haro name: Jose Haro Peralta short_bio: Jose Haro Peralta is a full-stack software consultant specialising in Python and DevOps. He’s currently authoring “Developing Microservice APIs with Python” (Manning). photo: jose_haro.png +photo_anchor: Top twitter: https://twitter.com/JoseHaroPeralta linkedin: https://www.linkedin.com/in/jose-haro-peralta/ diff --git a/content/people/marc-ramirez.md b/content/people/marc-ramirez.md index 39a1c2ed..742728e6 100644 --- a/content/people/marc-ramirez.md +++ b/content/people/marc-ramirez.md @@ -3,6 +3,7 @@ id: marc-ramirez name: Marc Ramirez short_bio: "" photo: marc-ramirez.jpeg +photo_anchor: Top linkedin: https://www.linkedin.com/in/marcramirezinvernon/ github: https://github.com/marcraminv diff --git a/content/people/maria-teresa-grifa.md b/content/people/maria-teresa-grifa.md index cf04b5b7..e5ca3f8c 100644 --- a/content/people/maria-teresa-grifa.md +++ b/content/people/maria-teresa-grifa.md @@ -6,6 +6,7 @@ Within a month, I will turn myself in a Machine Learning engineer. I am an avid reader, techy a.e., and I am always hungry." photo: maria_teresa_grifa.jpg +photo_anchor: Bottom linkedin: https://www.linkedin.com/in/maria-teresa-g-624967165/ github: https://github.com/MT-G/ diff --git a/content/people/marina-palma.md b/content/people/marina-palma.md index f5db1b44..51ce6d7d 100644 --- a/content/people/marina-palma.md +++ b/content/people/marina-palma.md @@ -3,6 +3,7 @@ id: marina-palma name: Marina Palma short_bio: "" photo: marina-palma.jpg +photo_anchor: Bottom linkedin: https://www.linkedin.com/in/marina-palma-0494a6190 --- diff --git a/content/people/miquel-sarrias.md b/content/people/miquel-sarrias.md index d67e56e3..8854a254 100644 --- a/content/people/miquel-sarrias.md +++ b/content/people/miquel-sarrias.md @@ -3,6 +3,7 @@ id: miquel-sarrias name: Miquel Sàrrias short_bio: NLP/ML engineer photo: miquel-sarrias.jpeg +photo_anchor: Top linkedin: https://www.linkedin.com/in/miquel-s%C3%A0rrias-mont%C3%B3n-aa5067129/ twitter: https://twitter.com/MiquelSarrias diff --git a/content/people/pavel-sulimov.md b/content/people/pavel-sulimov.md index 5f3e1d7d..2249b85a 100644 --- a/content/people/pavel-sulimov.md +++ b/content/people/pavel-sulimov.md @@ -2,6 +2,7 @@ id: pavel-sulimov name: Pavel Sulimov photo: pavel-sulimov.png +photo_anchor: Right --- diff --git a/content/people/peter-krupa.md b/content/people/peter-krupa.md index 946164fa..7506aeea 100644 --- a/content/people/peter-krupa.md +++ b/content/people/peter-krupa.md @@ -3,6 +3,7 @@ id: peter-krupa name: "Peter Krupa" photo: peter_krupa.jpeg +photo_anchor: Bottom pybcn_position: "Board member of Communications" diff --git a/content/people/rajdeep-pal.md b/content/people/rajdeep-pal.md index cfa7f1eb..a1faeb53 100644 --- a/content/people/rajdeep-pal.md +++ b/content/people/rajdeep-pal.md @@ -2,6 +2,7 @@ id: rajdeep-pal name: Rajdeep Pal photo: rajdeep-pal.jpeg +photo_anchor: Left linkedin: https://www.linkedin.com/in/rajdeeppal/ --- diff --git a/content/people/ricardo-ander-egg.md b/content/people/ricardo-ander-egg.md index 65635c7c..34f08345 100644 --- a/content/people/ricardo-ander-egg.md +++ b/content/people/ricardo-ander-egg.md @@ -2,6 +2,7 @@ id: ricardo-ander-egg name: Ricardo Ander-Egg Aguilar photo: ricardo-ander-egg.jpeg +photo_anchor: Top twitter: https://twitter.com/ricardoanderegg linkedin: https://www.linkedin.com/in/ricardoanderegg/ diff --git a/content/people/ruben-afonso.md b/content/people/ruben-afonso.md index cafe2f18..de2ce15c 100644 --- a/content/people/ruben-afonso.md +++ b/content/people/ruben-afonso.md @@ -3,6 +3,7 @@ id: ruben-afonso name: Ruben Afonso short_bio: Solutions Architect with AWS photo: ruben-afonso.png +photo_anchor: Bottom twitter: https://twitter.com/rubenafo linkedin: https://www.linkedin.com/in/rubenafonso/ diff --git a/content/people/sergi-ramirez.md b/content/people/sergi-ramirez.md index b7be692c..392db409 100644 --- a/content/people/sergi-ramirez.md +++ b/content/people/sergi-ramirez.md @@ -3,6 +3,7 @@ id: sergi-ramirez name: "Sergi Ramírez" photo: sergi-ramirez.jpeg +photo_anchor: Left pybcn_position: "Board member of Events" diff --git a/content/people/toni-espadas.md b/content/people/toni-espadas.md index 482105a5..79cab147 100644 --- a/content/people/toni-espadas.md +++ b/content/people/toni-espadas.md @@ -3,6 +3,7 @@ id: toni-espadas name: "Toni Espadas" photo: toni_espadas.jpg +photo_anchor: Bottom pybcn_position: "PyBCN Treasurer" diff --git a/content/people/vivek-sharma.md b/content/people/vivek-sharma.md index f1ddc891..1a68da2f 100644 --- a/content/people/vivek-sharma.md +++ b/content/people/vivek-sharma.md @@ -3,6 +3,7 @@ id: vivek-sharma name: Vivek Sharma short_bio: "Vivek (They/Them/Theirs) is a Research Assistant at Instituto de Bioenginyeria de Cataluña (IBEC). They are interested in signal processing, mathematical modeling, python and are an open-source and Linux enthusiast. They love to discuss and do little things to make science open-source." photo: vivek-sharma.jpg +photo_anchor: Top twitter: https://twitter.com/Chaotic_Neuron linkedin: https://www.linkedin.com/in/vivek-sharma-2715b6129 diff --git a/content/people/xiang-xu.md b/content/people/xiang-xu.md index ffaca2d6..c2aab20f 100644 --- a/content/people/xiang-xu.md +++ b/content/people/xiang-xu.md @@ -3,6 +3,7 @@ id: xiang-xu name: Xiang Xu short_bio: "" photo: xiang-xu.jpg +photo_anchor: Right linkedin: https://www.linkedin.com/in/xiang-xu-68192b138/ --- diff --git a/content/pybcn_association/coc.md b/content/pybcn_association/coc.md index c44d1a02..45a513c0 100644 --- a/content/pybcn_association/coc.md +++ b/content/pybcn_association/coc.md @@ -9,7 +9,7 @@ aliases: - /coc layout: single -heroBackground: https://source.unsplash.com/LjqARJaJotc/1600x400 +heroBackground: /images/photos/people-pyday-2016.jpg --- PyBCN is dedicated to providing a respectful, harassment-free community for diff --git a/content/pybcn_association/collaborate.md b/content/pybcn_association/collaborate.md index 780b0155..4e2d32d8 100644 --- a/content/pybcn_association/collaborate.md +++ b/content/pybcn_association/collaborate.md @@ -7,7 +7,7 @@ menu: weight: 2 layout: single -heroBackground: https://source.unsplash.com/eluzJSfkNCk/1600x400 +heroBackground: /images/photos/people-pyday-2019.jpg --- diff --git a/content/pybcn_association/information.md b/content/pybcn_association/information.md index ff9ca5e2..3bb0c502 100644 --- a/content/pybcn_association/information.md +++ b/content/pybcn_association/information.md @@ -7,7 +7,7 @@ menu: weight: 1 layout: single -heroBackground: https://source.unsplash.com/5cFwQ-WMcJU/1600x400 +heroBackground: /images/photos/group-pydata-2017.jpg --- diff --git a/content/pybcn_association/job-offers.md b/content/pybcn_association/job-offers.md index 0679c6d7..853a4c5a 100644 --- a/content/pybcn_association/job-offers.md +++ b/content/pybcn_association/job-offers.md @@ -7,7 +7,7 @@ menu: weight: 5 aliases: - /job-offers -heroBackground: https://source.unsplash.com/vzfgh3RAPzM/1600x400 +heroBackground: /images/photos/pydata_badges.jpg --- diff --git a/content/pybcn_association/promote-your-event.md b/content/pybcn_association/promote-your-event.md index 31af2a01..aa57ec86 100644 --- a/content/pybcn_association/promote-your-event.md +++ b/content/pybcn_association/promote-your-event.md @@ -7,7 +7,7 @@ menu: weight: 3 layout: options -heroBackground: https://source.unsplash.com/tiNCpHudGrw/1600x400 +heroBackground: /images/photos/reg-desk-pyday-2019.jpg --- diff --git a/content/pybcn_association/sponsor-us.md b/content/pybcn_association/sponsor-us.md index 99adb33c..4f733f80 100644 --- a/content/pybcn_association/sponsor-us.md +++ b/content/pybcn_association/sponsor-us.md @@ -7,7 +7,7 @@ menu: weight: 3 layout: options -heroBackground: https://source.unsplash.com/Zyx1bK9mqmA/1600x400 +heroBackground: /images/photos/sponsors-area-pyday-2019.jpg options: - name: Regular monthly events diff --git a/content/pyladies_bcn/contact-us.md b/content/pyladies_bcn/contact-us.md index e2f9df41..2028a392 100644 --- a/content/pyladies_bcn/contact-us.md +++ b/content/pyladies_bcn/contact-us.md @@ -6,7 +6,7 @@ menu: parent: 'PyLadies BCN' weight: 7 layout: "contact" -heroBackground: https://images.unsplash.com/photo-1512626120412-faf41adb4874?ixlib=rb-1.2.1&auto=format&fit=crop&w=1500&q=80 +heroBackground: /images/photos/pyladies/header/header2.jpeg config: "pyladies_first" --- diff --git a/content/pyladies_bcn/job-offers.md b/content/pyladies_bcn/job-offers.md index ac77b220..c0cd93cd 100644 --- a/content/pyladies_bcn/job-offers.md +++ b/content/pyladies_bcn/job-offers.md @@ -5,7 +5,7 @@ menu: main: parent: 'PyLadies BCN' weight: 6 -heroBackground: https://source.unsplash.com/vzfgh3RAPzM/1600x400 +heroBackground: /images/photos/pyladies/header/header1.jpg --- Is your company offering jobs or scholarships? Share your offers with us and we'll forward it to the subscribers of the PyLadiesBCN mailing list. diff --git a/static/archives/pybcn.org/static/fonts/30B858_0_0.css b/static/archives/pybcn.org/static/fonts/30B858_0_0.css index a3e99364..26f0d516 100644 --- a/static/archives/pybcn.org/static/fonts/30B858_0_0.css +++ b/static/archives/pybcn.org/static/fonts/30B858_0_0.css @@ -20,8 +20,6 @@ */ -/* @import must be at top of file, otherwise CSS will not work */ -@import url("https://hello.myfonts.net/count/30b858"); @font-face {font-family: 'Flux-Regular';src: url('30B858_0_0.eot');src: url('30B858_0_0.eot%3F') format('embedded-opentype'),url('30B858_0_0.woff2') format('woff2'),url('30B858_0_0.woff') format('woff'),url('30B858_0_0.ttf') format('truetype');} diff --git a/themes/pybcn_theme/assets/css/style.css b/themes/pybcn_theme/assets/css/style.css deleted file mode 100644 index 8d19ae51..00000000 --- a/themes/pybcn_theme/assets/css/style.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v4.4.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.333333%;max-width:8.333333%}.col-2{flex:0 0 16.666667%;max-width:16.666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.333333%;max-width:33.333333%}.col-5{flex:0 0 41.666667%;max-width:41.666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.333333%;max-width:58.333333%}.col-8{flex:0 0 66.666667%;max-width:66.666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.333333%;max-width:83.333333%}.col-11{flex:0 0 91.666667%;max-width:91.666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}@media (min-width:48em){html{font-size:18px}}body{color:#555}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:400;color:#333}.h1 a,.h1 a:focus,.h1 a:hover,.h2 a,.h2 a:focus,.h2 a:hover,.h3 a,.h3 a:focus,.h3 a:hover,.h4 a,.h4 a:focus,.h4 a:hover,.h5 a,.h5 a:focus,.h5 a:hover,.h6 a,.h6 a:focus,.h6 a:hover,h1 a,h1 a:focus,h1 a:hover,h2 a,h2 a:focus,h2 a:hover,h3 a,h3 a:focus,h3 a:hover,h4 a,h4 a:focus,h4 a:hover,h5 a,h5 a:focus,h5 a:hover,h6 a,h6 a:focus,h6 a:hover{color:inherit;text-decoration:none}.container{max-width:60rem}.blog-masthead{margin-bottom:3rem;background-color:#428bca;-webkit-box-shadow:inset 0 -.1rem .25rem rgba(0,0,0,.1);box-shadow:inset 0 -.1rem .25rem rgba(0,0,0,.1)}.nav-link{position:relative;padding:1rem;font-weight:500;color:#cdddeb}.nav-link:focus,.nav-link:hover{color:#fff;background-color:transparent}.nav-link.active{color:#fff}.nav-link.active:after{position:absolute;bottom:0;left:50%;width:0;height:0;margin-left:-.3rem;vertical-align:middle;content:"";border-right:.3rem solid transparent;border-bottom:.3rem solid;border-left:.3rem solid transparent}.blog-header{padding-bottom:1.25rem;margin-bottom:2rem;border-bottom:.05rem solid #eee}.blog-title{margin-bottom:0;font-size:2rem;font-weight:400}.blog-description{font-size:1.1rem;color:#999}@media (min-width:40em){.blog-title{font-size:3.5rem}}.sidebar-module{padding:1rem}.sidebar-module-inset{padding:1rem;background-color:#f5f5f5;border-radius:.25rem}.sidebar-module-inset ol:last-child,.sidebar-module-inset p:last-child,.sidebar-module-inset ul:last-child{margin-bottom:0}.blog-pagination{margin-bottom:4rem}.blog-pagination>.btn{border-radius:2rem}.blog-post{margin-bottom:4rem}.blog-post-title{margin-bottom:.25rem;font-size:2.5rem}.blog-post-meta{margin-bottom:1.25rem;color:#999}article img{max-width:100%;height:auto;margin:13px auto}.sharing-icons .nav-item+.nav-item{margin-left:1rem}section+#disqus_thread{margin-top:1rem}article blockquote{margin-bottom:1rem;font-size:1.25rem}article div.highlight{padding:5px 5px 0 5px}.blog-footer{padding:2.5rem 0;color:#999;text-align:center;background-color:#f9f9f9;border-top:.05rem solid #e5e5e5}.blog-footer p:last-child{margin-bottom:0} \ No newline at end of file diff --git a/themes/pybcn_theme/assets/images/logo.svg b/themes/pybcn_theme/assets/images/logo.svg deleted file mode 100644 index 66ea8c3c..00000000 --- a/themes/pybcn_theme/assets/images/logo.svg +++ /dev/null @@ -1,79 +0,0 @@ - -image/svg+xml -python -barcelona - \ No newline at end of file diff --git a/static/images/people/JavierSabariego.jpg b/themes/pybcn_theme/assets/images/people/JavierSabariego.jpg similarity index 100% rename from static/images/people/JavierSabariego.jpg rename to themes/pybcn_theme/assets/images/people/JavierSabariego.jpg diff --git a/static/images/people/VyronVasileiadis.jpg b/themes/pybcn_theme/assets/images/people/VyronVasileiadis.jpg similarity index 100% rename from static/images/people/VyronVasileiadis.jpg rename to themes/pybcn_theme/assets/images/people/VyronVasileiadis.jpg diff --git a/static/images/people/adria-blanco.jpg b/themes/pybcn_theme/assets/images/people/adria-blanco.jpg similarity index 100% rename from static/images/people/adria-blanco.jpg rename to themes/pybcn_theme/assets/images/people/adria-blanco.jpg diff --git a/static/images/people/adrian-garcia-riber.jpeg b/themes/pybcn_theme/assets/images/people/adrian-garcia-riber.jpeg similarity index 100% rename from static/images/people/adrian-garcia-riber.jpeg rename to themes/pybcn_theme/assets/images/people/adrian-garcia-riber.jpeg diff --git a/static/images/people/afra-llado.jpg b/themes/pybcn_theme/assets/images/people/afra-llado.jpg similarity index 100% rename from static/images/people/afra-llado.jpg rename to themes/pybcn_theme/assets/images/people/afra-llado.jpg diff --git a/static/images/people/albert-franzi.jpeg b/themes/pybcn_theme/assets/images/people/albert-franzi.jpeg similarity index 100% rename from static/images/people/albert-franzi.jpeg rename to themes/pybcn_theme/assets/images/people/albert-franzi.jpeg diff --git a/static/images/people/albert-pujol-torras.jpeg b/themes/pybcn_theme/assets/images/people/albert-pujol-torras.jpeg similarity index 100% rename from static/images/people/albert-pujol-torras.jpeg rename to themes/pybcn_theme/assets/images/people/albert-pujol-torras.jpeg diff --git a/static/images/people/alberto-camara.jpeg b/themes/pybcn_theme/assets/images/people/alberto-camara.jpeg similarity index 100% rename from static/images/people/alberto-camara.jpeg rename to themes/pybcn_theme/assets/images/people/alberto-camara.jpeg diff --git a/static/images/people/alberto-labarga.jpg b/themes/pybcn_theme/assets/images/people/alberto-labarga.jpg similarity index 100% rename from static/images/people/alberto-labarga.jpg rename to themes/pybcn_theme/assets/images/people/alberto-labarga.jpg diff --git a/static/images/people/alberto.jpeg b/themes/pybcn_theme/assets/images/people/alberto.jpeg similarity index 100% rename from static/images/people/alberto.jpeg rename to themes/pybcn_theme/assets/images/people/alberto.jpeg diff --git a/static/images/people/alejandro-nicolas.jpg b/themes/pybcn_theme/assets/images/people/alejandro-nicolas.jpg similarity index 100% rename from static/images/people/alejandro-nicolas.jpg rename to themes/pybcn_theme/assets/images/people/alejandro-nicolas.jpg diff --git a/static/images/people/alex-molas.png b/themes/pybcn_theme/assets/images/people/alex-molas.png similarity index 100% rename from static/images/people/alex-molas.png rename to themes/pybcn_theme/assets/images/people/alex-molas.png diff --git a/static/images/people/alexandre-savio.jpeg b/themes/pybcn_theme/assets/images/people/alexandre-savio.jpeg similarity index 100% rename from static/images/people/alexandre-savio.jpeg rename to themes/pybcn_theme/assets/images/people/alexandre-savio.jpeg diff --git a/static/images/people/alicia-morales.jpeg b/themes/pybcn_theme/assets/images/people/alicia-morales.jpeg similarity index 100% rename from static/images/people/alicia-morales.jpeg rename to themes/pybcn_theme/assets/images/people/alicia-morales.jpeg diff --git a/static/images/people/alvaro-duran-barata.jpeg b/themes/pybcn_theme/assets/images/people/alvaro-duran-barata.jpeg similarity index 100% rename from static/images/people/alvaro-duran-barata.jpeg rename to themes/pybcn_theme/assets/images/people/alvaro-duran-barata.jpeg diff --git a/static/images/people/alvaro_duran.jpg b/themes/pybcn_theme/assets/images/people/alvaro_duran.jpg similarity index 100% rename from static/images/people/alvaro_duran.jpg rename to themes/pybcn_theme/assets/images/people/alvaro_duran.jpg diff --git a/static/images/people/amalia-vradi.jpg b/themes/pybcn_theme/assets/images/people/amalia-vradi.jpg similarity index 100% rename from static/images/people/amalia-vradi.jpg rename to themes/pybcn_theme/assets/images/people/amalia-vradi.jpg diff --git a/static/images/people/amir-azam.jpg b/themes/pybcn_theme/assets/images/people/amir-azam.jpg similarity index 100% rename from static/images/people/amir-azam.jpg rename to themes/pybcn_theme/assets/images/people/amir-azam.jpg diff --git a/static/images/people/ana-eliza-barbosa.jpeg b/themes/pybcn_theme/assets/images/people/ana-eliza-barbosa.jpeg similarity index 100% rename from static/images/people/ana-eliza-barbosa.jpeg rename to themes/pybcn_theme/assets/images/people/ana-eliza-barbosa.jpeg diff --git a/static/images/people/angel.jpg b/themes/pybcn_theme/assets/images/people/angel.jpg similarity index 100% rename from static/images/people/angel.jpg rename to themes/pybcn_theme/assets/images/people/angel.jpg diff --git a/static/images/people/ankit-mahato.png b/themes/pybcn_theme/assets/images/people/ankit-mahato.png similarity index 100% rename from static/images/people/ankit-mahato.png rename to themes/pybcn_theme/assets/images/people/ankit-mahato.png diff --git a/static/images/people/anton-caceres.jpg b/themes/pybcn_theme/assets/images/people/anton-caceres.jpg similarity index 100% rename from static/images/people/anton-caceres.jpg rename to themes/pybcn_theme/assets/images/people/anton-caceres.jpg diff --git a/static/images/people/antonio-molina.jpg b/themes/pybcn_theme/assets/images/people/antonio-molina.jpg similarity index 100% rename from static/images/people/antonio-molina.jpg rename to themes/pybcn_theme/assets/images/people/antonio-molina.jpg diff --git a/static/images/people/ariadna_fernandez.jpg b/themes/pybcn_theme/assets/images/people/ariadna_fernandez.jpg similarity index 100% rename from static/images/people/ariadna_fernandez.jpg rename to themes/pybcn_theme/assets/images/people/ariadna_fernandez.jpg diff --git a/static/images/people/asia-noble.jpeg b/themes/pybcn_theme/assets/images/people/asia-noble.jpeg similarity index 100% rename from static/images/people/asia-noble.jpeg rename to themes/pybcn_theme/assets/images/people/asia-noble.jpeg diff --git a/static/images/people/biel-stela-ballester.jpeg b/themes/pybcn_theme/assets/images/people/biel-stela-ballester.jpeg similarity index 100% rename from static/images/people/biel-stela-ballester.jpeg rename to themes/pybcn_theme/assets/images/people/biel-stela-ballester.jpeg diff --git a/static/images/people/brian-power.jpg b/themes/pybcn_theme/assets/images/people/brian-power.jpg similarity index 100% rename from static/images/people/brian-power.jpg rename to themes/pybcn_theme/assets/images/people/brian-power.jpg diff --git a/static/images/people/camilo-chacon.jpg b/themes/pybcn_theme/assets/images/people/camilo-chacon.jpg similarity index 100% rename from static/images/people/camilo-chacon.jpg rename to themes/pybcn_theme/assets/images/people/camilo-chacon.jpg diff --git a/static/images/people/carles_barrobes.jpg b/themes/pybcn_theme/assets/images/people/carles_barrobes.jpg similarity index 100% rename from static/images/people/carles_barrobes.jpg rename to themes/pybcn_theme/assets/images/people/carles_barrobes.jpg diff --git a/static/images/people/carlton-gibson.jpeg b/themes/pybcn_theme/assets/images/people/carlton-gibson.jpeg similarity index 100% rename from static/images/people/carlton-gibson.jpeg rename to themes/pybcn_theme/assets/images/people/carlton-gibson.jpeg diff --git a/static/images/people/carmen-iniesta-lopez.jpeg b/themes/pybcn_theme/assets/images/people/carmen-iniesta-lopez.jpeg similarity index 100% rename from static/images/people/carmen-iniesta-lopez.jpeg rename to themes/pybcn_theme/assets/images/people/carmen-iniesta-lopez.jpeg diff --git a/static/images/people/cheuk-ting-ho.jpg b/themes/pybcn_theme/assets/images/people/cheuk-ting-ho.jpg similarity index 100% rename from static/images/people/cheuk-ting-ho.jpg rename to themes/pybcn_theme/assets/images/people/cheuk-ting-ho.jpg diff --git a/static/images/people/christian-adell.jpg b/themes/pybcn_theme/assets/images/people/christian-adell.jpg similarity index 100% rename from static/images/people/christian-adell.jpg rename to themes/pybcn_theme/assets/images/people/christian-adell.jpg diff --git a/static/images/people/cristina-cosma.jpg b/themes/pybcn_theme/assets/images/people/cristina-cosma.jpg similarity index 100% rename from static/images/people/cristina-cosma.jpg rename to themes/pybcn_theme/assets/images/people/cristina-cosma.jpg diff --git a/static/images/people/dani-mesejo.jpeg b/themes/pybcn_theme/assets/images/people/dani-mesejo.jpeg similarity index 100% rename from static/images/people/dani-mesejo.jpeg rename to themes/pybcn_theme/assets/images/people/dani-mesejo.jpeg diff --git a/static/images/people/daniel-sanchez-santolaya.jpeg b/themes/pybcn_theme/assets/images/people/daniel-sanchez-santolaya.jpeg similarity index 100% rename from static/images/people/daniel-sanchez-santolaya.jpeg rename to themes/pybcn_theme/assets/images/people/daniel-sanchez-santolaya.jpeg diff --git a/static/images/people/daniel_mesejo.jpg b/themes/pybcn_theme/assets/images/people/daniel_mesejo.jpg similarity index 100% rename from static/images/people/daniel_mesejo.jpg rename to themes/pybcn_theme/assets/images/people/daniel_mesejo.jpg diff --git a/static/images/people/dave-pitts.png b/themes/pybcn_theme/assets/images/people/dave-pitts.png similarity index 100% rename from static/images/people/dave-pitts.png rename to themes/pybcn_theme/assets/images/people/dave-pitts.png diff --git a/static/images/people/david-blazquez.jpg b/themes/pybcn_theme/assets/images/people/david-blazquez.jpg similarity index 100% rename from static/images/people/david-blazquez.jpg rename to themes/pybcn_theme/assets/images/people/david-blazquez.jpg diff --git a/static/images/people/david-de-la-iglesia-castro.jpg b/themes/pybcn_theme/assets/images/people/david-de-la-iglesia-castro.jpg similarity index 100% rename from static/images/people/david-de-la-iglesia-castro.jpg rename to themes/pybcn_theme/assets/images/people/david-de-la-iglesia-castro.jpg diff --git a/static/images/people/david.jpeg b/themes/pybcn_theme/assets/images/people/david.jpeg similarity index 100% rename from static/images/people/david.jpeg rename to themes/pybcn_theme/assets/images/people/david.jpeg diff --git a/static/images/people/diego-giaquinta.png b/themes/pybcn_theme/assets/images/people/diego-giaquinta.png similarity index 100% rename from static/images/people/diego-giaquinta.png rename to themes/pybcn_theme/assets/images/people/diego-giaquinta.png diff --git a/static/images/people/diego-gonzalez.jpeg b/themes/pybcn_theme/assets/images/people/diego-gonzalez.jpeg similarity index 100% rename from static/images/people/diego-gonzalez.jpeg rename to themes/pybcn_theme/assets/images/people/diego-gonzalez.jpeg diff --git a/static/images/people/diego-quintana.jpeg b/themes/pybcn_theme/assets/images/people/diego-quintana.jpeg similarity index 100% rename from static/images/people/diego-quintana.jpeg rename to themes/pybcn_theme/assets/images/people/diego-quintana.jpeg diff --git a/static/images/people/edgar-riba.jpg b/themes/pybcn_theme/assets/images/people/edgar-riba.jpg similarity index 100% rename from static/images/people/edgar-riba.jpg rename to themes/pybcn_theme/assets/images/people/edgar-riba.jpg diff --git a/static/images/people/edgar-sarria-tenes.jpeg b/themes/pybcn_theme/assets/images/people/edgar-sarria-tenes.jpeg similarity index 100% rename from static/images/people/edgar-sarria-tenes.jpeg rename to themes/pybcn_theme/assets/images/people/edgar-sarria-tenes.jpeg diff --git a/static/images/people/eduard_cespedes.jpg b/themes/pybcn_theme/assets/images/people/eduard_cespedes.jpg similarity index 100% rename from static/images/people/eduard_cespedes.jpg rename to themes/pybcn_theme/assets/images/people/eduard_cespedes.jpg diff --git a/static/images/people/elisabeth-ortega-carrasco.jpg b/themes/pybcn_theme/assets/images/people/elisabeth-ortega-carrasco.jpg similarity index 100% rename from static/images/people/elisabeth-ortega-carrasco.jpg rename to themes/pybcn_theme/assets/images/people/elisabeth-ortega-carrasco.jpg diff --git a/static/images/people/elisabeth-ortega-carrasco.png b/themes/pybcn_theme/assets/images/people/elisabeth-ortega-carrasco.png similarity index 100% rename from static/images/people/elisabeth-ortega-carrasco.png rename to themes/pybcn_theme/assets/images/people/elisabeth-ortega-carrasco.png diff --git a/static/images/people/eloi.jpg b/themes/pybcn_theme/assets/images/people/eloi.jpg similarity index 100% rename from static/images/people/eloi.jpg rename to themes/pybcn_theme/assets/images/people/eloi.jpg diff --git a/static/images/people/ely-farres.jpg b/themes/pybcn_theme/assets/images/people/ely-farres.jpg similarity index 100% rename from static/images/people/ely-farres.jpg rename to themes/pybcn_theme/assets/images/people/ely-farres.jpg diff --git a/static/images/people/emanuel-frazao.jpeg b/themes/pybcn_theme/assets/images/people/emanuel-frazao.jpeg similarity index 100% rename from static/images/people/emanuel-frazao.jpeg rename to themes/pybcn_theme/assets/images/people/emanuel-frazao.jpeg diff --git a/static/images/people/enric-domingo.jpg b/themes/pybcn_theme/assets/images/people/enric-domingo.jpg similarity index 100% rename from static/images/people/enric-domingo.jpg rename to themes/pybcn_theme/assets/images/people/enric-domingo.jpg diff --git a/static/images/people/eric-massip.png b/themes/pybcn_theme/assets/images/people/eric-massip.png similarity index 100% rename from static/images/people/eric-massip.png rename to themes/pybcn_theme/assets/images/people/eric-massip.png diff --git a/static/images/people/esperanza-buitrago.jpeg b/themes/pybcn_theme/assets/images/people/esperanza-buitrago.jpeg similarity index 100% rename from static/images/people/esperanza-buitrago.jpeg rename to themes/pybcn_theme/assets/images/people/esperanza-buitrago.jpeg diff --git a/static/images/people/ester-jara.jpg b/themes/pybcn_theme/assets/images/people/ester-jara.jpg similarity index 100% rename from static/images/people/ester-jara.jpg rename to themes/pybcn_theme/assets/images/people/ester-jara.jpg diff --git a/static/images/people/esteve.jpeg b/themes/pybcn_theme/assets/images/people/esteve.jpeg similarity index 100% rename from static/images/people/esteve.jpeg rename to themes/pybcn_theme/assets/images/people/esteve.jpeg diff --git a/static/images/people/eva-martin-del-pico.png b/themes/pybcn_theme/assets/images/people/eva-martin-del-pico.png similarity index 100% rename from static/images/people/eva-martin-del-pico.png rename to themes/pybcn_theme/assets/images/people/eva-martin-del-pico.png diff --git a/static/images/people/ferran-jovell.jpg b/themes/pybcn_theme/assets/images/people/ferran-jovell.jpg similarity index 100% rename from static/images/people/ferran-jovell.jpg rename to themes/pybcn_theme/assets/images/people/ferran-jovell.jpg diff --git a/static/images/people/ferran_fabregas.png b/themes/pybcn_theme/assets/images/people/ferran_fabregas.png similarity index 100% rename from static/images/people/ferran_fabregas.png rename to themes/pybcn_theme/assets/images/people/ferran_fabregas.png diff --git a/static/images/people/fiorella-piriz-sapio.jpeg b/themes/pybcn_theme/assets/images/people/fiorella-piriz-sapio.jpeg similarity index 100% rename from static/images/people/fiorella-piriz-sapio.jpeg rename to themes/pybcn_theme/assets/images/people/fiorella-piriz-sapio.jpeg diff --git a/static/images/people/flavie-le-bars.jpg b/themes/pybcn_theme/assets/images/people/flavie-le-bars.jpg similarity index 100% rename from static/images/people/flavie-le-bars.jpg rename to themes/pybcn_theme/assets/images/people/flavie-le-bars.jpg diff --git a/static/images/people/francesco-faraone.png b/themes/pybcn_theme/assets/images/people/francesco-faraone.png similarity index 100% rename from static/images/people/francesco-faraone.png rename to themes/pybcn_theme/assets/images/people/francesco-faraone.png diff --git a/static/images/people/gabriel-de-maeztu.jpg b/themes/pybcn_theme/assets/images/people/gabriel-de-maeztu.jpg similarity index 100% rename from static/images/people/gabriel-de-maeztu.jpg rename to themes/pybcn_theme/assets/images/people/gabriel-de-maeztu.jpg diff --git a/static/images/people/gajendra-deshpande.jpg b/themes/pybcn_theme/assets/images/people/gajendra-deshpande.jpg similarity index 100% rename from static/images/people/gajendra-deshpande.jpg rename to themes/pybcn_theme/assets/images/people/gajendra-deshpande.jpg diff --git a/static/images/people/gema-parreno.jpeg b/themes/pybcn_theme/assets/images/people/gema-parreno.jpeg similarity index 100% rename from static/images/people/gema-parreno.jpeg rename to themes/pybcn_theme/assets/images/people/gema-parreno.jpeg diff --git a/static/images/people/guillermo_abad.jpg b/themes/pybcn_theme/assets/images/people/guillermo_abad.jpg similarity index 100% rename from static/images/people/guillermo_abad.jpg rename to themes/pybcn_theme/assets/images/people/guillermo_abad.jpg diff --git a/static/images/people/ifosch.jpg b/themes/pybcn_theme/assets/images/people/ifosch.jpg similarity index 100% rename from static/images/people/ifosch.jpg rename to themes/pybcn_theme/assets/images/people/ifosch.jpg diff --git a/static/images/people/israel-saeta.jpg b/themes/pybcn_theme/assets/images/people/israel-saeta.jpg similarity index 100% rename from static/images/people/israel-saeta.jpg rename to themes/pybcn_theme/assets/images/people/israel-saeta.jpg diff --git a/static/images/people/javier-ramos-panduro.jpg b/themes/pybcn_theme/assets/images/people/javier-ramos-panduro.jpg similarity index 100% rename from static/images/people/javier-ramos-panduro.jpg rename to themes/pybcn_theme/assets/images/people/javier-ramos-panduro.jpg diff --git a/static/images/people/jimena-escobar.jpg b/themes/pybcn_theme/assets/images/people/jimena-escobar.jpg similarity index 100% rename from static/images/people/jimena-escobar.jpg rename to themes/pybcn_theme/assets/images/people/jimena-escobar.jpg diff --git a/static/images/people/joan-fontanals-martinez.jpg b/themes/pybcn_theme/assets/images/people/joan-fontanals-martinez.jpg similarity index 100% rename from static/images/people/joan-fontanals-martinez.jpg rename to themes/pybcn_theme/assets/images/people/joan-fontanals-martinez.jpg diff --git a/static/images/people/johanna-sanchez.jpg b/themes/pybcn_theme/assets/images/people/johanna-sanchez.jpg similarity index 100% rename from static/images/people/johanna-sanchez.jpg rename to themes/pybcn_theme/assets/images/people/johanna-sanchez.jpg diff --git a/static/images/people/jordi-mur.jpg b/themes/pybcn_theme/assets/images/people/jordi-mur.jpg similarity index 100% rename from static/images/people/jordi-mur.jpg rename to themes/pybcn_theme/assets/images/people/jordi-mur.jpg diff --git a/static/images/people/jordi.jpg b/themes/pybcn_theme/assets/images/people/jordi.jpg similarity index 100% rename from static/images/people/jordi.jpg rename to themes/pybcn_theme/assets/images/people/jordi.jpg diff --git a/static/images/people/jordi_bosch.jpeg b/themes/pybcn_theme/assets/images/people/jordi_bosch.jpeg similarity index 100% rename from static/images/people/jordi_bosch.jpeg rename to themes/pybcn_theme/assets/images/people/jordi_bosch.jpeg diff --git a/static/images/people/jose-riera.jpeg b/themes/pybcn_theme/assets/images/people/jose-riera.jpeg similarity index 100% rename from static/images/people/jose-riera.jpeg rename to themes/pybcn_theme/assets/images/people/jose-riera.jpeg diff --git a/static/images/people/jose_haro.png b/themes/pybcn_theme/assets/images/people/jose_haro.png similarity index 100% rename from static/images/people/jose_haro.png rename to themes/pybcn_theme/assets/images/people/jose_haro.png diff --git a/static/images/people/josep.jpg b/themes/pybcn_theme/assets/images/people/josep.jpg similarity index 100% rename from static/images/people/josep.jpg rename to themes/pybcn_theme/assets/images/people/josep.jpg diff --git a/static/images/people/juan-bernardo-lince.jpeg b/themes/pybcn_theme/assets/images/people/juan-bernardo-lince.jpeg similarity index 100% rename from static/images/people/juan-bernardo-lince.jpeg rename to themes/pybcn_theme/assets/images/people/juan-bernardo-lince.jpeg diff --git a/static/images/people/juan-luis-cano.jpeg b/themes/pybcn_theme/assets/images/people/juan-luis-cano.jpeg similarity index 100% rename from static/images/people/juan-luis-cano.jpeg rename to themes/pybcn_theme/assets/images/people/juan-luis-cano.jpeg diff --git a/static/images/people/julio-martinez.jpg b/themes/pybcn_theme/assets/images/people/julio-martinez.jpg similarity index 100% rename from static/images/people/julio-martinez.jpg rename to themes/pybcn_theme/assets/images/people/julio-martinez.jpg diff --git a/static/images/people/kemalcan-bora.jpg b/themes/pybcn_theme/assets/images/people/kemalcan-bora.jpg similarity index 100% rename from static/images/people/kemalcan-bora.jpg rename to themes/pybcn_theme/assets/images/people/kemalcan-bora.jpg diff --git a/static/images/people/kevin-albes.jpg b/themes/pybcn_theme/assets/images/people/kevin-albes.jpg similarity index 100% rename from static/images/people/kevin-albes.jpg rename to themes/pybcn_theme/assets/images/people/kevin-albes.jpg diff --git a/static/images/people/kevin-sanchez.jpg b/themes/pybcn_theme/assets/images/people/kevin-sanchez.jpg similarity index 100% rename from static/images/people/kevin-sanchez.jpg rename to themes/pybcn_theme/assets/images/people/kevin-sanchez.jpg diff --git a/static/images/people/laysa-uchoa.jpg b/themes/pybcn_theme/assets/images/people/laysa-uchoa.jpg similarity index 100% rename from static/images/people/laysa-uchoa.jpg rename to themes/pybcn_theme/assets/images/people/laysa-uchoa.jpg diff --git a/static/images/people/loris.jpg b/themes/pybcn_theme/assets/images/people/loris.jpg similarity index 100% rename from static/images/people/loris.jpg rename to themes/pybcn_theme/assets/images/people/loris.jpg diff --git a/static/images/people/lpmayos.jpeg b/themes/pybcn_theme/assets/images/people/lpmayos.jpeg similarity index 100% rename from static/images/people/lpmayos.jpeg rename to themes/pybcn_theme/assets/images/people/lpmayos.jpeg diff --git a/static/images/people/manuel-gijon.jpg b/themes/pybcn_theme/assets/images/people/manuel-gijon.jpg similarity index 100% rename from static/images/people/manuel-gijon.jpg rename to themes/pybcn_theme/assets/images/people/manuel-gijon.jpg diff --git a/static/images/people/marc-pomar.jpg b/themes/pybcn_theme/assets/images/people/marc-pomar.jpg similarity index 100% rename from static/images/people/marc-pomar.jpg rename to themes/pybcn_theme/assets/images/people/marc-pomar.jpg diff --git a/static/images/people/marc-pous.jpg b/themes/pybcn_theme/assets/images/people/marc-pous.jpg similarity index 100% rename from static/images/people/marc-pous.jpg rename to themes/pybcn_theme/assets/images/people/marc-pous.jpg diff --git a/static/images/people/marc-ramirez.jpeg b/themes/pybcn_theme/assets/images/people/marc-ramirez.jpeg similarity index 100% rename from static/images/people/marc-ramirez.jpeg rename to themes/pybcn_theme/assets/images/people/marc-ramirez.jpeg diff --git a/static/images/people/maria_teresa_grifa.jpg b/themes/pybcn_theme/assets/images/people/maria_teresa_grifa.jpg similarity index 100% rename from static/images/people/maria_teresa_grifa.jpg rename to themes/pybcn_theme/assets/images/people/maria_teresa_grifa.jpg diff --git a/static/images/people/mariana-meireles.png b/themes/pybcn_theme/assets/images/people/mariana-meireles.png similarity index 100% rename from static/images/people/mariana-meireles.png rename to themes/pybcn_theme/assets/images/people/mariana-meireles.png diff --git a/static/images/people/marina-palma.jpg b/themes/pybcn_theme/assets/images/people/marina-palma.jpg similarity index 100% rename from static/images/people/marina-palma.jpg rename to themes/pybcn_theme/assets/images/people/marina-palma.jpg diff --git a/static/images/people/mauricio-volcanes.png b/themes/pybcn_theme/assets/images/people/mauricio-volcanes.png similarity index 100% rename from static/images/people/mauricio-volcanes.png rename to themes/pybcn_theme/assets/images/people/mauricio-volcanes.png diff --git a/static/images/people/miquel-sarrias.jpeg b/themes/pybcn_theme/assets/images/people/miquel-sarrias.jpeg similarity index 100% rename from static/images/people/miquel-sarrias.jpeg rename to themes/pybcn_theme/assets/images/people/miquel-sarrias.jpeg diff --git a/static/images/people/mireia.jpeg b/themes/pybcn_theme/assets/images/people/mireia.jpeg similarity index 100% rename from static/images/people/mireia.jpeg rename to themes/pybcn_theme/assets/images/people/mireia.jpeg diff --git a/static/images/people/miroslav_sedivy.jpg b/themes/pybcn_theme/assets/images/people/miroslav_sedivy.jpg similarity index 100% rename from static/images/people/miroslav_sedivy.jpg rename to themes/pybcn_theme/assets/images/people/miroslav_sedivy.jpg diff --git a/static/images/people/monica-dominguez.jpeg b/themes/pybcn_theme/assets/images/people/monica-dominguez.jpeg similarity index 100% rename from static/images/people/monica-dominguez.jpeg rename to themes/pybcn_theme/assets/images/people/monica-dominguez.jpeg diff --git a/static/images/people/natalia.jpeg b/themes/pybcn_theme/assets/images/people/natalia.jpeg similarity index 100% rename from static/images/people/natalia.jpeg rename to themes/pybcn_theme/assets/images/people/natalia.jpeg diff --git a/static/images/people/nikita-polovinkin.jpeg b/themes/pybcn_theme/assets/images/people/nikita-polovinkin.jpeg similarity index 100% rename from static/images/people/nikita-polovinkin.jpeg rename to themes/pybcn_theme/assets/images/people/nikita-polovinkin.jpeg diff --git a/static/images/people/noe-casas.png b/themes/pybcn_theme/assets/images/people/noe-casas.png similarity index 100% rename from static/images/people/noe-casas.png rename to themes/pybcn_theme/assets/images/people/noe-casas.png diff --git a/static/images/people/nuria.jpeg b/themes/pybcn_theme/assets/images/people/nuria.jpeg similarity index 100% rename from static/images/people/nuria.jpeg rename to themes/pybcn_theme/assets/images/people/nuria.jpeg diff --git a/static/images/people/oriol-abril-pla.png b/themes/pybcn_theme/assets/images/people/oriol-abril-pla.png similarity index 100% rename from static/images/people/oriol-abril-pla.png rename to themes/pybcn_theme/assets/images/people/oriol-abril-pla.png diff --git a/static/images/people/patricia-lamadrid.jpg b/themes/pybcn_theme/assets/images/people/patricia-lamadrid.jpg similarity index 100% rename from static/images/people/patricia-lamadrid.jpg rename to themes/pybcn_theme/assets/images/people/patricia-lamadrid.jpg diff --git a/static/images/people/patricio-reyes.jpeg b/themes/pybcn_theme/assets/images/people/patricio-reyes.jpeg similarity index 100% rename from static/images/people/patricio-reyes.jpeg rename to themes/pybcn_theme/assets/images/people/patricio-reyes.jpeg diff --git a/static/images/people/paula-bassaganas.jpeg b/themes/pybcn_theme/assets/images/people/paula-bassaganas.jpeg similarity index 100% rename from static/images/people/paula-bassaganas.jpeg rename to themes/pybcn_theme/assets/images/people/paula-bassaganas.jpeg diff --git a/static/images/people/pavel-lonkin.jpg b/themes/pybcn_theme/assets/images/people/pavel-lonkin.jpg similarity index 100% rename from static/images/people/pavel-lonkin.jpg rename to themes/pybcn_theme/assets/images/people/pavel-lonkin.jpg diff --git a/static/images/people/pavel-sulimov.png b/themes/pybcn_theme/assets/images/people/pavel-sulimov.png similarity index 100% rename from static/images/people/pavel-sulimov.png rename to themes/pybcn_theme/assets/images/people/pavel-sulimov.png diff --git a/static/images/people/pere-miquel-brull.jpeg b/themes/pybcn_theme/assets/images/people/pere-miquel-brull.jpeg similarity index 100% rename from static/images/people/pere-miquel-brull.jpeg rename to themes/pybcn_theme/assets/images/people/pere-miquel-brull.jpeg diff --git a/static/images/people/peter_krupa.jpeg b/themes/pybcn_theme/assets/images/people/peter_krupa.jpeg similarity index 100% rename from static/images/people/peter_krupa.jpeg rename to themes/pybcn_theme/assets/images/people/peter_krupa.jpeg diff --git a/static/images/people/rajdeep-pal.jpeg b/themes/pybcn_theme/assets/images/people/rajdeep-pal.jpeg similarity index 100% rename from static/images/people/rajdeep-pal.jpeg rename to themes/pybcn_theme/assets/images/people/rajdeep-pal.jpeg diff --git a/static/images/people/raul-cumplido.jpg b/themes/pybcn_theme/assets/images/people/raul-cumplido.jpg similarity index 100% rename from static/images/people/raul-cumplido.jpg rename to themes/pybcn_theme/assets/images/people/raul-cumplido.jpg diff --git a/static/images/people/rberenguel.png b/themes/pybcn_theme/assets/images/people/rberenguel.png similarity index 100% rename from static/images/people/rberenguel.png rename to themes/pybcn_theme/assets/images/people/rberenguel.png diff --git a/static/images/people/ricardo-ander-egg.jpeg b/themes/pybcn_theme/assets/images/people/ricardo-ander-egg.jpeg similarity index 100% rename from static/images/people/ricardo-ander-egg.jpeg rename to themes/pybcn_theme/assets/images/people/ricardo-ander-egg.jpeg diff --git a/static/images/people/ruben-afonso.png b/themes/pybcn_theme/assets/images/people/ruben-afonso.png similarity index 100% rename from static/images/people/ruben-afonso.png rename to themes/pybcn_theme/assets/images/people/ruben-afonso.png diff --git a/static/images/people/selen-ozkan.jpg b/themes/pybcn_theme/assets/images/people/selen-ozkan.jpg similarity index 100% rename from static/images/people/selen-ozkan.jpg rename to themes/pybcn_theme/assets/images/people/selen-ozkan.jpg diff --git a/static/images/people/sergi-baena-miret.jpeg b/themes/pybcn_theme/assets/images/people/sergi-baena-miret.jpeg similarity index 100% rename from static/images/people/sergi-baena-miret.jpeg rename to themes/pybcn_theme/assets/images/people/sergi-baena-miret.jpeg diff --git a/static/images/people/sergi-ortiz.jpg b/themes/pybcn_theme/assets/images/people/sergi-ortiz.jpg similarity index 100% rename from static/images/people/sergi-ortiz.jpg rename to themes/pybcn_theme/assets/images/people/sergi-ortiz.jpg diff --git a/static/images/people/sergi-ramirez.jpeg b/themes/pybcn_theme/assets/images/people/sergi-ramirez.jpeg similarity index 100% rename from static/images/people/sergi-ramirez.jpeg rename to themes/pybcn_theme/assets/images/people/sergi-ramirez.jpeg diff --git a/static/images/people/sonia-estrade.jpeg b/themes/pybcn_theme/assets/images/people/sonia-estrade.jpeg similarity index 100% rename from static/images/people/sonia-estrade.jpeg rename to themes/pybcn_theme/assets/images/people/sonia-estrade.jpeg diff --git a/static/images/people/thais-ruiz-de-alda.jpeg b/themes/pybcn_theme/assets/images/people/thais-ruiz-de-alda.jpeg similarity index 100% rename from static/images/people/thais-ruiz-de-alda.jpeg rename to themes/pybcn_theme/assets/images/people/thais-ruiz-de-alda.jpeg diff --git a/static/images/people/thomas-alisi.jpg b/themes/pybcn_theme/assets/images/people/thomas-alisi.jpg similarity index 100% rename from static/images/people/thomas-alisi.jpg rename to themes/pybcn_theme/assets/images/people/thomas-alisi.jpg diff --git a/static/images/people/toni_espadas.jpg b/themes/pybcn_theme/assets/images/people/toni_espadas.jpg similarity index 100% rename from static/images/people/toni_espadas.jpg rename to themes/pybcn_theme/assets/images/people/toni_espadas.jpg diff --git a/static/images/people/ubaldo-hervas.jpg b/themes/pybcn_theme/assets/images/people/ubaldo-hervas.jpg similarity index 100% rename from static/images/people/ubaldo-hervas.jpg rename to themes/pybcn_theme/assets/images/people/ubaldo-hervas.jpg diff --git a/static/images/people/victor-garcia.jpg b/themes/pybcn_theme/assets/images/people/victor-garcia.jpg similarity index 100% rename from static/images/people/victor-garcia.jpg rename to themes/pybcn_theme/assets/images/people/victor-garcia.jpg diff --git a/static/images/people/vincent-choubard.jpeg b/themes/pybcn_theme/assets/images/people/vincent-choubard.jpeg similarity index 100% rename from static/images/people/vincent-choubard.jpeg rename to themes/pybcn_theme/assets/images/people/vincent-choubard.jpeg diff --git a/static/images/people/vivek-sharma.jpg b/themes/pybcn_theme/assets/images/people/vivek-sharma.jpg similarity index 100% rename from static/images/people/vivek-sharma.jpg rename to themes/pybcn_theme/assets/images/people/vivek-sharma.jpg diff --git a/static/images/people/xavi.jpg b/themes/pybcn_theme/assets/images/people/xavi.jpg similarity index 100% rename from static/images/people/xavi.jpg rename to themes/pybcn_theme/assets/images/people/xavi.jpg diff --git a/static/images/people/xiang-xu.jpg b/themes/pybcn_theme/assets/images/people/xiang-xu.jpg similarity index 100% rename from static/images/people/xiang-xu.jpg rename to themes/pybcn_theme/assets/images/people/xiang-xu.jpg diff --git a/static/images/people/yago-tafalla.png b/themes/pybcn_theme/assets/images/people/yago-tafalla.png similarity index 100% rename from static/images/people/yago-tafalla.png rename to themes/pybcn_theme/assets/images/people/yago-tafalla.png diff --git a/static/images/photos/canodrom.png b/themes/pybcn_theme/assets/images/photos/canodrom.png similarity index 100% rename from static/images/photos/canodrom.png rename to themes/pybcn_theme/assets/images/photos/canodrom.png diff --git a/static/images/photos/canodrom_header.png b/themes/pybcn_theme/assets/images/photos/canodrom_header.png similarity index 100% rename from static/images/photos/canodrom_header.png rename to themes/pybcn_theme/assets/images/photos/canodrom_header.png diff --git a/static/images/photos/django_pyladies_2022/carousel1.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel1.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel1.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel1.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel10.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel10.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel10.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel10.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel11.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel11.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel11.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel11.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel13.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel13.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel13.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel13.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel16.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel16.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel16.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel16.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel3.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel3.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel3.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel3.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel4.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel4.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel4.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel4.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel5.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel5.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel5.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel5.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel6.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel6.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel6.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel6.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel7.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel7.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel7.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel7.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel8.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel8.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel8.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel8.jpeg diff --git a/static/images/photos/django_pyladies_2022/carousel9.jpeg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel9.jpeg similarity index 100% rename from static/images/photos/django_pyladies_2022/carousel9.jpeg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/carousel9.jpeg diff --git a/static/images/photos/django_pyladies_2022/header.jpg b/themes/pybcn_theme/assets/images/photos/django_pyladies_2022/header.jpg similarity index 100% rename from static/images/photos/django_pyladies_2022/header.jpg rename to themes/pybcn_theme/assets/images/photos/django_pyladies_2022/header.jpg diff --git a/static/images/photos/group-pydata-2017.jpg b/themes/pybcn_theme/assets/images/photos/group-pydata-2017.jpg similarity index 100% rename from static/images/photos/group-pydata-2017.jpg rename to themes/pybcn_theme/assets/images/photos/group-pydata-2017.jpg diff --git a/static/images/photos/meetups.jpg b/themes/pybcn_theme/assets/images/photos/meetups.jpg similarity index 100% rename from static/images/photos/meetups.jpg rename to themes/pybcn_theme/assets/images/photos/meetups.jpg diff --git a/static/images/photos/news_bkg.jpg b/themes/pybcn_theme/assets/images/photos/news_bkg.jpg similarity index 100% rename from static/images/photos/news_bkg.jpg rename to themes/pybcn_theme/assets/images/photos/news_bkg.jpg diff --git a/static/images/photos/organize-with-us.jpg b/themes/pybcn_theme/assets/images/photos/organize-with-us.jpg similarity index 100% rename from static/images/photos/organize-with-us.jpg rename to themes/pybcn_theme/assets/images/photos/organize-with-us.jpg diff --git a/static/images/photos/people-pydata-2017.jpg b/themes/pybcn_theme/assets/images/photos/people-pydata-2017.jpg similarity index 100% rename from static/images/photos/people-pydata-2017.jpg rename to themes/pybcn_theme/assets/images/photos/people-pydata-2017.jpg diff --git a/static/images/photos/people-pyday-2016.jpg b/themes/pybcn_theme/assets/images/photos/people-pyday-2016.jpg similarity index 100% rename from static/images/photos/people-pyday-2016.jpg rename to themes/pybcn_theme/assets/images/photos/people-pyday-2016.jpg diff --git a/static/images/photos/people-pyday-2019.jpg b/themes/pybcn_theme/assets/images/photos/people-pyday-2019.jpg similarity index 100% rename from static/images/photos/people-pyday-2019.jpg rename to themes/pybcn_theme/assets/images/photos/people-pyday-2019.jpg diff --git a/static/images/photos/people-pyday-2019_1600_450.png b/themes/pybcn_theme/assets/images/photos/people-pyday-2019_1600_450.png similarity index 100% rename from static/images/photos/people-pyday-2019_1600_450.png rename to themes/pybcn_theme/assets/images/photos/people-pyday-2019_1600_450.png diff --git a/static/images/photos/practice-sessions.jpg b/themes/pybcn_theme/assets/images/photos/practice-sessions.jpg similarity index 100% rename from static/images/photos/practice-sessions.jpg rename to themes/pybcn_theme/assets/images/photos/practice-sessions.jpg diff --git a/static/images/photos/propose-a-talk.jpg b/themes/pybcn_theme/assets/images/photos/propose-a-talk.jpg similarity index 100% rename from static/images/photos/propose-a-talk.jpg rename to themes/pybcn_theme/assets/images/photos/propose-a-talk.jpg diff --git a/static/images/photos/pydata_badges.jpg b/themes/pybcn_theme/assets/images/photos/pydata_badges.jpg similarity index 100% rename from static/images/photos/pydata_badges.jpg rename to themes/pybcn_theme/assets/images/photos/pydata_badges.jpg diff --git a/static/images/photos/pyday/group_photo.jpeg b/themes/pybcn_theme/assets/images/photos/pyday/group_photo.jpeg similarity index 100% rename from static/images/photos/pyday/group_photo.jpeg rename to themes/pybcn_theme/assets/images/photos/pyday/group_photo.jpeg diff --git a/static/images/photos/pyday/workshop_photo.jpg b/themes/pybcn_theme/assets/images/photos/pyday/workshop_photo.jpg similarity index 100% rename from static/images/photos/pyday/workshop_photo.jpg rename to themes/pybcn_theme/assets/images/photos/pyday/workshop_photo.jpg diff --git a/static/images/photos/pyday2021.jpeg b/themes/pybcn_theme/assets/images/photos/pyday2021.jpeg similarity index 100% rename from static/images/photos/pyday2021.jpeg rename to themes/pybcn_theme/assets/images/photos/pyday2021.jpeg diff --git a/static/images/photos/pyladies/carousel/djangogirls.jpeg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/djangogirls.jpeg similarity index 100% rename from static/images/photos/pyladies/carousel/djangogirls.jpeg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/djangogirls.jpeg diff --git a/static/images/photos/pyladies/carousel/pyladies1.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies1.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies1.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies1.jpg diff --git a/static/images/photos/pyladies/carousel/pyladies11.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies11.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies11.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies11.jpg diff --git a/static/images/photos/pyladies/carousel/pyladies12.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies12.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies12.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies12.jpg diff --git a/static/images/photos/pyladies/carousel/pyladies2.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies2.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies2.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies2.jpg diff --git a/static/images/photos/pyladies/carousel/pyladies3.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies3.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies3.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies3.jpg diff --git a/static/images/photos/pyladies/carousel/pyladies4.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies4.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies4.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies4.jpg diff --git a/static/images/photos/pyladies/carousel/pyladies6.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies6.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies6.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies6.jpg diff --git a/static/images/photos/pyladies/carousel/pyladies7.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies7.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies7.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies7.jpg diff --git a/static/images/photos/pyladies/carousel/pyladies8.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies8.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies8.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies8.jpg diff --git a/static/images/photos/pyladies/carousel/pyladies9.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies9.jpg similarity index 100% rename from static/images/photos/pyladies/carousel/pyladies9.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/carousel/pyladies9.jpg diff --git a/static/images/photos/pyladies/header/header1.jpg b/themes/pybcn_theme/assets/images/photos/pyladies/header/header1.jpg similarity index 100% rename from static/images/photos/pyladies/header/header1.jpg rename to themes/pybcn_theme/assets/images/photos/pyladies/header/header1.jpg diff --git a/static/images/photos/pyladies/header/header2.jpeg b/themes/pybcn_theme/assets/images/photos/pyladies/header/header2.jpeg similarity index 100% rename from static/images/photos/pyladies/header/header2.jpeg rename to themes/pybcn_theme/assets/images/photos/pyladies/header/header2.jpeg diff --git a/static/images/photos/pyladies/header/header3.jpeg b/themes/pybcn_theme/assets/images/photos/pyladies/header/header3.jpeg similarity index 100% rename from static/images/photos/pyladies/header/header3.jpeg rename to themes/pybcn_theme/assets/images/photos/pyladies/header/header3.jpeg diff --git a/static/images/photos/pyladies_meetups.jpeg b/themes/pybcn_theme/assets/images/photos/pyladies_meetups.jpeg similarity index 100% rename from static/images/photos/pyladies_meetups.jpeg rename to themes/pybcn_theme/assets/images/photos/pyladies_meetups.jpeg diff --git a/static/images/photos/reg-desk-pyday-2019.jpg b/themes/pybcn_theme/assets/images/photos/reg-desk-pyday-2019.jpg similarity index 100% rename from static/images/photos/reg-desk-pyday-2019.jpg rename to themes/pybcn_theme/assets/images/photos/reg-desk-pyday-2019.jpg diff --git a/static/images/photos/sponsors-area-pyday-2019.jpg b/themes/pybcn_theme/assets/images/photos/sponsors-area-pyday-2019.jpg similarity index 100% rename from static/images/photos/sponsors-area-pyday-2019.jpg rename to themes/pybcn_theme/assets/images/photos/sponsors-area-pyday-2019.jpg diff --git a/static/images/sponsors/21buttons.png b/themes/pybcn_theme/assets/images/sponsors/21buttons.png similarity index 100% rename from static/images/sponsors/21buttons.png rename to themes/pybcn_theme/assets/images/sponsors/21buttons.png diff --git a/static/images/sponsors/Nuclia.png b/themes/pybcn_theme/assets/images/sponsors/Nuclia.png similarity index 100% rename from static/images/sponsors/Nuclia.png rename to themes/pybcn_theme/assets/images/sponsors/Nuclia.png diff --git a/static/images/sponsors/Qida.png b/themes/pybcn_theme/assets/images/sponsors/Qida.png similarity index 100% rename from static/images/sponsors/Qida.png rename to themes/pybcn_theme/assets/images/sponsors/Qida.png diff --git a/static/images/sponsors/RakutenTV.png b/themes/pybcn_theme/assets/images/sponsors/RakutenTV.png similarity index 100% rename from static/images/sponsors/RakutenTV.png rename to themes/pybcn_theme/assets/images/sponsors/RakutenTV.png diff --git a/static/images/sponsors/affectv.png b/themes/pybcn_theme/assets/images/sponsors/affectv.png similarity index 100% rename from static/images/sponsors/affectv.png rename to themes/pybcn_theme/assets/images/sponsors/affectv.png diff --git a/static/images/sponsors/aimsun.jpg b/themes/pybcn_theme/assets/images/sponsors/aimsun.jpg similarity index 100% rename from static/images/sponsors/aimsun.jpg rename to themes/pybcn_theme/assets/images/sponsors/aimsun.jpg diff --git a/static/images/sponsors/apsl.png b/themes/pybcn_theme/assets/images/sponsors/apsl.png similarity index 100% rename from static/images/sponsors/apsl.png rename to themes/pybcn_theme/assets/images/sponsors/apsl.png diff --git a/static/images/sponsors/apsl.svg b/themes/pybcn_theme/assets/images/sponsors/apsl.svg similarity index 100% rename from static/images/sponsors/apsl.svg rename to themes/pybcn_theme/assets/images/sponsors/apsl.svg diff --git a/static/images/sponsors/backmarket.png b/themes/pybcn_theme/assets/images/sponsors/backmarket.png similarity index 100% rename from static/images/sponsors/backmarket.png rename to themes/pybcn_theme/assets/images/sponsors/backmarket.png diff --git a/static/images/sponsors/bitphy.png b/themes/pybcn_theme/assets/images/sponsors/bitphy.png similarity index 100% rename from static/images/sponsors/bitphy.png rename to themes/pybcn_theme/assets/images/sponsors/bitphy.png diff --git a/static/images/sponsors/bling.png b/themes/pybcn_theme/assets/images/sponsors/bling.png similarity index 100% rename from static/images/sponsors/bling.png rename to themes/pybcn_theme/assets/images/sponsors/bling.png diff --git a/static/images/sponsors/bmat.jpeg b/themes/pybcn_theme/assets/images/sponsors/bmat.jpeg similarity index 100% rename from static/images/sponsors/bmat.jpeg rename to themes/pybcn_theme/assets/images/sponsors/bmat.jpeg diff --git a/static/images/sponsors/business-insights.png b/themes/pybcn_theme/assets/images/sponsors/business-insights.png similarity index 100% rename from static/images/sponsors/business-insights.png rename to themes/pybcn_theme/assets/images/sponsors/business-insights.png diff --git a/static/images/sponsors/canodrom.png b/themes/pybcn_theme/assets/images/sponsors/canodrom.png similarity index 100% rename from static/images/sponsors/canodrom.png rename to themes/pybcn_theme/assets/images/sponsors/canodrom.png diff --git a/static/images/sponsors/capitole.jpg b/themes/pybcn_theme/assets/images/sponsors/capitole.jpg similarity index 100% rename from static/images/sponsors/capitole.jpg rename to themes/pybcn_theme/assets/images/sponsors/capitole.jpg diff --git a/static/images/sponsors/casadelmig.jpg b/themes/pybcn_theme/assets/images/sponsors/casadelmig.jpg similarity index 100% rename from static/images/sponsors/casadelmig.jpg rename to themes/pybcn_theme/assets/images/sponsors/casadelmig.jpg diff --git a/static/images/sponsors/cloudblue.jpg b/themes/pybcn_theme/assets/images/sponsors/cloudblue.jpg similarity index 100% rename from static/images/sponsors/cloudblue.jpg rename to themes/pybcn_theme/assets/images/sponsors/cloudblue.jpg diff --git a/static/images/sponsors/cloudblue.png b/themes/pybcn_theme/assets/images/sponsors/cloudblue.png similarity index 100% rename from static/images/sponsors/cloudblue.png rename to themes/pybcn_theme/assets/images/sponsors/cloudblue.png diff --git a/static/images/sponsors/codely.png b/themes/pybcn_theme/assets/images/sponsors/codely.png similarity index 100% rename from static/images/sponsors/codely.png rename to themes/pybcn_theme/assets/images/sponsors/codely.png diff --git a/static/images/sponsors/codeop.png b/themes/pybcn_theme/assets/images/sponsors/codeop.png similarity index 100% rename from static/images/sponsors/codeop.png rename to themes/pybcn_theme/assets/images/sponsors/codeop.png diff --git a/static/images/sponsors/codurance.png b/themes/pybcn_theme/assets/images/sponsors/codurance.png similarity index 100% rename from static/images/sponsors/codurance.png rename to themes/pybcn_theme/assets/images/sponsors/codurance.png diff --git a/static/images/sponsors/colorsensing.svg b/themes/pybcn_theme/assets/images/sponsors/colorsensing.svg similarity index 100% rename from static/images/sponsors/colorsensing.svg rename to themes/pybcn_theme/assets/images/sponsors/colorsensing.svg diff --git a/static/images/sponsors/coopdevs.svg b/themes/pybcn_theme/assets/images/sponsors/coopdevs.svg similarity index 100% rename from static/images/sponsors/coopdevs.svg rename to themes/pybcn_theme/assets/images/sponsors/coopdevs.svg diff --git a/static/images/sponsors/digitalfems.png b/themes/pybcn_theme/assets/images/sponsors/digitalfems.png similarity index 100% rename from static/images/sponsors/digitalfems.png rename to themes/pybcn_theme/assets/images/sponsors/digitalfems.png diff --git a/static/images/sponsors/edgetier.jpeg b/themes/pybcn_theme/assets/images/sponsors/edgetier.jpeg similarity index 100% rename from static/images/sponsors/edgetier.jpeg rename to themes/pybcn_theme/assets/images/sponsors/edgetier.jpeg diff --git a/static/images/sponsors/europython_society.png b/themes/pybcn_theme/assets/images/sponsors/europython_society.png similarity index 100% rename from static/images/sponsors/europython_society.png rename to themes/pybcn_theme/assets/images/sponsors/europython_society.png diff --git a/static/images/sponsors/flanks.png b/themes/pybcn_theme/assets/images/sponsors/flanks.png similarity index 100% rename from static/images/sponsors/flanks.png rename to themes/pybcn_theme/assets/images/sponsors/flanks.png diff --git a/static/images/sponsors/gesco.jpg b/themes/pybcn_theme/assets/images/sponsors/gesco.jpg similarity index 100% rename from static/images/sponsors/gesco.jpg rename to themes/pybcn_theme/assets/images/sponsors/gesco.jpg diff --git a/static/images/sponsors/gluecharm.png b/themes/pybcn_theme/assets/images/sponsors/gluecharm.png similarity index 100% rename from static/images/sponsors/gluecharm.png rename to themes/pybcn_theme/assets/images/sponsors/gluecharm.png diff --git a/static/images/sponsors/holaluz.png b/themes/pybcn_theme/assets/images/sponsors/holaluz.png similarity index 100% rename from static/images/sponsors/holaluz.png rename to themes/pybcn_theme/assets/images/sponsors/holaluz.png diff --git a/static/images/sponsors/hpc-now.svg b/themes/pybcn_theme/assets/images/sponsors/hpc-now.svg similarity index 100% rename from static/images/sponsors/hpc-now.svg rename to themes/pybcn_theme/assets/images/sponsors/hpc-now.svg diff --git a/static/images/sponsors/hybridtheory.png b/themes/pybcn_theme/assets/images/sponsors/hybridtheory.png similarity index 100% rename from static/images/sponsors/hybridtheory.png rename to themes/pybcn_theme/assets/images/sponsors/hybridtheory.png diff --git a/static/images/sponsors/ikigai.jpg b/themes/pybcn_theme/assets/images/sponsors/ikigai.jpg similarity index 100% rename from static/images/sponsors/ikigai.jpg rename to themes/pybcn_theme/assets/images/sponsors/ikigai.jpg diff --git a/static/images/sponsors/innoit.png b/themes/pybcn_theme/assets/images/sponsors/innoit.png similarity index 100% rename from static/images/sponsors/innoit.png rename to themes/pybcn_theme/assets/images/sponsors/innoit.png diff --git a/static/images/sponsors/innovamat.gif b/themes/pybcn_theme/assets/images/sponsors/innovamat.gif similarity index 100% rename from static/images/sponsors/innovamat.gif rename to themes/pybcn_theme/assets/images/sponsors/innovamat.gif diff --git a/static/images/sponsors/iomed.png b/themes/pybcn_theme/assets/images/sponsors/iomed.png similarity index 100% rename from static/images/sponsors/iomed.png rename to themes/pybcn_theme/assets/images/sponsors/iomed.png diff --git a/static/images/sponsors/isdi.png b/themes/pybcn_theme/assets/images/sponsors/isdi.png similarity index 100% rename from static/images/sponsors/isdi.png rename to themes/pybcn_theme/assets/images/sponsors/isdi.png diff --git a/static/images/sponsors/izi.png b/themes/pybcn_theme/assets/images/sponsors/izi.png similarity index 100% rename from static/images/sponsors/izi.png rename to themes/pybcn_theme/assets/images/sponsors/izi.png diff --git a/static/images/sponsors/jobfluent.png b/themes/pybcn_theme/assets/images/sponsors/jobfluent.png similarity index 100% rename from static/images/sponsors/jobfluent.png rename to themes/pybcn_theme/assets/images/sponsors/jobfluent.png diff --git a/static/images/sponsors/kiwi.png b/themes/pybcn_theme/assets/images/sponsors/kiwi.png similarity index 100% rename from static/images/sponsors/kiwi.png rename to themes/pybcn_theme/assets/images/sponsors/kiwi.png diff --git a/static/images/sponsors/lambdaloopers.png b/themes/pybcn_theme/assets/images/sponsors/lambdaloopers.png similarity index 100% rename from static/images/sponsors/lambdaloopers.png rename to themes/pybcn_theme/assets/images/sponsors/lambdaloopers.png diff --git a/static/images/sponsors/letgo.png b/themes/pybcn_theme/assets/images/sponsors/letgo.png similarity index 100% rename from static/images/sponsors/letgo.png rename to themes/pybcn_theme/assets/images/sponsors/letgo.png diff --git a/static/images/sponsors/marfeel.png b/themes/pybcn_theme/assets/images/sponsors/marfeel.png similarity index 100% rename from static/images/sponsors/marfeel.png rename to themes/pybcn_theme/assets/images/sponsors/marfeel.png diff --git a/static/images/sponsors/mundimoto.png b/themes/pybcn_theme/assets/images/sponsors/mundimoto.png similarity index 100% rename from static/images/sponsors/mundimoto.png rename to themes/pybcn_theme/assets/images/sponsors/mundimoto.png diff --git a/static/images/sponsors/nagarro.svg b/themes/pybcn_theme/assets/images/sponsors/nagarro.svg similarity index 100% rename from static/images/sponsors/nagarro.svg rename to themes/pybcn_theme/assets/images/sponsors/nagarro.svg diff --git a/static/images/sponsors/okta.png b/themes/pybcn_theme/assets/images/sponsors/okta.png similarity index 100% rename from static/images/sponsors/okta.png rename to themes/pybcn_theme/assets/images/sponsors/okta.png diff --git a/static/images/sponsors/onna.png b/themes/pybcn_theme/assets/images/sponsors/onna.png similarity index 100% rename from static/images/sponsors/onna.png rename to themes/pybcn_theme/assets/images/sponsors/onna.png diff --git a/static/images/sponsors/orpheus.png b/themes/pybcn_theme/assets/images/sponsors/orpheus.png similarity index 100% rename from static/images/sponsors/orpheus.png rename to themes/pybcn_theme/assets/images/sponsors/orpheus.png diff --git a/static/images/sponsors/preply.png b/themes/pybcn_theme/assets/images/sponsors/preply.png similarity index 100% rename from static/images/sponsors/preply.png rename to themes/pybcn_theme/assets/images/sponsors/preply.png diff --git a/static/images/sponsors/protopixel.png b/themes/pybcn_theme/assets/images/sponsors/protopixel.png similarity index 100% rename from static/images/sponsors/protopixel.png rename to themes/pybcn_theme/assets/images/sponsors/protopixel.png diff --git a/static/images/sponsors/psf.png b/themes/pybcn_theme/assets/images/sponsors/psf.png similarity index 100% rename from static/images/sponsors/psf.png rename to themes/pybcn_theme/assets/images/sponsors/psf.png diff --git a/static/images/sponsors/pybcn.png b/themes/pybcn_theme/assets/images/sponsors/pybcn.png similarity index 100% rename from static/images/sponsors/pybcn.png rename to themes/pybcn_theme/assets/images/sponsors/pybcn.png diff --git a/static/images/sponsors/pyladiesbcn.jpeg b/themes/pybcn_theme/assets/images/sponsors/pyladiesbcn.jpeg similarity index 100% rename from static/images/sponsors/pyladiesbcn.jpeg rename to themes/pybcn_theme/assets/images/sponsors/pyladiesbcn.jpeg diff --git a/static/images/sponsors/pythonES.png b/themes/pybcn_theme/assets/images/sponsors/pythonES.png similarity index 100% rename from static/images/sponsors/pythonES.png rename to themes/pybcn_theme/assets/images/sponsors/pythonES.png diff --git a/static/images/sponsors/qilimanjaro.png b/themes/pybcn_theme/assets/images/sponsors/qilimanjaro.png similarity index 100% rename from static/images/sponsors/qilimanjaro.png rename to themes/pybcn_theme/assets/images/sponsors/qilimanjaro.png diff --git a/static/images/sponsors/quside.png b/themes/pybcn_theme/assets/images/sponsors/quside.png similarity index 100% rename from static/images/sponsors/quside.png rename to themes/pybcn_theme/assets/images/sponsors/quside.png diff --git a/static/images/sponsors/qustodio.png b/themes/pybcn_theme/assets/images/sponsors/qustodio.png similarity index 100% rename from static/images/sponsors/qustodio.png rename to themes/pybcn_theme/assets/images/sponsors/qustodio.png diff --git a/static/images/sponsors/rover.png b/themes/pybcn_theme/assets/images/sponsors/rover.png similarity index 100% rename from static/images/sponsors/rover.png rename to themes/pybcn_theme/assets/images/sponsors/rover.png diff --git a/static/images/sponsors/satellogic.png b/themes/pybcn_theme/assets/images/sponsors/satellogic.png similarity index 100% rename from static/images/sponsors/satellogic.png rename to themes/pybcn_theme/assets/images/sponsors/satellogic.png diff --git a/static/images/sponsors/shimoku.png b/themes/pybcn_theme/assets/images/sponsors/shimoku.png similarity index 100% rename from static/images/sponsors/shimoku.png rename to themes/pybcn_theme/assets/images/sponsors/shimoku.png diff --git a/static/images/sponsors/skyscanner.png b/themes/pybcn_theme/assets/images/sponsors/skyscanner.png similarity index 100% rename from static/images/sponsors/skyscanner.png rename to themes/pybcn_theme/assets/images/sponsors/skyscanner.png diff --git a/static/images/sponsors/somenergia.jpg b/themes/pybcn_theme/assets/images/sponsors/somenergia.jpg similarity index 100% rename from static/images/sponsors/somenergia.jpg rename to themes/pybcn_theme/assets/images/sponsors/somenergia.jpg diff --git a/static/images/sponsors/tecnologas.png b/themes/pybcn_theme/assets/images/sponsors/tecnologas.png similarity index 100% rename from static/images/sponsors/tecnologas.png rename to themes/pybcn_theme/assets/images/sponsors/tecnologas.png diff --git a/static/images/sponsors/travelperk.png b/themes/pybcn_theme/assets/images/sponsors/travelperk.png similarity index 100% rename from static/images/sponsors/travelperk.png rename to themes/pybcn_theme/assets/images/sponsors/travelperk.png diff --git a/static/images/sponsors/typeform.png b/themes/pybcn_theme/assets/images/sponsors/typeform.png similarity index 100% rename from static/images/sponsors/typeform.png rename to themes/pybcn_theme/assets/images/sponsors/typeform.png diff --git a/static/images/sponsors/ub.jpg b/themes/pybcn_theme/assets/images/sponsors/ub.jpg similarity index 100% rename from static/images/sponsors/ub.jpg rename to themes/pybcn_theme/assets/images/sponsors/ub.jpg diff --git a/static/images/sponsors/upf.png b/themes/pybcn_theme/assets/images/sponsors/upf.png similarity index 100% rename from static/images/sponsors/upf.png rename to themes/pybcn_theme/assets/images/sponsors/upf.png diff --git a/static/images/sponsors/veriff.png b/themes/pybcn_theme/assets/images/sponsors/veriff.png similarity index 100% rename from static/images/sponsors/veriff.png rename to themes/pybcn_theme/assets/images/sponsors/veriff.png diff --git a/static/images/sponsors/verse.jpg b/themes/pybcn_theme/assets/images/sponsors/verse.jpg similarity index 100% rename from static/images/sponsors/verse.jpg rename to themes/pybcn_theme/assets/images/sponsors/verse.jpg diff --git a/static/images/sponsors/verse.png b/themes/pybcn_theme/assets/images/sponsors/verse.png similarity index 100% rename from static/images/sponsors/verse.png rename to themes/pybcn_theme/assets/images/sponsors/verse.png diff --git a/static/images/sponsors/xorq.png b/themes/pybcn_theme/assets/images/sponsors/xorq.png similarity index 100% rename from static/images/sponsors/xorq.png rename to themes/pybcn_theme/assets/images/sponsors/xorq.png diff --git a/themes/pybcn_theme/assets/js/modal-focus.js b/themes/pybcn_theme/assets/js/modal-focus.js new file mode 100644 index 00000000..09eb6c54 --- /dev/null +++ b/themes/pybcn_theme/assets/js/modal-focus.js @@ -0,0 +1,20 @@ +// Bootstrap 4.0.0 does not return focus to the trigger when a modal closes, +// so focus falls to the body and keyboard users lose their place. +// This script stores the element that opened the modal and focuses it again +// after the modal is hidden. +(function ($) { + 'use strict'; + + var lastTrigger = null; + + $(document).on('show.bs.modal', '.modal', function (event) { + lastTrigger = event.relatedTarget || document.activeElement; + }); + + $(document).on('hidden.bs.modal', '.modal', function () { + if (lastTrigger && typeof lastTrigger.focus === 'function' && document.body.contains(lastTrigger)) { + lastTrigger.focus(); + } + lastTrigger = null; + }); +}(jQuery)); diff --git a/themes/pybcn_theme/assets/scss/agenda.scss b/themes/pybcn_theme/assets/scss/agenda.scss index d4e639ea..8c06ef0e 100644 --- a/themes/pybcn_theme/assets/scss/agenda.scss +++ b/themes/pybcn_theme/assets/scss/agenda.scss @@ -1,3 +1,10 @@ +// Dark text for cells whose background is too light for white. +$text-on-light: #212529; +// The half-slot time labels (9:30, 10:30, ...) are 0.8rem text on white, so +// they need 4.5:1 (WCAG 1.4.3). #ccc was 1.61:1. #767676 is 4.54:1, the +// same grey as the legend separator. +$time-label-muted: #767676; + $blockTimes30: 700,730,800,830,900,930,1000,1030,1100,1130,1200,1230,1300,1330,1400,1430,1500,1530,1600,1630,1700,1730,1800,1830,1900,1930,2000,2030,2100,2130,2200,2230,2300; $blockTimes20: 700,720,740,800,820,840,900,920,940,1000,1020,1040,1100,1120,1140,1200,1220,1240,1300,1320,1340,1400,1420,1440,1500,1520,1540,1600,1620,1640,1700,1720,1740,1800,1820,1840,1900,1920,1940,2000,2020,2040,2100,2120,2140,2200,2220,2240,2300; $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,1045,1100,1115,1130,1145, @@ -27,7 +34,7 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10 } &[class*="30"]:not(.start-1300) { font-size: 0.8rem; - color: #ccc; + color: $time-label-muted; } } } @@ -38,7 +45,7 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10 } &[class*="20"]:not(.start-2000), &[class*="40"] { font-size: 0.8rem; - color: #ccc; + color: $time-label-muted; } } } @@ -49,7 +56,7 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10 } &[class*="15"]:not(.start-1500):not(.start-1530), &[class*="45"] { font-size: 0.8rem; - color: #ccc; + color: $time-label-muted; } } } @@ -63,7 +70,13 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10 justify-content: start; flex-direction: column; padding: 0.5rem 1rem; - background-color: orange; + /* + The fallback for an entry with no colour class. White text on + the CSS orange was 1.97:1. #A15C00 is 5.19:1 on white, so an + entry that omits its colour stays readable. bin/check-content + reports such an entry, so nothing should reach this fallback. + */ + background-color: #A15C00; border-radius: 0.2rem; font-size: 0.9rem; font-weight: bold; @@ -98,14 +111,32 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10 margin-top: 5%; } - &.green {background-color: #2E7D32}; /* green */ - &.yellow {background-color: #edb92e}; /* yellow */ - &.orange {background-color: #FF7900}; /* orange */ - &.red {background-color: #ce1836}; /* red */ - &.blue {background-color: #009989}; /* blue */ - &.purple {background-color: #672493}; /* purple */ - &.grey{background-color: #666666}; /* grey */ - &.pink{background-color:#FF1493}; + /* + Every cell carries bold 0.9 rem text, which WCAG counts as normal + text and so needs 4.5:1 against its background. White on the old + yellow was 1.81:1 and on the old orange 2.63:1. + + Yellow and orange keep their brand colour and take dark text + instead, which reads better than any darkened version would: + 8.51:1 and 5.87:1. Blue and pink work with neither white nor dark + text as they were, so they are darkened just enough for white to + pass. Green, red, purple and grey already passed and are unchanged. + */ + &.green { background-color: #2E7D32; } /* 5.13:1 on white */ + &.red { background-color: #ce1836; } /* 5.51:1 on white */ + &.purple { background-color: #672493; } /* 9.33:1 on white */ + &.grey { background-color: #666666; } /* 5.74:1 on white */ + + &.blue { background-color: #008577; } /* was #009989, 3.55:1. Now 4.54:1 */ + &.pink { background-color: #E4007B; } /* was #FF1493, 3.64:1. Now 4.58:1 */ + + &.yellow, + &.orange { + color: $text-on-light; + a { color: $text-on-light; } + } + &.yellow { background-color: #edb92e; } /* 8.51:1 on dark text */ + &.orange { background-color: #FF7900; } /* 5.87:1 on dark text */ } &.span30min { diff --git a/themes/pybcn_theme/assets/scss/carousel.scss b/themes/pybcn_theme/assets/scss/carousel.scss index fc0120b6..1fcef22f 100644 --- a/themes/pybcn_theme/assets/scss/carousel.scss +++ b/themes/pybcn_theme/assets/scss/carousel.scss @@ -5,7 +5,7 @@ padding: 10px; margin-bottom: 40px; - h1 { + h1, .h1 { background-color: transparent; margin-bottom: 0; } @@ -16,7 +16,7 @@ .col { .carousel { - h1 { + h1, .h1 { padding: 10px; font-size: 1.1em; } @@ -39,7 +39,7 @@ @media (max-width: 768px) { .carousel { - h1 { + h1, .h1 { padding: 10px; font-size: 1.1em; } diff --git a/themes/pybcn_theme/assets/scss/footer.scss b/themes/pybcn_theme/assets/scss/footer.scss index 79e35790..efd3b77e 100644 --- a/themes/pybcn_theme/assets/scss/footer.scss +++ b/themes/pybcn_theme/assets/scss/footer.scss @@ -6,6 +6,7 @@ footer { img.logo_icon { width: 30px; + height: auto; margin-right: 10px; } diff --git a/themes/pybcn_theme/assets/scss/home.scss b/themes/pybcn_theme/assets/scss/home.scss index 1a73a11c..e5769aa6 100644 --- a/themes/pybcn_theme/assets/scss/home.scss +++ b/themes/pybcn_theme/assets/scss/home.scss @@ -13,7 +13,7 @@ background-size: 67%; - h1 { + h1, .h1 { color: white; background-color: transparent; text-align: center; @@ -83,7 +83,7 @@ margin-top: 50px; padding: 20px; - h1 { + h1, .h1 { margin: 0; padding-top: 10px; background-color: transparent; @@ -125,7 +125,7 @@ margin-bottom: -6px; - h1 { + h1, .h1 { font-size: 1rem; line-height: 1rem; padding: 8px; diff --git a/themes/pybcn_theme/assets/scss/items_list.scss b/themes/pybcn_theme/assets/scss/items_list.scss index 04a96410..dc54a560 100644 --- a/themes/pybcn_theme/assets/scss/items_list.scss +++ b/themes/pybcn_theme/assets/scss/items_list.scss @@ -1,6 +1,6 @@ .items-title { border-bottom: 1px solid rgb(230,230,230); - h1 { + h1, .h1 { padding-top: 12px; padding-bottom: 25px; color: rgb(41,47,51); diff --git a/themes/pybcn_theme/assets/scss/main.scss b/themes/pybcn_theme/assets/scss/main.scss index 17d358d8..3de978d9 100644 --- a/themes/pybcn_theme/assets/scss/main.scss +++ b/themes/pybcn_theme/assets/scss/main.scss @@ -3,6 +3,7 @@ $blue-pybcn: #006c9b; $yellow-pybcn-OLD: #ffdc39; $yellow-pybcn: #fdbf2e; $dark-grey: #343a40; +$focus-ring: #0b0c0c; $primary: $blue-pybcn; @@ -76,11 +77,83 @@ a, a:hover { color: $blue-pybcn; } +// Focus ring. The Bootstrap 4.0.0 ring is a 25% alpha blue shadow, about +// 1.39:1 against white, which fails WCAG 1.4.11. This ring is a dark line +// with a white line inside it, so it keeps 3:1 contrast on a light and on a +// dark background. +a:focus, +button:focus, +input:focus, +select:focus, +textarea:focus, +[tabindex="0"]:focus, +.btn:focus, +.btn.focus, +.form-control:focus { + outline: 3px solid $focus-ring; + outline-offset: 2px; + box-shadow: 0 0 0 2px #ffffff; +} + +// Browsers that can tell a pointer click from keyboard navigation show the +// ring for keyboard users only. +a:focus:not(:focus-visible), +button:focus:not(:focus-visible), +[tabindex="0"]:focus:not(:focus-visible), +.btn:focus:not(:focus-visible), +.btn.focus:not(:focus-visible) { + outline: none; + box-shadow: none; +} + +// The selectors above use tabindex="0" only, so the ring does not appear +// around the main element or around a modal, which both carry +// tabindex="-1" and take focus from a script. + +// Modal triggers are buttons, because they open a dialog and do not +// navigate. This reset keeps them looking like the text or the image +// that they wrap. +.modal_trigger { + padding: 0; + border: 0; + background: none; + color: inherit; + font: inherit; + line-height: inherit; + text-align: inherit; + cursor: pointer; + + // A heading holds one trigger and nothing else, so the button takes the + // whole width and the text wraps as it did inside the link. + h3 & { + width: 100%; + } +} + #main_content { + display: block; margin-top: 105px; padding-top: 0; } +// The skip link stays out of sight until it takes focus. Then it shows +// above the fixed navigation bar. +.skip_link { + position: fixed; + top: 0; + left: 0; + z-index: 2000; + padding: 10px 15px; + border: 2px solid $blue-pybcn; + background-color: white; + color: $blue-pybcn; + transform: translateY(-200%); + + &:focus { + transform: translateY(0); + } +} + .oov { min-height: 400px; padding: 50px; diff --git a/themes/pybcn_theme/assets/scss/monthly_events.scss b/themes/pybcn_theme/assets/scss/monthly_events.scss index ddf64260..be69789b 100644 --- a/themes/pybcn_theme/assets/scss/monthly_events.scss +++ b/themes/pybcn_theme/assets/scss/monthly_events.scss @@ -38,7 +38,7 @@ .past_events { .items-title { - h1 { + h1, .h1 { font-size: 1.3em; } } diff --git a/themes/pybcn_theme/assets/scss/navbar.scss b/themes/pybcn_theme/assets/scss/navbar.scss index 5fd3d336..86ee47e4 100644 --- a/themes/pybcn_theme/assets/scss/navbar.scss +++ b/themes/pybcn_theme/assets/scss/navbar.scss @@ -8,8 +8,16 @@ border-bottom: 1px solid $blue-pybcn; #logo { - max-width: 230px; - max-height: 100px; + // The height is set and the width follows it, so the picture keeps + // its shape by construction. The pair max-width plus max-height does + // not: with both of them violated the browser resolved them against + // each other and the logo came out 200x40, a ratio of 5 against the + // 3.36 of the file. One dimension decides, the other follows. + // + // 68px of height is 228px of width, which is what the 230px cap this + // replaces was aiming at. + height: 68px; + width: auto; margin: 5px 5px 5px 0; @include transition(0.4s); } @@ -20,8 +28,7 @@ @include transition(0.2s); #logo { - max-width: 200px; - max-height: 40px; + height: 40px; @include transition(0.4s); } } diff --git a/themes/pybcn_theme/assets/scss/people.scss b/themes/pybcn_theme/assets/scss/people.scss index 48d3fc67..f4db29cd 100644 --- a/themes/pybcn_theme/assets/scss/people.scss +++ b/themes/pybcn_theme/assets/scss/people.scss @@ -1,6 +1,7 @@ -// Sponsors CSS +// People grid. Hooked on a class: an event page holds one grid per +// people section, so there is no single id to target. -#people_grid { +.people_grid { .person_wrapper { margin-bottom: 20px; @@ -9,24 +10,52 @@ border: 1px solid black; padding: 10px; - min-height: 100%; + + // A column, so every card in a row is as tall as the tallest and + // the social links sit on the bottom edge whatever the length of + // the role above them. They used to be positioned absolutely, + // which needed a reserved gap under the text and, because this + // box was not positioned, resolved against an ancestor far up the + // page: the icons ended up the full width of the viewport. + display: flex; + flex-direction: column; + height: 100%; .img-wrap { margin-bottom: 25px; - position:relative; - overflow:hidden; - padding-bottom:100%; + position: relative; + // Keeps the zoom on hover inside the frame. + overflow: hidden; + + // The photo is cropped to a square by the image pipeline, so + // the frame is square because its content is. This used to be + // padding-bottom: 100% with the photo positioned absolutely, + // which made the box square whatever the photo was and hid + // the overflow. That worked until an element was added between + // the box and the photo: the new element became the containing + // block and the crop stopped applying. + // + // display: block on the photo matters. An inline image sits on + // the text baseline, which leaves a few pixels of space under + // it inside the frame. + .modal_trigger { + display: block; + } img { - position:absolute; + display: block; width: 100%; - filter: grayscale(100%); + + // Grey only where the pointer can hover. A touch screen + // has no hover, so the photos stayed grey for good. + @media (hover: hover) { + filter: grayscale(100%); + } } } .person_data { line-height: 1rem; - margin-bottom: 35px; h3 { color: black; @@ -36,20 +65,26 @@ } .social_links { + // margin-top: auto puts this on the bottom edge of the card, + // which is what the absolute positioning was for, without the + // positioning. The old rule resolved against an ancestor far + // up the page, because this box has no positioned ancestor of + // its own, so the icons were only in the right place by luck. + margin-top: auto; + padding-top: 10px; + i { color: black; &:hover { color: $blue-pybcn; } } - - position: absolute; - bottom: 5px; - left: 25px; - padding-top: 10px; } - &:hover { + // Keyboard focus shows the colour photo too, because the card holds + // two focusable triggers. + &:hover, + &:focus-within { .img-wrap { img { transform: scale(1.2); @@ -88,7 +123,7 @@ } @media (max-width: 575.98px) { - #people_grid { + .people_grid { .person_wrapper { .person_item { .modal { diff --git a/themes/pybcn_theme/layouts/_default/baseof.html b/themes/pybcn_theme/layouts/_default/baseof.html index 914e6d04..830902d6 100644 --- a/themes/pybcn_theme/layouts/_default/baseof.html +++ b/themes/pybcn_theme/layouts/_default/baseof.html @@ -9,14 +9,18 @@ - {{ partial "nav.html" . }} + -
+
+ {{ partial "nav.html" . }} +
+ +
{{ partial "hero_header.html" . }} {{ block "main" . }} {{ end }} -
+ {{ partial "footer.html" . }} diff --git a/themes/pybcn_theme/layouts/_default/contact.html b/themes/pybcn_theme/layouts/_default/contact.html index 37157e8e..e0ba0b6c 100644 --- a/themes/pybcn_theme/layouts/_default/contact.html +++ b/themes/pybcn_theme/layouts/_default/contact.html @@ -6,20 +6,20 @@
{{ if .Params.show_pybcn }} -

PyBCN

+

PyBCN

- + {{ range $.Site.Params.social_items }} - + {{ end }}


{{ end }} -

PyLadiesBCN

+

PyLadiesBCN

- + {{ range $.Site.Params.social_items_pyladies }} - + {{ end }}

diff --git a/themes/pybcn_theme/layouts/_default/event.html b/themes/pybcn_theme/layouts/_default/event.html index abc855a3..3b43d4e5 100644 --- a/themes/pybcn_theme/layouts/_default/event.html +++ b/themes/pybcn_theme/layouts/_default/event.html @@ -42,7 +42,7 @@ {{ range $section := .Params.free_text_sections }} @@ -50,14 +50,14 @@

{{ $section.title }}

{{ if .Params.events }} {{ end }} {{ if .Params.sponsor_levels }}