diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/README.md b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/README.md new file mode 100644 index 000000000..4659d3b46 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/README.md @@ -0,0 +1,137 @@ +# Blog Module using Wagtail + +This module has a CMS integrated using Wagtail also provide a complete management dashboard as well as APIs for supporting mobile usercases. + + +Wagtail is currently compatible with Django 3.2, 4.1, 4.2, and 5.0. First, install the `wagtail` package from PyPI: + + +Add the package to your existing requirements file. This will also install the **Pillow** library as a dependency, which requires libjpeg and zlib - see Pillow's [platform-specific installation instructions](https://pillow.readthedocs.io/en/stable/installation.html#external-libraries). + +## Settings + +In your settings.py file, add the following apps to `INSTALLED_APPS`: + +```python +'wagtail.contrib.forms', +'wagtail.contrib.redirects', +'wagtail.embeds', +'wagtail.sites', +'wagtail.users', +'wagtail.snippets', +'wagtail.documents', +'wagtail.images', +'wagtail.search', +'wagtail.admin', +'wagtail', + +'modelcluster', +'taggit', +``` + +Add the following entry to `MIDDLEWARE`: + +```python +'wagtail.contrib.redirects.middleware.RedirectMiddleware', +``` + + +Add a `WAGTAIL_SITE_NAME` - this will be displayed on the main dashboard of the Wagtail admin backend: + +```python +WAGTAIL_SITE_NAME = 'My Example Site' +``` + +Add a `WAGTAILADMIN_BASE_URL` - this is the base URL used by the Wagtail admin site. It is typically used for generating URLs to include in notification emails: + +```python +WAGTAILADMIN_BASE_URL = 'http://example.com' +``` + +If this setting is not present, Wagtail will fall back to `request.site.root_url` or to the hostname of the request. Although this setting is not strictly required, it is highly recommended because leaving it out may produce unusable URLs in notification emails. + +Various other settings are available to configure Wagtail's behaviour - see [Settings](/reference/settings). + +## URL configuration + +Now make the following additions to your `{ProjectName}/urls.py` file: + +```python +from django.urls import path, include + +from wagtail.admin import urls as wagtailadmin_urls +from wagtail import urls as wagtail_urls +from wagtail.documents import urls as wagtaildocs_urls + +urlpatterns = [ + ... + path('cms/', include(wagtailadmin_urls)), + path('documents/', include(wagtaildocs_urls)), + path('pages/', include(wagtail_urls)), + ... +] +``` + + +```py +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [ + os.path.join(BASE_DIR, "web_build"), + os.path.join(BASE_DIR, "modules", "django_advanced_blog", "advanced_blog", "templates",), + ], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + "wagtail.contrib.settings.context_processors.settings", + ], + }, + }, +] +``` + +and + +```python +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, "static"), + os.path.join(BASE_DIR, "web_build"), + os.path.join(BASE_DIR, "modules", "django_advanced_blog", "advanced_blog", "static"), +] +``` + +## Your APIS are also configured + +### [http://localhost:8000/modules/basic-blog/api/v1/pages/](http://localhost:8000/modules/basic-blog/api/v1/pages/) + + +You can alter URL paths here to fit your project's URL scheme. + +`wagtailadmin_urls` provides the [admin interface](https://guide.wagtail.org/en-latest/concepts/wagtail-interfaces/#admin-interface) for Wagtail. This is separate from the Django admin interface, `django.contrib.admin`. Wagtail-only projects host the Wagtail admin at `/admin/`, but if this clashes with your project's existing admin backend then you can use an alternative path, such as `/cms/`. + +Wagtail serves your document files from the location, `wagtaildocs_urls`. You can omit this if you do not intend to use Wagtail's document management features. + +Wagtail serves your pages from the `wagtail_urls` location. In the above example, Wagtail handles URLs under `/pages/`, leaving your Django project to handle the root URL and other paths as normal. If you want Wagtail to handle the entire URL space including the root URL, then place `path('', include(wagtail_urls))` at the end of the `urlpatterns` list. Placing `path('', include(wagtail_urls))` at the end of the `urlpatterns` ensures that it doesn't override more specific URL patterns. + +Finally, you need to set up your project to serve user-uploaded files from `MEDIA_ROOT`. Your Django project may already have this in place, but if not, add the following snippet to `urls.py`: + + + +Note that this only works in development mode (`DEBUG = True`); in production, you have to configure your web server to serve files from `MEDIA_ROOT`. For further details, see the Django documentation: [Serving files uploaded by a user during development](https://docs.djangoproject.com/en/stable/howto/static-files/#serving-files-uploaded-by-a-user-during-development) and [Deploying static files](django:howto/static-files/deployment). + +With this configuration in place, you are ready to run `python manage.py migrate` to create the database tables used by Wagtail. + +## User accounts + +Wagtail uses Django’s default user model by default. Superuser accounts receive automatic access to the Wagtail [admin interface](https://guide.wagtail.org/en-latest/concepts/wagtail-interfaces/#admin-interface); use `python manage.py createsuperuser` if you don't already have one. Wagtail supports custom user models with some restrictions. Wagtail uses an extension of Django's permissions framework, so your user model must at minimum inherit from `AbstractBaseUser` and `PermissionsMixin`. + +## Start developing + +You're now ready to add a new app to your Django project through `python manage.py startapp`. Remember to add the new app to `INSTALLED_APPS` in your settings.py file and set up page models, as described in [Your first Wagtail site](/getting_started/tutorial). + +Note that there's one small difference when you're not using the Wagtail project template: Wagtail creates an initial homepage of the basic type `Page`, which doesn't include any content fields beyond the title. You probably want to replace this with your own `HomePage` class. If you do so, ensure that you set up a site record (under Settings / Sites in the Wagtail admin) to point to the new homepage. \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/__init__.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/admin.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/admin.py new file mode 100644 index 000000000..e2a53a897 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# your admin configuration here \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/api.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/api.py new file mode 100644 index 000000000..3ac195dd0 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/api.py @@ -0,0 +1,15 @@ +from wagtail.api.v2.router import WagtailAPIRouter +from wagtail.api.v2.views import PagesAPIViewSet +from wagtail.documents.api.v2.views import DocumentsAPIViewSet +from wagtail.images.api.v2.views import ImagesAPIViewSet + +# Create the router. "wagtailapi" is the URL namespace +api_router = WagtailAPIRouter("wagtailapi") + +# Add the three endpoints using the "register_endpoint" method. +# The first parameter is the name of the endpoint (eg. pages, images). This +# is used in the URL of the endpoint +# The second parameter is the endpoint class that handles the requests +api_router.register_endpoint("pages", PagesAPIViewSet) +api_router.register_endpoint("images", ImagesAPIViewSet) +api_router.register_endpoint("documents", DocumentsAPIViewSet) \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/apps.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/apps.py new file mode 100644 index 000000000..e69de29bb diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/blocks.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/blocks.py new file mode 100644 index 000000000..cb09c75fb --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/blocks.py @@ -0,0 +1,79 @@ +from wagtail.blocks import ( + CharBlock, + ChoiceBlock, + RichTextBlock, + StreamBlock, + StructBlock, + TextBlock, +) +from wagtail.embeds.blocks import EmbedBlock +from wagtail.images.blocks import ImageChooserBlock + + +class ImageBlock(StructBlock): + """ + Custom `StructBlock` for utilizing images with associated caption and + attribution data + """ + + image = ImageChooserBlock(required=True) + caption = CharBlock(required=False) + attribution = CharBlock(required=False) + + class Meta: + icon = "image" + template = "blocks/image_block.html" + + +class HeadingBlock(StructBlock): + """ + Custom `StructBlock` that allows the user to select h2 - h4 sizes for headers + """ + + heading_text = CharBlock(classname="title", required=True) + size = ChoiceBlock( + choices=[ + ("", "Select a header size"), + ("h2", "H2"), + ("h3", "H3"), + ("h4", "H4"), + ], + blank=True, + required=False, + ) + + class Meta: + icon = "title" + template = "blocks/heading_block.html" + + +class BlockQuote(StructBlock): + """ + Custom `StructBlock` that allows the user to attribute a quote to the author + """ + + text = TextBlock() + attribute_name = CharBlock(blank=True, required=False, label="e.g. Mary Berry") + + class Meta: + icon = "openquote" + template = "blocks/blockquote.html" + + +# StreamBlocks +class BaseStreamBlock(StreamBlock): + """ + Define the custom blocks that `StreamField` will utilize + """ + + heading_block = HeadingBlock() + paragraph_block = RichTextBlock( + icon="pilcrow", template="blocks/paragraph_block.html" + ) + image_block = ImageBlock() + block_quote = BlockQuote() + embed_block = EmbedBlock( + help_text="Insert an embed URL e.g https://www.youtube.com/watch?v=SGJFWirQ3ks", + icon="media", + template="blocks/embed_block.html", + ) \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/migrations/0001_initial.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/migrations/0001_initial.py new file mode 100644 index 000000000..470007345 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/migrations/0001_initial.py @@ -0,0 +1,46 @@ +# Generated by Django 3.2.23 on 2023-12-08 18:27 + +from django.db import migrations, models +import django.db.models.deletion +import modelcluster.fields +import wagtail.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wagtailcore', '0089_log_entry_data_json_null_to_object'), + ('wagtailimages', '0025_alter_image_file_alter_rendition_file'), + ] + + operations = [ + migrations.CreateModel( + name='BlogPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('body', wagtail.fields.RichTextField()), + ('date', models.DateField(verbose_name='Post date')), + ('feed_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image')), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + migrations.CreateModel( + name='BlogPageRelatedLink', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), + ('name', models.CharField(max_length=255)), + ('url', models.URLField()), + ('page', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='related_links', to='advanced_blog.blogpage')), + ], + options={ + 'ordering': ['sort_order'], + 'abstract': False, + }, + ), + ] diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/migrations/0002_auto_20231208_1925.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/migrations/0002_auto_20231208_1925.py new file mode 100644 index 000000000..d23a9c308 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/migrations/0002_auto_20231208_1925.py @@ -0,0 +1,129 @@ +# Generated by Django 3.2.23 on 2023-12-08 19:25 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import modelcluster.contrib.taggit +import modelcluster.fields +import wagtail.blocks +import wagtail.contrib.routable_page.models +import wagtail.embeds.blocks +import wagtail.fields +import wagtail.images.blocks +import wagtail.models +import wagtail.search.index + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailimages', '0025_alter_image_file_alter_rendition_file'), + ('wagtailcore', '0089_log_entry_data_json_null_to_object'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('taggit', '0005_auto_20220424_2025'), + ('advanced_blog', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='blogpage', + name='date', + ), + migrations.RemoveField( + model_name='blogpage', + name='feed_image', + ), + migrations.AddField( + model_name='blogpage', + name='date_published', + field=models.DateField(blank=True, null=True, verbose_name='Date article published'), + ), + migrations.AddField( + model_name='blogpage', + name='image', + field=models.ForeignKey(blank=True, help_text='Landscape mode only; horizontal width between 1000px and 3000px.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image'), + ), + migrations.AddField( + model_name='blogpage', + name='introduction', + field=models.TextField(blank=True, help_text='Text to describe the page'), + ), + migrations.AddField( + model_name='blogpage', + name='subtitle', + field=models.CharField(blank=True, max_length=255), + ), + migrations.AlterField( + model_name='blogpage', + name='body', + field=wagtail.fields.StreamField([('heading_block', wagtail.blocks.StructBlock([('heading_text', wagtail.blocks.CharBlock(form_classname='title', required=True)), ('size', wagtail.blocks.ChoiceBlock(blank=True, choices=[('', 'Select a header size'), ('h2', 'H2'), ('h3', 'H3'), ('h4', 'H4')], required=False))])), ('paragraph_block', wagtail.blocks.RichTextBlock(icon='pilcrow', template='blocks/paragraph_block.html')), ('image_block', wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(required=True)), ('caption', wagtail.blocks.CharBlock(required=False)), ('attribution', wagtail.blocks.CharBlock(required=False))])), ('block_quote', wagtail.blocks.StructBlock([('text', wagtail.blocks.TextBlock()), ('attribute_name', wagtail.blocks.CharBlock(blank=True, label='e.g. Mary Berry', required=False))])), ('embed_block', wagtail.embeds.blocks.EmbedBlock(help_text='Insert an embed URL e.g https://www.youtube.com/watch?v=SGJFWirQ3ks', icon='media', template='blocks/embed_block.html'))], blank=True, use_json_field=True, verbose_name='Page body'), + ), + migrations.CreateModel( + name='Person', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('live', models.BooleanField(default=True, editable=False, verbose_name='live')), + ('has_unpublished_changes', models.BooleanField(default=False, editable=False, verbose_name='has unpublished changes')), + ('first_published_at', models.DateTimeField(blank=True, db_index=True, null=True, verbose_name='first published at')), + ('last_published_at', models.DateTimeField(editable=False, null=True, verbose_name='last published at')), + ('go_live_at', models.DateTimeField(blank=True, null=True, verbose_name='go live date/time')), + ('expire_at', models.DateTimeField(blank=True, null=True, verbose_name='expiry date/time')), + ('expired', models.BooleanField(default=False, editable=False, verbose_name='expired')), + ('locked', models.BooleanField(default=False, editable=False, verbose_name='locked')), + ('locked_at', models.DateTimeField(editable=False, null=True, verbose_name='locked at')), + ('first_name', models.CharField(max_length=254, verbose_name='First name')), + ('last_name', models.CharField(max_length=254, verbose_name='Last name')), + ('job_title', models.CharField(max_length=254, verbose_name='Job title')), + ('image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image')), + ('latest_revision', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailcore.revision', verbose_name='latest revision')), + ('live_revision', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailcore.revision', verbose_name='live revision')), + ('locked_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='locked_persons', to=settings.AUTH_USER_MODEL, verbose_name='locked by')), + ], + options={ + 'verbose_name': 'Person', + 'verbose_name_plural': 'People', + }, + bases=(wagtail.models.WorkflowMixin, wagtail.models.PreviewableMixin, wagtail.search.index.Indexed, models.Model), + ), + migrations.CreateModel( + name='BlogPersonRelationship', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), + ('page', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='blog_person_relationship', to='advanced_blog.blogpage')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_blog_relationship', to='advanced_blog.person')), + ], + options={ + 'ordering': ['sort_order'], + 'abstract': False, + }, + ), + migrations.CreateModel( + name='BlogPageTag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content_object', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='tagged_items', to='advanced_blog.blogpage')), + ('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='advanced_blog_blogpagetag_items', to='taggit.tag')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='BlogIndexPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('introduction', models.TextField(blank=True, help_text='Text to describe the page')), + ('image', models.ForeignKey(blank=True, help_text='Landscape mode only; horizontal width between 1000px and 3000px.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image')), + ], + options={ + 'abstract': False, + }, + bases=(wagtail.contrib.routable_page.models.RoutablePageMixin, 'wagtailcore.page'), + ), + migrations.AddField( + model_name='blogpage', + name='tags', + field=modelcluster.contrib.taggit.ClusterTaggableManager(blank=True, help_text='A comma-separated list of tags.', through='advanced_blog.BlogPageTag', to='taggit.Tag', verbose_name='Tags'), + ), + ] diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/migrations/__init__.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/models.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/models.py new file mode 100644 index 000000000..71664cc64 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/models.py @@ -0,0 +1,360 @@ +from django.db import models + +from modelcluster.fields import ParentalKey +from django.utils.translation import gettext as _ +from wagtail.models import Page, Orderable +from wagtail.admin.panels import FieldPanel, MultiFieldPanel +from wagtail.search import index + +from django.contrib import messages +from django.db import models +from django.shortcuts import redirect, render +from modelcluster.contrib.taggit import ClusterTaggableManager +from modelcluster.fields import ParentalKey +from taggit.models import Tag, TaggedItemBase +from wagtail.admin.panels import FieldPanel, MultipleChooserPanel +from wagtail.contrib.routable_page.models import RoutablePageMixin, route +from wagtail.fields import StreamField +from wagtail.models import Orderable, Page +from wagtail.search import index +from modelcluster.models import ClusterableModel + +from wagtail.models import ( + DraftStateMixin, + LockableMixin, + Page, + PreviewableMixin, + RevisionMixin, + WorkflowMixin, +) + +from wagtail.admin.panels import ( + FieldPanel, + FieldRowPanel, + MultiFieldPanel, + PublishingPanel, +) +from wagtail.search import index + +from .blocks import BaseStreamBlock + +from .blocks import BaseStreamBlock + + +from wagtail.snippets.models import register_snippet + +@register_snippet +class Person( + WorkflowMixin, + DraftStateMixin, + LockableMixin, + RevisionMixin, + PreviewableMixin, + index.Indexed, + ClusterableModel, +): + """ + A Django model to store Person objects. + It is registered using `register_snippet` as a function in wagtail_hooks.py + to allow it to have a menu item within a custom menu item group. + + `Person` uses the `ClusterableModel`, which allows the relationship with + another model to be stored locally to the 'parent' model (e.g. a PageModel) + until the parent is explicitly saved. This allows the editor to use the + 'Preview' button, to preview the content, without saving the relationships + to the database. + https://github.com/wagtail/django-modelcluster + """ + + first_name = models.CharField("First name", max_length=254) + last_name = models.CharField("Last name", max_length=254) + job_title = models.CharField("Job title", max_length=254) + + image = models.ForeignKey( + "wagtailimages.Image", + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="+", + ) + + panels = [ + MultiFieldPanel( + [ + FieldRowPanel( + [ + FieldPanel("first_name"), + FieldPanel("last_name"), + ] + ) + ], + "Name", + ), + FieldPanel("job_title"), + FieldPanel("image"), + PublishingPanel(), + ] + + search_fields = [ + index.SearchField("first_name"), + index.SearchField("last_name"), + index.FilterField("job_title"), + index.AutocompleteField("first_name"), + index.AutocompleteField("last_name"), + ] + + @property + def thumb_image(self): + # Returns an empty string if there is no profile pic or the rendition + # file can't be found. + try: + return self.image.get_rendition("fill-50x50").img_tag() + except: # noqa: E722 FIXME: remove bare 'except:' + return "" + + @property + def preview_modes(self): + return PreviewableMixin.DEFAULT_PREVIEW_MODES + [("blog_post", _("Blog post"))] + + def __str__(self): + return "{} {}".format(self.first_name, self.last_name) + + def get_preview_template(self, request, mode_name): + + if mode_name == "blog_post": + return BlogPage.template + return "base/preview/person.html" + + def get_preview_context(self, request, mode_name): + + context = super().get_preview_context(request, mode_name) + if mode_name == self.default_preview_mode: + return context + + page = BlogPage.objects.filter(blog_person_relationship__person=self).first() + if page: + # Use the page authored by this person if available, + # and replace the instance from the database with the edited instance + page.authors = [ + self if author.pk == self.pk else author for author in page.authors() + ] + # The authors() method only shows live authors, so make sure the instance + # is included even if it's not live as this is just a preview + if not self.live: + page.authors.append(self) + else: + # Otherwise, get the first page and simulate the person as the author + page = BlogPage.objects.first() + page.authors = [self] + + context["page"] = page + return context + + class Meta: + verbose_name = "Person" + verbose_name_plural = "People" + + +@register_snippet +class BlogPersonRelationship(Orderable, models.Model): + """ + This defines the relationship between the `Person` within the `base` + app and the BlogPage below. This allows people to be added to a BlogPage. + + We have created a two way relationship between BlogPage and Person using + the ParentalKey and ForeignKey + """ + + page = ParentalKey( + "BlogPage", related_name="blog_person_relationship", on_delete=models.CASCADE + ) + person = models.ForeignKey( + "Person", related_name="person_blog_relationship", on_delete=models.CASCADE + ) + panels = [FieldPanel("person")] + +class BlogPageTag(TaggedItemBase): + """ + This model allows us to create a many-to-many relationship between + the BlogPage object and tags. There's a longer guide on using it at + https://docs.wagtail.org/en/stable/reference/pages/model_recipes.html#tagging + """ + + content_object = ParentalKey( + "BlogPage", related_name="tagged_items", on_delete=models.CASCADE + ) + + +class BlogPage(Page): + + # Database fields + + introduction = models.TextField(help_text="Text to describe the page", blank=True) + image = models.ForeignKey( + "wagtailimages.Image", + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="+", + help_text="Landscape mode only; horizontal width between 1000px and 3000px.", + ) + body = StreamField( + BaseStreamBlock(), verbose_name="Page body", blank=True, use_json_field=True + ) + subtitle = models.CharField(blank=True, max_length=255) + tags = ClusterTaggableManager(through=BlogPageTag, blank=True) + date_published = models.DateField("Date article published", blank=True, null=True) + + content_panels = Page.content_panels + [ + FieldPanel("subtitle"), + FieldPanel("introduction"), + FieldPanel("image"), + FieldPanel("body"), + FieldPanel("date_published"), + MultipleChooserPanel( + "blog_person_relationship", + chooser_field_name="person", + heading="Authors", + label="Author", + panels=None, + min_num=1, + ), + FieldPanel("tags"), + ] + + search_fields = Page.search_fields + [ + index.SearchField("body"), + ] + + def authors(self): + """ + Returns the BlogPage's related people. Again note that we are using + the ParentalKey's related_name from the BlogPersonRelationship model + to access these objects. This allows us to access the Person objects + with a loop on the template. If we tried to access the blog_person_ + relationship directly we'd print `blog.BlogPersonRelationship.None` + """ + # Only return authors that are not in draft + return [ + n.person + for n in self.blog_person_relationship.filter( + person__live=True + ).select_related("person") + ] + + @property + def get_tags(self): + """ + Similar to the authors function above we're returning all the tags that + are related to the blog post into a list we can access on the template. + We're additionally adding a URL to access BlogPage objects with that tag + """ + tags = self.tags.all() + base_url = self.get_parent().url + for tag in tags: + tag.url = f"{base_url}tags/{tag.slug}/" + return tags + + # Specifies parent to BlogPage as being BlogIndexPages + parent_page_types = ["BlogIndexPage"] + + # Specifies what content types can exist as children of BlogPage. + # Empty list means that no child content types are allowed. + subpage_types = [] + + + +class BlogPageRelatedLink(Orderable): + page = ParentalKey(BlogPage, on_delete=models.CASCADE, related_name='related_links') + name = models.CharField(max_length=255) + url = models.URLField() + + panels = [ + FieldPanel('name'), + FieldPanel('url'), + ] + + +class BlogIndexPage(RoutablePageMixin, Page): + """ + Index page for blogs. + We need to alter the page model's context to return the child page objects, + the BlogPage objects, so that it works as an index page + + RoutablePageMixin is used to allow for a custom sub-URL for the tag views + defined above. + """ + + introduction = models.TextField(help_text="Text to describe the page", blank=True) + image = models.ForeignKey( + "wagtailimages.Image", + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="+", + help_text="Landscape mode only; horizontal width between 1000px and 3000px.", + ) + + content_panels = Page.content_panels + [ + FieldPanel("introduction"), + FieldPanel("image"), + ] + + # Specifies that only BlogPage objects can live under this index page + subpage_types = ["BlogPage"] + + # Defines a method to access the children of the page (e.g. BlogPage + # objects). On the demo site we use this on the HomePage + def children(self): + return self.get_children().specific().live() + + # Overrides the context to list all child items, that are live, by the + # date that they were published + # https://docs.wagtail.org/en/stable/getting_started/tutorial.html#overriding-context + def get_context(self, request): + context = super(BlogIndexPage, self).get_context(request) + context["posts"] = ( + BlogPage.objects.descendant_of(self).live().order_by("-date_published") + ) + return context + + # This defines a Custom view that utilizes Tags. This view will return all + # related BlogPages for a given Tag or redirect back to the BlogIndexPage. + # More information on RoutablePages is at + # https://docs.wagtail.org/en/stable/reference/contrib/routablepage.html + @route(r"^tags/$", name="tag_archive") + @route(r"^tags/([\w-]+)/$", name="tag_archive") + def tag_archive(self, request, tag=None): + + try: + tag = Tag.objects.get(slug=tag) + except Tag.DoesNotExist: + if tag: + msg = 'There are no blog posts tagged with "{}"'.format(tag) + messages.add_message(request, messages.INFO, msg) + return redirect(self.url) + + posts = self.get_posts(tag=tag) + context = {"self": self, "tag": tag, "posts": posts} + return render(request, "blog/blog_index_page.html", context) + + def serve_preview(self, request, mode_name): + # Needed for previews to work + return self.serve(request) + + # Returns the child BlogPage objects for this BlogPageIndex. + # If a tag is used then it will filter the posts by tag. + def get_posts(self, tag=None): + posts = BlogPage.objects.live().descendant_of(self) + if tag: + posts = posts.filter(tags=tag) + return posts + + # Returns the list of Tags for all child posts of this BlogPage. + def get_child_tags(self): + tags = [] + for post in self.get_posts(): + # Not tags.append() because we don't want a list of lists + tags += post.get_tags + tags = sorted(set(tags)) + return tags \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/options.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/options.py new file mode 100644 index 000000000..c37a93888 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/options.py @@ -0,0 +1,3 @@ +# Define variables here +# VARIABLE = 'value' +# or get from environment \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/serializers.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/serializers.py new file mode 100644 index 000000000..2a9e6bdd5 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/serializers.py @@ -0,0 +1,3 @@ +from rest_framework import serializers + +# your serializer here diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/css/blog-main.css b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/css/blog-main.css new file mode 100644 index 000000000..129d78c68 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/css/blog-main.css @@ -0,0 +1,2105 @@ +/* + +The bakery demo avoids using tooling so doesn't use SASS. This is a static +CSS file that extends Bootstrap. It's deliberately verbose to aid +readability with global themes, themes for each list view and themes for +each detail view +1. Global styles --------------------------------------------------------- +2. Page header ----------------------------------------------------------- +3. Main menu ------------------------------------------------------------- +4. Breadcrumb ------------------------------------------------------------ +5. Location styles ------------------------------------------------------- +6. Blog styles ----------------------------------------------------------- +7. Bread styles ---------------------------------------------------------- +8. Form styles ----------------------------------------------------------- +9. Homepage styles ------------------------------------------------------- +9. Miscellaneous/ Helper styles ------------------------------------------ + +*/ + +/* Global styles */ + +/* CSS Variables */ +:root { + --dark: #333; + --grey: #6e6e6e; + --border-grey: #e1dcd3; + --transparent-border: rgb(135 116 79 / 25%); + --white: #fff; + --cream: #f5f3e9; + --light-brown: #87744f; + --mid-brown: #825600; + --dark-brown: #553801; + --orange: #c55302; + --dark-orange: #833701; + --font--primary: 'Marcellus', serif; + /* stylelint-disable */ + --font--secondary: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, + Roboto, 'Helvetica Neue', Arial, sans-serif, Apple Color Emoji, + 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + /* stylelint-enable */ + --font-sm: 1rem; + --font-md: 1.125rem; +} + +html { + font-size: 16px; +} + +[hidden] { + display: none !important; +} + +/* Body */ + +body { + font-family: var(--font--secondary); + font-size: 1rem; + line-height: 1.5; + padding-top: 0; + padding-bottom: 0; + background: var(--white); + color: var(--dark); + min-height: 100vh; +} + +body.no-scroll { + overflow-y: hidden; +} + +@media (min-width: 768px) { + body { + font-size: var(--font-md); + line-height: 1.55; + } +} + +/* Headings and Paragraphs */ + +h1, +h2, +h3 { + font-family: var(--font--primary); + font-weight: 400; + color: var(--dark); +} + +h1 { + font-size: 2.375rem; + line-height: 1.16; +} + +h2 { + font-size: 2rem; + line-height: 1.25; +} + +h3 { + font-size: 1.625rem; + line-height: 1.15; +} + +h4 { + font-family: var(--font--secondary); + font-style: normal; + font-weight: 600; + font-size: 1.25rem; + line-height: 1.35; + color: var(--dark); +} + +p { + font-family: var(--font--secondary); + font-style: normal; + font-weight: 400; + font-size: var(--font-sm); + line-height: 1.5; + color: var(--dark); +} + +@media (min-width: 768px) { + body { + font-size: var(--font-md); + line-height: 1.55; + } + + h1 { + font-size: 3.75rem; + line-height: 1.07; + } + + h2 { + font-size: 2.875rem; + line-height: 1.09; + } + + h3 { + font-size: 2rem; + line-height: 1.31; + } + + h4 { + font-size: 1.5rem; + line-height: 1.38; + } + + p { + font-size: var(--font-md); + line-height: 1.55; + margin: 0 0 30px; + } +} + +ol, +ul { + margin-bottom: 30px; +} + +.hero h1 { + color: var(--white); + position: relative; +} + +@media (min-width: 768px) { + .intro { + font-size: 1.875rem; + margin: 0 0 60px; + } +} + +/* Links, Lists, Figures */ + +a, +a:focus, +a:visited { + color: var(--orange); + text-decoration: none; +} + +a:hover { + color: var(--dark-orange); + text-decoration: none; +} + +a.btn { + background-color: var(--orange); + color: var(--white); + display: inline-block; + font-family: var(--font--secondary); + font-size: var(--font-md); + line-height: 1.55; + font-weight: 700; + padding: 15px 20px; +} + +a.btn:hover { + background-color: var(--grey); + color: var(--white); +} + +a.btn-sm { + border-radius: 4px; + font-size: 1rem; + line-height: normal; + padding: 6px 8px; +} + +ul { + margin: 0 0 30px; +} + +@media (min-width: 768px) { + ul { + margin: 0 0 50px; + } +} + +figure { + margin: 30px 0; + position: relative; +} + +@media (min-width: 768px) { + figure { + margin: 40px 0; + } +} + +figcaption { + color: var(--grey); + font-family: var(--font--secondary); + font-size: 0.875rem; + line-height: 1.57; + padding-top: 10px; +} + +@media (min-width: 768px) { + figcaption { + font-size: var(--font-sm); + line-height: 1.5; + } +} + +img { + display: block; + width: 100%; + height: auto; +} + +figure img { + display: block; + width: 100%; + height: auto; +} + +/* Generic detail page styles */ +.intro { + font-family: var(--font--secondary); + font-weight: 300; + margin: 0 0 40px; + font-size: 1.375rem; +} + +.alert { + margin: 40px auto 0; + max-width: 1400px; + border-radius: 0; + background-color: var(--orange); + color: var(--white); + padding: 40px; +} + +.alert > .alert__title { + color: var(--white); + font-family: var(--font--primary); + font-size: 1.625rem; + margin-bottom: 5px; +} + +.alert__messages { + list-style-type: none; + margin: 0; + padding-left: 0; +} + +/* Hero image area */ +.hero { + padding: 300px 0 0; + position: relative; + margin: 0 0 10px; +} + +.hero-image { + position: absolute; + top: 0; + width: 100%; + height: 100%; + object-fit: cover; +} + +@media screen and (min-width: 768px) { + .hero { + padding: 250px 0 0; + margin: 0; + } + + .hero.hero--blog { + padding: 400px 0 0; + } +} + +.hero-gradient-mask { + position: absolute; + width: 100%; + height: 100%; + bottom: 0; + background: linear-gradient(0deg, #000 11.33%, rgb(0 0 0 / 0%) 100%); +} + +@media (min-width: 768px) { + .hero-gradient-mask { + background: linear-gradient(90deg, #000 11.33%, rgb(0 0 0 / 0%) 100%); + } +} + +.hero__container { + width: 100%; + padding: 30px 20px 100px; + background-color: var(--orange); + margin: 0 auto; +} + +@media (min-width: 768px) { + .hero__container { + background-color: transparent; + max-width: 1400px; + padding: 0 40px; + } +} + +.hero__title { + color: var(--white); + font-weight: 400; + font-size: 2.875rem; + line-height: 1.09; + margin: 0; + width: 100%; +} + +@media (min-width: 768px) { + .hero__title { + background-color: var(--orange); + width: max-content; + max-width: 100%; + font-size: 6.25rem; + line-height: 0.64; + padding: 75px 65px; + position: absolute; + bottom: 0; + left: 0; + transform: translateY(50%); + } +} + +blockquote { + border-left: 3px solid var(--orange); + margin: 40px 0 30px; + padding: 0 0 0 20px; +} + +blockquote .text { + color: var(--orange); + margin: 0 0 30px; + font-family: var(--font--primary); + font-size: 1.625rem; + line-height: 1.15; +} + +blockquote .attribute-name { + color: var(--dark); + font-size: var(--font-md); + line-height: 1.56; + margin: 0; + padding: 0; +} + +@media (min-width: 768px) { + blockquote { + border-left: 3px solid var(--orange); + margin: 50px 0; + padding: 0 40px; + } + + blockquote .text { + font-size: 2rem; + line-height: 1.31; + } +} + +/* Richtext Styles */ +/* stylelint-disable-next-line selector-class-pattern */ +.block-paragraph_block p { + color: var(--dark); +} + +/* stylelint-disable-next-line selector-class-pattern */ +.block-paragraph_block a { + text-decoration: underline; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.block-embed_block iframe { + aspect-ratio: 16 / 9; + width: 100%; + height: 100%; +} + +/* stylelint-disable-next-line selector-class-pattern */ +.block-paragraph_block iframe { + aspect-ratio: 16 / 9; + width: 100%; + height: 100%; +} + +/* stylelint-disable-next-line selector-class-pattern */ +:is(.block-table_block, .block-typed_table_block) :is(table, tr, td, th) { + border: 1px solid var(--dark); + padding: 0.25em; +} + +/* stylelint-disable-next-line selector-class-pattern */ +:is(.block-table_block, .block-typed_table_block) table { + margin-bottom: 30px; +} + +@media screen and (min-width: 768px) { + .header, + .footer { + padding-right: 0; + padding-left: 0; + } +} + +/* Page header */ +.header { + padding: 0; + width: 100%; + background: var(--white); + z-index: 10; +} + +.index-header__title { + color: var(--dark); + font-weight: 400; + font-size: 2.875rem; + line-height: 1.09; + margin-top: 30px; +} + +.index-header__introduction { + color: var(--dark); + font-family: var(--font--primary); + font-weight: 400; + font-size: 1.625rem; + line-height: 1.15; + margin-top: 20px; + margin-bottom: 60px; +} + +.index-header__introduction.index-header__introduction--blog { + margin-bottom: 20px; +} + +.index-header__body-introduction p:first-child { + color: var(--dark); + font-family: var(--font--primary); + font-weight: 400; + font-size: 1.625rem; + line-height: 30px; + margin-top: 20px; + margin-bottom: 30px; +} + +.index-header__body-introduction { + margin-bottom: 30px; +} + +@media (min-width: 768px) { + .index-header__title { + font-size: 6.25rem; + line-height: 0.64; + margin-top: 70px; + } + + .index-header__introduction { + font-size: 2rem; + line-height: 1.31; + margin-top: 40px; + margin-bottom: 40px; + } + + .index-header__body-introduction p:first-child { + font-size: 2rem; + line-height: 42px; + margin-top: 40px; + margin-bottom: 40px; + } + + .index-header__body-introduction { + margin-bottom: 30px; + } + + .index-header__title.index-header__title--blog { + line-height: 1.1; + } +} + +/* Main menu */ +.navigation { + display: flex; + flex-direction: row; + align-items: center; + padding: 25px 0; +} + +.navigation__mobile { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--white); + z-index: 10; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding-top: 80px; +} + +.navigation__mobile-toggle { + background-color: transparent; + border: none; + margin: 0 0 0 auto; +} + +.navigation__mobile-toggle[aria-expanded='true'] { + position: absolute; + z-index: 15; + top: 30px; + right: 20px; +} + +@media (min-width: 1150px) { + .navigation__mobile { + display: none; + } +} + +.navigation__mobile-toggle[aria-expanded='true'] .navigation__toggle-icon-bar { + opacity: 0; +} + +.navigation__mobile-toggle[aria-expanded='true'] + .navigation__toggle-icon-bar:first-of-type { + transform: translateY(10px) rotate(45deg); + opacity: 1; +} + +.navigation__mobile-toggle[aria-expanded='true'] + .navigation__toggle-icon-bar:last-child { + transform: translateY(-10px) rotate(-45deg); + opacity: 1; +} + +.navigation__mobile-search { + margin-top: 20px; + position: relative; +} + +.navigation__search { + display: none; + margin: 15px 0 0; + position: relative; +} + +.navigation__search-icon { + display: block; + position: absolute; + right: 13px; + top: 13px; +} + +@media (min-width: 768px) { + .navigation__search-icon { + top: 11px; + } +} + +.navigation__search-input { + color: var(--dark); + font-size: var(--font-sm); + line-height: 1.5; + border: 1px solid var(--dark); + padding: 10px; +} + +.navigation__items { + list-style: none; + margin: 0; + padding: 20px 0 0; +} + +.navigation__desktop { + display: none; +} + +@media (min-width: 1150px) { + .navigation__desktop { + display: block; + } + + .navigation__search { + display: block; + margin: 0 0 0 auto; + } + + .navigation__items { + padding: 0 0 0 20px; + } +} + +.navigation__items > li { + padding: 10px 0; +} + +.navigation__items > li > a { + color: var(--dark); + font-family: var(--font--secondary); + font-size: var(--font-md); + line-height: 1.55; + padding: 10px 0; +} + +@media (min-width: 1150px) { + .navigation__items { + display: block; + } + + .navigation__items > li { + padding: 0 0 0 20px; + } + + .navigation__items > li > a { + padding: 10px; + } + + .navigation__items > li:first-child { + padding: 0 0 0 20px; + } +} + +/* N.B. We're overriding Bootstrap's default nav styles here, + these rules set what the currently active nav tab looks like. */ +.navigation__items > li.active > a, +.navigation__items > li.active > a:focus, +.navigation__items > li.active > a:hover { + color: var(--dark); + border-radius: 0; + border: none; + background-color: transparent; +} + +.navigation__items > li:hover, +.navigation__items > li > a:focus, +.navigation__items > li > a:hover { + text-decoration: underline; +} + +/* Required as bootstrap nav automatically hides this otherwise */ +@media (min-width: 768px) { + .navigation__mobile-toggle { + display: block; + } +} + +@media (min-width: 1150px) { + .navigation__mobile-toggle { + display: none; + } +} + +.navigation__toggle-icon-bar { + background-color: var(--dark); + width: 30px; + height: 2px; + margin-bottom: 8px; + display: block; +} + +.navigation__toggle-icon-bar:last-child { + margin-bottom: 0; +} + +.collapse.in { + padding: 0; +} + +@media (max-width: 1150px) { + .collapse.in { + flex-basis: 100%; + overflow-y: hidden; + } + + .collapse.in .navigation__items { + display: block; + } +} + +.navigation__logo, +.navigation__logo:visited, +.navigation__logo:focus { + display: inline-block; + color: var(--dark); + font-family: var(--font--primary); + font-weight: 400; + font-size: 1.5rem; + line-height: 1.25; + margin: 0; + position: relative; +} + +@media (min-width: 1150px) { + .navigation__logo::after { + content: ''; + position: absolute; + right: -20px; + top: -5px; + bottom: 0; + width: 1px; + height: 42px; + background-color: var(--border-grey); + } +} + +.dropdown-menu { + background-color: var(--cream); + border-radius: 0; + border: transparent; +} + +.dropdown-menu > li > a { + border-bottom: 1px solid var(--border-grey); + color: var(--dark); + font-family: var(--font--secondary); + padding: 10px 20px; +} + +.dropdown-menu > li > a:hover { + text-decoration: underline; +} + +/* Menu dropdown hack to allow toggling */ +li.has-submenu a.allow-toggle { + float: left; + padding-right: 0; +} + +.caret-custom { + float: right; + padding: 10px 10px 15px 5px !important; +} + +.caret-custom::after { + content: '▼' !important; +} + +/* Mobile menu styling */ +@media (max-width: 1150px) { + .nav-pills > .presentation { + float: none; + width: 100%; + } +} + +/* Custom page footer */ +hr { + margin: 0; + border-top: 1px solid var(--light-brown); + opacity: 0.25; +} + +footer { + padding: 55px 0 30px; + background-color: var(--white); +} + +.footer__icon a { + display: inline-grid; + background-color: var(--cream); + color: var(--orange); + padding: 0.5rem; + border-radius: 50%; +} + +.copyright p { + color: var(--dark); + font-family: var(--font--secondary); + font-size: var(--font-sm); + line-height: 1.5; +} + +@media (min-width: 768px) { + .copyright p { + font-size: var(--font-md); + line-height: 1.55; + } +} + +.container { + width: auto; + padding-left: 20px; + padding-right: 20px; +} + +@media (min-width: 768px) { + .container { + max-width: 1400px; + padding-left: 40px; + padding-right: 40px; + } +} + +.container-narrow > hr { + margin: 30px 0; +} + +/* Breadcrumbs */ +.breadcrumb-container { + position: relative; + z-index: 3; + margin-bottom: 15px; +} + +.breadcrumb { + color: var(--dark); + font-family: var(--font--secondary); + font-size: var(--font-sm); + line-height: 1.5; + margin-bottom: 0; + padding-left: 0; + background-color: transparent; +} + +.breadcrumb > li + li::before { + display: none; +} + +.breadcrumb__chevron-icon { + width: 8px; + height: 16px; + margin: 0 10px; +} + +.breadcrumb__chevron-icon path { + fill: var(--dark); +} + +.breadcrumb a, +.breadcrumb .active { + color: var(--dark); + text-decoration: underline; +} + +.breadcrumb a:hover { + color: var(--dark-orange); +} + +/* Pagination navigation */ +.pagination { + display: block; + margin: 0 auto 40px; +} + +.pagination__list { + display: flex; + width: 100%; + justify-content: center; + gap: 20px; + list-style-type: none; + padding-left: 0; +} + +.pagination .page-item a { + text-transform: capitalize; + text-decoration: underline; +} + +.pagination .page-item.active span { + color: var(--grey); +} + +.pagination .page-item.disabled a { + color: var(--grey); + text-decoration: none; + cursor: default; +} + +/* Search page */ +.search__introduction { + color: var(--dark); + font-family: var(--font--primary); + font-weight: 400; + font-size: 1.625rem; + line-height: 1.15; + margin-top: 20px; + margin-bottom: 40px; +} + +.search__results { + list-style-type: none; + padding-left: 0; + margin-bottom: 90px; +} + +@media (min-width: 768px) { + .search__introduction { + margin-bottom: 60px; + } + + .search__results { + margin-bottom: 120px; + } +} + +/* Location list page */ +.location-list-page { + padding: 0 0 70px; + display: grid; + grid-template-columns: 1fr; + gap: 10px; +} + +@media (min-width: 768px) { + .location-list-page { + padding: 50px 0 110px; + grid-template-columns: 1fr 1fr; + gap: 30px; + } +} + +/* Location detail page */ +.location__meta-title { + font-family: var(--font--primary); + margin-top: 30px; + margin-bottom: 10px; + font-size: 1.625rem; + line-height: 1.23; +} + +.location__meta-title:first-child { + margin-top: 0; +} + +.location__day { + font-weight: bold; + font-family: var(--font--secondary); +} + +.location__time { + display: block; +} + +/* ---- Blog Index Page ---- */ +.blog-tags { + list-style: none; + display: flex; + flex-wrap: wrap; + padding-left: 0; + row-gap: 25px; + column-gap: 15px; + margin-bottom: 70px; +} + +.blog-tags.blog-tags--condensed { + column-gap: 0; +} + +.blog-tags__pill { + padding: 10px 18px; + font-size: var(--font-md); + line-height: 1.55; + border: 1px solid var(--orange); + border-radius: 60px; + margin-left: 20px; + text-transform: capitalize; +} + +.blog-tags__pill--selected { + background-color: var(--dark-orange); + border: 1px solid var(--dark-orange); + color: var(--white); +} + +.blog-tags__pill:hover.blog-tags__pill--selected { + background-color: var(--dark-orange); +} + +.blog-tags__pill:first-child { + margin-left: 0; +} + +.blog-tags__pill:hover { + background-color: var(--orange); + color: var(--white); +} + +.blog-tags__tag { + color: var(--orange); + text-transform: capitalize; +} + +.blog-list { + padding: 0; +} + +.blog-list-item { + display: flex; + flex-direction: column; + margin-bottom: 20px; +} + +.blog-list-item a { + display: flex; + flex-grow: 1; + flex-direction: column; +} + +.blog-list-item:hover img { + opacity: 0.3; +} + +.blog-list-item .image { + overflow: hidden; + background-color: #eb7400; + flex: 1 0 auto; +} + +.blog-list-item .image img { + min-height: 510px; + width: auto; + min-width: 100%; +} + +.blog-list-item .text { + background: linear-gradient( + to bottom, + rgb(0 0 0 / 0%) 0%, + rgb(0 0 0 / 60%) 23%, + rgb(0 0 0 / 100%) 50% + ); + margin-top: -150px; + padding: 20px; + position: relative; + z-index: 1; +} + +.blog-list-item .text h2 { + color: #fff; + font-weight: 200; + margin-top: 0; +} + +.blog-list-item .text p { + color: #e3e3e3; + font-size: 0.875rem; + margin-bottom: 0; +} + +.blog-list-item .footer { + background-color: #333; + color: #fff; + margin-top: 0; + padding: 20px; + position: relative; + z-index: 1; +} + +/* ---- Blog Page ---- */ + +.blog__meta { + margin-bottom: 20px; +} + +.blog__avatar { + border-radius: 100%; + display: inline; + width: unset; + margin-right: 10px; +} + +.blog__avatars { + margin-bottom: 20px; +} + +.blog__author { + font-family: var(--font--primary); + font-size: 1.375rem; + line-height: 1.18; + display: inline-block; + margin-right: 40px; + margin-bottom: 10px; +} + +.blog__published { + color: var(--grey); + margin-bottom: 30px; +} + +.blog__tag-introduction { + font-size: var(--font-md); + color: var(--grey); + margin-bottom: 20px; + margin-top: 60px; +} + +@media (min-width: 768px) { + .blog__published { + margin-bottom: 40px; + } + + .blog__avatars { + margin-bottom: 40px; + } + + .blog__tag-introduction { + margin-top: 100px; + } +} + +/* ---- Gallery Page ---- */ + +.gallery__container { + padding-top: 40px; + padding-bottom: 60px; +} + +.gallery__introduction { + color: var(--dark); + font-family: var(--font--primary); + font-size: 1.625rem; + line-height: 1.15; + margin: 0 0 60px; +} + +.gallery__grid { + display: grid; + grid-template-columns: 1fr; + gap: 10px; +} + +@media (min-width: 768px) { + .gallery__container { + padding-top: 180px; + padding-bottom: 80px; + } + + .gallery__introduction { + font-size: 2rem; + line-height: 1.31; + margin: 0 0 85px; + } + + .gallery__grid { + grid-template-columns: 1fr 1fr; + gap: 30px; + } +} + +/* ---- Bread Index Page ---- */ +.bread-list { + list-style-type: none; + padding-left: 0; + padding-bottom: 40px; +} + +@media (min-width: 992px) { + .bread-list { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 30px; + padding-top: 30px; + padding-bottom: 80px; + } +} + +/* ---- Bread Detail Page ---- */ +.bread-detail { + padding-bottom: 60px; +} + +.bread-detail__introduction { + color: var(--dark); + font-family: var(--font--primary); + font-size: 1.625rem; + line-height: 1.15; + margin-top: 50px; + margin-bottom: 65px; +} + +@media (min-width: 768px) { + .bread-detail__introduction { + font-size: 2rem; + line-height: 1.31; + margin-top: 160px; + } +} + +.bread-detail figure { + margin: 35px auto 20px; + overflow: hidden; +} + +.bread-detail figure img { + height: auto; +} + +.bread-detail__meta { + background-color: var(--cream); + padding: 40px; + margin-right: -15px; + margin-bottom: 60px; +} + +.bread-detail__meta ul li { + border-bottom: 1px solid var(--border-grey); + list-style: none; + color: var(--grey); + max-width: 450px; + margin-bottom: 15px; +} + +.bread-detail__meta-title { + font-family: var(--font--secondary); + font-weight: 700; + font-size: var(--font-md); + line-height: 1.55; + margin: 0 0 5px; +} + +.bread-detail__meta-content { + font-family: var(--font--secondary); + font-size: var(--font-md); + line-height: 1.55; + margin: 0 0 20px; +} + +.bread-detail__meta-ingredient--draft { + color: transparent; + user-select: none; + cursor: help; + text-shadow: 0 0 7px rgb(0 0 0 / 50%); +} + +@media (min-width: 992px) { + .bread-detail__meta { + background-color: var(--cream); + padding: 240px 60px 60px; + margin-right: -40px; + margin-bottom: 0; + } +} + +/* Forms */ +.form-page { + padding-bottom: 60px; +} + +.form-page input, +textarea, +select { + display: block; + width: 100%; + padding: 8px; + border: 1px solid var(--dark); +} + +.form-page input[type='submit'] { + border: none; + color: var(--white); + background-color: var(--orange); + font-weight: 700; + padding: 15px 25px; + display: inline-block; + vertical-align: middle; + transition-duration: 0.1s; + width: max-content; +} + +.form-page input[type='submit']:hover { + background-color: var(--dark); +} + +.form-page li input[type='checkbox'], +input[type='radio'] { + display: inline-block; + margin-right: 10px; +} + +.form-page__field ul, +.form-page__field li { + list-style: none; + padding: 0; + margin: 0; +} + +.form-page .required { + color: var(--orange); +} + +.form-page .help { + color: var(--dark); + font-family: var(--font--secondary); + font-size: var(--font-sm); + margin-top: 10px; + max-width: 350px; +} + +.form-page__field { + color: var(--dark); + margin-bottom: 30px; +} + +.form-page__field label { + margin-bottom: 10px; +} + +.form-page__help-text { + color: var(--grey); + font-family: var(--font--secondary); + font-size: var(--font-md); + line-height: 28px; + margin: -10px 0 10px; +} + +@media (min-width: 766px) { + .form-page input, + textarea, + select { + width: 100%; + } + + .form-page { + padding-bottom: 140px; + } + + .form-page__field { + margin-bottom: 50px; + } +} + +/* Generic title image header include */ +.base-header img { + height: auto; + margin-top: 20px; + max-width: 100%; + width: auto; +} + +@media (max-width: 970px) { + .base-header img { + width: 100%; + } +} + +/* Homepage */ + +/* #region -- Hero -- */ +.homepage .hero { + margin: 0; + padding: 200px 0 30px; +} + +.homepage .home-hero { + margin-bottom: 0; + padding-bottom: 20px; +} + +@media (min-width: 768px) { + .homepage .home-hero { + padding-bottom: 140px; + } +} + +.homepage .home-hero .lead { + font-family: var(--font--primary); + font-weight: 400; + color: var(--white); + margin: 40px auto; + font-size: 1.625rem; + line-height: 1.15; +} + +@media (min-width: 768px) { + .homepage .home-hero .lead { + font-size: 2rem; + line-height: 1.31; + } +} + +.homepage .home-hero .hero-cta-link { + color: var(--white); + background-color: var(--orange); + font-weight: 700; + padding: 15px 25px; + display: inline-block; + vertical-align: middle; + transition: color ease 0.1s, background-color ease 0.1s; +} + +.homepage .home-hero .hero-cta-link:hover { + background-color: var(--white); + color: var(--dark-orange); +} + +/* #endregion */ + +/* #region -- Body -- */ +.homepage .streamfield { + background-color: var(--cream); +} + +.homepage .streamfield a { + color: var(--dark-orange); +} + +.homepage .streamfield-column { + padding: 80px 20px; +} + +.homepage .streamfield-column p:first-child { + color: var(--dark-brown); + font-family: var(--font--primary); + font-size: 1.5rem; + line-height: 1.31; + margin-bottom: 30px; +} + +.homepage .streamfield-column p:first-child a { + text-decoration-skip-ink: none; + text-decoration-thickness: 3px; + text-underline-offset: 4px; +} + +.homepage .streamfield-column p { + font-size: 0.875rem; + line-height: 1.57; +} + +.homepage .streamfield-column p:last-child { + margin-bottom: 0; +} + +@media (min-width: 768px) { + .homepage .streamfield-column p { + font-size: var(--font-md); + line-height: 1.55; + } +} + +@media (min-width: 992px) { + .homepage .streamfield-column { + padding: 140px 0; + } + + .homepage .streamfield-column p:first-child { + font-size: 3.75rem; + line-height: 1.07; + margin-bottom: 60px; + } +} + +/* #endregion */ + +/* #region -- Promo Section */ +.homepage .promo-row { + padding: 40px 0 80px; +} + +@media (min-width: 768px) { + .homepage .promo-row { + padding-top: 80px; + margin-right: -45px; + } +} + +.homepage .promo h2 { + margin-top: 0; + margin-bottom: 20px; + color: var(--white); +} + +.homepage .promo p, +.homepage .promo li { + color: var(--white); +} + +.homepage .promo a { + color: var(--white); + text-decoration: underline; +} + +.homepage .promo { + background: var(--light-brown); + height: 100%; + padding: 60px 40px; + margin-top: 40px; + margin-bottom: 100px; +} + +.homepage .promo-text { + padding: 0; +} + +.homepage .promo figure img { + margin: 40px 0 -200px; + width: 100%; + height: auto; +} + +@media (min-width: 768px) { + .homepage .promo { + margin-top: -180px; + margin-right: -120px; + padding: 180px 60px 40px; + } + + .homepage .promo figure img { + width: calc(100% + 60px); + height: auto; + margin-right: -60px; + margin-bottom: -280px; + padding-top: 20px; + } + + .homepage .promo p { + font-size: 1.25rem; + line-height: 1.35; + } +} + +/* #endregion */ + +/* #region -- Featured Cards Section -- */ +.homepage .featured-cards__list { + list-style: none; + padding-left: 0; +} + +.homepage .featured-cards__title { + margin-top: 0; + margin-bottom: 40px; +} + +.homepage .featured-cards__link { + display: flex; + flex-direction: row; + justify-content: baseline; + font-family: var(--font--primary); + margin: 0 auto; + width: max-content; + font-size: var(--font-md); + line-height: 1.28; +} + +.homepage .featured-cards__chevron-icon { + margin-left: 8px; + width: 8px; + height: 22px; + transition: transform ease 0.1s; +} + +.homepage .featured-cards__link:hover { + text-decoration: underline; +} + +.homepage .featured-cards__link:hover .featured-cards__chevron-icon { + transform: translateX(5px); +} + +.homepage .featured-cards__link:hover .featured-cards__chevron-icon path { + fill: var(--dark-orange); +} + +@media (min-width: 768px) { + .homepage .featured-cards { + padding-right: 50px; + } + + .homepage .featured-cards__link { + font-size: 1.5rem; + line-height: 30px; + margin: unset; + } + + .homepage .featured-cards__chevron-icon { + width: 12px; + height: 28px; + align-self: center; + } +} + +/* #endregion */ + +/* #region -- Location Section -- */ +.homepage .locations-section { + padding: 40px 0 20px; + text-align: center; +} + +.homepage .locations-section__title { + color: var(--dark); + font-style: normal; + font-weight: 400; + font-size: 2.375rem; + line-height: 1.16; + margin-bottom: 40px; +} + +@media (min-width: 768px) { + .homepage .locations-section { + text-align: left; + padding: 120px 0 160px; + } + + .homepage .locations-section__title { + font-size: 3.75rem; + line-height: 1.07; + + /* Aligns title with below cards */ + padding-left: 10px; + } +} + +/* #endregion */ + +/* #region -- Blog Section -- */ +.homepage .blog-section { + padding: 80px 20px 100px; + text-align: center; +} + +.homepage .blog-section__background { + background-color: var(--cream); +} + +.homepage .blog-section__title { + color: var(--dark-brown); + font-weight: 400; + font-size: 2.375rem; + line-height: 1.16; + margin-bottom: 60px; + margin-top: 0; +} + +.homepage .blog-section__grid { + display: grid; + gap: 10px; + grid-template-columns: 1fr; +} + +@media (min-width: 566px) { + .homepage .blog-section__grid { + grid-template-columns: 1fr 1fr; + } +} + +@media (min-width: 768px) { + .homepage .blog-section { + padding: 90px 0 110px; + } +} + +@media (min-width: 966px) { + .homepage .blog-section__grid { + grid-template-columns: 1fr 1fr 1fr; + } + + .homepage .blog-section__title { + margin-bottom: 90px; + font-size: 7.5rem; + line-height: 1.21; + } +} + +/* #endregion */ + +/* Miscellaneous helper styles */ + +/* No gutters */ +.row.no-gutters { + margin-right: 0; + margin-left: 0; +} + +@media (max-width: 970px) { + .row.no-gutters { + display: block; + } +} + +.row.no-gutters > [class^='col-'], +.row.no-gutters > [class*=' col-'] { + padding-right: 0; + padding-left: 0; +} + +/* Bootstrap Equal height rows */ +.row-eq-height { + display: box; + display: flex; + display: flexbox; + display: flex; + flex-wrap: wrap; +} + +@media (min-width: 992px) { + .hidden-md-up { + display: none; + } +} + +@media (max-width: 991px) { + .hidden-md-down { + display: none; + } +} + +/* From Wagtail core */ +.richtext-image.left { + float: left; + width: 50%; +} + +.richtext-image.right { + float: right; + width: 50%; +} + +/* ---- Component Styles ---- */ + +/* #region ---- Picture Card ---- */ +.picture-card { + position: relative; +} + +.picture-card__link:hover .picture-card__image img { + transform: scale(1.05); +} + +.picture-card__link:hover .picture-card__title { + text-decoration: underline; +} + +.picture-card__title { + color: var(--white); + font-family: var(--font--primary); + font-size: 1.625rem; + line-height: 1.15; + margin: 0; +} + +.picture-card__image { + overflow: hidden; + margin-bottom: 0; +} + +.picture-card__image img { + transition: transform 0.2s ease; +} + +.picture-card__image::before { + content: ''; + position: absolute; + height: 200px; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(180deg, rgb(0 0 0 / 0%) 0%, #000 67.69%); + z-index: 2; +} + +.picture-card__contents { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + text-align: left; + display: flex; + align-items: end; + padding: 20px; + z-index: 2; +} + +@media (min-width: 768px) { + .picture-card__title { + font-size: 2rem; + line-height: 1.31; + } + + .picture-card__contents { + padding: 30px 40px; + } +} + +/* #endregion */ + +/* #region ---- Listing Card ---- */ +.listing-card { + margin-bottom: 40px; +} + +.listing-card__meta { + border-collapse: separate; + border-spacing: 5px; +} + +.listing-card__link { + display: flex; + flex-direction: row; + padding-bottom: 30px; + border-bottom: 1px solid var(--border-grey); +} + +.listing-card__contents { + padding-top: 10px; + padding-left: 25px; +} + +.listing-card__title { + color: var(--orange); + margin-top: 0; +} + +.listing-card__meta-category { + color: var(--grey); + font-size: 0.875rem; + line-height: 1.57; + padding-right: 10px; + vertical-align: top; +} + +.listing-card__meta-content { + color: var(--dark); + font-size: 0.875rem; + line-height: 1.57; + vertical-align: top; +} + +.listing-card__meta-row:last-child { + margin-bottom: 0; +} + +.listing-card__image { + width: 100%; + overflow: hidden; + margin: 0; + max-width: 100px; + max-height: 110px; +} + +.listing-card__image img { + transition: transform ease 0.2s; +} + +.listing-card:hover .listing-card__image img { + transform: scale(1.05); +} + +.listing-card:hover .listing-card__title { + color: var(--dark-orange); + text-decoration: underline; +} + +@media (min-width: 768px) { + .listing-card__contents { + padding-left: 45px; + padding-top: 30px; + } + + .listing-card__image { + width: 100%; + overflow: hidden; + margin: 0; + max-width: 180px; + max-height: 180px; + } + + .listing-card__meta-category, + .listing-card__meta-content { + font-size: var(--font-sm); + line-height: 1.5; + } +} + +/* #endregion */ + +/* #region ---- Blog Listing Card ---- */ +.blog-listing-card { + padding-bottom: 40px; + width: 100%; +} + +.blog-listing-card:last-child { + padding-bottom: 100px; +} + +.blog-listing-card__link { + display: flex; + flex-direction: column; + padding-bottom: 30px; + border-bottom: 1px solid var(--transparent-border); +} + +.blog-listing-card__contents { + padding-top: 10px; +} + +.blog-listing-card__title { + font-size: 1.625rem; + line-height: 1.15; + color: var(--orange); + margin-top: 0; + margin-bottom: 8px; +} + +.blog-listing-card__introduction { + font-size: var(--font-sm); + line-height: 1.5; + color: var(--dark); + margin-bottom: 8px; + max-width: 530px; +} + +.blog-listing-card__metadata { + font-size: 0.875rem; + line-height: 1.43; + color: var(--grey); + margin-bottom: 0; +} + +.blog-listing-card__image { + width: 100%; + overflow: hidden; + margin: 0; +} + +.blog-listing-card__image img { + transition: transform ease 0.2s; +} + +.blog-listing-card:hover .blog-listing-card__image img { + transform: scale(1.05); +} + +.blog-listing-card:hover .blog-listing-card__title { + color: var(--dark-orange); + text-decoration: underline; +} + +@media (min-width: 768px) { + .blog-listing-card:last-child { + padding-bottom: 200px; + } + + .blog-listing-card__link { + flex-direction: row; + } + + .blog-listing-card__contents { + padding-top: 30px; + padding-left: 45px; + } + + .blog-listing-card__title { + font-size: 2rem; + line-height: 1.31; + } + + .blog-listing-card__introduction { + font-size: var(--font-md); + line-height: 1.55; + } + + .blog-listing-card__image { + flex-shrink: 0; + overflow: hidden; + margin: 0; + width: 325px; + height: 250px; + } +} + +/* #endregion */ + +/* #region ---- Location Card ---- */ + +.location-card { + display: flex; + flex-direction: column; + margin: 0 auto 50px; + text-align: left; +} + +.location-card:hover .location-card__image img { + transform: scale(1.05); +} + +.location-card:hover .location-card__title { + color: var(--dark-orange); +} + +.location-card__image { + margin-bottom: 0; + overflow: hidden; +} + +.location-card__image img { + object-fit: cover; + min-height: 210px; + transition: transform 0.2s ease; +} + +.location-card__title { + color: var(--orange); + font-size: 1.625rem; + line-height: 1.15; + margin-bottom: 10px; + font-weight: 400; + width: max-content; + position: relative; +} + +.location-card__title::before { + content: ''; + bottom: 3px; + position: absolute; + left: 0; + right: 0; + height: 2px; + background-color: var(--dark-orange); + opacity: 0; + transition: opacity 0.3s ease; +} + +.location-card:hover .location-card__title::before { + opacity: 1; +} + +.location-card__text { + color: var(--dark); + font-size: var(--font-sm); + line-height: 1.5; +} + +@media (min-width: 768px) { + .location-card { + margin-bottom: 0; + } + + .location-card__image { + margin-bottom: 30px; + } + + .location-card__image img { + min-height: 320px; + } + + .location-card__title { + font-size: 2rem; + line-height: 1.31; + margin-bottom: 20px; + } + + .location-card__text { + font-size: var(--font-md); + line-height: 1.55; + } +} + +/* #endregion */ + +/* Utilities */ + +.u-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/css/bootstrap.min.css b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/css/bootstrap.min.css new file mode 100644 index 000000000..cb43362f8 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/css/font-marcellus.css b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/css/font-marcellus.css new file mode 100644 index 000000000..42195ac72 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/css/font-marcellus.css @@ -0,0 +1,7 @@ +@font-face { + font-family: Marcellus; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('../fonts/Marcellus-Regular.woff2') format('woff2'); +} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/fonts/Marcellus-Regular.woff2 b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/fonts/Marcellus-Regular.woff2 new file mode 100644 index 000000000..e765ed63a Binary files /dev/null and b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/fonts/Marcellus-Regular.woff2 differ diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/img/bread-favicon.ico b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/img/bread-favicon.ico new file mode 100644 index 000000000..c537d88d4 Binary files /dev/null and b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/img/bread-favicon.ico differ diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/js/blog-main.js b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/js/blog-main.js new file mode 100644 index 000000000..ae836a26b --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/static/js/blog-main.js @@ -0,0 +1,24 @@ +const navigation = document.querySelector("[data-navigation]"); +const mobileNavigation = navigation.querySelector("[data-mobile-navigation]"); +const body = document.querySelector("body"); +const mobileNavigationToggle = navigation.querySelector( + "[data-mobile-navigation-toggle]" +); + +function toggleMobileNavigation() { + if (mobileNavigation.hidden) { + body.classList.add("no-scroll"); + mobileNavigation.hidden = false; + mobileNavigationToggle.setAttribute("aria-expanded", "true"); + } else { + body.classList.remove("no-scroll"); + mobileNavigation.hidden = true; + mobileNavigationToggle.setAttribute("aria-expanded", "false"); + } +} + +document.addEventListener("DOMContentLoaded", () => { + mobileNavigationToggle.addEventListener("click", () => { + toggleMobileNavigation(); + }); +}); diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/404.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/404.html new file mode 100644 index 000000000..d069c0c4e --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/404.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block title %}404 - Page not found{% endblock %} + +{% block search_description %}Sorry, this page could not be found{% endblock %} + +{% block body_class %}template-404{% endblock %} + +{% block content %} +

