From: Radek Czajka Date: Fri, 22 Oct 2021 07:58:06 +0000 (+0200) Subject: Experimental book page layout. X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/24721591455e048cffca365384e6759daae05916?ds=sidebyside;hp=--cc Experimental book page layout. --- 24721591455e048cffca365384e6759daae05916 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 000000000..c24ddfd0e Binary files /dev/null and b/src/wolnelektury/static/2021/images/header.jpg differ diff --git a/src/wolnelektury/static/2021/images/logo.png b/src/wolnelektury/static/2021/images/logo.png new file mode 100644 index 000000000..5a4598484 Binary files /dev/null and b/src/wolnelektury/static/2021/images/logo.png differ diff --git a/src/wolnelektury/static/2021/images/play.svg b/src/wolnelektury/static/2021/images/play.svg new file mode 100644 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