Experimental book page layout.
authorRadek Czajka <rczajka@rczajka.pl>
Fri, 22 Oct 2021 07:58:06 +0000 (09:58 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Fri, 22 Oct 2021 07:58:06 +0000 (09:58 +0200)
99 files changed:
src/catalogue/templates/catalogue/2021/book_detail.html [new file with mode: 0644]
src/catalogue/templatetags/catalogue_tags.py
src/catalogue/views.py
src/experiments/__init__.py [new file with mode: 0644]
src/experiments/apps.py [new file with mode: 0644]
src/experiments/middleware.py [new file with mode: 0644]
src/experiments/templates/experiments/main_switch.html [new file with mode: 0644]
src/experiments/templates/experiments/switch.html [new file with mode: 0644]
src/experiments/templatetags/experiments.py [new file with mode: 0644]
src/experiments/urls.py [new file with mode: 0644]
src/experiments/views.py [new file with mode: 0644]
src/wolnelektury/abtests.py [deleted file]
src/wolnelektury/settings/apps.py
src/wolnelektury/settings/basic.py
src/wolnelektury/settings/custom.py
src/wolnelektury/settings/static.py
src/wolnelektury/static/2021/css/base/_fonts.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/base/_global.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/base/_icons.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/base/_module.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/components/_hamburger.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/components/_media.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/components/_module.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/components/_player.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/components/_support.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_article.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_aside.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_author.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_books.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_button.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_footer.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_header.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_main.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_module.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_navigation.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_section.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/layout/_themes.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/main.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/pages/_module.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/_bourbon.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/_mixins.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/_module.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/_vars.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/helpers/_buttons-list.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/helpers/_scales.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/helpers/_text-inputs-list.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_border-color.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_border-radius.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_border-style.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_border-width.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_buttons.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_clearfix.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_contrast-switch.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_ellipsis.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_font-face.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_font-stacks.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-text.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-visually.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_margin.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_modular-scale.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_overflow-wrap.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_padding.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_position.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_prefixer.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_shade.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_size.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_strip-unit.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_text-inputs.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_timing-functions.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_tint.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_triangle.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/library/_value-prefixer.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/settings/_settings.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/utilities/_assign-inputs.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/utilities/_compact-shorthand.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/utilities/_contrast-ratio.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/utilities/_directional-property.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/utilities/_fetch-bourbon-setting.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/utilities/_font-source-declaration.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/utilities/_gamma.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/utilities/_lightness.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/utilities/_unpack-shorthand.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains-falsy.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-color.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-length.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-number.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-size.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/vendors/_module.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/vendors/_normalize.scss [new file with mode: 0644]
src/wolnelektury/static/2021/css/vendors/_typebase.scss [new file with mode: 0644]
src/wolnelektury/static/2021/images/fav.svg [new file with mode: 0644]
src/wolnelektury/static/2021/images/header.jpg [new file with mode: 0644]
src/wolnelektury/static/2021/images/logo.png [new file with mode: 0644]
src/wolnelektury/static/2021/images/play.svg [new file with mode: 0644]
src/wolnelektury/static/2021/scripts/main.js [new file with mode: 0644]
src/wolnelektury/static/2021/scripts/vendor.js [new file with mode: 0644]
src/wolnelektury/templates/piwik/tracking_code.html
src/wolnelektury/urls.py

diff --git a/src/catalogue/templates/catalogue/2021/book_detail.html b/src/catalogue/templates/catalogue/2021/book_detail.html
new file mode 100644 (file)
index 0000000..f492251
--- /dev/null
@@ -0,0 +1,335 @@
+<!doctype html>
+{% load pipeline %}
+{% load static %}
+{% load choose_cite from social_tags %}
+{% load choose_fragment license_icon from catalogue_tags %}
+{% load catalogue_tags %}
+
+
+<html class="no-js">
+  <head>
+    <meta charset="utf-8">
+    <meta name="description" content="">
+    <meta name="viewport" content="width=device-width,initial-scale=1">
+    <title>WolneLektury.pl</title>
+    <link rel="apple-touch-icon" href="apple-touch-icon.png">
+
+    {% stylesheet '2021' %}
+    <script src="scripts/modernizr.js"></script>
+
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=Merriweather:wght@300&family=Roboto:wght@400;700&display=swap" rel="stylesheet">
+  </head>
+  <body>
+
+    <nav class="l-navigation">
+      <a href="/" class="l-navigation__logo">
+        <img src="{% static '2021/images/logo.png' %}" alt="WolneLektury.pl">
+      </a>
+      <button class="l-navigation__button js-menu" aria-label="Menu">
+        <span class="c-hamburger">
+            <span class="bar"></span>
+        </span>
+      </button>
+    </nav>
+
+    <header class="l-header">
+      <figure class="l-header__img">
+        <img src="{% if book.cover_thumb %}{{ book.cover_thumb.url }}{% endif %}" alt="{{ book.pretty_title }}">
+      </figure>
+      <div class="l-header__content">
+        <p>
+          {% for author in book.authors %}
+            <a href="{{ author.get_absolute_url  }}">{{ author }}</a>{% if not forloop.last %}, {% endif %}
+          {% endfor %}
+          {% if book.translators %}
+            (tłum. {% for translator in book.translators %}{{ translator }}{% endfor %})
+          {% endif %}
+        </p>
+        <h1>{{ book.title }}</h1>
+        <ul>
+          {# Wielkość liter zmieniona sztucznie. Docelowo należy ustalić. #}
+          {% for tag in book.kinds %}
+            <li><a href="{{ tag.get_absolute_url }}">{{ tag|lower }}</a></li>
+          {% endfor %}
+          {% for tag in book.genres %}
+            <li><a href="{{ tag.get_absolute_url }}">{{ tag|lower }}</a></li>
+          {% endfor %}
+          {% for tag in book.epochs %}
+            <li><a href="{{ tag.get_absolute_url }}">{{ tag|lower }}</a></li>
+          {% endfor %}
+        </ul>
+      </div>
+      <div class="l-header__actions">
+        <button class="l-button l-button--fav">
+          <img src="{% static '2021/images/fav.svg' %}" alt="Dodaj do ulubionych">
+        </button>
+      </div>
+    </header>
+
+    <main class="l-main">
+      <section class="l-section">
+        <aside class="l-aside">
+          {% if book.parent or book.children.all %}
+            <h3>należy do zbiorów</h3>
+
+            {% if book.parent %}
+              <ul>
+              {% for b in book.ancestor.all %}
+                <li>
+                  <a href="{{ b.get_absolute_url }}">{{ b.title }}</a>
+                  <ul>
+              {% endfor %}
+              {% for b in book.get_siblings %}
+                <li>
+                  {% if b == book %}
+                    <strong>{{ b.title }}</strong>
+                    <ul>
+                      {% for c in book.children.all %}
+                        <li>
+                          <a href="{{ c.get_absolute_url }}">{{ c.title }}</a>
+                        </li>
+                      {% endfor %}
+                    </ul>
+                  {% else %}
+                    <a href="{{ b.get_absolute_url }}">{{ b.title }}</a>
+                  {% endif %}
+                </li>
+              {% endfor %}
+
+              {% for b in book.ancestor.all %}
+                </ul>
+                </li>
+              {% endfor %}
+              </ul>
+
+            {% else %}
+              <ul>
+                <li>
+                  <strong>{{ book.title }}</strong>
+                  <ul>
+                    {% for c in book.children.all %}
+                      <li>
+                        <a href="{{ c.get_absolute_url }}">{{ c.title }}</a>
+                      </li>
+                    {% endfor %}
+                  </ul>
+                </li>
+              </ul>
+            {% endif %}
+
+
+          {% endif  %}
+
+
+          <ul class="c-externals">
+            <li><a href="{{ book.xml_file.url }}" target="_blank">źródłowy plik XML</a></li>
+            <li><a href="{% url 'poem_from_book' book.slug %}" target="_blank">miksuj treść utworu</a></li>
+
+            <li><a href="{{ book.get_extra_info_json.about }}" target="_blank">utwór na Platformie Redakcyjnej</a></li>
+          </ul>
+        </aside>
+        <article class="l-article">
+
+          <div class="quote l-article__lead">
+            {% choose_cite book as cite_promo %}
+            {% if cite_promo %}
+              {{ cite.promo_box }}
+            {% else %}
+              {% choose_fragment book as fragment_promo %}
+              {% if fragment_promo %}
+                {{  fragment_promo.get_short_text|safe }}
+              {% endif %}
+            {% endif %}
+          </div>
+
+          <div class="c-media">
+            <div class="c-media__actions">
+              <div class="c-media__btn">
+                <div class="l-button l-button--media">
+                  pobierz audiobook
+                </div>
+                <ul>
+                  <li>mp3</li>
+                  <li>ogg</li>
+                  <li>DAISY</li>
+                </ul>
+              </div>
+              <div class="c-media__btn">
+                <div class="l-button l-button--media">
+                  pobierz książkę
+                </div>
+                <ul>
+                  <li>PDF</li>
+                  <li>epub</li>
+                  <li>mobi</li>
+                </ul>
+              </div>
+              <div class="c-media__btn">
+                {#% if book.get_first_text %#}
+                  <a href="{#% url 'book_text' book.get_first_text.slug %#}">
+                    <div class="l-button l-button--media l-button--media--full">
+                      czytaj
+                    </div>
+                  </a>
+                  <!-- ul>
+                    <li>PDF</li>
+                    <li>epub</li>
+                    <li>mobi</li>
+                  </ul-->
+                {#% endif %#}
+              </div>
+            </div>
+            <div class="c-media__player">
+              <h2>słuchaj audiobooka w naszym serwisie</h2>
+              <div class="c-player">
+                <button class="c-player__btn">
+                  <img src="{% static '2021/images/play.svg' %}" alt="słuchaj audiobooka w naszym serwisie">
+                </button>
+                <div class="c-player__timeline">
+                  <span></span>
+                  <time class="c-player__length">1h 20m</time>
+                </div>
+              </div>
+            </div>
+          </div>
+
+          {{ book.abstract|safe }}
+
+        </article>
+      </section>
+
+
+      <section class="l-section">
+        <div class="c-support">
+          <h2>Ta książka jest dostępna dla tysięcy dzieciaków dzięki darowiznom od osób takich jak Ty!</h2>
+          <a href="/towarzystwo/">DORZUĆ SIĘ!</a>
+        </div>
+      </section>
+
+
+      {% for author in book.authors %}
+        <section class="l-section">
+          <div class="l-author">
+            <article class="l-author__info">
+              <h3>
+                <a href="{{ author.get_absolute_url }}">
+                  {{ author.name }}
+                </a>
+              </h3>
+
+              {{ author.description|safe }}
+
+            </article>
+            {% if HAVE_AUTHOR_PHOTO %}
+              <figure class="l-author__photo">
+                <img src="{% static '2021/images/author.jpg' %}" alt="Adam Mickiewicz">
+                <figcaption>
+                  Wikipedia
+                </figcaption>
+              </figure>
+            {% endif %}
+          </div>
+        </section>
+      {% endfor %}
+
+      {% with book.related_themes as themes %}
+        {% if themes %}
+          <section class="l-section">
+            <div class="l-themes__wrapper">
+              <h2>motywy występujące w tym utworze</h2>
+              <div class="l-themes">
+                <ul>
+                  {% for item in themes %}
+                    <li><a href="{% url 'book_fragments' book.slug item.slug %}">{{ item|lower }}&nbsp;({{ item.count}})</a></li>
+                  {% endfor %}
+                </ul>
+                <a class="button" href="{% url 'theme_catalogue' %}">zobacz wszystkie motywy</a>
+              </div>
+            </div>
+          </section>
+        {% endif %}
+      {% endwith %}
+
+
+      <section class="l-section">
+        <div class="l-books__wrapper">
+          <h2>inne tytuły w naszej bibliotece</h2>
+          <div class="l-books">
+
+            {% if book.other_versions %}
+              {% for rel in book.other_versions %}
+
+                <article class="l-books__item">
+                  <figure class="l-books__item__img">
+                    <a href="{{ rel.get_absolute_url }}">
+                      <img src="{% if rel.cover %}{{ rel.cover.url }}{% endif %}" alt="{{ rel.pretty_title }}">
+                    </a>
+                  </figure>
+                  <h3>
+                    {% for author in rel.authors %}
+                      <a href="{{ author.get_absolute_url }}">{{ author|upper }}</a>
+                    {% endfor %}
+                  </h3>
+                  <h2><a href="{{ rel.get_absolute_url }}">{{ rel.title }}</a></h2>
+                </article>
+              {% endfor %}
+            {% endif %}
+
+            {% related_books_2021 book taken=book.other_versions|length as related_books %}
+            {% for rel in related_books %}
+              <article class="l-books__item">
+                <figure class="l-books__item__img">
+                  <a href="{{ rel.get_absolute_url }}">
+                    <img src="{% if rel.cover %}{{ rel.cover.url }}{% endif %}" alt="{{ rel.pretty_title }}">
+                  </a>
+                </figure>
+                <h3>
+                  {% for author in rel.authors %}
+                    <a href="{{ author.get_absolute_url }}">{{ author|upper }}</a>
+                  {% endfor %}
+                </h3>
+                <h2><a href="{{ rel.get_absolute_url }}">{{ rel.title }}</a></h2>
+              </article>
+            {% endfor %}
+
+
+          </div>
+        </div>
+      </section>
+    </main>
+
+    <div class="l-footer">
+      <div class="l-footer__row">
+        <div class="l-footer__col">
+          <p>Wolne Lektury to projekt prowadzony przez fundację Nowoczesna Polska.</p>
+          <p>Reprodukcje cyfrowe wykonane przez Bibliotekę Narodową, Bibliotekę Śląską i Bibliotekę Elbląską z egzemplarzy pochodzących ze zbiorów BN, BŚ i BE.</p>
+          <p>Hosting: ICM.</p>
+        </div>
+        <div class="l-footer__col">
+          <ul>
+            <li>Fundacja Nowoczesna Polska</li>
+            <li>ul. Marszałkowska 84/92 lok. 125</li>
+            <li>00-514 Warszawa</li>
+          </ul>
+          <ul>
+            <li>tel: <a href="tel:+48226213017">(22) 621-30-17</a></li>
+            <li>e-mail: <a href="mailto:fundacja@nowoczesnapolska.org.pl">fundacja@nowoczesnapolska.org.pl</a></li>
+          </ul>
+        </div>
+      </div>
+      <div class="l-footer__row">
+        <p>
+          Nowa strona biblioteki Wolne Lektury powstała dzięki środkom otrzymanym w ramach Programu Operacyjnego Fundusz
+          Inicjatyw Obywatelskich, Senatu RP (zadanie realizowane w ramach zlecania przez Kancelarię Senatu zadań
+          w zakresie opieki nad Polonią i Polakami za granicą w 2011 r.) oraz Narodowego Instytutu Audiowizualnego
+          w ramach programu Dziedzictwo Cyfrowe.
+        </p>
+      </div>
+    </div>
+
+    <script src="{% static '2021/scripts/vendor.js' %}"></script>
+    <script src="{% static '2021/scripts/main.js' %}"></script>
+  </body>
+</html>
index 1a3e0aa..8915807 100644 (file)
@@ -400,6 +400,18 @@ def related_books(context, instance, limit=6, random=1, taken=0):
     }
 
 
     }
 
 
+@register.simple_tag
+def related_books_2021(instance, limit=4, taken=0):
+    limit -= taken
+    max_books = limit
+
+    books_qs = Book.objects.filter(findable=True)
+    books_qs = books_qs.exclude(common_slug=instance.common_slug).exclude(ancestor=instance)
+    books = Book.tagged.related_to(instance, books_qs)[:max_books]
+
+    return books
+    
+
 @register.simple_tag
 def download_audio(book, daisy=True, mp3=True):
     links = []
 @register.simple_tag
 def download_audio(book, daisy=True, mp3=True):
     links = []
index 38c6165..62d34bb 100644 (file)
@@ -288,13 +288,15 @@ def book_detail(request, slug):
 
     return render(
         request,
 
     return render(
         request,
-        'catalogue/book_detail.html',
+        'catalogue/2021/book_detail.html' if request.EXPERIMENTS['layout'] == 'new' else 'catalogue/book_detail.html',
         {
             'book': book,
             'book_children': book.children.all().order_by('parent_number', 'sort_key'),
             'active_menu_item': 'books',
             'club_form': ScheduleForm() if book.preview else None,
             'club': Club.objects.first() if book.preview else None,
         {
             'book': book,
             'book_children': book.children.all().order_by('parent_number', 'sort_key'),
             'active_menu_item': 'books',
             'club_form': ScheduleForm() if book.preview else None,
             'club': Club.objects.first() if book.preview else None,
+
+            'EXPERIMENTS_SWITCHABLE_layout': True,
         })
 
 
         })
 
 
diff --git a/src/experiments/__init__.py b/src/experiments/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/experiments/apps.py b/src/experiments/apps.py
new file mode 100644 (file)
index 0000000..57d0133
--- /dev/null
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class ExperimentsConfig(AppConfig):
+    name = 'experiments'
diff --git a/src/experiments/middleware.py b/src/experiments/middleware.py
new file mode 100644 (file)
index 0000000..080aee2
--- /dev/null
@@ -0,0 +1,41 @@
+import hashlib
+from django.conf import settings
+
+
+def experiments_middleware(get_response):
+    def middleware(request):
+        exps = {}
+
+        overrides = getattr(settings, 'EXPERIMENTS_OVERRIDES', {})
+        for exp in settings.EXPERIMENTS:
+            slug = exp['slug']
+            if slug in overrides:
+                exps[slug] = overrides[slug]
+                continue
+
+            cookie_value = request.COOKIES.get(f'EXPERIMENT_{slug}')
+            if cookie_value is not None:
+                for cohort in exp.get('cohorts', []):
+                    if cohort['value'] == cookie_value:
+                        exps[slug] = cookie_value
+                        break
+
+            if slug not in exps:
+                number = int(
+                    # TODO sth else?
+                    hashlib.md5(
+                        (slug + request.META['REMOTE_ADDR']).encode('utf-8')
+                    ).hexdigest(),
+                    16
+                ) % 10e6 / 10e6
+                for cohort in exp.get('cohorts', []):
+                    number -= cohort.get('size', 1)
+                    if number < 0:
+                        exps[slug] = cohort['value']
+                        break
+
+        request.EXPERIMENTS = exps
+        response = get_response(request)
+        return response
+
+    return middleware
diff --git a/src/experiments/templates/experiments/main_switch.html b/src/experiments/templates/experiments/main_switch.html
new file mode 100644 (file)
index 0000000..0ff0d88
--- /dev/null
@@ -0,0 +1,44 @@
+{% extends "base/base.html" %}
+
+
+{% block body %}
+  <img src="https://upload.wikimedia.org/wikipedia/commons/c/c8/MH1Asimulator.JPG" style="width:100">
+
+  {% for exp in experiments %}
+    <div class="experiment" data-slug="{{ exp.config.slug }}">
+      {{ exp.config.name }}
+      {% for cohort in exp.config.cohorts %}
+        <button
+            {% if exp.value == cohort.value %}
+            disabled class="active"
+            {% endif %}
+            data-value="{{ cohort.value }}">{{ cohort.name }}</button>
+      {% endfor %}
+    </div>
+
+    <script>
+    </script>
+
+  {% endfor %}
+{% endblock %}
+
+{% block extrabody %}
+  <style>
+   .experiment {
+       margin: 1em 0;
+       font-size: 1.5em;
+   }
+   .experiment button {
+       margin: 0 1em;
+       padding: .5em;
+       font-size: 1em;
+
+   }
+  </style>
+  <script>
+   $(".experiment button").click(function() {
+       document.cookie = 'EXPERIMENT_' + $(this).parent().data('slug') + '=' + $(this).data('value') + '; path=/';
+       window.location.reload(true);
+   });
+  </script>
+{% endblock %}
diff --git a/src/experiments/templates/experiments/switch.html b/src/experiments/templates/experiments/switch.html
new file mode 100644 (file)
index 0000000..303518b
--- /dev/null
@@ -0,0 +1,55 @@
+{% if tests %}
+  <div id="test-switcher" class="{% if explicit %}test-switcher-explicit{% endif %}">
+    <div class="test-switcher-content">
+      {% for test, currval in tests %}
+        {% for cohort in test.cohorts %}
+          {% if cohort.value != currval %}
+            <a onclick="document.cookie='AB_{{test.slug}}={{cohort.value}}; path=/'; window.location.reload(true);">{{ cohort.name }}</a>
+          {% endif %}
+        {% endfor %}
+      {% endfor %}
+    </div>
+  </div>
+
+
+  <style>
+   #test-switcher {
+       background: white;
+       color: black;
+       position: absolute;
+       top: 0;
+       left: 0;
+       padding-left: 1.5em;
+       height: 2em;
+   }
+   #test-switcher:before {
+       content: ">";
+       display: inline-block;
+       vertical-align: top;
+       margin-left: -1em;
+       transition: opacity .2s;
+       line-height: 2em;
+   }
+   #test-switcher:hover .test-switcher-content {
+       width: 200px;
+   }
+   #test-switcher:hover:before,
+   .test-switcher-explicit:before {
+       opacity: 0;
+   }
+   .test-switcher-content {
+       width: 0;
+       overflow: hidden;
+       transition: width .2s;
+       display: inline-block;
+       line-height: 2em;
+       white-space: nowrap;
+   }
+   .test-switcher-explicit .test-switcher-content {
+       width: 200px;
+   }
+   .test-switcher-content a {
+       cursor: pointer;
+   }
+  </style>
+{% endif %}
diff --git a/src/experiments/templatetags/experiments.py b/src/experiments/templatetags/experiments.py
new file mode 100644 (file)
index 0000000..f491fb3
--- /dev/null
@@ -0,0 +1,22 @@
+from django.conf import settings
+from django.template import Library
+
+
+register = Library()
+
+
+@register.inclusion_tag('experiments/switch.html', takes_context=True)
+def experiments_switcher(context):
+    tests = []
+    explicit = False
+    for exp in settings.EXPERIMENTS:
+        currval = context['request'].EXPERIMENTS.get(exp['slug'])
+        if exp.get('switchable') or context.get('EXPERIMENTS_SWITCHABLE_' + test['slug']):
+            tests.append((exp, currval))
+            for cohort in exp.get('cohorts'):
+                if cohort.get('explicit') and cohort.get('value') == currval:
+                    explicit = True
+    return {
+        'tests': tests,
+        'explicit': explicit,
+    }
diff --git a/src/experiments/urls.py b/src/experiments/urls.py
new file mode 100644 (file)
index 0000000..5dfdcb6
--- /dev/null
@@ -0,0 +1,7 @@
+from django.urls import path
+from . import views
+
+
+urlpatterns = [
+    path('', views.MainSwitchView.as_view()),
+]
diff --git a/src/experiments/views.py b/src/experiments/views.py
new file mode 100644 (file)
index 0000000..71c514a
--- /dev/null
@@ -0,0 +1,17 @@
+from django.views.generic import TemplateView
+from django.conf import settings
+
+
+class MainSwitchView(TemplateView):
+    template_name = 'experiments/main_switch.html'
+
+    def get_context_data(self):
+        ctx = super().get_context_data()
+        ctx['experiments'] = [
+            {
+                "config": conf,
+                "value": self.request.EXPERIMENTS.get(conf['slug'])
+            }
+            for conf in settings.EXPERIMENTS
+        ]
+        return ctx
diff --git a/src/wolnelektury/abtests.py b/src/wolnelektury/abtests.py
deleted file mode 100644 (file)
index 6dd0ea2..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-import hashlib
-from django.conf import settings
-
-
-def context_processor(request):
-    ab = {}
-    overrides = getattr(settings, 'AB_TESTS_OVERRIDES', {})
-    for abtest, nvalues in settings.AB_TESTS.items():
-        ab[abtest] = overrides.get(
-            abtest,
-            hashlib.md5(
-                (abtest + request.META['REMOTE_ADDR']).encode('utf-8')
-            ).digest()[0] % nvalues
-        )
-    return {'AB': ab}
index 0facb8e..ac6c08e 100644 (file)
@@ -11,6 +11,7 @@ INSTALLED_APPS_OUR = [
     'catalogue',
     'chunks',
     'dictionary',
     'catalogue',
     'chunks',
     'dictionary',
+    'experiments',
     'infopages',
     'lesmianator',
     'messaging',
     'infopages',
     'lesmianator',
     'messaging',
index ed80fee..47a2388 100644 (file)
@@ -59,7 +59,6 @@ TEMPLATES = [{
             'django.template.context_processors.media',
             'django.template.context_processors.request',
             'wolnelektury.context_processors.extra_settings',
             'django.template.context_processors.media',
             'django.template.context_processors.request',
             'wolnelektury.context_processors.extra_settings',
-            'wolnelektury.abtests.context_processor',
             'search.context_processors.search_form',
             'machina.core.context_processors.metadata',
         ),
             'search.context_processors.search_form',
             'machina.core.context_processors.metadata',
         ),
@@ -81,6 +80,7 @@ MIDDLEWARE = [
     'fnpdjango.middleware.SetRemoteAddrFromXRealIP',
     'django.middleware.cache.FetchFromCacheMiddleware',
     'machina.apps.forum_permission.middleware.ForumPermissionMiddleware',
     'fnpdjango.middleware.SetRemoteAddrFromXRealIP',
     'django.middleware.cache.FetchFromCacheMiddleware',
     'machina.apps.forum_permission.middleware.ForumPermissionMiddleware',
+    'experiments.middleware.experiments_middleware',
 ]
 
 ROOT_URLCONF = 'wolnelektury.urls'
 ]
 
 ROOT_URLCONF = 'wolnelektury.urls'