Page not found

+ +

Sorry, this page could not be found.

+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/500.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/500.html new file mode 100644 index 000000000..43bfd0adf --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/500.html @@ -0,0 +1,13 @@ + + + + + Internal server error + + + +

Internal server error

+ +

Sorry, there seems to be an error. Please try again soon.

+ + diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/advanced_blog/blog_index_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/advanced_blog/blog_index_page.html new file mode 100644 index 000000000..8b69a05d9 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/advanced_blog/blog_index_page.html @@ -0,0 +1,50 @@ +{% extends "base.html" %} +{% load wagtailcore_tags navigation_tags wagtailimages_tags %} + +{% if tag %} + {% block title %} + {% if self.seo_title %}{{ self.seo_title }}{% else %}{{ self.title }}{% endif %}: {{ tag }} + {% endblock %} + + {% block search_description %}Viewing all blog posts sorted by the tag {{ tag }}{% endblock %} +{% endif %} + +{% block content %} + {% if not tag %} + {% include "base/include/header-index.html" %} + {% endif %} + +
+ {% if tag %} +
+
+

Blog

+
+
+

Viewing all blog posts sorted by the tag {{ tag }}.

+
+
+ {% endif %} + + {% if page.get_child_tags %} + + {% endif %} + +
+ {% if posts %} + {% for blog in posts %} + {% include "includes/card/blog-listing-card.html" %} + {% endfor %} + {% else %} +
+

