From 24721591455e048cffca365384e6759daae05916 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Fri, 22 Oct 2021 09:58:06 +0200 Subject: [PATCH 1/1] Experimental book page layout. --- .../templates/catalogue/2021/book_detail.html | 335 +++++++++++++ src/catalogue/templatetags/catalogue_tags.py | 12 + src/catalogue/views.py | 4 +- src/experiments/__init__.py | 0 src/experiments/apps.py | 5 + src/experiments/middleware.py | 41 ++ .../templates/experiments/main_switch.html | 44 ++ .../templates/experiments/switch.html | 55 +++ src/experiments/templatetags/experiments.py | 22 + src/experiments/urls.py | 7 + src/experiments/views.py | 17 + src/wolnelektury/abtests.py | 15 - src/wolnelektury/settings/apps.py | 1 + src/wolnelektury/settings/basic.py | 2 +- src/wolnelektury/settings/custom.py | 13 +- src/wolnelektury/settings/static.py | 6 + .../static/2021/css/base/_fonts.scss | 29 ++ .../static/2021/css/base/_global.scss | 39 ++ .../static/2021/css/base/_icons.scss | 79 +++ .../static/2021/css/base/_module.scss | 9 + .../2021/css/components/_hamburger.scss | 106 ++++ .../static/2021/css/components/_media.scss | 64 +++ .../static/2021/css/components/_module.scss | 10 + .../static/2021/css/components/_player.scss | 44 ++ .../static/2021/css/components/_support.scss | 40 ++ .../static/2021/css/layout/_article.scss | 35 ++ .../static/2021/css/layout/_aside.scss | 48 ++ .../static/2021/css/layout/_author.scss | 52 ++ .../static/2021/css/layout/_books.scss | 55 +++ .../static/2021/css/layout/_button.scss | 20 + .../static/2021/css/layout/_footer.scss | 78 +++ .../static/2021/css/layout/_header.scss | 79 +++ .../static/2021/css/layout/_main.scss | 5 + .../static/2021/css/layout/_module.scss | 17 + .../static/2021/css/layout/_navigation.scss | 18 + .../static/2021/css/layout/_section.scss | 5 + .../static/2021/css/layout/_themes.scss | 60 +++ src/wolnelektury/static/2021/css/main.scss | 30 ++ .../static/2021/css/pages/_module.scss | 6 + .../static/2021/css/utils/_bourbon.scss | 54 +++ .../static/2021/css/utils/_mixins.scss | 189 ++++++++ .../static/2021/css/utils/_module.scss | 9 + .../static/2021/css/utils/_vars.scss | 64 +++ .../utils/bourbon/helpers/_buttons-list.scss | 14 + .../css/utils/bourbon/helpers/_scales.scss | 27 ++ .../bourbon/helpers/_text-inputs-list.scss | 26 + .../utils/bourbon/library/_border-color.scss | 26 + .../utils/bourbon/library/_border-radius.scss | 85 ++++ .../utils/bourbon/library/_border-style.scss | 25 + .../utils/bourbon/library/_border-width.scss | 25 + .../css/utils/bourbon/library/_buttons.scss | 84 ++++ .../css/utils/bourbon/library/_clearfix.scss | 25 + .../bourbon/library/_contrast-switch.scss | 81 ++++ .../css/utils/bourbon/library/_ellipsis.scss | 36 ++ .../css/utils/bourbon/library/_font-face.scss | 65 +++ .../utils/bourbon/library/_font-stacks.scss | 249 ++++++++++ .../css/utils/bourbon/library/_hide-text.scss | 24 + .../utils/bourbon/library/_hide-visually.scss | 70 +++ .../css/utils/bourbon/library/_margin.scss | 37 ++ .../utils/bourbon/library/_modular-scale.scss | 120 +++++ .../utils/bourbon/library/_overflow-wrap.scss | 24 + .../css/utils/bourbon/library/_padding.scss | 36 ++ .../css/utils/bourbon/library/_position.scss | 62 +++ .../css/utils/bourbon/library/_prefixer.scss | 37 ++ .../css/utils/bourbon/library/_shade.scss | 32 ++ .../2021/css/utils/bourbon/library/_size.scss | 50 ++ .../utils/bourbon/library/_strip-unit.scss | 17 + .../utils/bourbon/library/_text-inputs.scss | 163 +++++++ .../bourbon/library/_timing-functions.scss | 38 ++ .../2021/css/utils/bourbon/library/_tint.scss | 32 ++ .../css/utils/bourbon/library/_triangle.scss | 82 ++++ .../bourbon/library/_value-prefixer.scss | 37 ++ .../css/utils/bourbon/settings/_settings.scss | 75 +++ .../bourbon/utilities/_assign-inputs.scss | 28 ++ .../bourbon/utilities/_compact-shorthand.scss | 39 ++ .../bourbon/utilities/_contrast-ratio.scss | 31 ++ .../utilities/_directional-property.scss | 70 +++ .../utilities/_fetch-bourbon-setting.scss | 16 + .../utilities/_font-source-declaration.scss | 51 ++ .../css/utils/bourbon/utilities/_gamma.scss | 21 + .../utils/bourbon/utilities/_lightness.scss | 24 + .../bourbon/utilities/_unpack-shorthand.scss | 29 ++ .../bourbon/validators/_contains-falsy.scss | 20 + .../utils/bourbon/validators/_contains.scss | 26 + .../utils/bourbon/validators/_is-color.scss | 13 + .../utils/bourbon/validators/_is-length.scss | 15 + .../utils/bourbon/validators/_is-number.scss | 15 + .../utils/bourbon/validators/_is-size.scss | 18 + .../static/2021/css/vendors/_module.scss | 8 + .../static/2021/css/vendors/_normalize.scss | 454 ++++++++++++++++++ .../static/2021/css/vendors/_typebase.scss | 102 ++++ src/wolnelektury/static/2021/images/fav.svg | 3 + .../static/2021/images/header.jpg | Bin 0 -> 15946 bytes src/wolnelektury/static/2021/images/logo.png | Bin 0 -> 11235 bytes src/wolnelektury/static/2021/images/play.svg | 4 + src/wolnelektury/static/2021/scripts/main.js | 29 ++ .../static/2021/scripts/vendor.js | 1 + .../templates/piwik/tracking_code.html | 4 +- src/wolnelektury/urls.py | 1 + 99 files changed, 4528 insertions(+), 21 deletions(-) create mode 100644 src/catalogue/templates/catalogue/2021/book_detail.html create mode 100644 src/experiments/__init__.py create mode 100644 src/experiments/apps.py create mode 100644 src/experiments/middleware.py create mode 100644 src/experiments/templates/experiments/main_switch.html create mode 100644 src/experiments/templates/experiments/switch.html create mode 100644 src/experiments/templatetags/experiments.py create mode 100644 src/experiments/urls.py create mode 100644 src/experiments/views.py delete mode 100644 src/wolnelektury/abtests.py create mode 100644 src/wolnelektury/static/2021/css/base/_fonts.scss create mode 100644 src/wolnelektury/static/2021/css/base/_global.scss create mode 100644 src/wolnelektury/static/2021/css/base/_icons.scss create mode 100644 src/wolnelektury/static/2021/css/base/_module.scss create mode 100644 src/wolnelektury/static/2021/css/components/_hamburger.scss create mode 100644 src/wolnelektury/static/2021/css/components/_media.scss create mode 100644 src/wolnelektury/static/2021/css/components/_module.scss create mode 100644 src/wolnelektury/static/2021/css/components/_player.scss create mode 100644 src/wolnelektury/static/2021/css/components/_support.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_article.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_aside.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_author.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_books.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_button.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_footer.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_header.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_main.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_module.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_navigation.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_section.scss create mode 100644 src/wolnelektury/static/2021/css/layout/_themes.scss create mode 100644 src/wolnelektury/static/2021/css/main.scss create mode 100644 src/wolnelektury/static/2021/css/pages/_module.scss create mode 100644 src/wolnelektury/static/2021/css/utils/_bourbon.scss create mode 100644 src/wolnelektury/static/2021/css/utils/_mixins.scss create mode 100644 src/wolnelektury/static/2021/css/utils/_module.scss create mode 100644 src/wolnelektury/static/2021/css/utils/_vars.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/helpers/_buttons-list.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/helpers/_scales.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/helpers/_text-inputs-list.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_border-color.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_border-radius.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_border-style.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_border-width.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_buttons.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_clearfix.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_contrast-switch.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_ellipsis.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_font-face.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_font-stacks.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-text.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-visually.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_margin.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_modular-scale.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_overflow-wrap.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_padding.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_position.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_prefixer.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_shade.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_size.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_strip-unit.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_text-inputs.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_timing-functions.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_tint.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_triangle.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/library/_value-prefixer.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/settings/_settings.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/utilities/_assign-inputs.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/utilities/_compact-shorthand.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/utilities/_contrast-ratio.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/utilities/_directional-property.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/utilities/_fetch-bourbon-setting.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/utilities/_font-source-declaration.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/utilities/_gamma.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/utilities/_lightness.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/utilities/_unpack-shorthand.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains-falsy.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-color.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-length.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-number.scss create mode 100644 src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-size.scss create mode 100644 src/wolnelektury/static/2021/css/vendors/_module.scss create mode 100644 src/wolnelektury/static/2021/css/vendors/_normalize.scss create mode 100644 src/wolnelektury/static/2021/css/vendors/_typebase.scss create mode 100644 src/wolnelektury/static/2021/images/fav.svg create mode 100644 src/wolnelektury/static/2021/images/header.jpg create mode 100644 src/wolnelektury/static/2021/images/logo.png create mode 100644 src/wolnelektury/static/2021/images/play.svg create mode 100644 src/wolnelektury/static/2021/scripts/main.js create mode 100644 src/wolnelektury/static/2021/scripts/vendor.js diff --git a/src/catalogue/templates/catalogue/2021/book_detail.html b/src/catalogue/templates/catalogue/2021/book_detail.html new file mode 100644 index 000000000..f492251cf --- /dev/null +++ b/src/catalogue/templates/catalogue/2021/book_detail.html @@ -0,0 +1,335 @@ + +{% load pipeline %} +{% load static %} +{% load choose_cite from social_tags %} +{% load choose_fragment license_icon from catalogue_tags %} +{% load catalogue_tags %} + + + + + + + + WolneLektury.pl + + + {% stylesheet '2021' %} + + + + + + + + + + + + +
+
+ +
+ +
+ {% 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 %} +
+ +
+
+
+
+ pobierz audiobook +
+
    +
  • mp3
  • +
  • ogg
  • +
  • DAISY
  • +
