Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
1 result

Target

Select target project
  • pi/pi-cms
  • mail1/pi-cms
2 results
Select Git revision
  • jw
  • master
2 results
Show changes
Showing
with 1457 additions and 3 deletions
# Generated by Django 4.2.2 on 2023-08-20 18:44
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("home", "0024_alter_homepage_academic_council_description_and_more"),
("home", "0032_alter_homevideopage_content"),
]
operations = []
# Generated by Django 4.2.4 on 2023-08-21 18:21
import django.db.models.deletion
import modelcluster.contrib.taggit
import modelcluster.fields
import wagtail_color_panel.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
("home", "0033_merge_20230820_1844"),
]
operations = [
migrations.CreateModel(
name="Tag",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"name",
models.CharField(max_length=100, unique=True, verbose_name="name"),
),
(
"slug",
models.SlugField(
allow_unicode=True,
max_length=100,
unique=True,
verbose_name="slug",
),
),
(
"bg_color",
wagtail_color_panel.fields.ColorField(
blank=True, max_length=7, null=True, verbose_name="Barva pozadí"
),
),
(
"fg_color",
wagtail_color_panel.fields.ColorField(
blank=True, max_length=7, null=True, verbose_name="Barva textu"
),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="TaggedArticle",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"object_id",
models.IntegerField(db_index=True, verbose_name="object ID"),
),
(
"content_object",
modelcluster.fields.ParentalKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="tagged_items",
to="home.homearticlepage",
),
),
(
"content_type",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="%(app_label)s_%(class)s_tagged_items",
to="contenttypes.contenttype",
verbose_name="content type",
),
),
(
"tag",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="%(app_label)s_%(class)s_items",
to="home.tag",
),
),
],
options={
"abstract": False,
},
),
migrations.DeleteModel(
name="ArticleTag",
),
migrations.AlterField(
model_name="homearticlepage",
name="tags",
field=modelcluster.contrib.taggit.ClusterTaggableManager(
blank=True,
help_text="A comma-separated list of tags.",
through="home.TaggedArticle",
to="home.Tag",
verbose_name="Štítky",
),
),
]
# Generated by Django 4.2.4 on 2023-08-21 18:26
import wagtail_color_panel.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("home", "0034_tag_taggedarticle_delete_articletag_and_more"),
]
operations = [
migrations.AlterField(
model_name="tag",
name="bg_color",
field=wagtail_color_panel.fields.ColorField(
default="#fafafa", max_length=7, verbose_name="Barva pozadí"
),
),
migrations.AlterField(
model_name="tag",
name="fg_color",
field=wagtail_color_panel.fields.ColorField(
default="#000000", max_length=7, verbose_name="Barva textu"
),
),
]
# Generated by Django 4.2.4 on 2023-08-21 18:44
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("home", "0035_alter_tag_bg_color_alter_tag_fg_color"),
]
operations = [
migrations.AlterField(
model_name="taggedarticle",
name="tag",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="article_tags",
to="home.tag",
),
),
]
# Generated by Django 4.2.4 on 2023-08-21 19:06
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("home", "0036_alter_taggedarticle_tag"),
]
operations = [
migrations.RemoveField(
model_name="homearticlepage",
name="tags",
),
]
# Generated by Django 4.2.4 on 2023-08-21 19:06
import modelcluster.contrib.taggit
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("home", "0037_remove_homearticlepage_tags"),
]
operations = [
migrations.AddField(
model_name="homearticlepage",
name="tags",
field=modelcluster.contrib.taggit.ClusterTaggableManager(
blank=True,
help_text="A comma-separated list of tags.",
through="home.TaggedArticle",
to="home.Tag",
verbose_name="Štítky",
),
),
]
# Generated by Django 4.2.4 on 2023-08-21 19:09
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("home", "0038_homearticlepage_tags"),
]
operations = [
migrations.RemoveField(
model_name="taggedarticle",
name="content_type",
),
migrations.RemoveField(
model_name="taggedarticle",
name="object_id",
),
]
from django.db import models
from django.utils import timezone
from modelcluster.contrib.taggit import ClusterTaggableManager
from modelcluster.fields import ParentalKey
from taggit.models import ItemBase, TagBase
from wagtail.admin.panels import (
FieldPanel,
InlinePanel,
MultiFieldPanel,
ObjectList,
TabbedInterface,
)
from wagtail.blocks import PageChooserBlock
from wagtail.contrib.routable_page.models import RoutablePageMixin, path
from wagtail.contrib.settings.models import BaseSiteSetting, register_setting
from wagtail.documents import get_document_model
from wagtail.fields import RichTextField, StreamField
from wagtail.models import Page
from wagtail_color_panel.edit_handlers import NativeColorPanel
from wagtail_color_panel.fields import ColorField
from .blocks import PersonBlock
# --- BEGIN Tags ---
class Tag(TagBase):
bg_color = ColorField(verbose_name="Barva pozadí", default="#fafafa")
fg_color = ColorField(verbose_name="Barva textu", default="#000000")
panels = [
FieldPanel("name"),
FieldPanel("slug"),
NativeColorPanel("bg_color"),
NativeColorPanel("fg_color"),
]
class TaggedArticle(ItemBase):
content_object = ParentalKey(
"home.HomeArticlePage", on_delete=models.CASCADE, related_name="tagged_items"
)
tag = models.ForeignKey(Tag, on_delete=models.CASCADE, related_name="article_tags")
# --- END Tags ---
class HomePage(RoutablePageMixin, Page):
heading_text = RichTextField(verbose_name="Hlavní text stránky")
# --- Donations ---
donation_text = RichTextField(verbose_name="Text pro dary")
# --- Contact info ---
address = models.CharField(verbose_name="Sídlo", max_length=128)
branch = models.CharField(verbose_name="Pobočka", max_length=128)
email = models.EmailField(verbose_name="Email", max_length=128)
ds_id = models.CharField(verbose_name="Datová schránka", max_length=128)
# --- People ---
director = StreamField(
[
("person", PersonBlock()),
(
"person_page",
PageChooserBlock(
page_type="home.HomePersonPage", label="Stránka osoby", icon="user"
),
),
],
verbose_name="Ředitel",
use_json_field=True,
blank=True,
null=True,
)
director_description = RichTextField(verbose_name="Ředitel - popis")
academic_council = StreamField(
[
("person", PersonBlock()),
(
"person_page",
PageChooserBlock(
page_type="home.HomePersonPage", label="Stránka osoby", icon="user"
),
),
],
verbose_name="Akademická rada",
use_json_field=True,
blank=True,
null=True,
)
academic_council_description = RichTextField(verbose_name="Akademická rada - popis")
controller = StreamField(
[
("person", PersonBlock()),
(
"person_page",
PageChooserBlock(
page_type="home.HomePersonPage", label="Stránka osoby", icon="user"
),
),
],
verbose_name="Kontrolor",
use_json_field=True,
blank=True,
null=True,
)
controller_description = RichTextField(verbose_name="Kontrolor - popis")
council_members = StreamField(
[
("person", PersonBlock()),
(
"person_page",
PageChooserBlock(
page_type="home.HomePersonPage", label="Stránka osoby", icon="user"
),
),
],
verbose_name="Správní rada",
use_json_field=True,
blank=True,
null=True,
)
council_members_description = RichTextField(verbose_name="Správní rada - popis")
volunteers = StreamField(
[
("person", PersonBlock()),
(
"person_page",
PageChooserBlock(
page_type="home.HomePersonPage", label="Stránka osoby", icon="user"
),
),
],
verbose_name="Dobrovolníci",
use_json_field=True,
blank=True,
null=True,
)
volunteers_description = RichTextField(verbose_name="Dobrovolníci - popis")
employees = StreamField(
[
("person", PersonBlock()),
(
"person_page",
PageChooserBlock(
page_type="home.HomePersonPage", label="Stránka osoby", icon="user"
),
),
],
verbose_name="Zaměstnanci",
use_json_field=True,
blank=True,
null=True,
)
employees_description = RichTextField(verbose_name="Zaměstnanci - popis")
subpage_types = [
"home.HomeArticlesPage",
"home.HomeEventsPage",
"home.HomeDocumentsPage",
"home.HomeVideosPage",
"home.HomePeoplePage",
]
intro_panels = Page.content_panels + [
FieldPanel("heading_text", icon="pilcrow"),
FieldPanel("donation_text", icon="pilcrow"),
MultiFieldPanel(
[
FieldPanel("address", icon="home"),
FieldPanel("branch", icon="home"),
FieldPanel("email", icon="pilcrow"),
FieldPanel("ds_id", icon="mail"),
],
heading="Kontaktní údaje",
),
]
people_panels = [
FieldPanel("director_description", icon="pilcrow"),
FieldPanel("director", icon="user"),
FieldPanel("academic_council_description"),
FieldPanel("academic_council", icon="user"),
FieldPanel("controller_description", icon="pilcrow"),
FieldPanel("controller", icon="user"),
FieldPanel("council_members_description", icon="pilcrow"),
FieldPanel("council_members", icon="group"),
FieldPanel("volunteers_description", icon="pilcrow"),
FieldPanel("volunteers", icon="group"),
FieldPanel("employees_description", icon="pilcrow"),
FieldPanel("employees", icon="group"),
]
edit_handler = TabbedInterface(
[
ObjectList(intro_panels, heading="Základy"),
ObjectList(people_panels, heading="Lidé"),
ObjectList(Page.promote_panels, heading="Propagace"),
]
)
# Articles
@property
def articles_page(self) -> "HomeArticlesPage":
return HomeArticlesPage.objects.live().first()
@property
def latest_articles(self) -> "QuerySet":
return HomeArticlePage.objects.order_by("-date").live().all()[:3]
# Events
@property
def events_page(self) -> "HomeEventsPage":
return HomeEventsPage.objects.live().first()
@property
def latest_events(self) -> "QuerySet":
return HomeEventPage.objects.order_by("-date").live().all()[:8]
# Documents
@property
def documents_page(self) -> "HomeDocumentsPage":
return HomeDocumentsPage.objects.child_of(self).live().first()
@property
def latest_documents(self) -> list:
documents = list(
HomeDocumentPage.objects.child_of(self.documents_page)
.order_by("-date")
.live()
.all()[:4]
)
# Pad documents list so it's always 4 items long
documents += [None] * (4 - len(documents))
document_directories = list(
HomeDocumentsPage.objects.child_of(self.documents_page).live().all()[:4]
)
# Replace 0-4 last items in the list with directories
position_in_documents = 3
for document_directory in document_directories:
documents[position_in_documents] = document_directory
position_in_documents -= 1
# Then remove the Nones we padded the list with
return list(filter(lambda document: document is not None, documents))
# Feed
@path("feeds/atom/")
def view_feed(self, request):
# Avoid circular import
from .feeds import LatestArticlesFeed # noqa
return LatestArticlesFeed()(request, self.articles_page.id)
class Meta:
verbose_name = "Domovská stránka"
# --- BEGIN Articles, events, videos and documents ---
class HomeArticlesPage(Page):
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
parent_page_type = ["home.HomePage"]
subpage_types = ["home.HomeArticlePage"]
content_panels = Page.content_panels + [
FieldPanel("content", icon="pilcrow"),
]
@property
def articles(self):
return HomeArticlePage.objects.live().order_by("-date")
def get_context(self, request):
context = super().get_context(request)
articles = self.articles
# Filter by tag
tag = request.GET.get("tag")
if tag:
articles = articles.filter(tags__name=tag)
context["filtered_tag"] = tag
context["articles"] = articles
return context
class Meta:
verbose_name = "Rozcestník článků"
class HomeEventsPage(Page):
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
parent_page_type = ["home.HomePage"]
subpage_types = ["home.HomeEventPage"]
content_panels = Page.content_panels + [
FieldPanel("content", icon="pilcrow"),
]
@property
def events(self):
return HomeEventPage.objects.live().order_by("-date").all()
class Meta:
verbose_name = "Rozcestník akcí"
class HomeDocumentsPage(Page):
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
parent_page_type = ["home.HomePage"]
subpage_types = ["home.HomeDocumentPage", "home.HomeDocumentsPage"]
content_panels = Page.content_panels + [
FieldPanel("content", icon="pilcrow"),
]
@property
def documents(self):
documents = list(
HomeDocumentPage.objects.child_of(self).order_by("-date").live().all()
)
document_directories = list(
HomeDocumentsPage.objects.child_of(self).live().all()
)
return documents + document_directories
class Meta:
verbose_name = "Rozcestník dokumentů"
class HomeVideosPage(Page):
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
parent_page_type = ["home.HomePage"]
subpage_types = ["home.HomeVideoPage"]
content_panels = Page.content_panels + [
FieldPanel("content", icon="pilcrow"),
]
@property
def videos(self):
return HomeVideoPage.objects.live().order_by("-date").all()
class Meta:
verbose_name = "Rozcestník videí"
class HomeContentPageMixin(Page):
author_page = models.ForeignKey(
"home.HomePersonPage",
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name="Stránka autora",
help_text="Pokud je vybrána stránka, není nutno vyplňovat jméno autora níže.",
)
author = models.CharField(
verbose_name="Jméno autora",
max_length=128,
blank=True,
null=True,
)
date = models.DateField(verbose_name="Datum vytvoření", default=timezone.now)
content = RichTextField(verbose_name="Obsah")
parent_page_type = ["home.HomeArticlesPage"]
content_panels = Page.content_panels + [
MultiFieldPanel(
[
FieldPanel("author_page", icon="user"),
FieldPanel("author", icon="user"),
],
heading="Autor",
),
FieldPanel("date", icon="calendar"),
FieldPanel("content", icon="pilcrow"),
]
@property
def shortened_perex(self) -> str:
if len(self.perex) > 310:
return self.perex[:300] + "..."
return self.perex
class Meta:
abstract = True
class HomeArticlePage(HomeContentPageMixin):
image = models.ForeignKey(
"wagtailimages.Image",
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name="+",
verbose_name="Obrázek",
)
content = RichTextField(
verbose_name="Obsah",
features=[
"h2",
"h3",
"h4",
"bold",
"italic",
"ol",
"ul",
"hr",
"link",
"document-link",
"image",
"embed",
"footnotes",
],
)
show_image_on_homepage = models.BooleanField(
verbose_name="Zobrazovat obrázek na homepage",
default=False,
)
tags = ClusterTaggableManager(
through=TaggedArticle, blank=True, verbose_name="Štítky"
)
perex = models.TextField(verbose_name="Perex")
content_panels = Page.content_panels + [
MultiFieldPanel(
[
FieldPanel("author_page", icon="user"),
FieldPanel("author", icon="user"),
],
heading="Autor",
),
MultiFieldPanel(
[
FieldPanel("image", icon="image", heading=" "),
FieldPanel("show_image_on_homepage"),
],
heading="Obrázek",
),
FieldPanel("date", icon="calendar"),
FieldPanel("perex", icon="pilcrow"),
FieldPanel("tags", icon="tag"),
FieldPanel("content", icon="pilcrow"),
InlinePanel("footnotes", label="Footnotes", icon="pilcrow"),
]
class Meta:
verbose_name = "Článek"
class HomeEventPage(HomeContentPageMixin):
date = models.DateField(verbose_name="Datum konání", blank=True, null=True)
location = models.CharField(
verbose_name="Místo konání", blank=True, null=True, max_length=64
)
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
content_panels = Page.content_panels + [
FieldPanel("date", icon="calendar"),
FieldPanel("location", icon="globe"),
MultiFieldPanel(
[
FieldPanel("author_page", icon="user"),
FieldPanel("author", icon="user"),
],
heading="Autor",
),
FieldPanel("content", icon="pilcrow"),
]
class Meta:
verbose_name = "Akce"
class HomeDocumentPage(HomeContentPageMixin):
document = models.ForeignKey(
get_document_model(), on_delete=models.PROTECT, verbose_name="Dokument"
)
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
subpage_types = ["home.HomeDocumentPage"]
content_panels = Page.content_panels + [
FieldPanel("document", icon="doc-full"),
MultiFieldPanel(
[
FieldPanel("author_page", icon="user"),
FieldPanel("author", icon="user"),
],
heading="Autor",
),
FieldPanel("date", icon="calendar"),
FieldPanel("content", icon="pilcrow"),
]
class Meta:
verbose_name = "Dokument"
class HomeVideoPage(HomeContentPageMixin):
embed_url = models.URLField(
verbose_name="URL Embedu",
help_text="Pro získání adresy zmáčkni tlačítko Sdílet, vyber záložku Embed a zaškrtní zobrazování pouze URL.",
)
thumbnail = models.ForeignKey(
"wagtailimages.Image",
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name="+",
verbose_name="Náhledový obrázek",
)
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
content_panels = Page.content_panels + [
FieldPanel("embed_url", icon="link"),
FieldPanel("thumbnail", icon="image"),
MultiFieldPanel(
[
FieldPanel("author_page", icon="user"),
FieldPanel("author", icon="user"),
],
heading="Autor",
),
FieldPanel("date", icon="calendar"),
FieldPanel("content", icon="pilcrow"),
]
class Meta:
verbose_name = "Video"
# --- END Articles, events, videos and documents ---
# --- BEGIN People ---
class HomePeoplePage(Page):
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
parent_page_type = ["home.HomePage"]
subpage_types = ["home.HomePersonPage"]
content_panels = Page.content_panels + [
FieldPanel("content", icon="pilcrow"),
]
@property
def people(self):
return HomePersonPage.objects.live().order_by("title").all()
class Meta:
verbose_name = "Rozcestník osob"
class HomePersonPage(Page):
image = models.ForeignKey(
"wagtailimages.Image",
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name="+",
verbose_name="Profilový obrázek",
)
name_titles = models.CharField(
max_length=32,
blank=True,
null=True,
verbose_name="Tituly",
)
position = models.TextField(verbose_name="Pracovní pozice", blank=True, null=True)
email = models.EmailField(verbose_name="Emailová adresa", blank=True, null=True)
description = RichTextField(verbose_name="Popis", blank=True, null=True)
content_panels = Page.content_panels + [
FieldPanel("name_titles", icon="pilcrow"),
FieldPanel("image", icon="image"),
FieldPanel("position", icon="pilcrow"),
FieldPanel("email", icon="mail"),
FieldPanel("description", icon="pilcrow"),
]
@property
def full_name(self) -> str:
name = self.title
if self.name_titles is not None:
name = f"{self.name_titles} {name}"
return name
@property
def inline_position(self) -> str:
"""Returns this person's position formatted to fit on a single line."""
if self.position is None:
return None
split_positions = self.position.split("\n")
split_positions = [position.strip() for position in split_positions]
return ", ".join(split_positions)
class Meta:
verbose_name = "Osoba"
# --- END People ---
# --- BEGIN Settings ---
@register_setting
class SocialMediaSettings(BaseSiteSetting):
mastodon = models.URLField(blank=True, null=True, help_text="Mastodon URL")
twitter = models.URLField(blank=True, null=True, help_text="Twitter URL")
linkedin = models.URLField(blank=True, null=True, help_text="LinkedIn URL")
facebook = models.URLField(blank=True, null=True, help_text="Facebook URL")
panels = [
MultiFieldPanel(
[
FieldPanel("mastodon"),
FieldPanel("twitter"),
FieldPanel("linkedin"),
FieldPanel("facebook"),
],
heading="Nastavení sociálních sítí",
)
]
class Meta:
verbose_name = "Sociální sítě"
class HomePage(Page):
pass
# --- END Settings ---
/* bebas-neue-regular - latin_latin-ext */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'Bebas Neue';
font-style: normal;
font-weight: 400;
src: url('./bebas-neue-v10-latin_latin-ext-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
File added
This diff is collapsed.
File added
File added
@font-face {
font-family: "pirati-ui";
src:
url("./pirati-ui.eot") format("embedded-opentype"),
url("./pirati-ui.ttf") format("truetype"),
url("./pirati-ui.woff") format("woff"),
url("./pirati-ui.svg") format("svg");
font-weight: normal;
font-style: normal;
font-display: block;
}
[class^="ico--"], [class*=" ico--"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'pirati-ui' !important;
speak: never;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.ico--mastodon:before {
content: "\e973";
}
.ico--helios:before {
content: "\e96e";
}
.ico--redmine:before {
content: "\e96f";
}
.ico--zulip:before {
content: "\e970";
}
.ico--forum:before {
content: "\e971";
}
.ico--pirati:before {
content: "\e90d";
}
.ico--jitsi:before {
content: "\e90f";
}
.ico--open-source:before {
content: "\e90e";
}
.ico--donation-full:before {
content: "\e96c";
}
.ico--donation-outline:before {
content: "\e96d";
}
.ico--strategy:before {
content: "\e932";
}
.ico--pig:before {
content: "\e928";
}
.ico--thermometer:before {
content: "\e90a";
}
.ico--menu:before {
content: "\e933";
}
.ico--chevron-right:before {
content: "\e923";
}
.ico--chevron-left:before {
content: "\e924";
}
.ico--chevron-down:before {
content: "\e925";
}
.ico--chevron-up:before {
content: "\e926";
}
.ico--link-horizontal:before {
content: "\e910";
}
.ico--beer:before {
content: "\e909";
}
.ico--food:before {
content: "\e968";
}
.ico--dots-three-vertical:before {
content: "\e940";
}
.ico--dots-three-horizontal:before {
content: "\e941";
}
.ico--log-out:before {
content: "\e942";
}
.ico--envelope:before {
content: "\e908";
}
.ico--pin:before {
content: "\e943";
}
.ico--at:before {
content: "\e905";
}
.ico--glass:before {
content: "\e967";
}
.ico--checkmark:before {
content: "\e965";
}
.ico--info:before {
content: "\e901";
}
.ico--question:before {
content: "\e904";
}
.ico--warning:before {
content: "\e93f";
}
.ico--code:before {
content: "\e94a";
}
.ico--checkbox-unchecked:before {
content: "\e94e";
}
.ico--star-full:before {
content: "\e94f";
}
.ico--star-empty:before {
content: "\e950";
}
.ico--bookmark:before {
content: "\e951";
}
.ico--cog:before {
content: "\e952";
}
.ico--key:before {
content: "\e953";
}
.ico--zoom-in:before {
content: "\e954";
}
.ico--zoom-out:before {
content: "\e955";
}
.ico--shrink:before {
content: "\e956";
}
.ico--printer:before {
content: "\e957";
}
.ico--file-openoffice:before {
content: "\e958";
}
.ico--user:before {
content: "\e959";
}
.ico--file-excel:before {
content: "\e95a";
}
.ico--file-word:before {
content: "\e95b";
}
.ico--file-pdf:before {
content: "\e95c";
}
.ico--file-picture:before {
content: "\e95d";
}
.ico--file-blank:before {
content: "\e95e";
}
.ico--folder-upload:before {
content: "\e95f";
}
.ico--upload:before {
content: "\e960";
}
.ico--cloud-upload:before {
content: "\e961";
}
.ico--folder-download:before {
content: "\e962";
}
.ico--download:before {
content: "\e963";
}
.ico--cloud-download:before {
content: "\e964";
}
.ico--alarm:before {
content: "\e900";
}
.ico--calculator:before {
content: "\e911";
}
.ico--facebook-full:before {
content: "\e913";
}
.ico--feed:before {
content: "\e927";
}
.ico--library:before {
content: "\e929";
}
.ico--office:before {
content: "\e92a";
}
.ico--attachment:before {
content: "\e92b";
}
.ico--enlarge:before {
content: "\e92c";
}
.ico--eye-off:before {
content: "\e92e";
}
.ico--eye:before {
content: "\e92f";
}
.ico--share:before {
content: "\e931";
}
.ico--search:before {
content: "\e939";
}
.ico--pencil:before {
content: "\e93c";
}
.ico--lock-open:before {
content: "\e947";
}
.ico--lock:before {
content: "\e948";
}
.ico--equalizer:before {
content: "\e949";
}
.ico--switch:before {
content: "\e94b";
}
.ico--loop:before {
content: "\e94c";
}
.ico--refresh:before {
content: "\e94d";
}
.ico--bullhorn:before {
content: "\e944";
}
.ico--bin:before {
content: "\e945";
}
.ico--cross:before {
content: "\e937";
}
.ico--checkbox-checked:before {
content: "\e938";
}
.ico--globe:before {
content: "\e93a";
}
.ico--wikipedia:before {
content: "\e93b";
}
.ico--youtube:before {
content: "\e936";
}
.ico--users:before {
content: "\e934";
}
.ico--book:before {
content: "\e935";
}
.ico--bubbles:before {
content: "\e930";
}
.ico--map:before {
content: "\e914";
}
.ico--compass:before {
content: "\e915";
}
.ico--folder-open:before {
content: "\e916";
}
.ico--folder:before {
content: "\e917";
}
.ico--drawer:before {
content: "\e918";
}
.ico--stop:before {
content: "\e919";
}
.ico--github:before {
content: "\e91a";
}
.ico--clock:before {
content: "\e91b";
}
.ico--calendar:before {
content: "\e91c";
}
.ico--flickr:before {
content: "\e91d";
}
.ico--instagram:before {
content: "\e91e";
}
.ico--twitter:before {
content: "\e91f";
}
.ico--newspaper:before {
content: "\e920";
}
.ico--cart:before {
content: "\e921";
}
.ico--home:before {
content: "\e922";
}
.ico--link:before {
content: "\e912";
}
.ico--power:before {
content: "\e90c";
}
.ico--rocket:before {
content: "\e946";
}
.ico--location:before {
content: "\e906";
}
.ico--phone:before {
content: "\e907";
}
.ico--linkedin:before {
content: "\e903";
}
.ico--facebook:before {
content: "\e902";
}
.ico--envelop:before {
content: "\e972";
}
.ico--bed:before {
content: "\e969";
}
.ico--train:before {
content: "\e96a";
}
.ico--bus:before {
content: "\e96b";
}
.ico--wheelchair:before {
content: "\e966";
}
.ico--thumbs-down:before {
content: "\e93d";
}
.ico--thumbs-up:before {
content: "\e93e";
}
.ico--anchor:before {
content: "\e92d";
}
.ico--paw:before {
content: "\e90b";
}
/* source-serif-4-regular - latin_latin-ext */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'Source Serif 4';
font-style: normal;
font-weight: 400;
src: url('./source-serif-4-v7-latin_latin-ext-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* source-serif-4-italic - latin_latin-ext */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'Source Serif 4';
font-style: italic;
font-weight: 400;
src: url('./source-serif-4-v7-latin_latin-ext-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* source-serif-4-700 - latin_latin-ext */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'Source Serif 4';
font-style: normal;
font-weight: 700;
src: url('./source-serif-4-v7-latin_latin-ext-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* source-serif-4-700italic - latin_latin-ext */
@font-face {
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
font-family: 'Source Serif 4';
font-style: italic;
font-weight: 700;
src: url('./source-serif-4-v7-latin_latin-ext-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}