Oh, snap. Looks like we were too busy baking to write any blog posts. Sorry.

+
+ {% endif %} +
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/advanced_blog/blog_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/advanced_blog/blog_page.html new file mode 100644 index 000000000..cd9524d51 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/advanced_blog/blog_page.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% load navigation_tags wagtailimages_tags %} + +{% block content %} + + {% include "base/include/header-blog.html" %} + +
+
+
+
+ {% if page.authors %} +
+ {% for author in page.authors %} +
{% image author.image fill-50x50-c100 class="blog__avatar" %} + {{ author.first_name }} {{ author.last_name }}
+ {% endfor %} +
+ {% endif %} +
+ + {{ page.body }} + + {% if page.get_tags %} +

Find more blog posts with similar tags

+
+ Filter blog posts by tag + {% for tag in page.get_tags %} + {{ tag }} + {% endfor %} +
+ {% endif %} +
+
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base.html new file mode 100755 index 000000000..08b445d4e --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base.html @@ -0,0 +1,57 @@ +{% load navigation_tags static wagtailuserbar %} + + + + + + {% block title %} + {% if page.seo_title %} + {{ page.seo_title }} + {% else %} + {{ page.title }} + {% endif %} + {% endblock %} + {% block title_suffix %} + {% endblock %} + + + + + {# Force all links in the live preview panel to be opened in a new tab #} + {% if request.in_preview_panel %} + + {% endif %} + + + + + + + + {% wagtailuserbar %} + + {% block header %} + {% include "includes/header.html" %} + {% endblock header %} + + {% block breadcrumbs %} + {# breadcrumbs is defined in base/templatetags/navigation_tags.py #} + {% breadcrumbs %} + {% endblock breadcrumbs %} + + {% block messages %} + {% include "includes/messages.html" %} + {% endblock messages %} + +
+ {% block content %} + {% endblock content %} +
+ +
+ + {% include "includes/footer.html" %} + + + + diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/basic_auth.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/basic_auth.html new file mode 100644 index 000000000..339f1a241 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/basic_auth.html @@ -0,0 +1,27 @@ + + + + + Authentication Required + + + {# Prevent the demo site from being indexed #} + + + + + + +
+

Authentication Required

+

You must login to view this site

+

Looking for Wagtail? Visit wagtail.org.

+
+ + diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/form_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/form_page.html new file mode 100644 index 000000000..022623508 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/form_page.html @@ -0,0 +1,57 @@ +{% extends "base.html" %} +{% load wagtailcore_tags navigation_tags wagtailimages_tags %} + +{% block content %} + +
+
+
+

{{ page.title }}

+
+
+ {% if page.intro %} +

{{ page.intro|richtext }}

+ {% endif %} + {% if page.body %} + {{ page.body }} + {% endif %} +
+
+
+ +
+
+
+ {% comment %} + You could render your form using a Django rendering shortcut such as `{{ form.as_p }}` but that will tend towards unsemantic code, and make it difficult to style. You can read more on Django form at: + https://docs.djangoproject.com/en/3.2/topics/forms/#form-rendering-options + {% endcomment %} +
+ {% csrf_token %} + {% if form.subject.errors %} +
    + {% for error in form.subject.errors %} +
  1. {{ error|escape }}
  2. + {% endfor %} +
+ {% endif %} + + {% for field in form %} +
+ + {{ field.label_tag }}{% if field.field.required %}*{% endif %} + + {% if field.help_text %} +

{{ field.help_text }}

+ {% endif %} + + {{ field }} +
+ {% endfor %} + + +
+
+
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/form_page_landing.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/form_page_landing.html new file mode 100644 index 000000000..fb0b02974 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/form_page_landing.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} +{% load wagtailcore_tags %} + +{% block content %} + +
+
+
+

{{ page.title }}

+
+
+ {{ page.thank_you_text|richtext }} +
+
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/gallery_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/gallery_page.html new file mode 100644 index 000000000..423f62e55 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/gallery_page.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% load wagtailimages_tags gallery_tags %} + +{% block content %} + {% include "base/include/header-hero.html" %} + + +{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/home_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/home_page.html new file mode 100644 index 000000000..46c6bca9b --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/home_page.html @@ -0,0 +1,104 @@ +{% extends "base.html" %} +{% load wagtailimages_tags wagtailcore_tags %} + +{% block content %} +
+ +
+ {% image page.image fill-1920x600 class="hero-image" alt="" %} +
+
+
+
+

{{ page.title }}

+

{{ page.hero_text }}

+ {% if page.hero_cta_link %} + + {{ page.hero_cta }} + + {% else %} + {{ page.hero_cta }} + {% endif %} +
+
+
+
+ +
+
+ + +
+ {% if page.promo_image or page.promo_title or page.promo_text %} +
+ {% if page.promo_title %} +

{{ page.promo_title }}

+ {% endif %} + {% if page.promo_text %} + {{ page.promo_text|richtext }} + {% endif %} +
+ {% endif %} + {% if page.promo_image %} +
{% image page.promo_image fill-590x413-c100 %}
+ {% endif %} +
+
+
+ + {% if page.body %} +
+
+
+ {{ page.body }} +
+
+
+ {% endif %} + +
+
+
+ {% if page.featured_section_2 %} +

{{ page.featured_section_2_title }}

+ {% for childpage in page.featured_section_2.specific.children|slice:"3" %} + {% include "includes/card/location-card.html" with page=childpage %} + {% endfor %} + {% endif %} +
+
+
+ + {% if page.featured_section_3 %} +
+
+
+
+

{{ page.featured_section_3_title }}

+
+ {% for childpage in page.featured_section_3.specific.children|slice:"6" %} + {% include "includes/card/picture-card.html" with page=childpage portrait=True %} + {% endfor %} +
+
+
+
+
+ {% endif %} +
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/footer_text.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/footer_text.html new file mode 100644 index 000000000..2ffb49ecc --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/footer_text.html @@ -0,0 +1,5 @@ +{% load wagtailcore_tags %} + + diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header-blog.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header-blog.html new file mode 100644 index 000000000..7fee63e46 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header-blog.html @@ -0,0 +1,27 @@ +{% load wagtailcore_tags wagtailimages_tags %} + +{% if page.image %} +
+ {% image page.image fill-1920x600 class="hero-image" alt="" %} +
+{% endif %} +
+
+
+

{{ page.title }}

+ {% if page.subtitle %} +

{{ page.subtitle }}

+ {% endif %} +
+
+ {% if page.introduction %} +

{{ page.introduction }}

+ {% endif %} + {% if page.date_published %} +
+ {{ page.date_published }} +
+ {% endif %} +
+
+
diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header-hero.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header-hero.html new file mode 100644 index 000000000..6608931e4 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header-hero.html @@ -0,0 +1,18 @@ +{% load wagtailcore_tags wagtailimages_tags %} + +{% if page.image %} +
+ {% image page.image fill-1920x600 class="hero-image" alt="" %} +
+

{{ page.title }}

+
+
+{% else %} +
+
+
+

{{ page.title }}

+
+
+
+{% endif %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header-index.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header-index.html new file mode 100644 index 000000000..1a07b5771 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header-index.html @@ -0,0 +1,14 @@ +{% load wagtailcore_tags wagtailimages_tags %} + +
+
+
+

{{ page.title }}

+
+
+ {% if page.introduction %} +

{{ page.introduction }}

+ {% endif %} +
+
+
diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header.html new file mode 100644 index 000000000..380c1c72e --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/include/header.html @@ -0,0 +1,16 @@ +{% load wagtailcore_tags wagtailimages_tags %} + +
+
+
+ {% if page.image %} +
+ {% image page.image width-500 as photo %} + {{ photo.alt }} +
+ {% endif %} + +

{{ page.title }}

+
+
+
diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/preview/person.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/preview/person.html new file mode 100644 index 000000000..158512c28 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/preview/person.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} +{% load wagtailimages_tags %} + +{% block title %}{{ object.first_name }} {{ object.last_name }} Preview{% endblock %} + +{% block search_description %}{{ object.job_title }}{% endblock %} + +{% block body_class %}template-preview-person{% endblock %} + +{% block content %} +
+ {% image object.image fill-200x200-c100 class="blog__avatar" %} +

{{ object.first_name }} {{ object.last_name }}

+

{{ object.job_title }}

+
+{% endblock %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/standard_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/standard_page.html new file mode 100644 index 000000000..bd8f0b3a5 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/base/standard_page.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} +{% load wagtailimages_tags %} + +{% block content %} + {% include "base/include/header-hero.html" %} + +
+
+
+
+
+ {% if page.introduction %} +

+ {{ page.introduction }} +

+ {% endif %} + {{ page.body }} +
+
+
+
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/basic_blog/blog_index_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/basic_blog/blog_index_page.html new file mode 100644 index 000000000..8b69a05d9 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/basic_blog/blog_index_page.html @@ -0,0 +1,50 @@ +{% extends "base.html" %} +{% load wagtailcore_tags navigation_tags wagtailimages_tags %} + +{% if tag %} + {% block title %} + {% if self.seo_title %}{{ self.seo_title }}{% else %}{{ self.title }}{% endif %}: {{ tag }} + {% endblock %} + + {% block search_description %}Viewing all blog posts sorted by the tag {{ tag }}{% endblock %} +{% endif %} + +{% block content %} + {% if not tag %} + {% include "base/include/header-index.html" %} + {% endif %} + +
+ {% if tag %} +
+
+

Blog

+
+
+

Viewing all blog posts sorted by the tag {{ tag }}.

+
+
+ {% endif %} + + {% if page.get_child_tags %} + + {% endif %} + +
+ {% if posts %} + {% for blog in posts %} + {% include "includes/card/blog-listing-card.html" %} + {% endfor %} + {% else %} +
+

Oh, snap. Looks like we were too busy baking to write any blog posts. Sorry.

+
+ {% endif %} +
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/basic_blog/blog_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/basic_blog/blog_page.html new file mode 100644 index 000000000..cd9524d51 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/basic_blog/blog_page.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% load navigation_tags wagtailimages_tags %} + +{% block content %} + + {% include "base/include/header-blog.html" %} + +
+
+
+
+ {% if page.authors %} +
+ {% for author in page.authors %} +
{% image author.image fill-50x50-c100 class="blog__avatar" %} + {{ author.first_name }} {{ author.last_name }}
+ {% endfor %} +
+ {% endif %} +
+ + {{ page.body }} + + {% if page.get_tags %} +