+
+
+
+ pobierz książkę +
+
    +
  • PDF
  • +
  • epub
  • +
  • mobi
  • +
+
+
+ {#% if book.get_first_text %#} + +
+ czytaj +
+
+ + {#% endif %#} +
+
+
+

słuchaj audiobooka w naszym serwisie

+
+ +
+ + +
+
+
+
+ + {{ book.abstract|safe }} + +
+
+ + +
+
+

Ta książka jest dostępna dla tysięcy dzieciaków dzięki darowiznom od osób takich jak Ty!

+ DORZUĆ SIĘ! +
+
+ + + {% for author in book.authors %} +
+
+ + {% if HAVE_AUTHOR_PHOTO %} +
+ Adam Mickiewicz +
+ Wikipedia +
+
+ {% endif %} +
+
+ {% endfor %} + + {% with book.related_themes as themes %} + {% if themes %} +
+
+

motywy występujące w tym utworze

+
+ + zobacz wszystkie motywy +
+
+
+ {% endif %} + {% endwith %} + + +
+
+

inne tytuły w naszej bibliotece

+
+ + {% if book.other_versions %} + {% for rel in book.other_versions %} + + + {% endfor %} + {% endif %} + + {% related_books_2021 book taken=book.other_versions|length as related_books %} + {% for rel in related_books %} + + {% endfor %} + + +
+
+
+
+ + + + + + + diff --git a/src/catalogue/templatetags/catalogue_tags.py b/src/catalogue/templatetags/catalogue_tags.py index 1a3e0aac9..8915807e1 100644 --- a/src/catalogue/templatetags/catalogue_tags.py +++ b/src/catalogue/templatetags/catalogue_tags.py @@ -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 = [] diff --git a/src/catalogue/views.py b/src/catalogue/views.py index 38c616520..62d34bb50 100644 --- a/src/catalogue/views.py +++ b/src/catalogue/views.py @@ -288,13 +288,15 @@ def book_detail(request, slug): 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, + + 'EXPERIMENTS_SWITCHABLE_layout': True, }) diff --git a/src/experiments/__init__.py b/src/experiments/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/experiments/apps.py b/src/experiments/apps.py new file mode 100644 index 000000000..57d0133d3 --- /dev/null +++ b/src/experiments/apps.py @@ -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 index 000000000..080aee2bc --- /dev/null +++ b/src/experiments/middleware.py @@ -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 index 000000000..0ff0d88c4 --- /dev/null +++ b/src/experiments/templates/experiments/main_switch.html @@ -0,0 +1,44 @@ +{% extends "base/base.html" %} + + +{% block body %} + + + {% for exp in experiments %} +
+ {{ exp.config.name }} + {% for cohort in exp.config.cohorts %} + + {% endfor %} +
+ + + + {% endfor %} +{% endblock %} + +{% block extrabody %} + + +{% endblock %} diff --git a/src/experiments/templates/experiments/switch.html b/src/experiments/templates/experiments/switch.html new file mode 100644 index 000000000..303518b3b --- /dev/null +++ b/src/experiments/templates/experiments/switch.html @@ -0,0 +1,55 @@ +{% if tests %} +
+
+ {% for test, currval in tests %} + {% for cohort in test.cohorts %} + {% if cohort.value != currval %} + {{ cohort.name }} + {% endif %} + {% endfor %} + {% endfor %} +
+
+ + + +{% endif %} diff --git a/src/experiments/templatetags/experiments.py b/src/experiments/templatetags/experiments.py new file mode 100644 index 000000000..f491fb33b --- /dev/null +++ b/src/experiments/templatetags/experiments.py @@ -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 index 000000000..5dfdcb6e4 --- /dev/null +++ b/src/experiments/urls.py @@ -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 index 000000000..71c514acd --- /dev/null +++ b/src/experiments/views.py @@ -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 index 6dd0ea2fc..000000000 --- a/src/wolnelektury/abtests.py +++ /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} diff --git a/src/wolnelektury/settings/apps.py b/src/wolnelektury/settings/apps.py index 0facb8e3c..ac6c08eb5 100644 --- a/src/wolnelektury/settings/apps.py +++ b/src/wolnelektury/settings/apps.py @@ -11,6 +11,7 @@ INSTALLED_APPS_OUR = [ 'catalogue', 'chunks', 'dictionary', + 'experiments', 'infopages', 'lesmianator', 'messaging', diff --git a/src/wolnelektury/settings/basic.py b/src/wolnelektury/settings/basic.py index ed80feecd..47a2388c1 100644 --- a/src/wolnelektury/settings/basic.py +++ b/src/wolnelektury/settings/basic.py @@ -59,7 +59,6 @@ TEMPLATES = [{ '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', ), @@ -81,6 +80,7 @@ MIDDLEWARE = [ 'fnpdjango.middleware.SetRemoteAddrFromXRealIP', 'django.middleware.cache.FetchFromCacheMiddleware', 'machina.apps.forum_permission.middleware.ForumPermissionMiddleware', + 'experiments.middleware.experiments_middleware', ] ROOT_URLCONF = 'wolnelektury.urls' diff --git a/src/wolnelektury/settings/custom.py b/src/wolnelektury/settings/custom.py index 38d293671..08937d9f8 100644 --- a/src/wolnelektury/settings/custom.py +++ b/src/wolnelektury/settings/custom.py @@ -39,8 +39,17 @@ CLUB_PAYU_POS = '300746' 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 diff --git a/src/wolnelektury/settings/static.py b/src/wolnelektury/settings/static.py index efb61b25f..b7beb79bb 100644 --- a/src/wolnelektury/settings/static.py +++ b/src/wolnelektury/settings/static.py @@ -22,6 +22,12 @@ IMAGE_DIR = 'book/pictures/' 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': [ diff --git a/src/wolnelektury/static/2021/css/base/_fonts.scss b/src/wolnelektury/static/2021/css/base/_fonts.scss new file mode 100644 index 000000000..489da8791 --- /dev/null +++ b/src/wolnelektury/static/2021/css/base/_fonts.scss @@ -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 index 000000000..30d43b4d3 --- /dev/null +++ b/src/wolnelektury/static/2021/css/base/_global.scss @@ -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 index 000000000..161be54fa --- /dev/null +++ b/src/wolnelektury/static/2021/css/base/_icons.scss @@ -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 index 000000000..3c5c9caff --- /dev/null +++ b/src/wolnelektury/static/2021/css/base/_module.scss @@ -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 index 000000000..2c6c22ef2 --- /dev/null +++ b/src/wolnelektury/static/2021/css/components/_hamburger.scss @@ -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 index 000000000..80f50b4d0 --- /dev/null +++ b/src/wolnelektury/static/2021/css/components/_media.scss @@ -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 index 000000000..f298f51d9 --- /dev/null +++ b/src/wolnelektury/static/2021/css/components/_module.scss @@ -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 index 000000000..c5d4f4ad6 --- /dev/null +++ b/src/wolnelektury/static/2021/css/components/_player.scss @@ -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 index 000000000..848780422 --- /dev/null +++ b/src/wolnelektury/static/2021/css/components/_support.scss @@ -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 index 000000000..8d5172abb --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_article.scss @@ -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 index 000000000..c3af6f890 --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_aside.scss @@ -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 index 000000000..293bad21c --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_author.scss @@ -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 index 000000000..5e2282078 --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_books.scss @@ -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 index 000000000..9da1e6ee4 --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_button.scss @@ -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 index 000000000..046c989a8 --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_footer.scss @@ -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 index 000000000..8ef222bef --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_header.scss @@ -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 index 000000000..90f4fc624 --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_main.scss @@ -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 index 000000000..60a9d24d1 --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_module.scss @@ -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 index 000000000..d01a1a815 --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_navigation.scss @@ -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 index 000000000..ec7193a71 --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_section.scss @@ -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 index 000000000..f034ac963 --- /dev/null +++ b/src/wolnelektury/static/2021/css/layout/_themes.scss @@ -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 index 000000000..2e02b64d6 --- /dev/null +++ b/src/wolnelektury/static/2021/css/main.scss @@ -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 index 000000000..964106550 --- /dev/null +++ b/src/wolnelektury/static/2021/css/pages/_module.scss @@ -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 index 000000000..b4096e10d --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/_bourbon.scss @@ -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 index 000000000..137b9bddb --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/_mixins.scss @@ -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 index 000000000..5361715f1 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/_module.scss @@ -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 index 000000000..e5f562313 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/_vars.scss @@ -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 index 000000000..2e845f762 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/helpers/_buttons-list.scss @@ -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 index 000000000..de1efa0da --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/helpers/_scales.scss @@ -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 index 000000000..479326ad8 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/helpers/_text-inputs-list.scss @@ -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 index 000000000..de25d17a7 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-color.scss @@ -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 index 000000000..3fce348b6 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-radius.scss @@ -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 index 000000000..222f2740c --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-style.scss @@ -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 index 000000000..a64e4b886 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_border-width.scss @@ -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 index 000000000..a03485dbc --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_buttons.scss @@ -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 index 000000000..d8ccc4211 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_clearfix.scss @@ -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 index 000000000..6f3c8e494 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_contrast-switch.scss @@ -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 index 000000000..6d3e5c63d --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_ellipsis.scss @@ -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 index 000000000..34143bcc3 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_font-face.scss @@ -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 index 000000000..abd607ddb --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_font-stacks.scss @@ -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 index 000000000..e9ee0f929 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-text.scss @@ -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 index 000000000..e803dfffc --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_hide-visually.scss @@ -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 index 000000000..29fa7abbb --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_margin.scss @@ -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 index 000000000..7a011f14c --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_modular-scale.scss @@ -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 index 000000000..16e0a6457 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_overflow-wrap.scss @@ -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 index 000000000..7d401bb7d --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_padding.scss @@ -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 index 000000000..d65d2bbd5 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_position.scss @@ -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 index 000000000..ad28e5a5f --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_prefixer.scss @@ -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 index 000000000..44b545b89 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_shade.scss @@ -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 index 000000000..cc52b237c --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_size.scss @@ -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 index 000000000..f4f660a35 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_strip-unit.scss @@ -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 index 000000000..dfebb79d5 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_text-inputs.scss @@ -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 index 000000000..a694b6483 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_timing-functions.scss @@ -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 index 000000000..1c536ed1f --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_tint.scss @@ -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 index 000000000..2ba96b595 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_triangle.scss @@ -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 index 000000000..6eb886732 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/library/_value-prefixer.scss @@ -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 index 000000000..62690f436 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/settings/_settings.scss @@ -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 index 000000000..e37455373 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_assign-inputs.scss @@ -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 index 000000000..25f0212ad --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_compact-shorthand.scss @@ -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 index 000000000..1ba65ce15 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_contrast-ratio.scss @@ -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 index 000000000..67807964b --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_directional-property.scss @@ -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 index 000000000..b6e4366c1 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_fetch-bourbon-setting.scss @@ -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 index 000000000..3c9d51ea5 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_font-source-declaration.scss @@ -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 index 000000000..2314f5a9a --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_gamma.scss @@ -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 index 000000000..a2929044b --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_lightness.scss @@ -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 index 000000000..5d39a713c --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/utilities/_unpack-shorthand.scss @@ -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 index 000000000..4501e588a --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains-falsy.scss @@ -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 index 000000000..97910a1b1 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_contains.scss @@ -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 index 000000000..fa40e74f6 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-color.scss @@ -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 index 000000000..aec94cf3d --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-length.scss @@ -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 index 000000000..36fa0864f --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-number.scss @@ -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 index 000000000..f68df1ea5 --- /dev/null +++ b/src/wolnelektury/static/2021/css/utils/bourbon/validators/_is-size.scss @@ -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 index 000000000..1ea5df18a --- /dev/null +++ b/src/wolnelektury/static/2021/css/vendors/_module.scss @@ -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 index 000000000..68c1ec67e --- /dev/null +++ b/src/wolnelektury/static/2021/css/vendors/_normalize.scss @@ -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 index 000000000..0c60152d6 --- /dev/null +++ b/src/wolnelektury/static/2021/css/vendors/_typebase.scss @@ -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 index 000000000..193e46b7c --- /dev/null +++ b/src/wolnelektury/static/2021/images/fav.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/wolnelektury/static/2021/images/header.jpg b/src/wolnelektury/static/2021/images/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c24ddfd0e907d90385859688a4eec11690149bbb GIT binary patch literal 15946 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 X?%ajg12062;^3M6Nilcq4@>_CSa8Zu literal 0 HcmV?d00001 diff --git a/src/wolnelektury/static/2021/images/logo.png b/src/wolnelektury/static/2021/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5a45984843778f877a428c10e8bfbf0444351628 GIT binary patch literal 11235 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 N002ovPDHLkV1oJ;VS)ev literal 0 HcmV?d00001 diff --git a/src/wolnelektury/static/2021/images/play.svg b/src/wolnelektury/static/2021/images/play.svg new file mode 100644 index 000000000..b2882591f --- /dev/null +++ b/src/wolnelektury/static/2021/images/play.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/wolnelektury/static/2021/scripts/main.js b/src/wolnelektury/static/2021/scripts/main.js new file mode 100644 index 000000000..279440b15 --- /dev/null +++ b/src/wolnelektury/static/2021/scripts/main.js @@ -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 index 000000000..f47c28b48 --- /dev/null +++ b/src/wolnelektury/static/2021/scripts/vendor.js @@ -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>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+~]|"+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="",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="";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":{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:\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)[^>]*|#([\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\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="",x.noCloneChecked=!!f.cloneNode(!0).lastChild.defaultValue,f.innerHTML="",x.option=!!f.lastChild;var de={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_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",""]);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\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").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="
",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").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