index 38d2936..08937d9 100644 (file)
@@ -39,8 +39,17 @@ CLUB_PAYU_POS = '300746'
 CLUB_PAYU_RECURRING_POS = '300746'
 CLUB_APP_HOST = None
 
 CLUB_PAYU_RECURRING_POS = '300746'
 CLUB_APP_HOST = None
 
-AB_TESTS = {
-}
+
+EXPERIMENTS = [
+    {
+        "name": "Eksperymentalny układ strony utworu",
+        "slug": "layout",
+        "cohorts": [
+            {"size": 0,   "value": "new", "name": "eksperymentalny układ", "explicit": True},
+            {             "value": "old", "name": "stary układ"},
+        ],
+    },
+]
 
 MESSAGING_MIN_DAYS = 2
 
 
 MESSAGING_MIN_DAYS = 2
 
index efb61b2..b7beb79 100644 (file)
@@ -22,6 +22,12 @@ IMAGE_DIR = 'book/pictures/'
 
 PIPELINE = {
     'STYLESHEETS': {
 
 PIPELINE = {
     'STYLESHEETS': {
+        '2021': {
+            'source_filenames': [
+                '2021/css/main.scss',
+            ],
+            'output_filename': 'css/compressed/2021.css',
+        },
         'main': {
             # styles both for mobile and for big screen
             'source_filenames': [
         'main': {
             # styles both for mobile and for big screen
             'source_filenames': [
diff --git a/src/wolnelektury/static/2021/css/base/_fonts.scss b/src/wolnelektury/static/2021/css/base/_fonts.scss
new file mode 100644 (file)
index 0000000..489da87
--- /dev/null
@@ -0,0 +1,29 @@
+@font-face {
+  font-family: "Futura PT";
+  src: url('#{$font-path}/subset-FuturaPT-Book.ttf?20uhbq') format('truetype'),
+       url('#{$font-path}/subset-FuturaPT-Book.woff?20uhbq') format('woff'),
+       url('#{$font-path}/subset-FuturaPT-Book.woff2?20uhbq') format('woff2');
+  font-weight: $regular;
+  font-style: normal;
+  font-display: swap;
+}
+
+@font-face {
+  font-family: "Canela";
+  src: url('#{$font-path}/subset-Canela-Light.ttf?20uhbq') format('truetype'),
+       url('#{$font-path}/subset-Canela-Light.woff?20uhbq') format('woff'),
+       url('#{$font-path}/subset-Canela-Light.woff2?20uhbq') format('woff2');
+  font-weight: $light;
+  font-style: normal;
+  font-display: swap;
+}
+
+@font-face {
+  font-family: "Canela";
+  src: url('#{$font-path}/subset-Canela-LightItalic.ttf?20uhbq') format('truetype'),
+       url('#{$font-path}/subset-Canela-LightItalic.woff') format('woff'),
+       url('#{$font-path}/subset-Canela-LightItalic.woff2') format('woff2');
+  font-weight: $light;
+  font-style: italic;
+  font-display: swap;
+}
diff --git a/src/wolnelektury/static/2021/css/base/_global.scss b/src/wolnelektury/static/2021/css/base/_global.scss
new file mode 100644 (file)
index 0000000..30d43b4
--- /dev/null
@@ -0,0 +1,39 @@
+/* ------------------------------
+    Base: Global
+------------------------------ */
+
+*, *:after, *:before {
+       box-sizing: border-box;
+}
+
+:focus {
+  outline: $color-black auto 2px;
+  outline-offset: 2px;
+}
+
+html,
+body {
+  -webkit-overflow-scrolling: auto;
+}
+
+body {
+       color: $color-black;
+       background-color: $color-white;
+
+  &.using-mouse {
+    *:focus {
+      outline: 0 !important;
+    }
+  }
+}
+
+.visibility-hidden {
+  visibility: hidden !important;
+}
+
+.simpleParallax {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
diff --git a/src/wolnelektury/static/2021/css/base/_icons.scss b/src/wolnelektury/static/2021/css/base/_icons.scss
new file mode 100644 (file)
index 0000000..161be54
--- /dev/null
@@ -0,0 +1,79 @@
+/* ------------------------------
+    Base: Icons
+------------------------------ */
+
+$icon-minus: "\e900";
+$icon-plus: "\e901";
+$icon-pin: "\e902";
+$icon-linkedin: "\e903";
+$icon-arrow-up: "\e904";
+$icon-arrow-down: "\e905";
+$icon-arrow-left: "\e906";
+$icon-arrow-right: "\e907";
+
+@font-face {
+  font-family: '#{$icomoon-font-family}';
+  src:
+    url('#{$icomoon-font-path}/#{$icomoon-font-family}.ttf?20uhbq') format('truetype'),
+    url('#{$icomoon-font-path}/#{$icomoon-font-family}.woff?20uhbq') format('woff'),
+    url('#{$icomoon-font-path}/#{$icomoon-font-family}.svg?20uhbq##{$icomoon-font-family}') format('svg');
+  font-weight: normal;
+  font-style: normal;
+  font-display: block;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: '#{$icomoon-font-family}' !important;
+  speak: never;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-minus {
+  &:before {
+    content: $icon-minus;
+  }
+}
+.icon-plus {
+  &:before {
+    content: $icon-plus;
+  }
+}
+.icon-pin {
+  &:before {
+    content: $icon-pin;
+  }
+}
+.icon-linkedin {
+  &:before {
+    content: $icon-linkedin;
+  }
+}
+.icon-arrow-up {
+  &:before {
+    content: $icon-arrow-up;
+  }
+}
+.icon-arrow-down {
+  &:before {
+    content: $icon-arrow-down;
+  }
+}
+.icon-arrow-left {
+  &:before {
+    content: $icon-arrow-left;
+  }
+}
+.icon-arrow-right {
+  &:before {
+    content: $icon-arrow-right;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/base/_module.scss b/src/wolnelektury/static/2021/css/base/_module.scss
new file mode 100644 (file)
index 0000000..3c5c9ca
--- /dev/null
@@ -0,0 +1,9 @@
+/*! ------------------------------
+    Base Module
+------------------------------ */
+
+/*!*/
+
+@import "global";
+@import "icons";
+@import "fonts";
diff --git a/src/wolnelektury/static/2021/css/components/_hamburger.scss b/src/wolnelektury/static/2021/css/components/_hamburger.scss
new file mode 100644 (file)
index 0000000..2c6c22e
--- /dev/null
@@ -0,0 +1,106 @@
+/* ------------------------------
+    Component: Hamburger
+------------------------------ */
+
+$bar-width:   35px;
+$bar-height:  3px;
+$bar-spacing: 8px;
+$bar-color:   $color-gray;
+
+.c-hamburger {
+  display: flex;
+  height: $bar-height + $bar-spacing*2;
+  transition: transform $ease-out 400ms;
+  backface-visibility: hidden;
+  position: relative;
+  cursor: pointer;
+
+  @include rwd(tablet) {
+    margin-right: 0;
+  }
+
+  border: 0;
+  margin: 0; padding: 0;
+  background-color: transparent;
+  appearance: none;
+
+  &:after {
+    content: attr(data-label);
+    transform: translateX(50%);
+    @include font-size(18px);
+    top: -3px; left: -7px;
+    font-weight: $medium;
+    padding-left: 17px;
+    position: absolute;
+    transition: color 300ms $ease-out;
+  }
+
+  &.is-clicked {
+    z-index: $master-layer + 2;
+
+    @include rwd(tablet) {
+      position: fixed;
+      top: 2rem; right: 1rem;
+    }
+
+    &:after {
+      color: $color-black;
+    }
+  }
+
+  .bar,
+  .bar:after,
+  .bar:before {
+    width: $bar-width;
+    height: $bar-height;
+    border-radius: 10px;
+  }
+
+  .bar {
+    position: relative;
+    transform: translateY($bar-spacing);
+    background-color: rgba($bar-color, 1);
+    transition: all 0ms 300ms;
+
+    &:before,
+    &:after {
+      left: 0;
+      content: "";
+      position: absolute;
+      bottom: $bar-spacing;
+      background-color: rgba($bar-color, 1);
+    }
+
+    &:before {
+      bottom: $bar-spacing;
+      transition: bottom 300ms 300ms $ease-out,
+      transform 300ms $ease-out,
+      background-color 300ms $ease-out;
+    }
+
+    &:after {
+      top: $bar-spacing;
+      transition: top 300ms 300ms $ease-out,
+      transform 300ms $ease-out,
+      background-color 300ms $ease-out;
+    }
+
+    &.animate {
+      background-color: rgba(255, 255, 255, 0);
+
+      &:before {
+        bottom: 0;
+        transform: rotate(-45deg);
+        transition: bottom 300ms $ease-out,
+        transform 300ms 300ms $ease-out;
+      }
+
+      &:after {
+        top: 0;
+        transform: rotate(45deg);
+        transition: top 300ms $ease-out,
+        transform 300ms 300ms $ease-out;
+      }
+    }
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/components/_media.scss b/src/wolnelektury/static/2021/css/components/_media.scss
new file mode 100644 (file)
index 0000000..80f50b4
--- /dev/null
@@ -0,0 +1,64 @@
+.c-media {
+  margin: 31px auto;
+  border: 1px solid $color-light-gray;
+}
+
+.c-media__actions {
+  display: flex;
+  padding: 30px;
+  border-bottom: 1px solid $color-light-gray;
+}
+
+.c-media__btn {
+  width: 100%;
+  text-align: center;
+
+  &:first-child {
+    padding-right: 35px;
+  }
+
+  &:nth-child(2) {
+    padding: 0 35px;
+    border-left: 1px solid #ccc;
+    border-right: 1px solid #ccc;
+  }
+
+  &:last-child {
+    padding-left: 35px;
+  }
+
+  .l-button {}
+
+  ul {
+    @include font-size(16px);
+    line-height: 19px;
+    text-align: center;
+    letter-spacing: 0.01em;
+    padding: 0;
+    list-style: none;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-weight: $bold;
+    margin: 0;
+
+    li {
+      margin-right: 6px;
+      &:not(:last-child):after { content: "|"; margin-left: 6px; }
+    }
+  }
+}
+
+.c-media__player {
+  padding: 25px 30px;
+
+  h2 {
+    font-weight: $bold;
+    @include font-size(16px);
+    line-height: 19px;
+    text-align: center;
+    letter-spacing: 0.01em;
+    color: $color-gray;
+    margin: 0;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/components/_module.scss b/src/wolnelektury/static/2021/css/components/_module.scss
new file mode 100644 (file)
index 0000000..f298f51
--- /dev/null
@@ -0,0 +1,10 @@
+/*! ------------------------------
+    Components Module
+------------------------------ */
+
+/*!*/
+
+@import "hamburger";
+@import "media";
+@import "player";
+@import "support";
diff --git a/src/wolnelektury/static/2021/css/components/_player.scss b/src/wolnelektury/static/2021/css/components/_player.scss
new file mode 100644 (file)
index 0000000..c5d4f4a
--- /dev/null
@@ -0,0 +1,44 @@
+.c-player {
+  display: flex;
+  width: 100%;
+  align-items: center;
+  position: relative;
+}
+
+.c-player__btn {
+  background: $color-primary;
+  border: 0;
+  outline: 0;
+  border-radius: 50%;
+  padding: 0;
+  width: 60px;
+  height: 60px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+
+  img {}
+}
+
+.c-player__timeline {
+  width: calc(100% - 60px);
+
+  span {
+    height: 5px;
+    width: 100%;
+    background: $color-primary;
+    display: block;
+  }
+}
+
+.c-player__length {
+  position: absolute;
+  right: 0;
+  padding-top: 3px;
+  font-weight: bold;
+  @include font-size(16px);
+  line-height: 19px;
+  text-align: right;
+  letter-spacing: 0.01em;
+}
diff --git a/src/wolnelektury/static/2021/css/components/_support.scss b/src/wolnelektury/static/2021/css/components/_support.scss
new file mode 100644 (file)
index 0000000..8487804
--- /dev/null
@@ -0,0 +1,40 @@
+.c-support {
+  display: flex;
+  margin-top: 100px;
+  flex-direction: column;
+  border-top: 4px solid $color-light-gray;
+  border-bottom: 4px solid $color-light-gray;
+  padding: 90px 0 40px 0;
+
+  h2 {
+    margin: 0;
+    font-weight: $bold;
+    @include font-size(64px);
+    letter-spacing: -0.02em;
+    color: $color-primary;
+    line-height: 64px;
+  }
+  a {
+    font-weight: $bold;
+    @include font-size(48px);
+    line-height: 56px;
+    text-align: center;
+    letter-spacing: 0.01em;
+    color: $color-primary;
+    border: 12px solid $color-yellow;
+    box-sizing: border-box;
+    border-radius: 40px;
+    width: 550px;
+    display: inline-block;
+    padding: 33px 23px 33px 193px;
+    margin-right: 0;
+    margin-left: auto;
+    position: relative;
+    top: -50px;
+    transition: all $ease-dynamic 350ms;
+
+    &:hover {
+      background: $color-yellow;
+    }
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_article.scss b/src/wolnelektury/static/2021/css/layout/_article.scss
new file mode 100644 (file)
index 0000000..8d5172a
--- /dev/null
@@ -0,0 +1,35 @@
+.l-article {
+  color: $color-gray;
+  border-left: 2px solid $color-light-gray;
+  padding-bottom: 30px;
+  padding-left: 21px;
+  margin-left: 15px;
+
+  h2 {}
+  h3 {}
+  h4 {}
+  p {
+    font-style: normal;
+    font-weight: $regular;
+    @include font-size(18px);
+    line-height: 166%;
+    letter-spacing: -0.005em;
+  }
+  ul {}
+  ol {}
+}
+
+.l-article__lead {
+  margin-top: 0;
+  font-weight: $light;
+  @include font-size(24px);
+  font-family: $secondary-font;
+  line-height: 166%;
+}
+
+
+
+.quote p {
+
+    margin-top: inherit;
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_aside.scss b/src/wolnelektury/static/2021/css/layout/_aside.scss
new file mode 100644 (file)
index 0000000..c3af6f8
--- /dev/null
@@ -0,0 +1,48 @@
+.l-aside {
+  color: $color-gray;
+  max-width: 350px;
+  width: 100%;
+
+  h3 {
+    font-weight: $bold;
+    @include font-size(18px);
+    line-height: 21px;
+    letter-spacing: 0.01em;
+    margin-top: 0;
+  }
+
+  & > ul {
+    padding-left: 0;
+  }
+
+  ul {
+    list-style: none;
+    padding-left: 30px;
+    li {
+      a {
+        text-decoration: underline;
+      }
+    }
+  }
+
+  ul:not(.c-externals) {
+    font-weight: $bold;
+    @include font-size(24px);
+    line-height: 28px;
+
+    li {
+      margin: 8px 0;
+      a {}
+    }
+  }
+
+  .c-externals {
+    margin-top: 2rem;
+    border-top: 2px solid $color-light-gray;
+    padding-top: 0.5rem;
+
+    li {
+      a {}
+    }
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_author.scss b/src/wolnelektury/static/2021/css/layout/_author.scss
new file mode 100644 (file)
index 0000000..293bad2
--- /dev/null
@@ -0,0 +1,52 @@
+.l-author {
+  display: flex;
+  padding: 60px;
+  margin-top: 100px;
+  justify-content: space-between;
+  border: 8px solid $color-light-gray;
+}
+
+.l-author__info {
+  max-width: 755px;
+
+  h3 {
+    margin: 0;
+    @include font-size(32px);
+    letter-spacing: -0.02em;
+    color: $color-primary;
+    font-weight: $bold;
+    line-height: 100%;
+  }
+  p, dl, ul {
+    font-weight: $regular;
+    @include font-size(18px);
+    letter-spacing: -0.005em;
+    color: $color-gray;
+    line-height: 166%;
+    font-size: 18px;
+  }
+
+  ul.meta {
+      list-style: none;
+      margin: 1em 0 0 0;
+      padding: 0;
+      text-align: right;
+      
+  }
+  dt {
+      float: left;
+  }
+  
+}
+
+.l-author__photo {
+  margin: 0;
+  img {}
+  figcaption {
+    font-weight: 500;
+    @include font-size(14px);
+    line-height: 140%;
+    letter-spacing: 0.0015em;
+    color: $color-gray;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_books.scss b/src/wolnelektury/static/2021/css/layout/_books.scss
new file mode 100644 (file)
index 0000000..5e22820
--- /dev/null
@@ -0,0 +1,55 @@
+.l-books__wrapper {
+  border-top: 4px solid $color-light-gray;
+  margin-top: 100px;
+  width: 100%;
+
+  h2 {
+    font-weight: $bold;
+    @include font-size(32px);
+    letter-spacing: -0.02em;
+    color: $color-primary;
+    line-height: 100%;
+    margin-top: 53px;
+  }
+}
+
+.l-books__wrapper
+
+.l-books {
+  display: flex;
+  flex-wrap: wrap;
+  margin-top: 30px;
+}
+
+.l-books__item {
+  width: 25%;
+
+  h2 {
+    font-weight: $bold;
+    @include font-size(18px);
+    line-height: 21px;
+    letter-spacing: -0.01em;
+    color: $color-gray;
+    margin: 0;
+  }
+  h3 {
+    font-weight: $bold;
+    @include font-size(14px);
+    line-height: 16px;
+    letter-spacing: 0.01em;
+    color: $color-gray;
+    margin: 0;
+  }
+}
+
+.l-books__item__img {
+  margin: 0;
+  font-size: 0;
+  margin-bottom: 25px;
+
+  a {}
+  img {
+      width: 194px;
+      height: 280px;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_button.scss b/src/wolnelektury/static/2021/css/layout/_button.scss
new file mode 100644 (file)
index 0000000..9da1e6e
--- /dev/null
@@ -0,0 +1,20 @@
+.l-button {
+  &.l-button--media {
+    letter-spacing: -0.01em;
+    color: $color-primary;
+    font-weight: $bold;
+    @include font-size(16px);
+    line-height: 19px;
+    border: 4px solid $color-primary;
+    border-radius: 10px;
+    padding: 19px 20px;
+    cursor: pointer;
+    transition: all $ease-dynamic 350ms;
+
+    &:hover,
+    &.l-button--media--full {
+      color: $color-white;
+      background: $color-primary;
+    }
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_footer.scss b/src/wolnelektury/static/2021/css/layout/_footer.scss
new file mode 100644 (file)
index 0000000..046c989
--- /dev/null
@@ -0,0 +1,78 @@
+.l-footer {}
+
+.l-footer__row {}
+
+.l-footer__col {
+  p {}
+}
+
+.l-footer {
+  max-width: 1140px;
+  margin: 0 auto;
+  padding-top: 60px;
+  border-top: 4px solid #CCCCCC;
+  margin-top: 100px;
+}
+
+.l-footer__row {
+  display: flex;
+}
+
+
+.l-footer__col {
+  width: 100%;
+}
+
+.l-footer p {
+  font-weight: normal;
+  font-size: 16px;
+  line-height: 19px;
+  /* identical to box height */
+  letter-spacing: 0.01em;
+  color: #666666;
+  margin-top: 22px;
+}
+
+.l-footer__col p:not(:last-child) {
+  padding-bottom: 37px;
+  border-bottom: 1px solid #CCCCCC;
+}
+
+.l-footer__row .l-footer__col:first-child {
+  border-right: 1px solid #ccc;
+  padding-right: 10px;
+}
+
+.l-footer__col ul {
+  font-weight: bold;
+  font-size: 24px;
+  line-height: 125%;
+  /* or 30px */
+  letter-spacing: -0.01em;
+  color: #666666;
+  list-style: none;
+  padding-left: 10px;
+}
+
+.l-footer__col ul:first-child {
+  margin-top: 0;
+}
+
+.l-footer__col p:first-child {
+  margin-top: 5px;
+}
+
+.l-footer__col p:last-child {
+  padding-bottom: 10px;
+}
+
+.l-footer__row:last-child {
+  margin-top: 20px;
+  border-top: 1px solid #ccc;
+  border-bottom: 12px solid #CCCCCC;
+}
+
+.l-footer__row:last-child p {
+  margin-top: 64px;
+  margin-bottom: 64px;
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_header.scss b/src/wolnelektury/static/2021/css/layout/_header.scss
new file mode 100644 (file)
index 0000000..8ef222b
--- /dev/null
@@ -0,0 +1,79 @@
+.l-header {
+  max-width: 1140px;
+  margin: 0 auto;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 40px 36px;
+  border-bottom: 4px solid $color-light-gray;
+}
+
+.l-header__img {
+  margin: 0;
+  font-size: 0;
+  width: 200px;
+  height: 200px;
+  overflow: hidden;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border-radius: 50%;
+
+  img {
+    width: 200px;
+    height: auto;
+  }
+}
+
+.l-header__content {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  margin-left: 58px;
+  margin-right: auto;
+
+  p {
+    letter-spacing: -0.02em;
+    font-weight: $bold;
+    @include font-size(32px);
+    line-height: 100%;
+    color: $color-primary;
+    margin: 0;
+  }
+
+  h1 {
+    letter-spacing: -0.02em;
+    color: $color-primary;
+    font-weight: $bold;
+    @include font-size(64px);
+    line-height: 100%;
+    margin: 0;
+  }
+
+  ul {
+    letter-spacing: -0.02em;
+    color: $color-secondary;
+    font-weight: $bold;
+    @include font-size(24px);
+    list-style: none;
+    line-height: 100%;
+    display: flex;
+    padding: 0;
+    margin: 0;
+
+    li {
+      margin-right: 10px;
+      &:not(:last-child):after { content: "/";margin-left: 10px; }
+    }
+  }
+}
+
+.l-header__actions {
+  .l-button {
+    appearance: none;
+    border: 0;
+    padding: 0;
+    background: transparent;
+    cursor: pointer;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_main.scss b/src/wolnelektury/static/2021/css/layout/_main.scss
new file mode 100644 (file)
index 0000000..90f4fc6
--- /dev/null
@@ -0,0 +1,5 @@
+.l-main {
+  margin: 0 auto;
+  max-width: 1140px;
+  padding-top: 60px;
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_module.scss b/src/wolnelektury/static/2021/css/layout/_module.scss
new file mode 100644 (file)
index 0000000..60a9d24
--- /dev/null
@@ -0,0 +1,17 @@
+/*! ------------------------------
+    Layout Module
+------------------------------ */
+
+/*!*/
+
+@import "navigation";
+@import "header";
+@import "main";
+@import "aside";
+@import "article";
+@import "section";
+@import "author";
+@import "themes";
+@import "books";
+@import "button";
+@import "footer";
diff --git a/src/wolnelektury/static/2021/css/layout/_navigation.scss b/src/wolnelektury/static/2021/css/layout/_navigation.scss
new file mode 100644 (file)
index 0000000..d01a1a8
--- /dev/null
@@ -0,0 +1,18 @@
+.l-navigation {
+  max-width: 1140px;
+  margin: 0 auto;
+  border-bottom: 2px solid #CCCCCC;
+  padding: 35px 0;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.l-navigation__button {
+  appearance: none;
+  border: 0;
+  background: 0;
+  padding: 0;
+  margin: 0;
+  outline: 0;
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_section.scss b/src/wolnelektury/static/2021/css/layout/_section.scss
new file mode 100644 (file)
index 0000000..ec7193a
--- /dev/null
@@ -0,0 +1,5 @@
+.l-section {
+  display: flex;
+
+  & > h2 {}
+}
diff --git a/src/wolnelektury/static/2021/css/layout/_themes.scss b/src/wolnelektury/static/2021/css/layout/_themes.scss
new file mode 100644 (file)
index 0000000..f034ac9
--- /dev/null
@@ -0,0 +1,60 @@
+.l-themes__wrapper {
+  border-top: 4px solid $color-light-gray;
+  margin-top: 100px;
+  width: 100%;
+
+  h2 {
+    font-weight: bold;
+    @include font-size(32px);
+    letter-spacing: -0.02em;
+    color: $color-primary;
+    line-height: 100%;
+    margin-top: 53px;
+  }
+}
+
+.l-themes {
+  margin-top: 52px;
+
+  ul {
+    padding: 0;
+    margin: 0;
+    list-style: none;
+    font-weight: $bold;
+    @include font-size(18px);
+    line-height: 21px;
+    letter-spacing: 0.01em;
+
+    color: $color-gray;
+    display: flex;
+    flex-wrap: wrap;
+
+    li {
+      width: 16.66666666666667%;
+      margin-bottom: 17px;
+
+      a {
+        text-decoration: none;
+        &:hover {
+          text-decoration: underline;
+        }
+      }
+    }
+  }
+
+  a.button {
+    font-weight: $bold;
+    @include font-size(24px);
+    line-height: 28px;
+    text-align: center;
+    text-decoration-line: underline;
+    color: $color-gray;
+    appearance: none;
+    background: transparent;
+    padding: 0;
+    border: 0;
+    cursor: pointer;
+    display: block;
+    margin: 43px auto 0;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/main.scss b/src/wolnelektury/static/2021/css/main.scss
new file mode 100644 (file)
index 0000000..2e02b64
--- /dev/null
@@ -0,0 +1,30 @@
+/*==============================================================================
+    Main Sass
+==============================================================================*/
+
+/*! -------------------------------------------*\
+*
+* Project Info
+*
+* @name     WolneLektury.pl
+* @version  0.0.1
+* @updated  13.10.2021
+*
+* @website  #
+*
+* @author   intui.eu
+*
+\*-------------------------------------------*/
+
+/*!*/
+
+/*==============================================================================
+    Imports
+==============================================================================*/
+
+@import "utils/module";
+@import "vendors/module";
+@import "base/module";
+@import "components/module";
+@import "layout/module";
+@import "pages/module";
diff --git a/src/wolnelektury/static/2021/css/pages/_module.scss b/src/wolnelektury/static/2021/css/pages/_module.scss
new file mode 100644 (file)
index 0000000..9641065
--- /dev/null
@@ -0,0 +1,6 @@
+/*! ------------------------------
+    Pages Module
+------------------------------ */
+
+/*!*/
+
diff --git a/src/wolnelektury/static/2021/css/utils/_bourbon.scss b/src/wolnelektury/static/2021/css/utils/_bourbon.scss
new file mode 100644 (file)
index 0000000..b4096e1
--- /dev/null
@@ -0,0 +1,54 @@
+// Bourbon 5.0.0
+// https://www.bourbon.io/
+// Copyright 2011-2018 thoughtbot, inc.
+// MIT License
+
+@import "bourbon/helpers/buttons-list";
+@import "bourbon/helpers/scales";
+@import "bourbon/helpers/text-inputs-list";
+
+@import "bourbon/settings/settings";
+
+@import "bourbon/validators/contains";
+@import "bourbon/validators/contains-falsy";
+@import "bourbon/validators/is-color";
+@import "bourbon/validators/is-length";
+@import "bourbon/validators/is-number";
+@import "bourbon/validators/is-size";
+
+@import "bourbon/utilities/assign-inputs";
+@import "bourbon/utilities/compact-shorthand";
+@import "bourbon/utilities/directional-property";
+@import "bourbon/utilities/fetch-bourbon-setting";
+@import "bourbon/utilities/font-source-declaration";
+@import "bourbon/utilities/gamma";
+@import "bourbon/utilities/lightness";
+@import "bourbon/utilities/contrast-ratio";
+@import "bourbon/utilities/unpack-shorthand";
+
+@import "bourbon/library/border-color";
+@import "bourbon/library/border-radius";
+@import "bourbon/library/border-style";
+@import "bourbon/library/border-width";
+@import "bourbon/library/buttons";
+@import "bourbon/library/clearfix";
+@import "bourbon/library/contrast-switch";
+@import "bourbon/library/ellipsis";
+@import "bourbon/library/font-face";
+@import "bourbon/library/font-stacks";
+@import "bourbon/library/hide-text";
+@import "bourbon/library/hide-visually";
+@import "bourbon/library/margin";
+@import "bourbon/library/modular-scale";
+@import "bourbon/library/overflow-wrap";
+@import "bourbon/library/padding";
+@import "bourbon/library/position";
+@import "bourbon/library/prefixer";
+@import "bourbon/library/shade";
+@import "bourbon/library/size";
+@import "bourbon/library/strip-unit";
+@import "bourbon/library/text-inputs";
+@import "bourbon/library/timing-functions";
+@import "bourbon/library/tint";
+@import "bourbon/library/triangle";
+@import "bourbon/library/value-prefixer";
diff --git a/src/wolnelektury/static/2021/css/utils/_mixins.scss b/src/wolnelektury/static/2021/css/utils/_mixins.scss
new file mode 100644 (file)
index 0000000..137b9bd
--- /dev/null
@@ -0,0 +1,189 @@
+/* ------------------------------
+    Util: Mixins
+------------------------------ */
+
+/* Calculate px to rem */
+@function calculateRem($size) {
+  $remSize: $size / $base-font-size;
+  @return $remSize * 1rem;
+}
+
+@mixin font-size($size) {
+  font-size: $size;
+  font-size: calculateRem($size);
+}
+
+/* Photoshop letter spacing */
+@function tracking($target) {
+  @return ($target / 1000) * 1rem;
+}
+
+@mixin tracking($target) {
+  letter-spacing: tracking($target);
+}
+
+/* Float fix */
+@mixin clearfix {
+  &:after {
+    content: "";
+    display: table;
+    clear: both;
+  }
+}
+
+/* Input placeholder selector */
+@mixin placeholder {
+  $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input";
+  @each $placeholder in $placeholders {
+    &:#{$placeholder}-placeholder {
+      @content;
+    }
+  }
+}
+
+@mixin keyframes($animation-name) {
+  @keyframes #{$animation-name} {
+    @content;
+  }
+}
+
+@keyframes slide-up {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+    transform: translate(0,0);
+  }
+}
+
+@mixin cascading {
+  @for $i from 1 through 14 {
+    &:nth-child(#{$i}) {
+      animation: slide-up 250ms cubic-bezier(0.645, 0.045, 0.355, 1) forwards  #{$i * 0.1}s;
+    }
+  }
+}
+
+$scrimStops: 0% 0%, 26.2% 19%, 45.9% 34%, 61.8% 47%, 72.2% 56.5%, 80.6% 65%, 87.4% 73%, 92.5% 80.2%, 95.8% 86.1%, 97.9% 91%, 99.2% 95.2%, 99.8% 98.2%, 100% 100%;
+
+@function getColorStop($colorTo, $colorFrom, $weight, $stop) {
+  @return mix($colorFrom, $colorTo, $weight) $stop;
+}
+
+@function getColorStops($colorTo, $colorFrom) {
+  $stops: ();
+  @each $scrimStop in $scrimStops {
+    $stops: append($stops, getColorStop($colorTo, $colorFrom, nth($scrimStop, 1), nth($scrimStop, 2)), comma)
+  }
+  @return $stops;
+}
+
+@function scrim-linear-gradient($args...) {
+  @if (length($args) == 2) {
+    @return linear-gradient(#{getColorStops(nth($args, 1), nth($args, 2))});
+  }
+  @return linear-gradient(#{nth($args, 1)}, #{getColorStops(nth($args, 2), nth($args, 3))});
+}
+
+@function unicode($str) {
+  @return unquote("\"") + $str + unquote("\"");
+}
+
+/* Breakpoints */
+$phone:              450px;
+$smartphone:         767px;
+$tablet:             1024px;
+$only-desktop:       1025px;
+$screen-xs:          1280px;
+$screen-sm:          1368px;
+$screen-md:          1418px;
+$screen-xl:          1680px;
+
+
+@mixin mq($breakpoint) {
+    @media only screen and (max-width: $breakpoint) {
+      @content;
+    }
+
+}
+@mixin rwd($canvas) {
+
+  // Really Small devices
+  @if $canvas == 'phone' {
+    @media only screen and (max-width: $phone) {
+      @content;
+    }
+  }
+
+  // Smartphones
+  @else if $canvas == 'smartphone' {
+    @media only screen and (max-width: $smartphone) {
+      @content;
+    }
+  }
+  @else if $canvas == 'smartphone-portrait' {
+    @media only screen and (max-width: $smartphone) and (orientation: portrait) {
+      @content;
+    }
+  }
+  @else if $canvas == 'smartphone-landscape' {
+    @media only screen and (max-width: $smartphone) and (orientation: landscape) {
+      @content;
+    }
+  }
+
+  // Tablets
+  @else if $canvas == 'tablet' {
+    @media only screen and (max-width: $tablet) {
+      @content;
+    }
+  }
+  @else if $canvas == 'tablet-portrait' {
+    @media only screen and (max-width: $tablet) and (orientation: portrait) {
+      @content;
+    }
+  }
+  @else if $canvas == 'tablet-landscape' {
+    @media only screen and (max-width: $tablet) and (orientation: landscape) {
+      @content;
+    }
+  }
+
+  // Screens
+  @else if  $canvas == 'screen-xs' {
+    @media only screen and (max-width: $screen-xs) {
+      @content;
+    }
+  }
+  @else if $canvas == 'screen-sm' {
+    @media only screen and (max-width: $screen-sm) {
+      @content;
+    }
+  }
+  @else if $canvas == 'screen-md' {
+    @media only screen and (max-width: $screen-md) {
+      @content;
+    }
+  }
+  @else if $canvas == 'screen-xl' {
+    @media only screen and (max-width: $screen-xl) {
+      @content;
+    }
+  }
+
+  // More than tablets
+  @else if $canvas == 'only-desktop' {
+    @media only screen and (min-width: 1025px) {
+      @content;
+    }
+  }
+
+  // Print styles
+  @else if $canvas == 'print' {
+    @media print {
+      @content;
+    }
+  }
+
+}
diff --git a/src/wolnelektury/static/2021/css/utils/_module.scss b/src/wolnelektury/static/2021/css/utils/_module.scss
new file mode 100644 (file)
index 0000000..5361715
--- /dev/null
@@ -0,0 +1,9 @@
+/*! ------------------------------
+    Utils Module
+------------------------------ */
+
+/*!*/
+
+@import "vars";
+@import "mixins";
+@import "bourbon";
\ No newline at end of file
diff --git a/src/wolnelektury/static/2021/css/utils/_vars.scss b/src/wolnelektury/static/2021/css/utils/_vars.scss
new file mode 100644 (file)
index 0000000..e5f5623
--- /dev/null
@@ -0,0 +1,64 @@
+/* ------------------------------
+    Util: Vars
+------------------------------ */
+
+/* Env */
+$production: false;
+
+$images-path: "/images" !default;
+
+@if $production == true {
+  $images-path: "/images";
+} @else {
+  $images-path: "../images";
+}
+
+/* Colors */
+$color-primary:                  #018189;
+$color-secondary:              #96C13D;
+
+$color-white:         #ffffff;
+$color-black:         #000000;
+$color-darker:        #0e0f0f;
+$color-dark:          #3E3E3E;
+$color-gray:          #666666;
+$color-light-gray:    #CCCCCC;
+
+$color-light-blue:    #E5F4FF;
+$color-yellow:        #FBC40F;
+
+
+$color-action:        #3498db;
+$color-error:         #e33147;
+$color-success:       #2ecc71;
+
+/* Typography */
+$base-font-size: 16px;
+$base-font: "Roboto", sans-serif;
+$secondary-font: "Merriweather", serif;
+$font-path: "../fonts" !default;
+
+$light:    300;
+$regular:  400;
+$medium:   500;
+$semibold: 600;
+$bold:     700;
+
+/* Layers */
+$master-layer:  15;
+$top-layer:     10;
+$middle-layer:  5;
+$default-layer: 0;
+$bottom-layer: -5;
+
+/* Animations */
+$ease:         cubic-bezier(.4, 0, .2, 1);
+$ease-in:      cubic-bezier(.4, 0, 1, 1);
+$ease-out:     cubic-bezier(.0, 0, .2, 1);
+$ease-dynamic: cubic-bezier(0.25, 1, 0.5, 1);
+$duration: 250ms;
+
+/* Icons */
+$icomoon-font-family: "kancelaria" !default;
+$icomoon-font-path: "../fonts" !default;
+
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/helpers/_buttons-list.scss b/src/wolnelektury/static/2021/css/utils/bourbon/helpers/_buttons-list.scss
new file mode 100644 (file)
index 0000000..2e845f7
--- /dev/null
@@ -0,0 +1,14 @@
+@charset "UTF-8";
+
+/// A list of all HTML button elements.
+///
+/// @type list
+///
+/// @access private
+
+$_buttons-list: (
+  "button",
+  "[type='button']",
+  "[type='reset']",
+  "[type='submit']",
+);
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/helpers/_scales.scss b/src/wolnelektury/static/2021/css/utils/bourbon/helpers/_scales.scss
new file mode 100644 (file)
index 0000000..de1efa0
--- /dev/null
@@ -0,0 +1,27 @@
+@charset "UTF-8";
+
+////
+/// Pre-defined scales for use with the `modular-scale` function.
+///
+/// @type number (unitless)
+///
+/// @see {function} modular-scale
+////
+
+$minor-second:     1.067;
+$major-second:     1.125;
+$minor-third:      1.2;
+$major-third:      1.25;
+$perfect-fourth:   1.333;
+$augmented-fourth: 1.414;
+$perfect-fifth:    1.5;
+$minor-sixth:      1.6;
+$golden:           1.618;
+$major-sixth:      1.667;
+$minor-seventh:    1.778;
+$major-seventh:    1.875;
+$octave:           2;
+$major-tenth:      2.5;
+$major-eleventh:   2.667;
+$major-twelfth:    3;
+$double-octave:    4;
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/helpers/_text-inputs-list.scss b/src/wolnelektury/static/2021/css/utils/bourbon/helpers/_text-inputs-list.scss
new file mode 100644 (file)
index 0000000..479326a
--- /dev/null
@@ -0,0 +1,26 @@
+@charset "UTF-8";
+
+/// A list of all _text-based_ HTML inputs.
+///
+/// @type list
+///
+/// @access private
+
+$_text-inputs-list: (
+  "[type='color']",
+  "[type='date']",
+  "[type='datetime']",
+  "[type='datetime-local']",
+  "[type='email']",
+  "[type='month']",
+  "[type='number']",
+  "[type='password']",
+  "[type='search']",
+  "[type='tel']",
+  "[type='text']",
+  "[type='time']",
+  "[type='url']",
+  "[type='week']",
+  "input:not([type])",
+  "textarea",
+);
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-color.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-color.scss
new file mode 100644 (file)
index 0000000..de25d17
--- /dev/null
@@ -0,0 +1,26 @@
+@charset "UTF-8";
+
+/// Provides a concise, one-line method for setting `border-color` on specific
+/// edges of a box. Use a `null` value to “skip” edges of the box with standard
+/// CSS shorthand.
+///
+/// @argument {list} $values
+///   List of colors; accepts CSS shorthand.
+///
+/// @example scss
+///   .element {
+///     @include border-color(#a60b55 #76cd9c null #e8ae1a);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     border-left-color: #e8ae1a;
+///     border-right-color: #76cd9c;
+///     border-top-color: #a60b55;
+///   }
+///
+/// @require {mixin} _directional-property
+
+@mixin border-color($values) {
+  @include _directional-property(border, color, $values);
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-radius.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-radius.scss
new file mode 100644 (file)
index 0000000..3fce348
--- /dev/null
@@ -0,0 +1,85 @@
+@charset "UTF-8";
+
+/// Provides a concise, one-line method for setting `border-radius` on both the
+/// top-left and top-right of a box.
+///
+/// @argument {number (with unit)} $radii
+///
+/// @example scss
+///   .element {
+///     @include border-top-radius(4px);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     border-top-left-radius: 4px;
+///     border-top-right-radius: 4px;
+///   }
+
+@mixin border-top-radius($radii) {
+  border-top-left-radius: $radii;
+  border-top-right-radius: $radii;
+}
+
+/// Provides a concise, one-line method for setting `border-radius` on both the
+/// top-right and bottom-right of a box.
+///
+/// @argument {number (with unit)} $radii
+///
+/// @example scss
+///   .element {
+///     @include border-right-radius(3px);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     border-bottom-right-radius: 3px;
+///     border-top-right-radius: 3px;
+///   }
+
+@mixin border-right-radius($radii) {
+  border-bottom-right-radius: $radii;
+  border-top-right-radius: $radii;
+}
+
+/// Provides a concise, one-line method for setting `border-radius` on both the
+/// bottom-left and bottom-right of a box.
+///
+/// @argument {number (with unit)} $radii
+///
+/// @example scss
+///   .element {
+///     @include border-bottom-radius(2px);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     border-bottom-left-radius: 2px;
+///     border-bottom-right-radius: 2px;
+///   }
+
+@mixin border-bottom-radius($radii) {
+  border-bottom-left-radius: $radii;
+  border-bottom-right-radius: $radii;
+}
+
+/// Provides a concise, one-line method for setting `border-radius` on both the
+/// top-left and bottom-left of a box.
+///
+/// @argument {number (with unit)} $radii
+///
+/// @example scss
+///   .element {
+///     @include border-left-radius(1px);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     border-bottom-left-radius: 1px;
+///     border-top-left-radius: 1px;
+///   }
+
+@mixin border-left-radius($radii) {
+  border-bottom-left-radius: $radii;
+  border-top-left-radius: $radii;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-style.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-style.scss
new file mode 100644 (file)
index 0000000..222f274
--- /dev/null
@@ -0,0 +1,25 @@
+@charset "UTF-8";
+
+/// Provides a concise, one-line method for setting `border-style` on specific
+/// edges of a box. Use a `null` value to “skip” edges of the box with standard
+/// CSS shorthand.
+///
+/// @argument {list} $values
+///   List of border styles; accepts CSS shorthand.
+///
+/// @example scss
+///   .element {
+///     @include border-style(dashed null solid);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     border-bottom-style: solid;
+///     border-top-style: dashed;
+///   }
+///
+/// @require {mixin} _directional-property
+
+@mixin border-style($values) {
+  @include _directional-property(border, style, $values);
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-width.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-width.scss
new file mode 100644 (file)
index 0000000..a64e4b8
--- /dev/null
@@ -0,0 +1,25 @@
+@charset "UTF-8";
+
+/// Provides a concise, one-line method for setting `border-width` on specific
+/// edges of a box. Use a `null` value to “skip” edges of the box with standard
+/// CSS shorthand.
+///
+/// @argument {list} $values
+///   List of border widths; accepts CSS shorthand.
+///
+/// @example scss
+///   .element {
+///     @include border-width(1em null 20px);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     border-bottom-width: 20px;
+///     border-top-width: 1em;
+///   }
+///
+/// @require {mixin} _directional-property
+
+@mixin border-width($values) {
+  @include _directional-property(border, width, $values);
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_buttons.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_buttons.scss
new file mode 100644 (file)
index 0000000..a03485d
--- /dev/null
@@ -0,0 +1,84 @@
+@charset "UTF-8";
+
+////
+/// @type list
+///
+/// @require {function} _assign-inputs
+///
+/// @require {variable} $_buttons-list
+////
+
+/// A list of all HTML button elements. Please note that you must interpolate
+/// the variable (`#{}`) to use it as a selector.
+///
+/// @example scss
+///   #{$all-buttons} {
+///     background-color: #f00;
+///   }
+///
+///   // CSS Output
+///   button,
+///   [type='button'],
+///   [type='reset'],
+///   [type='submit'] {
+///     background-color: #f00;
+///   }
+
+$all-buttons: _assign-inputs($_buttons-list);
+
+/// A list of all HTML button elements with the `:active` pseudo-class applied.
+/// Please note that you must interpolate the variable (`#{}`) to use it as a
+/// selector.
+///
+/// @example scss
+///   #{$all-buttons-active} {
+///     background-color: #00f;
+///   }
+///
+///   // CSS Output
+///   button:active,
+///   [type='button']:active,
+///   [type='reset']:active,
+///   [type='submit']:active {
+///     background-color: #00f;
+///   }
+
+$all-buttons-active: _assign-inputs($_buttons-list, active);
+
+/// A list of all HTML button elements with the `:focus` pseudo-class applied.
+/// Please note that you must interpolate the variable (`#{}`) to use it as a
+/// selector.
+///
+/// @example scss
+///   #{$all-buttons-focus} {
+///     background-color: #0f0;
+///   }
+///
+///   // CSS Output
+///   button:focus,
+///   [type='button']:focus,
+///   [type='reset']:focus,
+///   [type='submit']:focus {
+///     background-color: #0f0;
+///   }
+
+$all-buttons-focus: _assign-inputs($_buttons-list, focus);
+
+/// A list of all HTML button elements with the `:hover` pseudo-class applied.
+/// Please note that you must interpolate the variable (`#{}`) to use it as a
+/// selector.
+///
+/// @example scss
+///   #{$all-buttons-hover} {
+///     background-color: #0f0;
+///   }
+///
+///   // CSS Output
+///   button:hover,
+///   [type='button']:hover,
+///   [type='reset']:hover,
+///   [type='submit']:hover {
+///     background-color: #0f0;
+///   }
+
+$all-buttons-hover: _assign-inputs($_buttons-list, hover);
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_clearfix.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_clearfix.scss
new file mode 100644 (file)
index 0000000..d8ccc42
--- /dev/null
@@ -0,0 +1,25 @@
+@charset "UTF-8";
+
+/// Provides an easy way to include a clearfix for containing floats.
+///
+/// @link https://goo.gl/yP5hiZ
+///
+/// @example scss
+///   .element {
+///     @include clearfix;
+///   }
+///
+///   // CSS Output
+///   .element::after {
+///     clear: both;
+///     content: "";
+///     display: block;
+///   }
+
+@mixin clearfix {
+  &::after {
+    clear: both;
+    content: "";
+    display: block;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_contrast-switch.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_contrast-switch.scss
new file mode 100644 (file)
index 0000000..6f3c8e4
--- /dev/null
@@ -0,0 +1,81 @@
+@charset "UTF-8";
+
+/// Switches between two colors based on the contrast to another color. It’s
+/// like a [ternary operator] for color contrast and can be useful for building
+/// a button system.
+///
+/// The calculation of the contrast ratio is based on the [WCAG 2.0
+/// specification]. However, we cannot guarantee full compliance, though all of
+/// our manual testing passed.
+///
+///   [ternary operator]: https://goo.gl/ccfLqi
+///   [WCAG 2.0 specification]: https://goo.gl/zhQuYA
+///
+/// @argument {color} $base-color
+///   The color to evaluate lightness against.
+///
+/// @argument {color} $dark-color [#000]
+///   The color to be output when `$base-color` is light. Can also be set
+///   globally using the `contrast-switch-dark-color` key in the
+///   Bourbon settings.
+///
+/// @argument {color} $light-color [#fff]
+///   The color to be output when `$base-color` is dark. Can also be set
+///   globally using the `contrast-switch-light-color` key in the
+///   Bourbon settings.
+///
+/// @return {color}
+///
+/// @example scss
+///   .element {
+///     color: contrast-switch(#bae6e6);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     color: #000;
+///   }
+///
+/// @example scss
+///   .element {
+///     $button-color: #2d72d9;
+///     background-color: $button-color;
+///     color: contrast-switch($button-color, #222, #eee);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     background-color: #2d72d9;
+///     color: #eee;
+///   }
+///
+/// @require {function} _fetch-bourbon-setting
+///
+/// @require {function} _is-color
+///
+/// @require {function} _contrast-ratio
+///
+/// @since 5.0.0
+
+@function contrast-switch(
+  $base-color,
+  $dark-color: _fetch-bourbon-setting("contrast-switch-dark-color"),
+  $light-color: _fetch-bourbon-setting("contrast-switch-light-color")
+) {
+  @if not _is-color($base-color) {
+    @error "`#{$base-color}` is not a valid color for the `$base-color` " +
+           "argument in the `contrast-switch` function.";
+  } @else if not _is-color($dark-color) {
+    @error "`#{$dark-color}` is not a valid color for the `$dark-color` " +
+           "argument in the `contrast-switch` function.";
+  } @else if not _is-color($light-color) {
+    @error "`#{$light-color}` is not a valid color for the `$light-color` " +
+           "argument in the `contrast-switch` function.";
+  } @else {
+    $-contrast-to-dark: _contrast-ratio($base-color, $dark-color);
+    $-contrast-to-light: _contrast-ratio($base-color, $light-color);
+    $-prefer-dark: $-contrast-to-dark >= $-contrast-to-light;
+
+    @return if($-prefer-dark, $dark-color, $light-color);
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_ellipsis.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_ellipsis.scss
new file mode 100644 (file)
index 0000000..6d3e5c6
--- /dev/null
@@ -0,0 +1,36 @@
+@charset "UTF-8";
+
+/// Truncates text and adds an ellipsis to represent overflow.
+///
+/// @argument {number} $width [100%]
+///   The `max-width` for the string to respect before being truncated.
+///
+/// @argument {string} $display [inline-block]
+///   Sets the display-value of the element.
+///
+/// @example scss
+///   .element {
+///     @include ellipsis;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     display: inline-block;
+///     max-width: 100%;
+///     overflow: hidden;
+///     text-overflow: ellipsis;
+///     white-space: nowrap;
+///     word-wrap: normal;
+///   }
+
+@mixin ellipsis(
+  $width: 100%,
+  $display: inline-block
+) {
+  display: $display;
+  max-width: $width;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  word-wrap: normal;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_font-face.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_font-face.scss
new file mode 100644 (file)
index 0000000..34143bc
--- /dev/null
@@ -0,0 +1,65 @@
+@charset "UTF-8";
+
+/// Generates an `@font-face` declaration. You can choose the specific file
+/// formats you need to output; the mixin supports `eot`, `ttf`, `svg`, `woff2`
+/// and `woff`. The mixin also supports usage with the Rails Asset Pipeline,
+/// which you can enable per use, or globally in the `$bourbon()` settings.
+///
+/// @argument {string} $font-family
+///
+/// @argument {string} $file-path
+///
+/// @argument {string} $asset-pipeline [false]
+///   Set to `true` if you’re using the Rails Asset Pipeline (place the fonts
+///   in `app/assets/fonts/`). Can also be set globally using the
+///   `rails-asset-pipeline` key in the Bourbon settings.
+///
+/// @argument {string | list} $file-formats [("ttf", "woff2", "woff")]
+///   List of the font file formats to include. Can also be set globally using
+///   the `global-font-file-formats` key in the Bourbon settings.
+///
+/// @content
+///   Any additional CSS properties that are included in the `@include`
+///   directive will be output within the `@font-face` declaration, e.g. you can
+///   pass in `font-weight`, `font-style` and/or `unicode-range`.
+///
+/// @example scss
+///   @include font-face(
+///     "source-sans-pro",
+///     "fonts/source-sans-pro-regular",
+///     ("woff2", "woff")
+///   ) {
+///     font-style: normal;
+///     font-weight: 400;
+///   }
+///
+///   // CSS Output
+///   @font-face {
+///     font-family: "source-sans-pro";
+///     src: url("fonts/source-sans-pro-regular.woff2") format("woff2"),
+///          url("fonts/source-sans-pro-regular.woff") format("woff");
+///     font-style: normal;
+///     font-weight: 400;
+///   }
+///
+/// @require {function} _font-source-declaration
+///
+/// @require {function} _fetch-bourbon-setting
+
+@mixin font-face(
+  $font-family,
+  $file-path,
+  $file-formats: _fetch-bourbon-setting("global-font-file-formats"),
+  $asset-pipeline: _fetch-bourbon-setting("rails-asset-pipeline")
+) {
+  @font-face {
+    font-family: $font-family;
+    src: _font-source-declaration(
+      $font-family,
+      $file-path,
+      $asset-pipeline,
+      $file-formats
+    );
+    @content;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_font-stacks.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_font-stacks.scss
new file mode 100644 (file)
index 0000000..abd607d
--- /dev/null
@@ -0,0 +1,249 @@
+@charset "UTF-8";
+
+/// A variable that outputs a Helvetica font stack.
+///
+/// @link https://goo.gl/uSJvZe
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-helvetica;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+///   }
+
+$font-stack-helvetica: (
+  "Helvetica Neue",
+  "Helvetica",
+  "Arial",
+  sans-serif,
+);
+
+/// A variable that outputs a Lucida Grande font stack.
+///
+/// @link https://goo.gl/R5UyYE
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-lucida-grande;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: "Lucida Grande", "Lucida Sans Unicode", "Geneva", "Verdana", sans-serif;
+///   }
+
+$font-stack-lucida-grande: (
+  "Lucida Grande",
+  "Lucida Sans Unicode",
+  "Geneva",
+  "Verdana",
+  sans-serif,
+);
+
+/// A variable that outputs a Verdana font stack.
+///
+/// @link https://goo.gl/yGXWSS
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-verdana;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: "Verdana", "Geneva", sans-serif;
+///   }
+
+$font-stack-verdana: (
+  "Verdana",
+  "Geneva",
+  sans-serif,
+);
+
+/// A variable that outputs a system font stack.
+///
+/// @link https://goo.gl/LHRZIf
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-system;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: -apple-system, BlinkMacSystemFont, "Avenir Next", "Avenir", "Segoe UI", "Lucida Grande", "Helvetica Neue", "Helvetica", "Fira Sans", "Roboto", "Noto", "Droid Sans", "Cantarell", "Oxygen", "Ubuntu", "Franklin Gothic Medium", "Century Gothic", "Liberation Sans", sans-serif;
+///   }
+
+$font-stack-system: (
+  -apple-system,
+  BlinkMacSystemFont,
+  "Avenir Next",
+  "Avenir",
+  "Segoe UI",
+  "Lucida Grande",
+  "Helvetica Neue",
+  "Helvetica",
+  "Fira Sans",
+  "Roboto",
+  "Noto",
+  "Droid Sans",
+  "Cantarell",
+  "Oxygen",
+  "Ubuntu",
+  "Franklin Gothic Medium",
+  "Century Gothic",
+  "Liberation Sans",
+  sans-serif,
+);
+
+/// A variable that outputs a Garamond font stack.
+///
+/// @link https://goo.gl/QQFEkV
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-garamond;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: "Garamond", "Baskerville", "Baskerville Old Face", "Hoefler Text", "Times New Roman", serif;
+///   }
+
+$font-stack-garamond: (
+  "Garamond",
+  "Baskerville",
+  "Baskerville Old Face",
+  "Hoefler Text",
+  "Times New Roman",
+  serif,
+);
+
+/// A variable that outputs a Georgia font stack.
+///
+/// @link https://goo.gl/wtzVPy
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-georgia;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: "Georgia", "Times", "Times New Roman", serif;
+///   }
+
+$font-stack-georgia: (
+  "Georgia",
+  "Times",
+  "Times New Roman",
+  serif,
+);
+
+/// A variable that outputs a Hoefler Text font stack.
+///
+/// @link https://goo.gl/n7U7zx
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-hoefler-text;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: "Hoefler Text", "Baskerville Old Face", "Garamond", "Times New Roman", serif;
+///   }
+
+$font-stack-hoefler-text: (
+  "Hoefler Text",
+  "Baskerville Old Face",
+  "Garamond",
+  "Times New Roman",
+  serif,
+);
+
+/// A variable that outputs a Consolas font stack.
+///
+/// @link https://goo.gl/iKrtqv
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-consolas;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: "Consolas", "monaco", monospace;
+///   }
+
+$font-stack-consolas: (
+  "Consolas",
+  "monaco",
+  monospace,
+);
+
+/// A variable that outputs a Courier New font stack.
+///
+/// @link https://goo.gl/bHfWMP
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-courier-new;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: "Courier New", "Courier", "Lucida Sans Typewriter", "Lucida Typewriter", monospace;
+///   }
+
+$font-stack-courier-new: (
+  "Courier New",
+  "Courier",
+  "Lucida Sans Typewriter",
+  "Lucida Typewriter",
+  monospace,
+);
+
+/// A variable that outputs a Monaco font stack.
+///
+/// @link https://goo.gl/9PgKDO
+///
+/// @type list
+///
+/// @example scss
+///   .element {
+///     font-family: $font-stack-monaco;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-family: "Monaco", "Consolas", "Lucida Console", monospace;
+///   }
+
+$font-stack-monaco: (
+  "Monaco",
+  "Consolas",
+  "Lucida Console",
+  monospace,
+);
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-text.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-text.scss
new file mode 100644 (file)
index 0000000..e9ee0f9
--- /dev/null
@@ -0,0 +1,24 @@
+@charset "UTF-8";
+
+/// Hides the text in an element, commonly used to show an image instead. Some
+/// elements will need block-level styles applied.
+///
+/// @link https://goo.gl/EvLRIu
+///
+/// @example scss
+///   .element {
+///     @include hide-text;
+///   }
+///
+///   // CSS Output
+///   .element {
+///     overflow: hidden;
+///     text-indent: 101%;
+///     white-space: nowrap;
+///   }
+
+@mixin hide-text {
+  overflow: hidden;
+  text-indent: 101%;
+  white-space: nowrap;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-visually.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-visually.scss
new file mode 100644 (file)
index 0000000..e803dff
--- /dev/null
@@ -0,0 +1,70 @@
+@charset "UTF-8";
+
+/// Hides an element visually while still allowing the content to be accessible
+/// to assistive technology, e.g. screen readers. Passing `unhide` will reverse
+/// the affects of the hiding, which is handy for showing the element on focus,
+/// for example.
+///
+/// @link https://goo.gl/Vf1TGn
+///
+/// @argument {string} $toggle [hide]
+///   Accepts `hide` or `unhide`. `unhide` reverses the affects of `hide`.
+///
+/// @example scss
+///   .element {
+///     @include hide-visually;
+///
+///     &:active,
+///     &:focus {
+///       @include hide-visually("unhide");
+///     }
+///   }
+///
+///   // CSS Output
+///   .element {
+///     border: 0;
+///     clip: rect(1px, 1px, 1px, 1px);
+///     clip-path: inset(100%);
+///     height: 1px;
+///     overflow: hidden;
+///     padding: 0;
+///     position: absolute;
+///     width: 1px;
+///   }
+///
+///   .hide-visually:active,
+///   .hide-visually:focus {
+///     clip: auto;
+///     clip-path: none;
+///     height: auto;
+///     overflow: visible;
+///     position: static;
+///     width: auto;
+///   }
+///
+/// @since 5.0.0
+
+@mixin hide-visually($toggle: "hide") {
+  @if not index("hide" "unhide", $toggle) {
+    @error "`#{$toggle}` is not a valid value for the `$toggle` argument in " +
+           "the `hide-visually` mixin. Must be either `hide` or `unhide`.";
+  } @else if $toggle == "hide" {
+    border: 0;
+    clip: rect(1px, 1px, 1px, 1px);
+    clip-path: inset(100%);
+    height: 1px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    white-space: nowrap;
+    width: 1px;
+  } @else if $toggle == "unhide" {
+    clip: auto;
+    clip-path: none;
+    height: auto;
+    overflow: visible;
+    position: static;
+    white-space: inherit;
+    width: auto;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_margin.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_margin.scss
new file mode 100644 (file)
index 0000000..29fa7ab
--- /dev/null
@@ -0,0 +1,37 @@
+@charset "UTF-8";
+
+/// Provides a concise, one-line method for setting `margin` on specific edges
+/// of a box. Use a `null` value to “skip” edges of the box with standard
+/// CSS shorthand.
+///
+/// @argument {list} $values
+///   List of margin values; accepts CSS shorthand.
+///
+/// @example scss
+///   .element {
+///     @include margin(null auto);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     margin-left: auto;
+///     margin-right: auto;
+///   }
+///
+/// @example scss
+///   .element {
+///     @include margin(10px 3em 20vh null);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     margin-bottom: 20vh;
+///     margin-right: 3em;
+///     margin-top: 10px;
+///   }
+///
+/// @require {mixin} _directional-property
+
+@mixin margin($values) {
+  @include _directional-property(margin, null, $values);
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_modular-scale.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_modular-scale.scss
new file mode 100644 (file)
index 0000000..7a011f1
--- /dev/null
@@ -0,0 +1,120 @@
+@charset "UTF-8";
+
+/// Increments up or down a defined scale and returns an adjusted value. This
+/// helps establish consistent measurements and spacial relationships throughout
+/// your project. We provide a list of commonly used scales as
+/// [pre-defined variables][scales].
+///
+/// [scales]: https://github.com/thoughtbot/bourbon/blob/master/core/bourbon/settings/_scales.scss
+///
+/// @argument {number (unitless)} $increment
+///   How many steps to increment up or down the scale.
+///
+/// @argument {number (with unit) | list} $value [1em]
+///   The base value the scale starts at. Can also be set globally using the
+///   `modular-scale-base` key in the Bourbon settings.
+///
+/// @argument {number (unitless)} $ratio [1.25]
+///   The ratio the scale is built on. Can also be set globally using the
+///   `modular-scale-ratio` key in the Bourbon settings.
+///
+/// @return {number (with unit)}
+///
+/// @example scss
+///   .element {
+///     font-size: modular-scale(2);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-size: 1.5625em;
+///   }
+///
+/// @example scss
+///   .element {
+///     margin-right: modular-scale(3, 2em);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     margin-right: 3.90625em;
+///   }
+///
+/// @example scss
+///   .element {
+///     font-size: modular-scale(3, 1em 1.6em, $major-seventh);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-size: 3em;
+///   }
+///
+/// @example scss
+///   // Globally change the base ratio
+///   $bourbon: (
+///     "modular-scale-ratio": 1.2,
+///   );
+///
+///   .element {
+///     font-size: modular-scale(3);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     font-size: 1.728em;
+///   }
+///
+/// @require {function} _fetch-bourbon-setting
+
+@function modular-scale(
+  $increment,
+  $value: _fetch-bourbon-setting("modular-scale-base"),
+  $ratio: _fetch-bourbon-setting("modular-scale-ratio")
+) {
+  $v1: nth($value, 1);
+  $v2: nth($value, length($value));
+  $value: $v1;
+
+  // scale $v2 to just above $v1
+  @while $v2 > $v1 {
+    $v2: ($v2 / $ratio); // will be off-by-1
+  }
+  @while $v2 < $v1 {
+    $v2: ($v2 * $ratio); // will fix off-by-1
+  }
+
+  // check AFTER scaling $v2 to prevent double-counting corner-case
+  $double-stranded: $v2 > $v1;
+
+  @if $increment > 0 {
+    @for $i from 1 through $increment {
+      @if $double-stranded and ($v1 * $ratio) > $v2 {
+        $value: $v2;
+        $v2: ($v2 * $ratio);
+      } @else {
+        $v1: ($v1 * $ratio);
+        $value: $v1;
+      }
+    }
+  }
+
+  @if $increment < 0 {
+    // adjust $v2 to just below $v1
+    @if $double-stranded {
+      $v2: ($v2 / $ratio);
+    }
+
+    @for $i from $increment through -1 {
+      @if $double-stranded and ($v1 / $ratio) < $v2 {
+        $value: $v2;
+        $v2: ($v2 / $ratio);
+      } @else {
+        $v1: ($v1 / $ratio);
+        $value: $v1;
+      }
+    }
+  }
+
+  @return $value;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_overflow-wrap.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_overflow-wrap.scss
new file mode 100644 (file)
index 0000000..16e0a64
--- /dev/null
@@ -0,0 +1,24 @@
+@charset "UTF-8";
+
+/// Outputs the `overflow-wrap` property and its legacy name `word-wrap` to
+/// support browsers that do not yet use `overflow-wrap`.
+///
+/// @argument {string} $wrap [break-word]
+///   Accepted CSS values are `normal`, `break-word`, `inherit`, `initial`,
+///   or `unset`.
+///
+/// @example scss
+///   .wrapper {
+///     @include overflow-wrap;
+///   }
+///
+///   // CSS Output
+///   .wrapper {
+///     word-wrap: break-word;
+///     overflow-wrap: break-word;
+///   }
+
+@mixin overflow-wrap($wrap: break-word) {
+  word-wrap: $wrap;
+  overflow-wrap: $wrap;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_padding.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_padding.scss
new file mode 100644 (file)
index 0000000..7d401bb
--- /dev/null
@@ -0,0 +1,36 @@
+@charset "UTF-8";
+
+/// Provides a concise method for targeting `padding` on specific sides of a
+/// box. Use a `null` value to “skip” a side.
+///
+/// @argument {list} $values
+///   List of padding values; accepts CSS shorthand.
+///
+/// @example scss
+///   .element-one {
+///     @include padding(null 1rem);
+///   }
+///
+///   // CSS Output
+///   .element-one {
+///     padding-left: 1rem;
+///     padding-right: 1rem;
+///   }
+///
+/// @example scss
+///   .element-two {
+///     @include padding(10vh null 10px 5%);
+///   }
+///
+///   // CSS Output
+///   .element-two {
+///     padding-bottom: 10px;
+///     padding-left: 5%;
+///     padding-top: 10vh;
+///   }
+///
+/// @require {mixin} _directional-property
+
+@mixin padding($values) {
+  @include _directional-property(padding, null, $values);
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_position.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_position.scss
new file mode 100644 (file)
index 0000000..d65d2bb
--- /dev/null
@@ -0,0 +1,62 @@
+@charset "UTF-8";
+
+/// Provides a concise, one-line method for setting an element’s positioning
+/// properties: `position`, `top`, `right`, `bottom` and `left`. Use a `null`
+/// value to “skip” an edge of the box.
+///
+/// @argument {string} $position
+///   A CSS position value.
+///
+/// @argument {list} $box-edge-values
+///   List of lengths; accepts CSS shorthand.
+///
+/// @example scss
+///   .element {
+///     @include position(relative, 0 null null 10em);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     left: 10em;
+///     position: relative;
+///     top: 0;
+///   }
+///
+/// @example scss
+///   .element {
+///     @include position(absolute, 0);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     position: absolute;
+///     top: 0;
+///     right: 0;
+///     bottom: 0;
+///     left: 0;
+///   }
+///
+/// @require {function} _is-length
+///
+/// @require {function} _unpack-shorthand
+
+@mixin position(
+  $position,
+  $box-edge-values
+) {
+  $box-edge-values: _unpack-shorthand($box-edge-values);
+  $offsets: (
+    top:    nth($box-edge-values, 1),
+    right:  nth($box-edge-values, 2),
+    bottom: nth($box-edge-values, 3),
+    left:   nth($box-edge-values, 4),
+  );
+
+  position: $position;
+
+  @each $offset, $value in $offsets {
+    @if _is-length($value) {
+      #{$offset}: $value;
+    }
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_prefixer.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_prefixer.scss
new file mode 100644 (file)
index 0000000..ad28e5a
--- /dev/null
@@ -0,0 +1,37 @@
+@charset "UTF-8";
+
+/// Generates vendor prefixes.
+///
+/// @argument {string} $property
+///   Property to prefix.
+///
+/// @argument {string} $value
+///   Value to use.
+///
+/// @argument {list} $prefixes
+///   Vendor prefixes to output.
+///
+/// @example scss
+///   .element {
+///     @include prefixer(appearance, none, ("webkit", "moz"));
+///   }
+///
+///   // CSS Output
+///   .element {
+///     -webkit-appearance: none;
+///     -moz-appearance: none;
+///     appearance: none;
+///   }
+///
+/// @author Hugo Giraudel
+
+@mixin prefixer(
+  $property,
+  $value,
+  $prefixes: ()
+) {
+  @each $prefix in $prefixes {
+    #{"-" + $prefix + "-" + $property}: $value;
+  }
+  #{$property}: $value;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_shade.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_shade.scss
new file mode 100644 (file)
index 0000000..44b545b
--- /dev/null
@@ -0,0 +1,32 @@
+@charset "UTF-8";
+
+/// Mixes a color with black.
+///
+/// @argument {color} $color
+///
+/// @argument {number (percentage)} $percent
+///   The amount of black to be mixed in.
+///
+/// @return {color}
+///
+/// @example scss
+///   .element {
+///     background-color: shade(#ffbb52, 60%);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     background-color: #664a20;
+///   }
+
+@function shade(
+  $color,
+  $percent
+) {
+  @if not _is-color($color) {
+    @error "`#{$color}` is not a valid color for the `$color` argument in " +
+           "the `shade` mixin.";
+  } @else {
+    @return mix(#000, $color, $percent);
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_size.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_size.scss
new file mode 100644 (file)
index 0000000..cc52b23
--- /dev/null
@@ -0,0 +1,50 @@
+@charset "UTF-8";
+
+/// Sets the `width` and `height` of the element in one statement.
+///
+/// @argument {number (with unit) | string} $width
+///
+/// @argument {number (with unit) | string} $height [$width]
+///
+/// @example scss
+///   .first-element {
+///     @include size(2em);
+///   }
+///
+///   // CSS Output
+///   .first-element {
+///     width: 2em;
+///     height: 2em;
+///   }
+///
+/// @example scss
+///   .second-element {
+///     @include size(auto, 10em);
+///   }
+///
+///   // CSS Output
+///   .second-element {
+///     width: auto;
+///     height: 10em;
+///   }
+///
+/// @require {function} _is-size
+
+@mixin size(
+  $width,
+  $height: $width
+) {
+  @if _is-size($height) {
+    height: $height;
+  } @else {
+    @error "`#{$height}` is not a valid length for the `$height` argument " +
+           "in the `size` mixin.";
+  }
+
+  @if _is-size($width) {
+    width: $width;
+  } @else {
+    @error "`#{$width}` is not a valid length for the `$width` argument " +
+           "in the `size` mixin.";
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_strip-unit.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_strip-unit.scss
new file mode 100644 (file)
index 0000000..f4f660a
--- /dev/null
@@ -0,0 +1,17 @@
+@charset "UTF-8";
+
+/// Strips the unit from a number.
+///
+/// @argument {number} $value
+///
+/// @return {number (unitless)}
+///
+/// @example scss
+///   $dimension: strip-unit(10em);
+///
+///   // Output
+///   $dimension: 10;
+
+@function strip-unit($value) {
+  @return ($value / ($value * 0 + 1));
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_text-inputs.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_text-inputs.scss
new file mode 100644 (file)
index 0000000..dfebb79
--- /dev/null
@@ -0,0 +1,163 @@
+@charset "UTF-8";
+
+////
+/// @type list
+///
+/// @require {function} _assign-inputs
+///
+/// @require {variable} $_text-inputs-list
+////
+
+/// A list of all _text-based_ HTML inputs. Please note that you must
+/// interpolate the variable (`#{}`) to use it as a selector.
+///
+/// @example scss
+///   #{$all-text-inputs} {
+///     border: 1px solid #ccc;
+///   }
+///
+///   // CSS Output
+///   [type='color'],
+///   [type='date'],
+///   [type='datetime'],
+///   [type='datetime-local'],
+///   [type='email'],
+///   [type='month'],
+///   [type='number'],
+///   [type='password'],
+///   [type='search'],
+///   [type='tel'],
+///   [type='text'],
+///   [type='time'],
+///   [type='url'],
+///   [type='week'],
+///   input:not([type]),
+///   textarea {
+///     border: 1px solid #ccc;
+///   }
+
+$all-text-inputs: _assign-inputs($_text-inputs-list);
+
+/// A list of all _text-based_ HTML inputs with the `:active` pseudo-class
+/// applied. Please note that you must interpolate the variable (`#{}`) to use
+/// it as a selector.
+///
+/// @example scss
+///   #{$all-text-inputs-active} {
+///     border: 1px solid #aaa;
+///   }
+///
+///   // CSS Output
+///   [type='color']:active,
+///   [type='date']:active,
+///   [type='datetime']:active,
+///   [type='datetime-local']:active,
+///   [type='email']:active,
+///   [type='month']:active,
+///   [type='number']:active,
+///   [type='password']:active,
+///   [type='search']:active,
+///   [type='tel']:active,
+///   [type='text']:active,
+///   [type='time']:active,
+///   [type='url']:active,
+///   [type='week']:active,
+///   input:not([type]):active,
+///   textarea:active {
+///     border: 1px solid #aaa;
+///   }
+
+$all-text-inputs-active: _assign-inputs($_text-inputs-list, active);
+
+/// A list of all _text-based_ HTML inputs with the `:focus` pseudo-class
+/// applied. Please note that you must interpolate the variable (`#{}`) to use
+/// it as a selector.
+///
+/// @example scss
+///   #{$all-text-inputs-focus} {
+///     border: 1px solid #1565c0;
+///   }
+///
+///   // CSS Output
+///   [type='color']:focus,
+///   [type='date']:focus,
+///   [type='datetime']:focus,
+///   [type='datetime-local']:focus,
+///   [type='email']:focus,
+///   [type='month']:focus,
+///   [type='number']:focus,
+///   [type='password']:focus,
+///   [type='search']:focus,
+///   [type='tel']:focus,
+///   [type='text']:focus,
+///   [type='time']:focus,
+///   [type='url']:focus,
+///   [type='week']:focus,
+///   input:not([type]):focus,
+///   textarea:focus {
+///     border: 1px solid #1565c0;
+///   }
+
+$all-text-inputs-focus: _assign-inputs($_text-inputs-list, focus);
+
+/// A list of all _text-based_ HTML inputs with the `:hover` pseudo-class
+/// applied. Please note that you must interpolate the variable (`#{}`) to use
+/// it as a selector.
+///
+/// @example scss
+///   #{$all-text-inputs-hover} {
+///     border: 1px solid #aaa;
+///   }
+///
+///   // CSS Output
+///   [type='color']:hover,
+///   [type='date']:hover,
+///   [type='datetime']:hover,
+///   [type='datetime-local']:hover,
+///   [type='email']:hover,
+///   [type='month']:hover,
+///   [type='number']:hover,
+///   [type='password']:hover,
+///   [type='search']:hover,
+///   [type='tel']:hover,
+///   [type='text']:hover,
+///   [type='time']:hover,
+///   [type='url']:hover,
+///   [type='week']:hover,
+///   input:not([type]):hover,
+///   textarea:hover {
+///     border: 1px solid #aaa;
+///   }
+
+$all-text-inputs-hover: _assign-inputs($_text-inputs-list, hover);
+
+/// A list of all _text-based_ HTML inputs with the `:invalid` pseudo-class
+/// applied. Please note that you must interpolate the variable (`#{}`) to use
+/// it as a selector.
+///
+/// @example scss
+///   #{$all-text-inputs-invalid} {
+///     border: 1px solid #00f;
+///   }
+///
+///   // CSS Output
+///   [type='color']:invalid,
+///   [type='date']:invalid,
+///   [type='datetime']:invalid,
+///   [type='datetime-local']:invalid,
+///   [type='email']:invalid,
+///   [type='month']:invalid,
+///   [type='number']:invalid,
+///   [type='password']:invalid,
+///   [type='search']:invalid,
+///   [type='tel']:invalid,
+///   [type='text']:invalid,
+///   [type='time']:invalid,
+///   [type='url']:invalid,
+///   [type='week']:invalid,
+///   input:not([type]):invalid,
+///   textarea:invalid {
+///     border: 1px solid #00f;
+///   }
+
+$all-text-inputs-invalid: _assign-inputs($_text-inputs-list, invalid);
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_timing-functions.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_timing-functions.scss
new file mode 100644 (file)
index 0000000..a694b64
--- /dev/null
@@ -0,0 +1,38 @@
+@charset "UTF-8";
+
+// scss-lint:disable SpaceAfterComma, UnnecessaryMantissa, TrailingZero
+
+////
+/// CSS cubic-bezier timing functions.
+///
+/// @link https://goo.gl/p8u6SK
+///
+/// @type string
+////
+
+$ease-in-quad:      cubic-bezier(0.550,  0.085, 0.680, 0.530);
+$ease-in-cubic:     cubic-bezier(0.550,  0.055, 0.675, 0.190);
+$ease-in-quart:     cubic-bezier(0.895,  0.030, 0.685, 0.220);
+$ease-in-quint:     cubic-bezier(0.755,  0.050, 0.855, 0.060);
+$ease-in-sine:      cubic-bezier(0.470,  0.000, 0.745, 0.715);
+$ease-in-expo:      cubic-bezier(0.950,  0.050, 0.795, 0.035);
+$ease-in-circ:      cubic-bezier(0.600,  0.040, 0.980, 0.335);
+$ease-in-back:      cubic-bezier(0.600, -0.280, 0.735, 0.045);
+
+$ease-out-quad:     cubic-bezier(0.250,  0.460, 0.450, 0.940);
+$ease-out-cubic:    cubic-bezier(0.215,  0.610, 0.355, 1.000);
+$ease-out-quart:    cubic-bezier(0.165,  0.840, 0.440, 1.000);
+$ease-out-quint:    cubic-bezier(0.230,  1.000, 0.320, 1.000);
+$ease-out-sine:     cubic-bezier(0.390,  0.575, 0.565, 1.000);
+$ease-out-expo:     cubic-bezier(0.190,  1.000, 0.220, 1.000);
+$ease-out-circ:     cubic-bezier(0.075,  0.820, 0.165, 1.000);
+$ease-out-back:     cubic-bezier(0.175,  0.885, 0.320, 1.275);
+
+$ease-in-out-quad:  cubic-bezier(0.455,  0.030, 0.515, 0.955);
+$ease-in-out-cubic: cubic-bezier(0.645,  0.045, 0.355, 1.000);
+$ease-in-out-quart: cubic-bezier(0.770,  0.000, 0.175, 1.000);
+$ease-in-out-quint: cubic-bezier(0.860,  0.000, 0.070, 1.000);
+$ease-in-out-sine:  cubic-bezier(0.445,  0.050, 0.550, 0.950);
+$ease-in-out-expo:  cubic-bezier(1.000,  0.000, 0.000, 1.000);
+$ease-in-out-circ:  cubic-bezier(0.785,  0.135, 0.150, 0.860);
+$ease-in-out-back:  cubic-bezier(0.680, -0.550, 0.265, 1.550);
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_tint.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_tint.scss
new file mode 100644 (file)
index 0000000..1c536ed
--- /dev/null
@@ -0,0 +1,32 @@
+@charset "UTF-8";
+
+/// Mixes a color with white.
+///
+/// @argument {color} $color
+///
+/// @argument {number (percentage)} $percent
+///   The amount of white to be mixed in.
+///
+/// @return {color}
+///
+/// @example scss
+///   .element {
+///     background-color: tint(#6ecaa6, 40%);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     background-color: #a8dfc9;
+///   }
+
+@function tint(
+  $color,
+  $percent
+) {
+  @if not _is-color($color) {
+    @error "`#{$color}` is not a valid color for the `$color` argument in " +
+           "the `tint` mixin.";
+  } @else {
+    @return mix(#fff, $color, $percent);
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_triangle.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_triangle.scss
new file mode 100644 (file)
index 0000000..2ba96b5
--- /dev/null
@@ -0,0 +1,82 @@
+@charset "UTF-8";
+
+/// Generates a triangle pointing in a specified direction.
+///
+/// @argument {string} $direction
+///   The direction the triangle should point. Accepts `up`, `up-right`,
+///   `right`, `down-right`, `down`, `down-left`, `left` or `up-left`.
+///
+/// @argument {number (with unit)} $width
+///   Width of the triangle.
+///
+/// @argument {number (with unit)} $height
+///   Height of the triangle.
+///
+/// @argument {color} $color
+///   Color of the triangle.
+///
+/// @example scss
+///   .element {
+///     &::before {
+///       @include triangle("up", 2rem, 1rem, #b25c9c);
+///       content: "";
+///     }
+///   }
+///
+///   // CSS Output
+///   .element::before {
+///     border-style: solid;
+///     height: 0;
+///     width: 0;
+///     border-color: transparent transparent #b25c9c;
+///     border-width: 0 1rem 1rem;
+///     content: "";
+///   }
+
+@mixin triangle(
+  $direction,
+  $width,
+  $height,
+  $color
+) {
+  @if not index(
+    "up" "up-right" "right" "down-right" "down" "down-left" "left" "up-left",
+    $direction
+  ) {
+    @error "Direction must be `up`, `up-right`, `right`, `down-right`, " +
+           "`down`, `down-left`, `left` or `up-left`.";
+  } @else if not _is-color($color) {
+    @error "`#{$color}` is not a valid color for the `$color` argument in " +
+           "the `triangle` mixin.";
+  } @else {
+    border-style: solid;
+    height: 0;
+    width: 0;
+
+    @if $direction == "up" {
+      border-color: transparent transparent $color;
+      border-width: 0 ($width / 2) $height;
+    } @else if $direction == "up-right" {
+      border-color: transparent $color transparent transparent;
+      border-width: 0 $width $width 0;
+    } @else if $direction == "right" {
+      border-color: transparent transparent transparent $color;
+      border-width: ($height / 2) 0 ($height / 2) $width;
+    } @else if $direction == "down-right" {
+      border-color: transparent transparent $color;
+      border-width: 0 0 $width $width;
+    } @else if $direction == "down" {
+      border-color: $color transparent transparent;
+      border-width: $height ($width / 2) 0;
+    } @else if $direction == "down-left" {
+      border-color: transparent transparent transparent $color;
+      border-width: $width 0 0 $width;
+    } @else if $direction == "left" {
+      border-color: transparent $color transparent transparent;
+      border-width: ($height / 2) $width ($height / 2) 0;
+    } @else if $direction == "up-left" {
+      border-color: $color transparent transparent;
+      border-width: $width $width 0 0;
+    }
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/library/_value-prefixer.scss b/src/wolnelektury/static/2021/css/utils/bourbon/library/_value-prefixer.scss
new file mode 100644 (file)
index 0000000..6eb8867
--- /dev/null
@@ -0,0 +1,37 @@
+@charset "UTF-8";
+
+/// Generates vendor prefixes for values.
+///
+/// @argument {string} $property
+///   Property to use.
+///
+/// @argument {string} $value
+///   Value to prefix.
+///
+/// @argument {list} $prefixes
+///   Vendor prefixes to output.
+///
+/// @example scss
+///   .element {
+///     @include value-prefixer(cursor, grab, ("webkit", "moz"));
+///   }
+///
+///   // CSS Output
+///   .element {
+///     cursor: -webkit-grab;
+///     cursor: -moz-grab;
+///     cursor: grab;
+///   }
+///
+/// @author Matthew Tobiasz
+
+@mixin value-prefixer(
+  $property,
+  $value,
+  $prefixes: ()
+) {
+  @each $prefix in $prefixes {
+    #{$property}: #{"-" + $prefix + "-" + $value};
+  }
+  #{$property}: $value;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/settings/_settings.scss b/src/wolnelektury/static/2021/css/utils/bourbon/settings/_settings.scss
new file mode 100644 (file)
index 0000000..62690f4
--- /dev/null
@@ -0,0 +1,75 @@
+@charset "UTF-8";
+
+/// Default global Bourbon settings. Values in this map are overwritten by any
+/// values set in the `$bourbon` map.
+///
+/// @type map
+///
+/// @property {color} contrast-switch-dark-color [#000]
+///   Global dark color for the `contrast-switch` function.
+///
+/// @property {color} contrast-switch-light-color [#fff]
+///   Global light color for the `contrast-switch` function.
+///
+/// @property {list} global-font-file-formats [("ttf", "woff2", "woff")]
+///   Global font file formats for the `font-face` mixin.
+///
+/// @property {number (with unit)} modular-scale-base [1em]
+///   Global base value for the `modular-scale` function.
+///
+/// @property {number (unitless)} modular-scale-ratio [$major-third (1.25)]
+///   Global base ratio for the `modular-scale` function.
+///
+/// @property {boolean} rails-asset-pipeline [false]
+///   Set this to `true` when using the Rails Asset Pipeline and Bourbon will
+///   write asset paths using
+///   [sass-rails’ asset helpers](https://github.com/rails/sass-rails#asset-helpers).
+///
+/// @access private
+
+$_bourbon-defaults: (
+  "contrast-switch-dark-color": #000,
+  "contrast-switch-light-color": #fff,
+  "global-font-file-formats": ("ttf", "woff2", "woff"),
+  "modular-scale-base": 1em,
+  "modular-scale-ratio": $major-third,
+  "rails-asset-pipeline": false,
+);
+
+/// Global Bourbon settings.
+///
+/// @name Settings
+///
+/// @type map
+///
+/// @property {color} contrast-switch-dark-color [#000]
+///   Global dark color for the `contrast-switch` function.
+///
+/// @property {color} contrast-switch-light-color [#fff]
+///   Global light color for the `contrast-switch` function.
+///
+/// @property {list} global-font-file-formats [("ttf", "woff2", "woff")]
+///   Global font file formats for the `font-face` mixin.
+///
+/// @property {number (with unit)} modular-scale-base [1em]
+///   Global base value for the `modular-scale` function.
+///
+/// @property {number (unitless)} modular-scale-ratio [$major-third (1.25)]
+///   Global base ratio for the `modular-scale` function.
+///
+/// @property {boolean} rails-asset-pipeline [false]
+///   Set this to `true` when using the Rails Asset Pipeline and Bourbon will
+///   write asset paths using
+///   [sass-rails’ asset helpers](https://github.com/rails/sass-rails#asset-helpers).
+///
+/// @example scss
+///   $bourbon: (
+///     "contrast-switch-dark-color": #000,
+///     "contrast-switch-light-color": #fff,
+///     "global-font-file-formats": ("ttf", "woff2", "woff"),
+///     "modular-scale-base": 1em,
+///     "modular-scale-ratio": $major-third,
+///     "rails-asset-pipeline": false,
+///   );
+
+$bourbon: () !default;
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_assign-inputs.scss b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_assign-inputs.scss
new file mode 100644 (file)
index 0000000..e374553
--- /dev/null
@@ -0,0 +1,28 @@
+@charset "UTF-8";
+
+/// Append pseudo-classes to a selector(s).
+///
+/// @argument {list | string} $inputs
+///   A selector, or list of selectors, to apply the pseudo-class to.
+///
+/// @argument {pseudo-class} $pseudo [null]
+///   The pseudo-class to be appended.
+///
+/// @return {list}
+///
+/// @access private
+
+@function _assign-inputs(
+  $inputs,
+  $pseudo: null
+) {
+  $list: ();
+
+  @each $input in $inputs {
+    $input: unquote($input);
+    $input: if($pseudo, $input + ":" + $pseudo, $input);
+    $list: append($list, $input, comma);
+  }
+
+  @return $list;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_compact-shorthand.scss b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_compact-shorthand.scss
new file mode 100644 (file)
index 0000000..25f0212
--- /dev/null
@@ -0,0 +1,39 @@
+@charset "UTF-8";
+
+// scss-lint:disable ElsePlacement
+
+/// Transforms shorthand to its shortest possible form.
+///
+/// @argument {list} $values
+///   List of directional values.
+///
+/// @example scss
+///   $values: _compact-shorthand(10px 20px 10px 20px);
+///
+///   // Output
+///   $values: 10px 20px;
+///
+/// @return {list}
+///
+/// @access private
+
+@function _compact-shorthand($values) {
+  $output: null;
+
+  $a: nth($values, 1);
+  $b: if(length($values) < 2, $a, nth($values, 2));
+  $c: if(length($values) < 3, $a, nth($values, 3));
+  $d: if(length($values) < 2, $a, nth($values, if(length($values) < 4, 2, 4)));
+
+  @if $a == 0 { $a: 0; }
+  @if $b == 0 { $b: 0; }
+  @if $c == 0 { $c: 0; }
+  @if $d == 0 { $d: 0; }
+
+  @if $a == $b and $a == $c and $a == $d { $output: $a;          }
+  @else if $a == $c and $b == $d         { $output: $a $b;       }
+  @else if $b == $d                      { $output: $a $b $c;    }
+  @else                                  { $output: $a $b $c $d; }
+
+  @return $output;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_contrast-ratio.scss b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_contrast-ratio.scss
new file mode 100644 (file)
index 0000000..1ba65ce
--- /dev/null
@@ -0,0 +1,31 @@
+@charset "UTF-8";
+
+/// Programatically determines the contrast ratio between two colors.
+///
+/// Note that the alpha channel is ignored.
+///
+/// @link https://goo.gl/54htLV
+///
+/// @argument {color (hex)} $color-1
+///
+/// @argument {color (hex)} $color-2
+///
+/// @return {number (1-21)}
+///
+/// @example scss
+///   _contrast-ratio(black, white)
+///
+/// @require {function} _lightness
+///
+/// @access private
+
+@function _contrast-ratio($color-1, $color-2) {
+  $-local-lightness-1: _lightness($color-1) + 0.05;
+  $-local-lightness-2: _lightness($color-2) + 0.05;
+
+  @if $-local-lightness-1 > $-local-lightness-2 {
+    @return $-local-lightness-1 / $-local-lightness-2;
+  } @else {
+    @return $-local-lightness-2 / $-local-lightness-1;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_directional-property.scss b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_directional-property.scss
new file mode 100644 (file)
index 0000000..6780796
--- /dev/null
@@ -0,0 +1,70 @@
+@charset "UTF-8";
+
+// scss-lint:disable SpaceAroundOperator
+
+/// Builds directional properties by parsing CSS shorthand values. For example,
+/// a value of `10px null` will output top and bottom directional properties,
+/// but the `null` skips left and right from being output.
+///
+/// @argument {string} $property
+///   Base property.
+///
+/// @argument {string} $suffix
+///   Suffix to append. Use `null` to omit.
+///
+/// @argument {list} $values
+///   List of values to set for the property.
+///
+/// @example scss
+///   .element {
+///     @include _directional-property(border, width, null 5px);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     border-right-width: 5px;
+///     border-left-width: 5px;
+///   }
+///
+/// @require {function} _compact-shorthand
+///
+/// @require {function} _contains-falsy
+///
+/// @access private
+
+@mixin _directional-property(
+  $property,
+  $suffix,
+  $values
+) {
+  $top:    $property + "-top"    + if($suffix, "-#{$suffix}", "");
+  $bottom: $property + "-bottom" + if($suffix, "-#{$suffix}", "");
+  $left:   $property + "-left"   + if($suffix, "-#{$suffix}", "");
+  $right:  $property + "-right"  + if($suffix, "-#{$suffix}", "");
+  $all:    $property +             if($suffix, "-#{$suffix}", "");
+
+  $values: _compact-shorthand($values);
+
+  @if _contains-falsy($values) {
+    @if nth($values, 1) { #{$top}: nth($values, 1); }
+
+    @if length($values) == 1 {
+      @if nth($values, 1) { #{$right}: nth($values, 1); }
+    } @else {
+      @if nth($values, 2) { #{$right}: nth($values, 2); }
+    }
+
+    @if length($values) == 2 {
+      @if nth($values, 1) { #{$bottom}: nth($values, 1); }
+      @if nth($values, 2) { #{$left}: nth($values, 2); }
+    } @else if length($values) == 3 {
+      @if nth($values, 3) { #{$bottom}: nth($values, 3); }
+      @if nth($values, 2) { #{$left}: nth($values, 2); }
+    } @else if length($values) == 4 {
+      @if nth($values, 3) { #{$bottom}: nth($values, 3); }
+      @if nth($values, 4) { #{$left}: nth($values, 4); }
+    }
+  } @else {
+    #{$all}: $values;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_fetch-bourbon-setting.scss b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_fetch-bourbon-setting.scss
new file mode 100644 (file)
index 0000000..b6e4366
--- /dev/null
@@ -0,0 +1,16 @@
+@charset "UTF-8";
+
+/// Return a Bourbon setting.
+///
+/// @argument {string} $setting
+///
+/// @return {boolean | color | list | number | string}
+///
+/// @example scss
+///   _fetch-bourbon-setting(rails-asset-pipeline)
+///
+/// @access private
+
+@function _fetch-bourbon-setting($setting) {
+  @return map-get(map-merge($_bourbon-defaults, $bourbon), $setting);
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_font-source-declaration.scss b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_font-source-declaration.scss
new file mode 100644 (file)
index 0000000..3c9d51e
--- /dev/null
@@ -0,0 +1,51 @@
+@charset "UTF-8";
+
+/// Builds the `src` list for an `@font-face` declaration.
+///
+/// @link https://goo.gl/Ru1bKP
+///
+/// @argument {string} $font-family
+///
+/// @argument {string} $file-path
+///
+/// @argument {boolean} $asset-pipeline
+///
+/// @argument {list} $file-formats
+///
+/// @return {list}
+///
+/// @require {function} _contains
+///
+/// @access private
+
+@function _font-source-declaration(
+  $font-family,
+  $file-path,
+  $asset-pipeline,
+  $file-formats
+) {
+  $src: ();
+
+  $formats-map: (
+    eot:   "#{$file-path}.eot?#iefix" format("embedded-opentype"),
+    woff2: "#{$file-path}.woff2" format("woff2"),
+    woff:  "#{$file-path}.woff" format("woff"),
+    ttf:   "#{$file-path}.ttf" format("truetype"),
+    svg:   "#{$file-path}.svg##{$font-family}" format("svg"),
+  );
+
+  @each $key, $values in $formats-map {
+    @if _contains($file-formats, $key) {
+      $file-path: nth($values, 1);
+      $font-format: nth($values, 2);
+
+      @if $asset-pipeline == true {
+        $src: append($src, font-url($file-path) $font-format, comma);
+      } @else {
+        $src: append($src, url($file-path) $font-format, comma);
+      }
+    }
+  }
+
+  @return $src;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_gamma.scss b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_gamma.scss
new file mode 100644 (file)
index 0000000..2314f5a
--- /dev/null
@@ -0,0 +1,21 @@
+@charset "UTF-8";
+
+/// Performs gamma correction on a single color channel.
+///
+/// Note that Sass does not have a `pow()` function, so the calculation
+/// is approximate.
+///
+/// @argument {number (0-1)} $channel
+///
+/// @return {number (0-1)}
+///
+/// @access private
+
+@function _gamma($channel) {
+  @if $channel < 0.03928 {
+    @return $channel / 12.92;
+  } @else {
+    $c: ($channel + 0.055) / 1.055;
+    @return (133 * $c * $c * $c + 155 * $c * $c) / 288;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_lightness.scss b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_lightness.scss
new file mode 100644 (file)
index 0000000..a292904
--- /dev/null
@@ -0,0 +1,24 @@
+@charset "UTF-8";
+
+/// Programatically determines the lightness of a color.
+///
+/// @argument {color (hex)} $hex-color
+///
+/// @return {number (0-1)}
+///
+/// @example scss
+///   _lightness($color)
+///
+/// @access private
+
+@function _lightness($hex-color) {
+  $-local-red-raw: red(rgba($hex-color, 1));
+  $-local-green-raw: green(rgba($hex-color, 1));
+  $-local-blue-raw: blue(rgba($hex-color, 1));
+
+  $-local-red: _gamma($-local-red-raw / 255);
+  $-local-green: _gamma($-local-green-raw / 255);
+  $-local-blue: _gamma($-local-blue-raw / 255);
+
+  @return $-local-red * 0.2126 + $-local-green * 0.7152 + $-local-blue * 0.0722;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_unpack-shorthand.scss b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_unpack-shorthand.scss
new file mode 100644 (file)
index 0000000..5d39a71
--- /dev/null
@@ -0,0 +1,29 @@
+@charset "UTF-8";
+
+/// Transforms shorthand that can range from 1-to-4 values to be 4 values.
+///
+/// @argument {list} $shorthand
+///
+/// @example scss
+///   .element {
+///     margin: _unpack-shorthand(1em 2em);
+///   }
+///
+///   // CSS Output
+///   .element {
+///     margin: 1em 2em 1em 2em;
+///   }
+///
+/// @access private
+
+@function _unpack-shorthand($shorthand) {
+  @if length($shorthand) == 1 {
+    @return nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1);
+  } @else if length($shorthand) == 2 {
+    @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 1) nth($shorthand, 2);
+  } @else if length($shorthand) == 3 {
+    @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 3) nth($shorthand, 2);
+  } @else {
+    @return $shorthand;
+  }
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains-falsy.scss b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains-falsy.scss
new file mode 100644 (file)
index 0000000..4501e58
--- /dev/null
@@ -0,0 +1,20 @@
+@charset "UTF-8";
+
+/// Checks if a list does not contain any values.
+///
+/// @argument {list} $list
+///   The list to check against.
+///
+/// @return {boolean}
+///
+/// @access private
+
+@function _contains-falsy($list) {
+  @each $item in $list {
+    @if not $item {
+      @return true;
+    }
+  }
+
+  @return false;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains.scss b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains.scss
new file mode 100644 (file)
index 0000000..97910a1
--- /dev/null
@@ -0,0 +1,26 @@
+@charset "UTF-8";
+
+/// Checks if a list contains a value(s).
+///
+/// @argument {list} $list
+///   The list to check against.
+///
+/// @argument {list} $values
+///   A single value or list of values to check for.
+///
+/// @return {boolean}
+///
+/// @access private
+
+@function _contains(
+  $list,
+  $values...
+) {
+  @each $value in $values {
+    @if type-of(index($list, $value)) != "number" {
+      @return false;
+    }
+  }
+
+  @return true;
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-color.scss b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-color.scss
new file mode 100644 (file)
index 0000000..fa40e74
--- /dev/null
@@ -0,0 +1,13 @@
+@charset "UTF-8";
+
+/// Checks for a valid CSS color.
+///
+/// @argument {string} $color
+///
+/// @return {boolean}
+///
+/// @access private
+
+@function _is-color($color) {
+  @return (type-of($color) == color) or ($color == "currentColor");
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-length.scss b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-length.scss
new file mode 100644 (file)
index 0000000..aec94cf
--- /dev/null
@@ -0,0 +1,15 @@
+@charset "UTF-8";
+
+/// Checks for a valid CSS length.
+///
+/// @argument {string} $value
+///
+/// @return {boolean}
+///
+/// @access private
+
+@function _is-length($value) {
+  @return type-of($value) != "null" and (str-slice($value + "", 1, 4) == "calc"
+       or index(auto inherit initial 0, $value)
+       or (type-of($value) == "number" and not(unitless($value))));
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-number.scss b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-number.scss
new file mode 100644 (file)
index 0000000..36fa086
--- /dev/null
@@ -0,0 +1,15 @@
+@charset "UTF-8";
+
+/// Checks for a valid number.
+///
+/// @argument {number} $value
+///
+/// @require {function} _contains
+///
+/// @return {boolean}
+///
+/// @access private
+
+@function _is-number($value) {
+  @return _contains("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" 0 1 2 3 4 5 6 7 8 9, $value);
+}
diff --git a/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-size.scss b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-size.scss
new file mode 100644 (file)
index 0000000..f68df1e
--- /dev/null
@@ -0,0 +1,18 @@
+@charset "UTF-8";
+
+/// Checks for a valid CSS size.
+///
+/// @argument {string} $value
+///
+/// @return {boolean}
+///
+/// @require {function} _contains
+///
+/// @require {function} _is-length
+///
+/// @access private
+
+@function _is-size($value) {
+  @return _is-length($value)
+          or _contains("fill" "fit-content" "min-content" "max-content", $value);
+}
diff --git a/src/wolnelektury/static/2021/css/vendors/_module.scss b/src/wolnelektury/static/2021/css/vendors/_module.scss
new file mode 100644 (file)
index 0000000..1ea5df1
--- /dev/null
@@ -0,0 +1,8 @@
+/*! ------------------------------
+    Vendors Module
+------------------------------ */
+
+/*!*/
+
+@import "normalize";
+@import "typebase";
diff --git a/src/wolnelektury/static/2021/css/vendors/_normalize.scss b/src/wolnelektury/static/2021/css/vendors/_normalize.scss
new file mode 100644 (file)
index 0000000..68c1ec6
--- /dev/null
@@ -0,0 +1,454 @@
+/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+   ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in
+ *    IE on Windows Phone and in iOS.
+ */
+
+html {
+  line-height: 1.15; /* 1 */
+  -ms-text-size-adjust: 100%; /* 2 */
+  -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/* Sections
+   ========================================================================== */
+
+/**
+ * Remove the margin in all browsers (opinionated).
+ */
+
+body {
+  margin: 0;
+}
+
+/**
+ * Add the correct display in IE 9-.
+ */
+
+article,
+aside,
+footer,
+header,
+nav,
+section {
+  display: block;
+}
+
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+/* Grouping content
+   ========================================================================== */
+
+/**
+ * Add the correct display in IE 9-.
+ * 1. Add the correct display in IE.
+ */
+
+figcaption,
+figure,
+main { /* 1 */
+  display: block;
+}
+
+/**
+ * Add the correct margin in IE 8.
+ */
+
+figure {
+  margin: 1em 40px;
+}
+
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+hr {
+  box-sizing: content-box; /* 1 */
+  height: 0; /* 1 */
+  overflow: visible; /* 2 */
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+pre {
+  font-family: monospace, monospace; /* 1 */
+  font-size: 1em; /* 2 */
+}
+
+/* Text-level semantics
+   ========================================================================== */
+
+/**
+ * 1. Remove the gray background on active links in IE 10.
+ * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
+ */
+
+a {
+  color: currentColor;
+  text-decoration: none;
+  background-color: transparent; /* 1 */
+  -webkit-text-decoration-skip: objects; /* 2 */
+  transition: color $ease-out 350ms, border-bottom-color $ease-out 350ms;
+  &:hover {
+    border-bottom-color: transparent;
+    color: $color-primary;
+  }
+}
+
+/**
+ * 1. Remove the bottom border in Chrome 57- and Firefox 39-.
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+abbr[title] {
+  border-bottom: none; /* 1 */
+  text-decoration: underline; /* 2 */
+  text-decoration: underline dotted; /* 2 */
+}
+
+/**
+ * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
+ */
+
+b,
+strong {
+  font-weight: inherit;
+}
+
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+b,
+strong {
+  font-weight: bolder;
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+code,
+kbd,
+samp {
+  font-family: monospace, monospace; /* 1 */
+  font-size: 1em; /* 2 */
+}
+
+/**
+ * Add the correct font style in Android 4.3-.
+ */
+
+dfn {
+  font-style: italic;
+}
+
+/**
+ * Add the correct background and color in IE 9-.
+ */
+
+mark {
+  background-color: #ff0;
+  color: #000;
+}
+
+/**
+ * Add the correct font size in all browsers.
+ */
+
+small {
+  font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+sup {
+  top: -0.5em;
+}
+
+/* Embedded content
+   ========================================================================== */
+
+/**
+ * Add the correct display in IE 9-.
+ */
+
+audio,
+video {
+  display: inline-block;
+}
+
+/**
+ * Add the correct display in iOS 4-7.
+ */
+
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+
+/**
+ * Remove the border on images inside links in IE 10-.
+ */
+
+img {
+  border-style: none;
+}
+
+/**
+ * Hide the overflow in IE.
+ */
+
+svg:not(:root) {
+  overflow: hidden;
+}
+
+/* Forms
+   ========================================================================== */
+
+/**
+ * 1. Change the font styles in all browsers (opinionated).
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  font-family: sans-serif; /* 1 */
+  font-size: 100%; /* 1 */
+  line-height: 1.15; /* 1 */
+  margin: 0; /* 2 */
+}
+
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+button,
+input { /* 1 */
+  overflow: visible;
+}
+
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+button,
+select { /* 1 */
+  text-transform: none;
+}
+
+/**
+ * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+ *    controls in Android 4.
+ * 2. Correct the inability to style clickable types in iOS and Safari.
+ */
+
+button,
+html [type="button"], /* 1 */
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button; /* 2 */
+}
+
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  border-style: none;
+  padding: 0;
+}
+
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+  outline: 1px dotted ButtonText;
+}
+
+/**
+ * Correct the padding in Firefox.
+ */
+
+fieldset {
+  padding: 0.35em 0.75em 0.625em;
+}
+
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ *    `fieldset` elements in all browsers.
+ */
+
+legend {
+  box-sizing: border-box; /* 1 */
+  color: inherit; /* 2 */
+  display: table; /* 1 */
+  max-width: 100%; /* 1 */
+  padding: 0; /* 3 */
+  white-space: normal; /* 1 */
+}
+
+/**
+ * 1. Add the correct display in IE 9-.
+ * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+progress {
+  display: inline-block; /* 1 */
+  vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Remove the default vertical scrollbar in IE.
+ */
+
+textarea {
+  overflow: auto;
+}
+
+/**
+ * 1. Add the correct box sizing in IE 10-.
+ * 2. Remove the padding in IE 10-.
+ */
+
+[type="checkbox"],
+[type="radio"] {
+  box-sizing: border-box; /* 1 */
+  padding: 0; /* 2 */
+}
+
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+[type="search"] {
+  -webkit-appearance: textfield; /* 1 */
+  outline-offset: -2px; /* 2 */
+}
+
+/**
+ * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
+ */
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+::-webkit-file-upload-button {
+  -webkit-appearance: button; /* 1 */
+  font: inherit; /* 2 */
+}
+
+/* Interactive
+   ========================================================================== */
+
+/*
+ * Add the correct display in IE 9-.
+ * 1. Add the correct display in Edge, IE, and Firefox.
+ */
+
+details, /* 1 */
+menu {
+  display: block;
+}
+
+/*
+ * Add the correct display in all browsers.
+ */
+
+summary {
+  display: list-item;
+}
+
+/* Scripting
+   ========================================================================== */
+
+/**
+ * Add the correct display in IE 9-.
+ */
+
+canvas {
+  display: inline-block;
+}
+
+/**
+ * Add the correct display in IE.
+ */
+
+template {
+  display: none;
+}
+
+/* Hidden
+   ========================================================================== */
+
+/**
+ * Add the correct display in IE 10-.
+ */
+
+[hidden] {
+  display: none;
+}
diff --git a/src/wolnelektury/static/2021/css/vendors/_typebase.scss b/src/wolnelektury/static/2021/css/vendors/_typebase.scss
new file mode 100644 (file)
index 0000000..0c60152
--- /dev/null
@@ -0,0 +1,102 @@
+/* ------------------------------
+    Typebase
+------------------------------ */
+
+/* Setup */
+html {
+  font-weight: $regular;
+  font-family: $base-font;
+  font-size: $base-font-size;
+  -webkit-font-smoothing: antialiased;
+}
+/* Copy & Lists */
+p {
+  line-height: 1.35;
+  margin-top: 1.5rem;
+  font-size: 1.125rem;
+  margin-bottom: 0;
+}
+ul,
+ol {
+  margin-top: 1.5rem;
+  margin-bottom: 1.5rem;
+}
+ul li,
+ol li {
+  line-height: 30px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+blockquote {
+  line-height: 1.35;
+  margin-top: 1.5rem;
+  margin-bottom: 1.5rem;
+}
+/* Headings */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  font-family: $base-font;
+  font-weight: $regular;
+  margin-top: 1.5rem;
+  margin-bottom: 0;
+  line-height: 1.35;
+}
+h1, .h1 {
+  @include font-size(72px);
+  margin-top: 3rem;
+}
+h2, .h2 {
+  @include font-size(52px);
+  font-size: 2.625rem;
+  margin-top: 3rem;
+}
+h3, .h3 {
+
+  @include font-size(38px);
+  font-size: 2.000rem;
+}
+h4, .h4 {
+  font-size: 1.500rem;
+}
+h5 {
+  font-size: 0.4713333333333333rem;
+}
+h6 {
+  font-size: 0.3535rem;
+}
+/* Tables */
+table {
+  margin-top: 1.5rem;
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+table td,
+table th {
+  padding: 0;
+  line-height: 1.35;
+}
+/* Code blocks */
+code {
+  vertical-align: bottom;
+}
+/* Leading paragraph text */
+.lead {
+  font-size: 1.414rem;
+}
+/* Hug the block above you */
+.hug {
+  margin-top: 0;
+}
+a {
+  -webkit-tap-highlight-color: rgba(0,0,0,0);
+  -webkit-tap-highlight-color: transparent;
+}
diff --git a/src/wolnelektury/static/2021/images/fav.svg b/src/wolnelektury/static/2021/images/fav.svg
new file mode 100644 (file)
index 0000000..193e46b
--- /dev/null
@@ -0,0 +1,3 @@
+<svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.8333 5.5C7.77146 5.5 3.66663 9.56267 3.66663 14.575C3.66663 18.6212 5.27079 28.2242 21.0613 37.9317C21.3441 38.1038 21.6689 38.1948 22 38.1948C22.3311 38.1948 22.6558 38.1038 22.9386 37.9317C38.7291 28.2242 40.3333 18.6212 40.3333 14.575C40.3333 9.56267 36.2285 5.5 31.1666 5.5C26.1048 5.5 22 11 22 11C22 11 17.8951 5.5 12.8333 5.5Z" stroke="#666666" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/src/wolnelektury/static/2021/images/header.jpg b/src/wolnelektury/static/2021/images/header.jpg
new file mode 100644 (file)
index 0000000..c24ddfd
Binary files /dev/null and b/src/wolnelektury/static/2021/images/header.jpg differ
diff --git a/src/wolnelektury/static/2021/images/logo.png b/src/wolnelektury/static/2021/images/logo.png
new file mode 100644 (file)
index 0000000..5a45984
Binary files /dev/null and b/src/wolnelektury/static/2021/images/logo.png differ
diff --git a/src/wolnelektury/static/2021/images/play.svg b/src/wolnelektury/static/2021/images/play.svg
new file mode 100644 (file)
index 0000000..b288259
--- /dev/null
@@ -0,0 +1,4 @@
+<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M19.9946 36.6667C29.1971 36.6667 36.6572 29.2048 36.6572 20C36.6572 10.7953 29.1971 3.33337 19.9946 3.33337C10.7921 3.33337 3.33203 10.7953 3.33203 20C3.33203 29.2048 10.7921 36.6667 19.9946 36.6667Z" stroke="white" stroke-width="4"/>
+<path d="M26.6597 20L16.6621 13.3334V26.6667L26.6597 20Z" stroke="white" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/src/wolnelektury/static/2021/scripts/main.js b/src/wolnelektury/static/2021/scripts/main.js
new file mode 100644 (file)
index 0000000..279440b
--- /dev/null
@@ -0,0 +1,29 @@
+// JS Menu
+(function () {
+  let button = $('.js-menu');
+  let menu = $('.l-navigation__menu');
+  let menuLinks = menu.find('a');
+
+  button.on('click', function() {
+    if(!$(this).hasClass('is-active')) {
+      $(this).addClass('is-active');
+      menu.addClass('is-open');
+      button.find('.bar').addClass('animate');
+      menuLinks.attr('tabindex', 0);
+    } else {
+      $(this).removeClass('is-active');
+      menu.removeClass('is-open');
+      button.find('.bar').removeClass('animate');
+      menuLinks.attr('tabindex', -1);
+    }
+  });
+
+  $(document).keyup(function(e) {
+    if (e.keyCode === 27) {
+      button.removeClass('is-active');
+      menu.removeClass('is-open');
+      button.find('.bar').removeClass('animate');
+      menuLinks.attr('tabindex', -1);
+    }
+  });
+})();
diff --git a/src/wolnelektury/static/2021/scripts/vendor.js b/src/wolnelektury/static/2021/scripts/vendor.js
new file mode 100644 (file)
index 0000000..f47c28b
--- /dev/null
@@ -0,0 +1 @@
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(T,e){"use strict";function g(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item}function y(e){return null!=e&&e===e.window}var t=[],n=Object.getPrototypeOf,s=t.slice,m=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,r={},o=r.toString,v=r.hasOwnProperty,a=v.toString,l=a.call(Object),x={},C=T.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function h(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?r[o.call(e)]||"object":typeof e}var f="3.6.0",E=function(e,t){return new E.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=h(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}E.fn=E.prototype={jquery:f,constructor:E,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){e=E.merge(this.constructor(),e);return e.prevObject=this,e},each:function(e){return E.each(this,e)},map:function(n){return this.pushStack(E.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(E.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(E.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,e=+e+(e<0?t:0);return this.pushStack(0<=e&&e<t?[this[e]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},E.extend=E.fn.extend=function(){var e,t,n,r,i,o=arguments[0]||{},a=1,s=arguments.length,u=!1;for("boolean"==typeof o&&(u=o,o=arguments[a]||{},a++),"object"==typeof o||g(o)||(o={}),a===s&&(o=this,a--);a<s;a++)if(null!=(e=arguments[a]))for(t in e)n=e[t],"__proto__"!==t&&o!==n&&(u&&n&&(E.isPlainObject(n)||(r=Array.isArray(n)))?(i=o[t],i=r&&!Array.isArray(i)?[]:r||E.isPlainObject(i)?i:{},r=!1,o[t]=E.extend(u,i,n)):void 0!==n&&(o[t]=n));return o},E.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){return!(!e||"[object Object]"!==o.call(e)||(e=n(e))&&("function"!=typeof(e=v.call(e,"constructor")&&e.constructor)||a.call(e)!==l))},isEmptyObject:function(e){for(var t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e))for(n=e.length;r<n&&!1!==t.call(e[r],r,e[r]);r++);else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){t=t||[];return null!=e&&(p(Object(e))?E.merge(t,"string"==typeof e?[e]:e):u.call(t,e)),t},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!=a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return m(a)},guid:1,support:x}),"function"==typeof Symbol&&(E.fn[Symbol.iterator]=t[Symbol.iterator]),E.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){r["[object "+t+"]"]=t.toLowerCase()});var d=function(n){function f(e,t){return e="0x"+e.slice(1)-65536,t||(e<0?String.fromCharCode(65536+e):String.fromCharCode(e>>10|55296,1023&e|56320))}function p(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}function r(){T()}var e,d,b,o,i,h,g,y,w,u,l,T,C,a,E,m,s,c,v,S="sizzle"+ +new Date,x=n.document,k=0,A=0,N=ue(),j=ue(),D=ue(),q=ue(),L=function(e,t){return e===t&&(l=!0),0},H={}.hasOwnProperty,t=[],O=t.pop,P=t.push,R=t.push,M=t.slice,I=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},W="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",F="[\\x20\\t\\r\\n\\f]",B="(?:\\\\[\\da-fA-F]{1,6}"+F+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",$="\\["+F+"*("+B+")(?:"+F+"*([*^$|!~]?=)"+F+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+B+"))|)"+F+"*\\]",_=":("+B+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+$+")*)|.*)\\)|)",z=new RegExp(F+"+","g"),U=new RegExp("^"+F+"+|((?:^|[^\\\\])(?:\\\\.)*)"+F+"+$","g"),X=new RegExp("^"+F+"*,"+F+"*"),V=new RegExp("^"+F+"*([>+~]|"+F+")"+F+"*"),G=new RegExp(F+"|>"),Y=new RegExp(_),Q=new RegExp("^"+B+"$"),J={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),TAG:new RegExp("^("+B+"|[*])"),ATTR:new RegExp("^"+$),PSEUDO:new RegExp("^"+_),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+F+"*(even|odd|(([+-]|)(\\d*)n|)"+F+"*(?:([+-]|)"+F+"*(\\d+)|))"+F+"*\\)|)","i"),bool:new RegExp("^(?:"+W+")$","i"),needsContext:new RegExp("^"+F+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+F+"*((?:-\\d)?\\d*)"+F+"*\\)|)(?=[^-]|$)","i")},K=/HTML$/i,Z=/^(?:input|select|textarea|button)$/i,ee=/^h\d$/i,te=/^[^{]+\{\s*\[native \w/,ne=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,re=/[+~]/,ie=new RegExp("\\\\[\\da-fA-F]{1,6}"+F+"?|\\\\([^\\r\\n\\f])","g"),oe=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ae=ve(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{R.apply(t=M.call(x.childNodes),x.childNodes),t[x.childNodes.length].nodeType}catch(e){R={apply:t.length?function(e,t){P.apply(e,M.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function se(e,t,n,r){var i,o,a,s,u,l,c=t&&t.ownerDocument,f=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==f&&9!==f&&11!==f)return n;if(!r&&(T(t),t=t||C,E)){if(11!==f&&(s=ne.exec(e)))if(l=s[1]){if(9===f){if(!(o=t.getElementById(l)))return n;if(o.id===l)return n.push(o),n}else if(c&&(o=c.getElementById(l))&&v(t,o)&&o.id===l)return n.push(o),n}else{if(s[2])return R.apply(n,t.getElementsByTagName(e)),n;if((l=s[3])&&d.getElementsByClassName&&t.getElementsByClassName)return R.apply(n,t.getElementsByClassName(l)),n}if(d.qsa&&!q[e+" "]&&(!m||!m.test(e))&&(1!==f||"object"!==t.nodeName.toLowerCase())){if(l=e,c=t,1===f&&(G.test(e)||V.test(e))){for((c=re.test(e)&&ge(t.parentNode)||t)===t&&d.scope||((a=t.getAttribute("id"))?a=a.replace(oe,p):t.setAttribute("id",a=S)),i=(u=h(e)).length;i--;)u[i]=(a?"#"+a:":scope")+" "+me(u[i]);l=u.join(",")}try{return R.apply(n,c.querySelectorAll(l)),n}catch(t){q(e,!0)}finally{a===S&&t.removeAttribute("id")}}}return y(e.replace(U,"$1"),t,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function fe(e,t){for(var n=e.split("|"),r=n.length;r--;)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function he(a){return le(function(o){return o=+o,le(function(e,t){for(var n,r=a([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ge(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,e=e&&(e.ownerDocument||e).documentElement;return!K.test(t||e&&e.nodeName||"HTML")},T=se.setDocument=function(e){var t,e=e?e.ownerDocument||e:x;return e!=C&&9===e.nodeType&&e.documentElement&&(a=(C=e).documentElement,E=!i(C),x!=C&&(t=C.defaultView)&&t.top!==t&&(t.addEventListener?t.addEventListener("unload",r,!1):t.attachEvent&&t.attachEvent("onunload",r)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=te.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(ie,f);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&E){e=t.getElementById(e);return e?[e]:[]}}):(b.filter.ID=function(e){var t=e.replace(ie,f);return function(e){e=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[i++];)1===n.nodeType&&r.push(n);return r},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],m=[],(d.qsa=te.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+F+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+F+"*(?:value|"+W+")"),e.querySelectorAll("[id~="+S+"-]").length||m.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||m.push("\\["+F+"*name"+F+"*="+F+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||m.push(".#.+[+~]"),e.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+F+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(d.matchesSelector=te.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",_)}),m=m.length&&new RegExp(m.join("|")),s=s.length&&new RegExp(s.join("|")),t=te.test(a.compareDocumentPosition),v=t||te.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,t=t&&t.parentNode;return e===t||!(!t||1!==t.nodeType||!(n.contains?n.contains(t):e.compareDocumentPosition&&16&e.compareDocumentPosition(t)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},L=t?function(e,t){return e===t?(l=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==x&&v(x,e)?-1:t==C||t.ownerDocument==x&&v(x,t)?1:u?I(u,e)-I(u,t):0:4&n?-1:1);var n}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?I(u,e)-I(u,t):0;if(i===o)return pe(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?pe(a[r],s[r]):a[r]==x?-1:s[r]==x?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!q[t+" "]&&(!s||!s.test(t))&&(!m||!m.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){q(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),v(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],n=n&&H.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==n?n:d.attributes||!E?e.getAttribute(t):(n=e.getAttributeNode(t))&&n.specified?n.value:null},se.escape=function(e){return(e+"").replace(oe,p)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(L),l){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(ie,f),e[3]=(e[3]||e[4]||e[5]||"").replace(ie,f),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return J.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&Y.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(ie,f).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=new RegExp("(^|"+F+")"+e+"("+F+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=se.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1<e.indexOf(r):"$="===n?r&&e.slice(-r.length)===r:"~="===n?-1<(" "+e.replace(z," ")+" ").indexOf(r):"|="===n&&(e===r||e.slice(0,r.length+1)===r+"-"))}},CHILD:function(h,e,t,g,y){var m="nth"!==h.slice(0,3),v="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===y?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=m!=v?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(m){for(;l;){for(a=e;a=a[l];)if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[v?c.firstChild:c.lastChild],v&&p){for(d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];a=++s&&a&&a[l]||(d=s=0)||u.pop();)if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(!1===(d=p?s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]:d))for(;(a=++s&&a&&a[l]||(d=s=0)||u.pop())&&((x?a.nodeName.toLowerCase()!==f:1!==a.nodeType)||!++d||(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a!==e)););return(d-=y)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){for(var n,r=a(e,o),i=r.length;i--;)e[n=I(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=g(e.replace(U,"$1"));return s[S]?le(function(e,t,n,r){for(var i,o=s(e,null,r,[]),a=e.length;a--;)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(ie,f),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return Q.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(ie,f).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return ee.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(e=e.getAttribute("type"))||"text"===e.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=function(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=function(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}(e);function ye(){}function me(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function ve(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=A++;return e.first?function(e,t,n){for(;e=e[s];)if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[k,f];if(n){for(;e=e[s];)if((1===e.nodeType||c)&&a(e,t,n))return!0}else for(;e=e[s];)if(1===e.nodeType||c)if(r=(i=e[S]||(e[S]={}))[e.uniqueID]||(i[e.uniqueID]={}),u&&u===e.nodeName.toLowerCase())e=e[s]||e;else{if((i=r[l])&&i[0]===k&&i[1]===f)return o[2]=i[2];if((r[l]=o)[2]=a(e,t,n))return!0}return!1}}function xe(i){return 1<i.length?function(e,t,n){for(var r=i.length;r--;)if(!i[r](e,t,n))return!1;return!0}:i[0]}function be(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function we(e){for(var r,t,n,i=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=ve(function(e){return e===r},a,!0),l=ve(function(e){return-1<I(r,e)},a,!0),c=[function(e,t,n){n=!o&&(n||t!==w)||((r=t).nodeType?u:l)(e,t,n);return r=null,n}];s<i;s++)if(t=b.relative[e[s].type])c=[ve(xe(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<i&&!b.relative[e[n].type];n++);return function e(d,h,g,y,m,t){return y&&!y[S]&&(y=e(y)),m&&!m[S]&&(m=e(m,t)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:be(c,s,d,n,r),p=g?m||(e?d:l||y)?[]:t:f;if(g&&g(f,p,n,r),y)for(i=be(p,u),y(i,[],n,r),o=i.length;o--;)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a));if(e){if(m||d){if(m){for(i=[],o=p.length;o--;)(a=p[o])&&i.push(f[o]=a);m(null,p=[],i,r)}for(o=p.length;o--;)(a=p[o])&&-1<(i=m?I(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=be(p===t?p.splice(l,p.length):p),m?m(null,t,p,r):R.apply(t,p)})}(1<s&&xe(c),1<s&&me(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(U,"$1"),t,s<n&&we(e.slice(s,n)),n<i&&we(e=e.slice(n)),n<i&&me(e))}c.push(t)}return xe(c)}return ye.prototype=b.filters=b.pseudos,b.setFilters=new ye,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=j[e+" "];if(l)return t?0:l.slice(0);for(a=e,s=[],u=b.preFilter;a;){for(o in n&&!(r=X.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=V.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(U," ")}),a=a.slice(n.length)),b.filter)!(r=J[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):j(e,s).slice(0)},g=se.compile=function(e,t){var n,y,m,v,x,r,i=[],o=[],a=D[e+" "];if(!a){for(n=(t=t||h(e)).length;n--;)((a=we(t[n]))[S]?i:o).push(a);(a=D(e,(v=0<(m=i).length,x=0<(y=o).length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){for(a=0,t||o.ownerDocument==C||(T(o),n=!E);s=y[a++];)if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}v&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,v&&l!==u){for(a=0;s=m[a++];)s(c,f,t,n);if(e){if(0<u)for(;l--;)c[l]||f[l]||(f[l]=O.call(r));f=be(f)}R.apply(r,f),i&&!e&&0<f.length&&1<u+m.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},v?le(r):r))).selector=e}return a},y=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(ie,f),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=J.needsContext.test(e)?0:o.length;i--&&(a=o[i],!b.relative[s=a.type]);)if((u=b.find[s])&&(r=u(a.matches[0].replace(ie,f),re.test(o[0].type)&&ge(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&me(o)))return R.apply(n,r),n;break}}return(l||g(e,c))(r,t,!E,n,!t||re.test(e)&&ge(t.parentNode)||t),n},d.sortStable=S.split("").sort(L).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(W,function(e,t,n){if(!n)return!0===e[t]?t.toLowerCase():(t=e.getAttributeNode(t))&&t.specified?t.value:null}),se}(T);E.find=d,E.expr=d.selectors,E.expr[":"]=E.expr.pseudos,E.uniqueSort=E.unique=d.uniqueSort,E.text=d.getText,E.isXMLDoc=d.isXML,E.contains=d.contains,E.escapeSelector=d.escape;function w(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&E(e).is(n))break;r.push(e)}return r}function S(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}var k=E.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return g(n)?E.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?E.grep(e,function(e){return e===n!==r}):"string"!=typeof n?E.grep(e,function(e){return-1<i.call(n,e)!==r}):E.filter(n,e,r)}E.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?E.find.matchesSelector(r,e)?[r]:[]:E.find.matches(e,E.grep(t,function(e){return 1===e.nodeType}))},E.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(E(e).filter(function(){for(t=0;t<r;t++)if(E.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)E.find(e,i[t],n);return 1<r?E.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?E(e):e||[],!1).length}});var D=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){if(!e)return this;if(n=n||q,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:D.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof E?t[0]:t,E.merge(this,E.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),N.test(r[1])&&E.isPlainObject(t))for(var r in t)g(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(e=C.getElementById(r[2]))&&(this[0]=e,this.length=1),this}).prototype=E.fn;var q=E(C),L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(E.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&E(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&E.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?E.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(E(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(E.uniqueSort(E.merge(this.get(),E(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),E.each({parent:function(e){e=e.parentNode;return e&&11!==e.nodeType?e:null},parents:function(e){return w(e,"parentNode")},parentsUntil:function(e,t,n){return w(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return w(e,"nextSibling")},prevAll:function(e){return w(e,"previousSibling")},nextUntil:function(e,t,n){return w(e,"nextSibling",n)},prevUntil:function(e,t,n){return w(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return null!=e.contentDocument&&n(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),E.merge([],e.childNodes))}},function(r,i){E.fn[r]=function(e,t){var n=E.map(this,i,e);return(t="Until"!==r.slice(-5)?e:t)&&"string"==typeof t&&(n=E.filter(t,n)),1<this.length&&(H[r]||E.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}E.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},E.each(e.match(P)||[],function(e,t){n[t]=!0}),n):E.extend({},r);function i(){for(s=s||r.once,a=o=!0;l.length;c=-1)for(t=l.shift();++c<u.length;)!1===u[c].apply(t[0],t[1])&&r.stopOnFalse&&(c=u.length,t=!1);r.memory||(t=!1),o=!1,s&&(u=t?[]:"")}var o,t,a,s,u=[],l=[],c=-1,f={add:function(){return u&&(t&&!o&&(c=u.length-1,l.push(t)),function n(e){E.each(e,function(e,t){g(t)?r.unique&&f.has(t)||u.push(t):t&&t.length&&"string"!==h(t)&&n(t)})}(arguments),t&&!o&&i()),this},remove:function(){return E.each(arguments,function(e,t){for(var n;-1<(n=E.inArray(t,u,n));)u.splice(n,1),n<=c&&c--}),this},has:function(e){return e?-1<E.inArray(e,u):0<u.length},empty:function(){return u=u&&[],this},disable:function(){return s=l=[],u=t="",this},disabled:function(){return!u},lock:function(){return s=l=[],t||o||(u=t=""),this},locked:function(){return!!s},fireWith:function(e,t){return s||(t=[e,(t=t||[]).slice?t.slice():t],l.push(t),o||i()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!a}};return f},E.extend({Deferred:function(e){var o=[["notify","progress",E.Callbacks("memory"),E.Callbacks("memory"),2],["resolve","done",E.Callbacks("once memory"),E.Callbacks("once memory"),0,"resolved"],["reject","fail",E.Callbacks("once memory"),E.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},catch:function(e){return a.then(null,e)},pipe:function(){var i=arguments;return E.Deferred(function(r){E.each(o,function(e,t){var n=g(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&g(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){function e(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,g(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}}var n=this,r=arguments,t=s?e:function(){try{e()}catch(e){E.Deferred.exceptionHook&&E.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(E.Deferred.getStackHook&&(t.stackTrace=E.Deferred.getStackHook()),T.setTimeout(t))}}return E.Deferred(function(e){o[0][3].add(l(0,e,g(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,g(t)?t:R)),o[2][3].add(l(0,e,g(n)?n:M))}).promise()},promise:function(e){return null!=e?E.extend(e,a):a}},s={};return E.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){function t(t){return function(e){i[t]=this,o[t]=1<arguments.length?s.call(arguments):e,--n||a.resolveWith(i,o)}}var n=arguments.length,r=n,i=Array(r),o=s.call(arguments),a=E.Deferred();if(n<=1&&(I(e,a.done(t(r)).resolve,a.reject,!n),"pending"===a.state()||g(o[r]&&o[r].then)))return a.then();for(;r--;)I(o[r],t(r),a.reject);return a.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;E.Deferred.exceptionHook=function(e,t){T.console&&T.console.warn&&e&&W.test(e.name)&&T.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},E.readyException=function(e){T.setTimeout(function(){throw e})};var F=E.Deferred();function B(){C.removeEventListener("DOMContentLoaded",B),T.removeEventListener("load",B),E.ready()}E.fn.ready=function(e){return F.then(e).catch(function(e){E.readyException(e)}),this},E.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--E.readyWait:E.isReady)||(E.isReady=!0)!==e&&0<--E.readyWait||F.resolveWith(C,[E])}}),E.ready.then=F.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?T.setTimeout(E.ready):(C.addEventListener("DOMContentLoaded",B),T.addEventListener("load",B));function $(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===h(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,g(r)||(a=!0),t=l?a?(t.call(e,r),null):(l=t,function(e,t,n){return l.call(E(e),n)}):t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o}var _=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}function V(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType}function G(){this.expando=E.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;for(;n--;)delete r[t[n]]}void 0!==t&&!E.isEmptyObject(r)||(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){e=e[this.expando];return void 0!==e&&!E.isEmptyObject(e)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}E.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),E.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0!==n)return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;return o&&void 0===e?void 0!==(t=Q.get(o,n))||void 0!==(t=Z(o,n))?t:void 0:void this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0);if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){for(t=a.length;t--;)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),E.extend({queue:function(e,t,n){var r;if(e)return r=Y.get(e,t=(t||"fx")+"queue"),n&&(!r||Array.isArray(n)?r=Y.access(e,t,E.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=E.queue(e,t),r=n.length,i=n.shift(),o=E._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){E.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:E.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),E.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?E.queue(this[0],t):void 0===n?this:this.each(function(){var e=E.queue(this,t,n);E._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&E.dequeue(this,t)})},dequeue:function(e){return this.each(function(){E.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){function n(){--i||o.resolveWith(a,[a])}var r,i=1,o=E.Deferred(),a=this,s=this.length;for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";s--;)(r=Y.get(a[s],e+"queueHooks"))&&r.empty&&(i++,r.empty.add(n));return n(),o.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=C.documentElement,ie=function(e){return E.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return E.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});function ae(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===E.css(e,"display")}function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return E.css(e,t,"")},u=s(),l=n&&n[3]||(E.cssNumber[t]?"":"px"),c=e.nodeType&&(E.cssNumber[t]||"px"!==l&&+u)&&te.exec(E.css(e,t));if(c&&c[3]!==l){for(l=l||c[3],c=+(u/=2)||1;a--;)E.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;E.style(e,t,(c*=2)+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u=[],l=0,c=e.length;l<c;l++)(r=e[l]).style&&(n=r.style.display,t?("none"===n&&(u[l]=Y.get(r,"display")||null,u[l]||(r.style.display="")),""===r.style.display&&ae(r)&&(u[l]=(s=o=i=void 0,o=r.ownerDocument,a=r.nodeName,(s=ue[a])||(i=o.body.appendChild(o.createElement(a)),s=E.css(i,"display"),i.parentNode.removeChild(i),ue[a]=s="none"===s?"block":s)))):"none"!==n&&(u[l]="none",Y.set(r,"display",n)));for(l=0;l<c;l++)null!=u[l]&&(e[l].style.display=u[l]);return e}E.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?E(this).show():E(this).hide()})}});var ce=/^(?:checkbox|radio)$/i,fe=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i,f=C.createDocumentFragment().appendChild(C.createElement("div"));(d=C.createElement("input")).setAttribute("type","radio"),d.setAttribute("checked","checked"),d.setAttribute("name","t"),f.appendChild(d),x.checkClone=f.cloneNode(!0).cloneNode(!0).lastChild.checked,f.innerHTML="<textarea>x</textarea>",x.noCloneChecked=!!f.cloneNode(!0).lastChild.defaultValue,f.innerHTML="<option></option>",x.option=!!f.lastChild;var de={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function he(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&A(e,t)?E.merge([e],n):n}function ge(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}de.tbody=de.tfoot=de.colgroup=de.caption=de.thead,de.th=de.td,x.option||(de.optgroup=de.option=[1,"<select multiple='multiple'>","</select>"]);var ye=/<|&#?\w+;/;function me(e,t,n,r,i){for(var o,a,s,u,l,c=t.createDocumentFragment(),f=[],p=0,d=e.length;p<d;p++)if((o=e[p])||0===o)if("object"===h(o))E.merge(f,o.nodeType?[o]:o);else if(ye.test(o)){for(a=a||c.appendChild(t.createElement("div")),s=(fe.exec(o)||["",""])[1].toLowerCase(),s=de[s]||de._default,a.innerHTML=s[1]+E.htmlPrefilter(o)+s[2],l=s[0];l--;)a=a.lastChild;E.merge(f,a.childNodes),(a=c.firstChild).textContent=""}else f.push(t.createTextNode(o));for(c.textContent="",p=0;o=f[p++];)if(r&&-1<E.inArray(o,r))i&&i.push(o);else if(u=ie(o),a=he(c.appendChild(o),"script"),u&&ge(a),n)for(l=0;o=a[l++];)pe.test(o.type||"")&&n.push(o);return c}var ve=/^([^.]*)(?:\.(.+)|)/;function xe(){return!0}function be(){return!1}function we(e,t){return e===function(){try{return C.activeElement}catch(e){}}()==("focus"===t)}function Te(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Te(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=be;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return E().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=E.guid++)),e.each(function(){E.event.add(this,t,i,r,n)})}function Ce(e,i,o){o?(Y.set(e,i,!1),E.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(E.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:E.event.trigger(E.extend(r[0],E.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&E.event.add(e,i,xe)}E.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h=Y.get(t);if(V(t))for(n.handler&&(n=(o=n).handler,i=o.selector),i&&E.find.matchesSelector(re,i),n.guid||(n.guid=E.guid++),(s=h.events)||(s=h.events=Object.create(null)),(a=h.handle)||(a=h.handle=function(e){return void 0!==E&&E.event.triggered!==e.type?E.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(P)||[""]).length;u--;)f=d=(l=ve.exec(e[u])||[])[1],p=(l[2]||"").split(".").sort(),f&&(c=E.event.special[f]||{},f=(i?c.delegateType:c.bindType)||f,c=E.event.special[f]||{},l=E.extend({type:f,origType:d,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&E.expr.match.needsContext.test(i),namespace:p.join(".")},o),(d=s[f])||((d=s[f]=[]).delegateCount=0,c.setup&&!1!==c.setup.call(t,r,p,a)||t.addEventListener&&t.addEventListener(f,a)),c.add&&(c.add.call(t,l),l.handler.guid||(l.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,l):d.push(l),E.event.global[f]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=Y.hasData(e)&&Y.get(e);if(y&&(u=y.events)){for(l=(t=(t||"").match(P)||[""]).length;l--;)if(d=g=(s=ve.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){for(f=E.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||E.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)E.event.remove(e,d+t[l],n,r,!0);E.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a=new Array(arguments.length),s=E.event.fix(e),u=(Y.get(this,"events")||Object.create(null))[s.type]||[],e=E.event.special[s.type]||{};for(a[0]=s,t=1;t<arguments.length;t++)a[t]=arguments[t];if(s.delegateTarget=this,!e.preDispatch||!1!==e.preDispatch.call(this,s)){for(o=E.event.handlers.call(this,s,u),t=0;(r=o[t++])&&!s.isPropagationStopped();)for(s.currentTarget=r.elem,n=0;(i=r.handlers[n++])&&!s.isImmediatePropagationStopped();)s.rnamespace&&!1!==i.namespace&&!s.rnamespace.test(i.namespace)||(s.handleObj=i,s.data=i.data,void 0!==(i=((E.event.special[i.origType]||{}).handle||i.handler).apply(r.elem,a))&&!1===(s.result=i)&&(s.preventDefault(),s.stopPropagation()));return e.postDispatch&&e.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<E(i,this).index(l):E.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(E.Event.prototype,t,{enumerable:!0,configurable:!0,get:g(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[E.expando]?e:new E.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){e=this||e;return ce.test(e.type)&&e.click&&A(e,"input")&&Ce(e,"click",xe),!1},trigger:function(e){e=this||e;return ce.test(e.type)&&e.click&&A(e,"input")&&Ce(e,"click"),!0},_default:function(e){e=e.target;return ce.test(e.type)&&e.click&&A(e,"input")&&Y.get(e,"click")||A(e,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},E.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},E.Event=function(e,t){if(!(this instanceof E.Event))return new E.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?xe:be,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&E.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[E.expando]=!0},E.Event.prototype={constructor:E.Event,isDefaultPrevented:be,isPropagationStopped:be,isImmediatePropagationStopped:be,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=xe,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=xe,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=xe,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},E.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},E.event.addProp),E.each({focus:"focusin",blur:"focusout"},function(e,t){E.event.special[e]={setup:function(){return Ce(this,e,we),!1},trigger:function(){return Ce(this,e),!0},_default:function(){return!0},delegateType:t}}),E.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){E.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||E.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),E.fn.extend({on:function(e,t,n,r){return Te(this,e,t,n,r)},one:function(e,t,n,r){return Te(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,E(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"!=typeof e)return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=be),this.each(function(){E.event.remove(this,e,n,t)});for(i in e)this.off(i,t,e[i]);return this}});var Ee=/<script|<style|<link/i,Se=/checked\s*(?:[^=]|=\s*.checked.)/i,ke=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ae(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function Ne(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function je(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function De(e,t){var n,r,i,o;if(1===t.nodeType){if(Y.hasData(e)&&(o=Y.get(e).events))for(i in Y.remove(t,"handle events"),o)for(n=0,r=o[i].length;n<r;n++)E.event.add(t,i,o[i][n]);Q.hasData(e)&&(e=Q.access(e),e=E.extend({},e),Q.set(t,e))}}function qe(n,r,i,o){r=m(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=g(d);if(h||1<f&&"string"==typeof d&&!x.checkClone&&Se.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),qe(t,r,i,o)});if(f&&(t=(e=me(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=E.map(he(e,"script"),Ne)).length;c<f;c++)u=e,c!==p&&(u=E.clone(u,!0,!0),s&&E.merge(a,he(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,E.map(a,je),c=0;c<s;c++)u=a[c],pe.test(u.type||"")&&!Y.access(u,"globalEval")&&E.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?E._evalUrl&&!u.noModule&&E._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(ke,""),u,l))}return n}function Le(e,t,n){for(var r,i=t?E.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||E.cleanData(he(r)),r.parentNode&&(n&&ie(r)&&ge(he(r,"script")),r.parentNode.removeChild(r));return e}E.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(x.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||E.isXMLDoc(e)))for(a=he(c),r=0,i=(o=he(e)).length;r<i;r++)s=o[r],"input"===(l=(u=a[r]).nodeName.toLowerCase())&&ce.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||he(e),a=a||he(c),r=0,i=o.length;r<i;r++)De(o[r],a[r]);else De(e,c);return 0<(a=he(c,"script")).length&&ge(a,!f&&he(e,"script")),c},cleanData:function(e){for(var t,n,r,i=E.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?E.event.remove(n,r):E.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),E.fn.extend({detach:function(e){return Le(this,e,!0)},remove:function(e){return Le(this,e)},text:function(e){return $(this,function(e){return void 0===e?E.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return qe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ae(this,e).appendChild(e)})},prepend:function(){return qe(this,arguments,function(e){var t;1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(t=Ae(this,e)).insertBefore(e,t.firstChild)})},before:function(){return qe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return qe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(E.cleanData(he(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return E.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ee.test(e)&&!de[(fe.exec(e)||["",""])[1].toLowerCase()]){e=E.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(E.cleanData(he(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return qe(this,arguments,function(e){var t=this.parentNode;E.inArray(this,n)<0&&(E.cleanData(he(this)),t&&t.replaceChild(e,this))},n)}}),E.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){E.fn[e]=function(e){for(var t,n=[],r=E(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),E(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});function He(e){var t=e.ownerDocument.defaultView;return(t=!t||!t.opener?T:t).getComputedStyle(e)}function Oe(e,t,n){var r,i={};for(r in t)i[r]=e.style[r],e.style[r]=t[r];for(r in n=n.call(e),t)e.style[r]=i[r];return n}var Pe,Re,Me,Ie,We,Fe,Be,$e,_e=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),ze=new RegExp(ne.join("|"),"i");function Ue(e,t,n){var r,i,o=e.style;return(n=n||He(e))&&(""!==(i=n.getPropertyValue(t)||n[t])||ie(e)||(i=E.style(e,t)),!x.pixelBoxStyles()&&_e.test(i)&&ze.test(t)&&(r=o.width,e=o.minWidth,t=o.maxWidth,o.minWidth=o.maxWidth=o.width=i,i=n.width,o.width=r,o.minWidth=e,o.maxWidth=t)),void 0!==i?i+"":i}function Xe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}function Ve(){var e;$e&&(Be.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",$e.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(Be).appendChild($e),e=T.getComputedStyle($e),Pe="1%"!==e.top,Fe=12===Ge(e.marginLeft),$e.style.right="60%",Ie=36===Ge(e.right),Re=36===Ge(e.width),$e.style.position="absolute",Me=12===Ge($e.offsetWidth/3),re.removeChild(Be),$e=null)}function Ge(e){return Math.round(parseFloat(e))}Be=C.createElement("div"),($e=C.createElement("div")).style&&($e.style.backgroundClip="content-box",$e.cloneNode(!0).style.backgroundClip="",x.clearCloneStyle="content-box"===$e.style.backgroundClip,E.extend(x,{boxSizingReliable:function(){return Ve(),Re},pixelBoxStyles:function(){return Ve(),Ie},pixelPosition:function(){return Ve(),Pe},reliableMarginLeft:function(){return Ve(),Fe},scrollboxSize:function(){return Ve(),Me},reliableTrDimensions:function(){var e,t,n;return null==We&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),n=T.getComputedStyle(t),We=parseInt(n.height,10)+parseInt(n.borderTopWidth,10)+parseInt(n.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),We}}));var Ye=["Webkit","Moz","ms"],Qe=C.createElement("div").style,Je={};function Ke(e){return E.cssProps[e]||Je[e]||(e in Qe?e:Je[e]=function(e){for(var t=e[0].toUpperCase()+e.slice(1),n=Ye.length;n--;)if((e=Ye[n]+t)in Qe)return e}(e)||e)}var Ze=/^(none|table(?!-c[ea]).+)/,et=/^--/,tt={position:"absolute",visibility:"hidden",display:"block"},nt={letterSpacing:"0",fontWeight:"400"};function rt(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function it(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=E.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=E.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=E.css(e,"border"+ne[a]+"Width",!0,i))):(u+=E.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=E.css(e,"border"+ne[a]+"Width",!0,i):s+=E.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function ot(e,t,n){var r=He(e),i=(!x.boxSizingReliable()||n)&&"border-box"===E.css(e,"boxSizing",!1,r),o=i,a=Ue(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a="auto"}return(!x.boxSizingReliable()&&i||!x.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===E.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===E.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?"border":"content"),o,r,a)+"px"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}E.extend({cssHooks:{opacity:{get:function(e,t){if(t){e=Ue(e,"opacity");return""===e?"1":e}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=et.test(t),l=e.style;if(u||(t=Ke(s)),a=E.cssHooks[t]||E.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(E.cssNumber[s]?"":"px")),x.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o=X(t);return et.test(t)||(t=Ke(o)),"normal"===(i=void 0===(i=(o=E.cssHooks[t]||E.cssHooks[o])&&"get"in o?o.get(e,!0,n):i)?Ue(e,t,r):i)&&t in nt&&(i=nt[t]),""===n||n?(t=parseFloat(i),!0===n||isFinite(t)?t||0:i):i}}),E.each(["height","width"],function(e,s){E.cssHooks[s]={get:function(e,t,n){if(t)return!Ze.test(E.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,s,n):Oe(e,tt,function(){return ot(e,s,n)})},set:function(e,t,n){var r,i=He(e),o=!x.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===E.css(e,"boxSizing",!1,i),n=n?it(e,s,n,a,i):0;return a&&o&&(n-=Math.ceil(e["offset"+s[0].toUpperCase()+s.slice(1)]-parseFloat(i[s])-it(e,s,"border",!1,i)-.5)),n&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[s]=t,t=E.css(e,s)),rt(0,t,n)}}}),E.cssHooks.marginLeft=Xe(x.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ue(e,"marginLeft"))||e.getBoundingClientRect().left-Oe(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),E.each({margin:"",padding:"",border:"Width"},function(i,o){E.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(E.cssHooks[i+o].set=rt)}),E.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=He(e),i=t.length;a<i;a++)o[t[a]]=E.css(e,t[a],!1,r);return o}return void 0!==n?E.style(e,t,n):E.css(e,t)},e,t,1<arguments.length)}}),((E.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||E.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(E.cssNumber[n]?"":"px")},cur:function(){var e=at.propHooks[this.prop];return(e&&e.get?e:at.propHooks._default).get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=E.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),(n&&n.set?n:at.propHooks._default).set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(e=E.css(e.elem,e.prop,""))&&"auto"!==e?e:0},set:function(e){E.fx.step[e.prop]?E.fx.step[e.prop](e):1!==e.elem.nodeType||!E.cssHooks[e.prop]&&null==e.elem.style[Ke(e.prop)]?e.elem[e.prop]=e.now:E.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},E.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},E.fx=at.prototype.init,E.fx.step={};var st,ut,lt=/^(?:toggle|show|hide)$/,ct=/queueHooks$/;function ft(){ut&&(!1===C.hidden&&T.requestAnimationFrame?T.requestAnimationFrame(ft):T.setTimeout(ft,E.fx.interval),E.fx.tick())}function pt(){return T.setTimeout(function(){st=void 0}),st=Date.now()}function dt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ht(e,t,n){for(var r,i=(gt.tweeners[t]||[]).concat(gt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function gt(i,e,t){var n,o,r=0,a=gt.prefilters.length,s=E.Deferred().always(function(){delete u.elem}),u=function(){if(o)return!1;for(var e=st||pt(),e=Math.max(0,l.startTime+l.duration-e),t=1-(e/l.duration||0),n=0,r=l.tweens.length;n<r;n++)l.tweens[n].run(t);return s.notifyWith(i,[l,t,e]),t<1&&r?e:(r||s.notifyWith(i,[l,1,0]),s.resolveWith(i,[l]),!1)},l=s.promise({elem:i,props:E.extend({},e),opts:E.extend(!0,{specialEasing:{},easing:E.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||pt(),duration:t.duration,tweens:[],createTween:function(e,t){e=E.Tween(i,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(e),e},stop:function(e){var t=0,n=e?l.tweens.length:0;if(o)return this;for(o=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(i,[l,1,0]),s.resolveWith(i,[l,e])):s.rejectWith(i,[l,e]),this}}),c=l.props;for(function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=E.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<a;r++)if(n=gt.prefilters[r].call(l,i,c,l.opts))return g(n.stop)&&(E._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return E.map(c,ht,l),g(l.opts.start)&&l.opts.start.call(i,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),E.fx.timer(E.extend(u,{elem:i,anim:l,queue:l.opts.queue})),l}E.Animation=E.extend(gt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){for(var n,r=0,i=(e=g(e)?(t=e,["*"]):e.match(P)).length;r<i;r++)n=e[r],gt.tweeners[n]=gt.tweeners[n]||[],gt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c="width"in t||"height"in t,f=this,p={},d=e.style,h=e.nodeType&&ae(e),g=Y.get(e,"fxshow");for(r in n.queue||(null==(a=E._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,f.always(function(){f.always(function(){a.unqueued--,E.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],lt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}p[r]=g&&g[r]||E.style(e,r)}if((u=!E.isEmptyObject(t))||!E.isEmptyObject(p))for(r in c&&1===e.nodeType&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],null==(l=g&&g.display)&&(l=Y.get(e,"display")),"none"===(c=E.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=E.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===E.css(e,"float")&&(u||(f.done(function(){d.display=l}),null==l&&(c=d.display,l="none"===c?"":c)),d.display="inline-block")),n.overflow&&(d.overflow="hidden",f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]})),u=!1,p)u||(g?"hidden"in g&&(h=g.hidden):g=Y.access(e,"fxshow",{display:l}),o&&(g.hidden=!h),h&&le([e],!0),f.done(function(){for(r in h||le([e]),Y.remove(e,"fxshow"),p)E.style(e,r,p[r])})),u=ht(h?g[r]:0,r,f),r in g||(g[r]=u.start,h&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?gt.prefilters.unshift(e):gt.prefilters.push(e)}}),E.speed=function(e,t,n){var r=e&&"object"==typeof e?E.extend({},e):{complete:n||!n&&t||g(e)&&e,duration:e,easing:n&&t||t&&!g(t)&&t};return E.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in E.fx.speeds?r.duration=E.fx.speeds[r.duration]:r.duration=E.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){g(r.old)&&r.old.call(this),r.queue&&E.dequeue(this,r.queue)},r},E.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=E.isEmptyObject(t),o=E.speed(e,n,r),r=function(){var e=gt(this,E.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return r.finish=r,i||!1===o.queue?this.each(r):this.queue(o.queue,r)},stop:function(i,e,o){function a(e){var t=e.stop;delete e.stop,t(o)}return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=E.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ct.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||E.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=E.timers,o=n?n.length:0;for(t.finish=!0,E.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),E.each(["toggle","show","hide"],function(e,r){var i=E.fn[r];E.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(dt(r,!0),e,t,n)}}),E.each({slideDown:dt("show"),slideUp:dt("hide"),slideToggle:dt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){E.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),E.timers=[],E.fx.tick=function(){var e,t=0,n=E.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||E.fx.stop(),st=void 0},E.fx.timer=function(e){E.timers.push(e),E.fx.start()},E.fx.interval=13,E.fx.start=function(){ut||(ut=!0,ft())},E.fx.stop=function(){ut=null},E.fx.speeds={slow:600,fast:200,_default:400},E.fn.delay=function(r,e){return r=E.fx&&E.fx.speeds[r]||r,this.queue(e=e||"fx",function(e,t){var n=T.setTimeout(e,r);t.stop=function(){T.clearTimeout(n)}})},f=C.createElement("input"),ee=C.createElement("select").appendChild(C.createElement("option")),f.type="checkbox",x.checkOn=""!==f.value,x.optSelected=ee.selected,(f=C.createElement("input")).value="t",f.type="radio",x.radioValue="t"===f.value;var yt,mt=E.expr.attrHandle;E.fn.extend({attr:function(e,t){return $(this,E.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){E.removeAttr(this,e)})}}),E.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?E.prop(e,t,n):(1===o&&E.isXMLDoc(e)||(i=E.attrHooks[t.toLowerCase()]||(E.expr.match.bool.test(t)?yt:void 0)),void 0!==n?null===n?void E.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):!(i&&"get"in i&&null!==(r=i.get(e,t)))&&null==(r=E.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!x.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),yt={set:function(e,t,n){return!1===t?E.removeAttr(e,n):e.setAttribute(n,n),n}},E.each(E.expr.match.bool.source.match(/\w+/g),function(e,t){var a=mt[t]||E.find.attr;mt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=mt[o],mt[o]=r,r=null!=a(e,t,n)?o:null,mt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,xt=/^(?:a|area)$/i;function bt(e){return(e.match(P)||[]).join(" ")}function wt(e){return e.getAttribute&&e.getAttribute("class")||""}function Tt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}E.fn.extend({prop:function(e,t){return $(this,E.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[E.propFix[e]||e]})}}),E.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&E.isXMLDoc(e)||(t=E.propFix[t]||t,i=E.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=E.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||xt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),x.optSelected||(E.propHooks.selected={get:function(e){e=e.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(e){e=e.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),E.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){E.propFix[this.toLowerCase()]=this}),E.fn.extend({addClass:function(t){var e,n,r,i,o,a,s=0;if(g(t))return this.each(function(e){E(this).addClass(t.call(this,e,wt(this)))});if((e=Tt(t)).length)for(;n=this[s++];)if(a=wt(n),r=1===n.nodeType&&" "+bt(a)+" "){for(o=0;i=e[o++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a!==(a=bt(r))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,r,i,o,a,s=0;if(g(t))return this.each(function(e){E(this).removeClass(t.call(this,e,wt(this)))});if(!arguments.length)return this.attr("class","");if((e=Tt(t)).length)for(;n=this[s++];)if(a=wt(n),r=1===n.nodeType&&" "+bt(a)+" "){for(o=0;i=e[o++];)for(;-1<r.indexOf(" "+i+" ");)r=r.replace(" "+i+" "," ");a!==(a=bt(r))&&n.setAttribute("class",a)}return this},toggleClass:function(i,t){var o=typeof i,a="string"==o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):g(i)?this.each(function(e){E(this).toggleClass(i.call(this,e,wt(this),t),t)}):this.each(function(){var e,t,n,r;if(a)for(t=0,n=E(this),r=Tt(i);e=r[t++];)n.hasClass(e)?n.removeClass(e):n.addClass(e);else void 0!==i&&"boolean"!=o||((e=wt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",!e&&!1!==i&&Y.get(this,"__className__")||""))})},hasClass:function(e){for(var t,n=0,r=" "+e+" ";t=this[n++];)if(1===t.nodeType&&-1<(" "+bt(wt(t))+" ").indexOf(r))return!0;return!1}});var Ct=/\r/g;E.fn.extend({val:function(t){var n,e,r,i=this[0];return arguments.length?(r=g(t),this.each(function(e){1===this.nodeType&&(null==(e=r?t.call(this,e,E(this).val()):t)?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=E.map(e,function(e){return null==e?"":e+""})),(n=E.valHooks[this.type]||E.valHooks[this.nodeName.toLowerCase()])&&"set"in n&&void 0!==n.set(this,e,"value")||(this.value=e))})):i?(n=E.valHooks[i.type]||E.valHooks[i.nodeName.toLowerCase()])&&"get"in n&&void 0!==(e=n.get(i,"value"))?e:"string"==typeof(e=i.value)?e.replace(Ct,""):null==e?"":e:void 0}}),E.extend({valHooks:{option:{get:function(e){var t=E.find.attr(e,"value");return null!=t?t:bt(E.text(e))}},select:{get:function(e){for(var t,n=e.options,r=e.selectedIndex,i="select-one"===e.type,o=i?null:[],a=i?r+1:n.length,s=r<0?a:i?r:0;s<a;s++)if(((t=n[s]).selected||s===r)&&!t.disabled&&(!t.parentNode.disabled||!A(t.parentNode,"optgroup"))){if(t=E(t).val(),i)return t;o.push(t)}return o},set:function(e,t){for(var n,r,i=e.options,o=E.makeArray(t),a=i.length;a--;)((r=i[a]).selected=-1<E.inArray(E.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),E.each(["radio","checkbox"],function(){E.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<E.inArray(E(e).val(),t)}},x.checkOn||(E.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),x.focusin="onfocusin"in T;function Et(e){e.stopPropagation()}var St=/^(?:focusinfocus|focusoutblur)$/;E.extend(E.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f=[n||C],p=v.call(e,"type")?e.type:e,d=v.call(e,"namespace")?e.namespace.split("."):[],h=c=o=n=n||C;if(3!==n.nodeType&&8!==n.nodeType&&!St.test(p+E.event.triggered)&&(-1<p.indexOf(".")&&(p=(d=p.split(".")).shift(),d.sort()),s=p.indexOf(":")<0&&"on"+p,(e=e[E.expando]?e:new E.Event(p,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=d.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:E.makeArray(t,[e]),l=E.event.special[p]||{},r||!l.trigger||!1!==l.trigger.apply(n,t))){if(!r&&!l.noBubble&&!y(n)){for(a=l.delegateType||p,St.test(a+p)||(h=h.parentNode);h;h=h.parentNode)f.push(h),o=h;o===(n.ownerDocument||C)&&f.push(o.defaultView||o.parentWindow||T)}for(i=0;(h=f[i++])&&!e.isPropagationStopped();)c=h,e.type=1<i?a:l.bindType||p,(u=(Y.get(h,"events")||Object.create(null))[e.type]&&Y.get(h,"handle"))&&u.apply(h,t),(u=s&&h[s])&&u.apply&&V(h)&&(e.result=u.apply(h,t),!1===e.result&&e.preventDefault());return e.type=p,r||e.isDefaultPrevented()||l._default&&!1!==l._default.apply(f.pop(),t)||!V(n)||s&&g(n[p])&&!y(n)&&((o=n[s])&&(n[s]=null),E.event.triggered=p,e.isPropagationStopped()&&c.addEventListener(p,Et),n[p](),e.isPropagationStopped()&&c.removeEventListener(p,Et),E.event.triggered=void 0,o&&(n[s]=o)),e.result}},simulate:function(e,t,n){e=E.extend(new E.Event,n,{type:e,isSimulated:!0});E.event.trigger(e,null,t)}}),E.fn.extend({trigger:function(e,t){return this.each(function(){E.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return E.event.trigger(e,t,n,!0)}}),x.focusin||E.each({focus:"focusin",blur:"focusout"},function(n,r){function i(e){E.event.simulate(r,e.target,E.event.fix(e))}E.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var kt=T.location,At={guid:Date.now()},Nt=/\?/;E.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new T.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||E.error("Invalid XML: "+(n?E.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var jt=/\[\]$/,Dt=/\r?\n/g,qt=/^(?:submit|button|image|reset|file)$/i,Lt=/^(?:input|select|textarea|keygen)/i;E.param=function(e,t){function n(e,t){t=g(t)?t():t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==t?"":t)}var r,i=[];if(null==e)return"";if(Array.isArray(e)||e.jquery&&!E.isPlainObject(e))E.each(e,function(){n(this.name,this.value)});else for(r in e)!function n(r,e,i,o){if(Array.isArray(e))E.each(e,function(e,t){i||jt.test(r)?o(r,t):n(r+"["+("object"==typeof t&&null!=t?e:"")+"]",t,i,o)});else if(i||"object"!==h(e))o(r,e);else for(var t in e)n(r+"["+t+"]",e[t],i,o)}(r,e[r],t,n);return i.join("&")},E.fn.extend({serialize:function(){return E.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=E.prop(this,"elements");return e?E.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!E(this).is(":disabled")&&Lt.test(this.nodeName)&&!qt.test(e)&&(this.checked||!ce.test(e))}).map(function(e,t){var n=E(this).val();return null==n?null:Array.isArray(n)?E.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var Ht=/%20/g,Ot=/#.*$/,Pt=/([?&])_=[^&]*/,Rt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Mt=/^(?:GET|HEAD)$/,It=/^\/\//,Wt={},Ft={},Bt="*/".concat("*"),$t=C.createElement("a");function _t(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(g(t))for(;n=i[r++];)"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function zt(t,r,i,o){var a={},s=t===Ft;function u(e){var n;return a[e]=!0,E.each(t[e]||[],function(e,t){t=t(r,i,o);return"string"!=typeof t||s||a[t]?s?!(n=t):void 0:(r.dataTypes.unshift(t),u(t),!1)}),n}return u(r.dataTypes[0])||!a["*"]&&u("*")}function Ut(e,t){var n,r,i=E.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r=r||{})[n]=t[n]);return r&&E.extend(!0,e,r),e}$t.href=kt.href,E.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:kt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(kt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Bt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":E.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ut(Ut(e,E.ajaxSettings),t):Ut(E.ajaxSettings,e)},ajaxPrefilter:_t(Wt),ajaxTransport:_t(Ft),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0);var u,l,c,n,f,p,d,r,i,h=E.ajaxSetup({},t=t||{}),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?E(g):E.event,m=E.Deferred(),v=E.Callbacks("once memory"),x=h.statusCode||{},o={},a={},s="canceled",b={readyState:0,getResponseHeader:function(e){var t;if(p){if(!n)for(n={};t=Rt.exec(c);)n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return p?c:null},setRequestHeader:function(e,t){return null==p&&(e=a[e.toLowerCase()]=a[e.toLowerCase()]||e,o[e]=t),this},overrideMimeType:function(e){return null==p&&(h.mimeType=e),this},statusCode:function(e){if(e)if(p)b.always(e[b.status]);else for(var t in e)x[t]=[x[t],e[t]];return this},abort:function(e){e=e||s;return u&&u.abort(e),w(0,e),this}};if(m.promise(b),h.url=((e||h.url||kt.href)+"").replace(It,kt.protocol+"//"),h.type=t.method||t.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(P)||[""],null==h.crossDomain){i=C.createElement("a");try{i.href=h.url,i.href=i.href,h.crossDomain=$t.protocol+"//"+$t.host!=i.protocol+"//"+i.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=E.param(h.data,h.traditional)),zt(Wt,h,t,b),p)return b;for(r in(d=E.event&&h.global)&&0==E.active++&&E.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),l=h.url.replace(Ot,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ht,"+")):(i=h.url.slice(l.length),h.data&&(h.processData||"string"==typeof h.data)&&(l+=(Nt.test(l)?"&":"?")+h.data,delete h.data),!1===h.cache&&(l=l.replace(Pt,"$1"),i=(Nt.test(l)?"&":"?")+"_="+At.guid+++i),h.url=l+i),h.ifModified&&(E.lastModified[l]&&b.setRequestHeader("If-Modified-Since",E.lastModified[l]),E.etag[l]&&b.setRequestHeader("If-None-Match",E.etag[l])),(h.data&&h.hasContent&&!1!==h.contentType||t.contentType)&&b.setRequestHeader("Content-Type",h.contentType),b.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Bt+"; q=0.01":""):h.accepts["*"]),h.headers)b.setRequestHeader(r,h.headers[r]);if(h.beforeSend&&(!1===h.beforeSend.call(g,b,h)||p))return b.abort();if(s="abort",v.add(h.complete),b.done(h.success),b.fail(h.error),u=zt(Ft,h,t,b)){if(b.readyState=1,d&&y.trigger("ajaxSend",[b,h]),p)return b;h.async&&0<h.timeout&&(f=T.setTimeout(function(){b.abort("timeout")},h.timeout));try{p=!1,u.send(o,w)}catch(e){if(p)throw e;w(-1,e)}}else w(-1,"No Transport");function w(e,t,n,r){var i,o,a,s=t;p||(p=!0,f&&T.clearTimeout(f),u=void 0,c=r||"",b.readyState=0<e?4:0,r=200<=e&&e<300||304===e,n&&(a=function(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a=a||i}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(h,b,n)),!r&&-1<E.inArray("script",h.dataTypes)&&E.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),a=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(h,a,b,r),r?(h.ifModified&&((n=b.getResponseHeader("Last-Modified"))&&(E.lastModified[l]=n),(n=b.getResponseHeader("etag"))&&(E.etag[l]=n)),204===e||"HEAD"===h.type?s="nocontent":304===e?s="notmodified":(s=a.state,i=a.data,r=!(o=a.error))):(o=s,!e&&s||(s="error",e<0&&(e=0))),b.status=e,b.statusText=(t||s)+"",r?m.resolveWith(g,[i,s,b]):m.rejectWith(g,[b,s,o]),b.statusCode(x),x=void 0,d&&y.trigger(r?"ajaxSuccess":"ajaxError",[b,h,r?i:o]),v.fireWith(g,[b,s]),d&&(y.trigger("ajaxComplete",[b,h]),--E.active||E.event.trigger("ajaxStop")))}return b},getJSON:function(e,t,n){return E.get(e,t,n,"json")},getScript:function(e,t){return E.get(e,void 0,t,"script")}}),E.each(["get","post"],function(e,i){E[i]=function(e,t,n,r){return g(t)&&(r=r||n,n=t,t=void 0),E.ajax(E.extend({url:e,type:i,dataType:r,data:t,success:n},E.isPlainObject(e)&&e))}}),E.ajaxPrefilter(function(e){for(var t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),E._evalUrl=function(e,t,n){return E.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){E.globalEval(e,t,n)}})},E.fn.extend({wrapAll:function(e){return this[0]&&(g(e)&&(e=e.call(this[0])),e=E(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return g(n)?this.each(function(e){E(this).wrapInner(n.call(this,e))}):this.each(function(){var e=E(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=g(t);return this.each(function(e){E(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){E(this).replaceWith(this.childNodes)}),this}}),E.expr.pseudos.hidden=function(e){return!E.expr.pseudos.visible(e)},E.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},E.ajaxSettings.xhr=function(){try{return new T.XMLHttpRequest}catch(e){}};var Xt={0:200,1223:204},Vt=E.ajaxSettings.xhr();x.cors=!!Vt&&"withCredentials"in Vt,x.ajax=Vt=!!Vt,E.ajaxTransport(function(i){var o,a;if(x.cors||Vt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Xt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&T.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),E.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),E.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return E.globalEval(e),e}}}),E.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),E.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=E("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;E.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||E.expando+"_"+At.guid++;return this[e]=!0,e}}),E.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=g(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(Nt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||E.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=T[r],T[r]=function(){o=arguments},n.always(function(){void 0===i?E(T).removeProp(r):T[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&g(i)&&i(o[0]),o=i=void 0}),"script"}),x.createHTMLDocument=((f=C.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===f.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(x.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),r=!n&&[],(n=N.exec(e))?[t.createElement(n[1])]:(n=me([e],t,r),r&&r.length&&E(r).remove(),E.merge([],n.childNodes)));var r},E.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=bt(e.slice(s)),e=e.slice(0,s)),g(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&E.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?E("<div>").append(E.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},E.expr.pseudos.animated=function(t){return E.grep(E.timers,function(e){return t===e.elem}).length},E.offset={setOffset:function(e,t,n){var r,i,o,a,s=E.css(e,"position"),u=E(e),l={};"static"===s&&(e.style.position="relative"),o=u.offset(),r=E.css(e,"top"),a=E.css(e,"left"),a=("absolute"===s||"fixed"===s)&&-1<(r+a).indexOf("auto")?(i=(s=u.position()).top,s.left):(i=parseFloat(r)||0,parseFloat(a)||0),null!=(t=g(t)?t.call(e,n,E.extend({},o)):t).top&&(l.top=t.top-o.top+i),null!=t.left&&(l.left=t.left-o.left+a),"using"in t?t.using.call(e,l):u.css(l)}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n=this[0];return n?n.getClientRects().length?(e=n.getBoundingClientRect(),n=n.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),i.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-E.css(r,"marginTop",!0),left:t.left-i.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===E.css(e,"position");)e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;E.fn[t]=function(e){return $(this,function(e,t,n){var r;return y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n?r?r[i]:e[t]:void(r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n)},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=Xe(x.pixelPosition,function(e,t){if(t)return t=Ue(e,n),_e.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){E.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,i):E.style(e,t,n,i)},s,n?e:void 0,n)}})}),E.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){E.fn[t]=function(e){return this.on(t,e)}}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){E.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Qt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;E.proxy=function(e,t){var n,r;if("string"==typeof t&&(r=e[t],t=e,e=r),g(e))return n=s.call(arguments,2),(r=function(){return e.apply(t||this,n.concat(s.call(arguments)))}).guid=e.guid=e.guid||E.guid++,r},E.holdReady=function(e){e?E.readyWait++:E.ready(!0)},E.isArray=Array.isArray,E.parseJSON=JSON.parse,E.nodeName=A,E.isFunction=g,E.isWindow=y,E.camelCase=X,E.type=h,E.now=Date.now,E.isNumeric=function(e){var t=E.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},E.trim=function(e){return null==e?"":(e+"").replace(Qt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return E});var Jt=T.jQuery,Kt=T.$;return E.noConflict=function(e){return T.$===E&&(T.$=Kt),e&&T.jQuery===E&&(T.jQuery=Jt),E},void 0===e&&(T.jQuery=T.$=E),E});
\ No newline at end of file
index a5c8b95..53be0f3 100644 (file)
@@ -1,8 +1,8 @@
 <!-- Matomo -->
 <script type="text/javascript">
   var _paq = window._paq || [];
 <!-- Matomo -->
 <script type="text/javascript">
   var _paq = window._paq || [];
-  {% for ab, abval in AB.items %}
-    _paq.push(['setCustomVariable', '{{ forloop.counter }}', "{{ ab }}", "{{ abval }}", "visit"]);
+  {% for experiment, value in request.EXPERIMENTS.items %}
+    _paq.push(['setCustomVariable', '{{ forloop.counter }}', "{{ experiment }}", "{{ value }}", "visit"]);
   {% endfor %}
   _paq.push(['trackPageView']);
   _paq.push(['enableLinkTracking']);
   {% endfor %}
   _paq.push(['trackPageView']);
   _paq.push(['enableLinkTracking']);
index 492f1dd..11722fc 100644 (file)
@@ -29,6 +29,7 @@ urlpatterns = [
 ]
 
 urlpatterns += [
 ]
 
 urlpatterns += [
+    path('eksperymenty/', include('experiments.urls')),
     path('katalog/', include('catalogue.urls')),
     path('opds/', include('opds.urls')),
     path('sugestia/', include('suggest.urls')),
     path('katalog/', include('catalogue.urls')),
     path('opds/', include('opds.urls')),
     path('sugestia/', include('suggest.urls')),