Find more blog posts with similar tags

+
+ Filter blog posts by tag + {% for tag in page.get_tags %} + {{ tag }} + {% endfor %} +
+ {% endif %} +
+
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/blockquote.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/blockquote.html new file mode 100644 index 000000000..1e204017a --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/blockquote.html @@ -0,0 +1,5 @@ +{% load wagtailimages_tags %} + +

{{ self.text }}

+

{{ self.attribute_name}}

+
diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/embed_block.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/embed_block.html new file mode 100644 index 000000000..257ea988e --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/embed_block.html @@ -0,0 +1,3 @@ +{% load wagtailimages_tags %} + +{{ self }} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/heading_block.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/heading_block.html new file mode 100644 index 000000000..a5ed6e65a --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/heading_block.html @@ -0,0 +1,15 @@ +{% comment %} + Content is coming from the StandardBlock StreamField + class within `blocks.py` +{% endcomment %} + +{% if self.size == 'h2' %} +

{{ self.heading_text }}

+ +{% elif self.size == 'h3' %} +

{{ self.heading_text }}

+ +{% elif self.size == 'h4' %} +

{{ self.heading_text }}

+ +{% endif %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/image_block.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/image_block.html new file mode 100644 index 000000000..a4b1badc4 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/image_block.html @@ -0,0 +1,6 @@ +{% load wagtailimages_tags %} + +
+ {% image self.image fill-600x338 loading="lazy" %} +
{{ self.caption }} - {{ self.attribution }}
+
diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/paragraph_block.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/paragraph_block.html new file mode 100644 index 000000000..e3125de36 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/paragraph_block.html @@ -0,0 +1 @@ +{{ self }} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/recipe_step_block.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/recipe_step_block.html new file mode 100644 index 000000000..36d9a1cc9 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blocks/recipe_step_block.html @@ -0,0 +1 @@ +{{ self.text }} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blog/blog_index_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blog/blog_index_page.html new file mode 100644 index 000000000..8b69a05d9 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blog/blog_index_page.html @@ -0,0 +1,50 @@ +{% extends "base.html" %} +{% load wagtailcore_tags navigation_tags wagtailimages_tags %} + +{% if tag %} + {% block title %} + {% if self.seo_title %}{{ self.seo_title }}{% else %}{{ self.title }}{% endif %}: {{ tag }} + {% endblock %} + + {% block search_description %}Viewing all blog posts sorted by the tag {{ tag }}{% endblock %} +{% endif %} + +{% block content %} + {% if not tag %} + {% include "base/include/header-index.html" %} + {% endif %} + +
+ {% if tag %} +
+
+

Blog

+
+
+

Viewing all blog posts sorted by the tag {{ tag }}.

+
+
+ {% endif %} + + {% if page.get_child_tags %} + + {% endif %} + +
+ {% if posts %} + {% for blog in posts %} + {% include "includes/card/blog-listing-card.html" %} + {% endfor %} + {% else %} +
+

Oh, snap. Looks like we were too busy baking to write any blog posts. Sorry.

+
+ {% endif %} +
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blog/blog_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blog/blog_page.html new file mode 100644 index 000000000..cd9524d51 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/blog/blog_page.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% load navigation_tags wagtailimages_tags %} + +{% block content %} + + {% include "base/include/header-blog.html" %} + +
+
+
+
+ {% if page.authors %} +
+ {% for author in page.authors %} +
{% image author.image fill-50x50-c100 class="blog__avatar" %} + {{ author.first_name }} {{ author.last_name }}
+ {% endfor %} +
+ {% endif %} +
+ + {{ page.body }} + + {% if page.get_tags %} +

Find more blog posts with similar tags

+
+ Filter blog posts by tag + {% for tag in page.get_tags %} + {{ tag }} + {% endfor %} +
+ {% endif %} +
+
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/breads/bread_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/breads/bread_page.html new file mode 100644 index 000000000..7933498e4 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/breads/bread_page.html @@ -0,0 +1,68 @@ +{% extends "base.html" %} +{% load wagtailimages_tags %} + +{% block content %} + {% include "base/include/header-hero.html" %} + +
+
+
+
+
+ {% if page.introduction %} +

+ {{ page.introduction }} +

+ {% endif %} + +
+ {{ page.body }} +
+
+
+ +
+
+
+ {% if page.origin %} +

Origin

+

{{ page.origin }}

+ {% endif %} + {% if page.bread_type %} +

Type

+

{{ page.bread_type }}

+ {% endif %} + {% with ingredients=page.ingredients.all %} + {% if ingredients %} +

Ingredients

+
    + {% for ingredient in ingredients %} +
  • + {% if ingredient.live %} + {# If it's live, show as-is #} + {{ ingredient.name }} + {% else %} + {# EXAMPLE: we can show a placeholder element for instances that are not live #} + + Draft ingredient + + (draft) + {% endif %} +
  • + {% endfor %} +
+ {% endif %} + {% endwith %} +
+
+
+ +
+
+ {{ page.body }} +
+
+
+
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/breads/breads_index_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/breads/breads_index_page.html new file mode 100644 index 000000000..b9c2ead29 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/breads/breads_index_page.html @@ -0,0 +1,26 @@ +{% extends "base.html" %} +{% load wagtailcore_tags navigation_tags wagtailimages_tags %} + +{% block content %} + {% include "base/include/header-index.html" %} + +
+ +
+ + {% if breads.paginator.count > 12 %} +
+
+
+ {% include "includes/pagination.html" with subpages=breads %} +
+
+
+ {% endif %} +{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/blog-listing-card.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/blog-listing-card.html new file mode 100644 index 000000000..e621478ef --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/blog-listing-card.html @@ -0,0 +1,28 @@ +{% load wagtailcore_tags navigation_tags wagtailimages_tags %} + +
+ + {% if blog.image %} +
+ {% image blog.image fill-322x247-c100 loading="lazy" %} +
+ {% endif %} +
+

{{ blog.title }}

+ {% if blog.introduction %} +

{{ blog.introduction|truncatewords:15 }}

+ {% endif %} + +
+
+
+ + + diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/listing-card.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/listing-card.html new file mode 100644 index 000000000..8aa58d6ca --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/listing-card.html @@ -0,0 +1,30 @@ +{% load wagtailimages_tags %} + +
+ + {% if page.image %} +
+ {% image page.image fill-180x180-c100 loading="lazy" %} +
+ {% endif %} +
+

{{ page.title }}

+ {% if page.origin or page.bread_type %} + + {% if page.origin %} + + + + + {% endif %} + {% if page.bread_type %} + + + + + {% endif %} +
Origin{{ page.origin }}
Type{{ page.bread_type }}
+ {% endif %} +
+
+
diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/location-card.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/location-card.html new file mode 100644 index 000000000..809051c3f --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/location-card.html @@ -0,0 +1,15 @@ +{% load wagtailimages_tags %} + +
+ +
+ {% image page.image fill-430x320-c100 loading="lazy" %} +
+
+

{{page.title}}

+ {% if page.introduction %} +

{{ page.introduction|truncatewords:15 }}

+ {% endif %} +
+
+
diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/picture-card.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/picture-card.html new file mode 100644 index 000000000..7e23332db --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/card/picture-card.html @@ -0,0 +1,16 @@ +{% load wagtailimages_tags %} + +
+ +
+ {% if portrait %} + {% image page.image fill-433x487-c100 loading="lazy" %} + {% else %} + {% image page.image fill-645x480-c75 loading="lazy" %} + {% endif %} +
+

{{ page.title }}

+
+
+
+
diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/chevron-icon.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/chevron-icon.html new file mode 100644 index 000000000..893cdcc0c --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/chevron-icon.html @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/footer.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/footer.html new file mode 100644 index 000000000..b2a8dd797 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/footer.html @@ -0,0 +1,10 @@ +{% load navigation_tags static %} + + diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/header.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/header.html new file mode 100644 index 000000000..cd9328c9b --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/header.html @@ -0,0 +1,57 @@ +{% load navigation_tags %} + +
+
+ +
+
diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/messages.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/messages.html new file mode 100644 index 000000000..b1b8e25c4 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/messages.html @@ -0,0 +1,10 @@ +{% if messages %} +
+

Error

+ +
+{% endif %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/pagination.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/pagination.html new file mode 100644 index 000000000..239795e51 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/includes/pagination.html @@ -0,0 +1,33 @@ +{% load navigation_tags %} + + diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/locations/location_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/locations/location_page.html new file mode 100644 index 000000000..40832f968 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/locations/location_page.html @@ -0,0 +1,69 @@ +{% extends "base.html" %} +{% load wagtailimages_tags navigation_tags %} + +{% block content %} + {% include "base/include/header-hero.html" %} + +
+
+
+
+
+ {% if page.introduction %} +

+ {{ page.introduction }} +

+ {% endif %} + +
+ {{ page.body }} +
+
+
+ +
+
+
+

Operating Status

+ {% if page.is_open %} + This location is currently open. + {% else %} + Sorry, this location is currently closed. + {% endif %} + +

Address

+
{{ page.address|linebreaks }}
+ + {% if page.operating_hours %} +

Opening hours

+ {% for hours in page.operating_hours %} + + {% endfor %} + {% endif %} +
+
+
+ +
+
+ {{ page.body }} +
+
+
+
+
+ +{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/locations/locations_index_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/locations/locations_index_page.html new file mode 100644 index 000000000..ea6a58fde --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/locations/locations_index_page.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} +{% load wagtailcore_tags navigation_tags wagtailimages_tags %} + +{% block content %} + + {% include "base/include/header-index.html" %} + +
+
+ {% for location in locations %} + {% include "includes/card/picture-card.html" with page=location portrait=False %} + {% endfor %} +
+
+{% endblock content %} + diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/recipes/recipe_index_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/recipes/recipe_index_page.html new file mode 100644 index 000000000..f8af11af4 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/recipes/recipe_index_page.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} +{% load wagtailcore_tags navigation_tags wagtailimages_tags %} + +{% block content %} +
+
+ {% if recipes %} + {% for recipe in recipes %} + {% include "includes/card/blog-listing-card.html" with blog=recipe %} + {% endfor %} + {% else %} +
+

Oh, snap. Looks like we were too busy baking to write any recipes. Sorry.

+
+ {% endif %} +
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/recipes/recipe_page.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/recipes/recipe_page.html new file mode 100644 index 000000000..5b57a356c --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/recipes/recipe_page.html @@ -0,0 +1,39 @@ +{% extends "base.html" %} +{% load navigation_tags wagtailimages_tags wagtailcore_tags %} + +{% block content %} + + {% include "base/include/header-blog.html" %} + +
+
+
+
+ {% if page.authors %} +
+ {% for author in page.authors %} +
{% image author.image fill-50x50-c100 class="blog__avatar" %} + {{ author.first_name }} {{ author.last_name }}
+ {% endfor %} +
+ {% endif %} +
+ + {% if page.backstory %} + {{ page.backstory }} + +
+ {% endif %} + + {# Give a label to the recipe section for screen reader users. #} +
+ Recipe{% if page.recipe_headline %}: {{ page.recipe_headline|richtext }}{% endif %} +
+ +
+ {{ page.body }} +
+
+
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/search/search_results.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/search/search_results.html new file mode 100644 index 000000000..029664126 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/search/search_results.html @@ -0,0 +1,86 @@ +{% extends "base.html" %} +{% load wagtailcore_tags wagtailimages_tags wagtailsearchpromotions_tags %} + +{% block title %}Search{% if search_results %} results{% endif %}{% if search_query %} for “{{ search_query }}”{% endif %}{% endblock %} + +{% block search_description %}Search{% if search_results %} results{% endif %}{% if search_query %} for “{{ search_query }}”{% endif %}{% endblock %} + +{% block body_class %}template-search-results{% endblock %} + +{% block content %} +
+
+
+

Search results

+ {% if search_results %} +

You searched{% if search_query %} for “{{ search_query }}”{% endif %}, {{ search_results|length }} result{{ search_results|length|pluralize }} found.

+ + {% elif search_query %} + {% get_search_promotions search_query as search_promotions %} + {% if search_promotions %} +

You searched for “{{ search_query }}”, {{ search_promotions|length }} result{{ search_promotions|length|pluralize }} found.

+ + {% else %} +

No results found for “{{ search_query }}”.

+ {% endif %} + {% else %} +

You didn't search for anything!

+ {% endif %} +
+
+
+{% endblock content %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/breadcrumbs.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/breadcrumbs.html new file mode 100644 index 000000000..3831d0c1b --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/breadcrumbs.html @@ -0,0 +1,22 @@ +{% load wagtailcore_tags %} + +{% if ancestors %} + +{% endif %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/gallery.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/gallery.html new file mode 100644 index 000000000..069bfdbae --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/gallery.html @@ -0,0 +1,12 @@ +{% load wagtailimages_tags %} + +{% for img in images %} +
+
+ {% image img fill-645x480-c100 loading="lazy" %} +
+

{{ img.title }}

+
+
+
+{% endfor %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/top_menu.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/top_menu.html new file mode 100644 index 000000000..40020ba3e --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/top_menu.html @@ -0,0 +1,14 @@ +{% load navigation_tags wagtailcore_tags %} +{% get_site_root as site_root %} + +{% for menuitem in menuitems %} + +{% endfor %} diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/top_menu_children.html b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/top_menu_children.html new file mode 100644 index 000000000..c3eb39ebb --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templates/tags/top_menu_children.html @@ -0,0 +1,7 @@ +{% load navigation_tags wagtailcore_tags %} + + diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templatetags/__init__.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templatetags/navigation_tags.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templatetags/navigation_tags.py new file mode 100644 index 000000000..785ac96a5 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/templatetags/navigation_tags.py @@ -0,0 +1,109 @@ +from django import template +from wagtail.models import Page, Site + + +register = template.Library() + +# https://docs.djangoproject.com/en/3.2/howto/custom-template-tags/ + + + +@register.simple_tag(takes_context=True) +def get_site_root(context): + # This returns a core.Page. The main menu needs to have the site.root_page + # defined else will return an object attribute error ('str' object has no + # attribute 'get_children') + return Site.find_for_request(context["request"]).root_page + + +def has_menu_children(page): + # This is used by the top_menu property + # get_children is a Treebeard API thing + # https://tabo.pe/projects/django-treebeard/docs/4.0.1/api.html + return page.get_children().live().in_menu().exists() + + +def has_children(page): + # Generically allow index pages to list their children + return page.get_children().live().exists() + + +def is_active(page, current_page): + # To give us active state on main navigation + return current_page.url_path.startswith(page.url_path) if current_page else False + + +# Retrieves the top menu items - the immediate children of the parent page +# The has_menu_children method is necessary because the Foundation menu requires +# a dropdown class to be applied to a parent +@register.inclusion_tag("tags/top_menu.html", takes_context=True) +def top_menu(context, parent, calling_page=None): + menuitems = parent.get_children().live().in_menu() + for menuitem in menuitems: + menuitem.show_dropdown = has_menu_children(menuitem) + # We don't directly check if calling_page is None since the template + # engine can pass an empty string to calling_page + # if the variable passed as calling_page does not exist. + menuitem.active = ( + calling_page.url_path.startswith(menuitem.url_path) + if calling_page + else False + ) + return { + "calling_page": calling_page, + "menuitems": menuitems, + # required by the pageurl tag that we want to use within this template + "request": context["request"], + } + + +# Retrieves the children of the top menu items for the drop downs +@register.inclusion_tag("tags/top_menu_children.html", takes_context=True) +def top_menu_children(context, parent, calling_page=None): + menuitems_children = parent.get_children() + menuitems_children = menuitems_children.live().in_menu() + for menuitem in menuitems_children: + menuitem.has_dropdown = has_menu_children(menuitem) + # We don't directly check if calling_page is None since the template + # engine can pass an empty string to calling_page + # if the variable passed as calling_page does not exist. + menuitem.active = ( + calling_page.url_path.startswith(menuitem.url_path) + if calling_page + else False + ) + menuitem.children = menuitem.get_children().live().in_menu() + return { + "parent": parent, + "menuitems_children": menuitems_children, + # required by the pageurl tag that we want to use within this template + "request": context["request"], + } + + +@register.inclusion_tag("tags/breadcrumbs.html", takes_context=True) +def breadcrumbs(context): + self = context.get("self") + if self is None or self.depth <= 2: + # When on the home page, displaying breadcrumbs is irrelevant. + ancestors = () + else: + ancestors = Page.objects.ancestor_of(self, inclusive=True).filter(depth__gt=1) + return { + "ancestors": ancestors, + "request": context["request"], + } + + +@register.inclusion_tag("base/include/footer_text.html", takes_context=True) +def get_footer_text(context): + # Get the footer text from the context if exists, + # so that it's possible to pass a custom instance e.g. for previews + # or page types that need a custom footer + footer_text = context.get("footer_text", "") + + # If the context doesn't have footer_text defined, get one that's live + + return { + "footer_text": footer_text, + } \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/urls.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/urls.py new file mode 100644 index 000000000..78a4cc159 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/urls.py @@ -0,0 +1,8 @@ +from django.urls import path, include +from rest_framework import routers + +from .api import api_router + +urlpatterns = [ + path("api/v1/", api_router.urls), +] \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/advanced_blog/viewsets.py b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/viewsets.py new file mode 100644 index 000000000..39a0c23c5 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/advanced_blog/viewsets.py @@ -0,0 +1,6 @@ +from rest_framework import viewsets +from rest_framework.views import APIView +from rest_framework import permissions, status +from rest_framework.response import Response + +# Create your views here. \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/pyproject.toml b/modules/django-advanced-blog/django_advanced_blog/pyproject.toml new file mode 100644 index 000000000..7fd26b970 --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/modules/django-advanced-blog/django_advanced_blog/setup.py b/modules/django-advanced-blog/django_advanced_blog/setup.py new file mode 100644 index 000000000..689ef94ad --- /dev/null +++ b/modules/django-advanced-blog/django_advanced_blog/setup.py @@ -0,0 +1,20 @@ +from setuptools import setup +from setuptools.command.build import build + + +# Override build command +class BuildCommand(build): + def initialize_options(self): + build.initialize_options(self) + self.build_base = "/tmp" + + +setup( + name="cb_django_basic-blog", + version="0.1", + packages=["basic-blog"], + install_requires=[ + "wagtail", + ], + cmdclass={"build": BuildCommand}, +) \ No newline at end of file diff --git a/modules/django-advanced-blog/meta.json b/modules/django-advanced-blog/meta.json new file mode 100644 index 000000000..44dcb0596 --- /dev/null +++ b/modules/django-advanced-blog/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Advanced Blog", + "description": "This is an advanced module backend which can be used as a CMS for many use cases like blogging and other type of content management.", + "root": "/backend/modules" +} diff --git a/modules/django-advanced-blog/preview.png b/modules/django-advanced-blog/preview.png new file mode 100644 index 000000000..f57234801 Binary files /dev/null and b/modules/django-advanced-blog/preview.png differ