Move all files to 2017/
31
2017/web/themes/README.txt
Normal file
|
@ -0,0 +1,31 @@
|
|||
Themes allow you to change the look and feel of your Drupal site. You can use
|
||||
themes contributed by others or create your own.
|
||||
|
||||
WHAT TO PLACE IN THIS DIRECTORY?
|
||||
--------------------------------
|
||||
|
||||
Placing downloaded and custom themes in this directory separates downloaded and
|
||||
custom themes from Drupal core's themes. This allows Drupal core to be updated
|
||||
without overwriting these files.
|
||||
|
||||
DOWNLOAD ADDITIONAL THEMES
|
||||
--------------------------
|
||||
|
||||
Contributed themes from the Drupal community may be downloaded at
|
||||
https://www.drupal.org/project/project_theme.
|
||||
|
||||
MULTISITE CONFIGURATION
|
||||
-----------------------
|
||||
|
||||
In multisite configurations, themes found in this directory are available to
|
||||
all sites. You may also put themes in the sites/all/themes directory, and the
|
||||
versions in sites/all/themes will take precedence over versions of the same
|
||||
themes that are here. Alternatively, the sites/your_site_name/themes directory
|
||||
pattern may be used to restrict themes to a specific site instance.
|
||||
|
||||
MORE INFORMATION
|
||||
-----------------
|
||||
|
||||
Refer to the "Appearance" section of the README.txt in the Drupal root directory
|
||||
for further information on customizing the appearance of Drupal with custom
|
||||
themes.
|
1
2017/web/themes/dcb2017/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/css/
|
17
2017/web/themes/dcb2017/dcb2017.info.yml
Normal file
|
@ -0,0 +1,17 @@
|
|||
name: Drupalcamp Bristol 2017
|
||||
type: theme
|
||||
description: Theme for the new Drupalcamp Bristol 2017 site based on classy.
|
||||
core: 8.x
|
||||
base theme: classy
|
||||
libraries:
|
||||
- dcb2017/global-styling
|
||||
- dcb2017/fonts
|
||||
|
||||
# Regions
|
||||
regions:
|
||||
header: Header
|
||||
featured: Featured
|
||||
content_top: 'Content top'
|
||||
content: Content
|
||||
content_bottom: 'Content bottom'
|
||||
footer: Footer
|
9
2017/web/themes/dcb2017/dcb2017.libraries.yml
Normal file
|
@ -0,0 +1,9 @@
|
|||
global-styling:
|
||||
css:
|
||||
component:
|
||||
css/style.css: {}
|
||||
|
||||
fonts:
|
||||
css:
|
||||
theme:
|
||||
//fonts.googleapis.com/css?family=Poppins:400,600,700: { type: external }
|
22
2017/web/themes/dcb2017/dcb2017.theme
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Theming stuff goes here!
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements template_preprocess_html().
|
||||
*/
|
||||
function dcb2017_preprocess_html(&$variables) {
|
||||
if (\Drupal::service('path.matcher')->isFrontPage()) {
|
||||
$site_config = \Drupal::config('system.site');
|
||||
$variables['head_title'] = $site_config->get('name');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements template_preprocess_node().
|
||||
*/
|
||||
function dcb2017_preprocess_node(&$variables) {
|
||||
|
||||
}
|
46
2017/web/themes/dcb2017/gulpfile.js
Normal file
|
@ -0,0 +1,46 @@
|
|||
/**
|
||||
* @file gulpfile.js
|
||||
*
|
||||
* Provides gulp tasks for building theme components.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var gulp = require('gulp'),
|
||||
sass = require('gulp-sass'),
|
||||
prefix = require('gulp-autoprefixer'),
|
||||
sourcemaps = require('gulp-sourcemaps');
|
||||
|
||||
/**
|
||||
* @task sass
|
||||
*
|
||||
* Compile css from scss.
|
||||
*/
|
||||
gulp.task('sass', function () {
|
||||
return gulp.src('sass/**/*.scss')
|
||||
.pipe(sourcemaps.init())
|
||||
.pipe(sass({
|
||||
// Include the bootstrap library.
|
||||
//includePaths: ['./node_modules/bootstrap-sass/assets/stylesheets']
|
||||
}))
|
||||
.pipe(prefix(['last 15 versions', '> 1%', 'ie 8', 'ie 7'], { cascade: true }))
|
||||
.pipe(sourcemaps.write(''))
|
||||
.pipe(gulp.dest('css'));
|
||||
});
|
||||
|
||||
/**
|
||||
* @task watch
|
||||
*
|
||||
* Watch scss files for changes & recompile.
|
||||
*/
|
||||
gulp.task('watch', function () {
|
||||
gulp.watch(['sass/*.scss', 'sass/**/*.scss'], ['sass']);
|
||||
});
|
||||
|
||||
/**
|
||||
* @task default
|
||||
*
|
||||
* Default task, running just `gulp` will
|
||||
* compile & watch files.
|
||||
*/
|
||||
gulp.task('default', ['sass', 'watch']);
|
BIN
2017/web/themes/dcb2017/images/cxo.jpg
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
2017/web/themes/dcb2017/images/dcb-bg.jpg
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
2017/web/themes/dcb2017/images/dev.jpg
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
2017/web/themes/dcb2017/images/drop-1.png
Normal file
After Width: | Height: | Size: 922 B |
75
2017/web/themes/dcb2017/images/logo-with-dates.svg
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
2017/web/themes/dcb2017/images/sprint.jpg
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
2017/web/themes/dcb2017/images/twitter-1.png
Normal file
After Width: | Height: | Size: 858 B |
BIN
2017/web/themes/dcb2017/logo.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
73
2017/web/themes/dcb2017/logo.svg
Normal file
After Width: | Height: | Size: 14 KiB |
19
2017/web/themes/dcb2017/package.json
Normal file
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"name": "dcb2017_theme",
|
||||
"version": "1.0.0",
|
||||
"description": "A theme for new Drupalcamp Bristol site.",
|
||||
"main": "gulpfile.js",
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
},
|
||||
"devDependencies": {
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-autoprefixer": "^2.3.1",
|
||||
"gulp-sass": "^2.0.4",
|
||||
"gulp-sourcemaps": "^1.5.2"
|
||||
},
|
||||
"scripts": {
|
||||
"postinstall": "find node_modules/ -name '*.info' -type f -delete"
|
||||
}
|
||||
}
|
35
2017/web/themes/dcb2017/sass/_global.scss
Normal file
|
@ -0,0 +1,35 @@
|
|||
html {
|
||||
font-family: 'Poppins', sans-serif;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
a,
|
||||
a:visited {
|
||||
color: $dcb-grey;
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
color: black;
|
||||
}
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2.4em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.6em;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-weight: 600;
|
||||
margin-bottom: 0.4em
|
||||
}
|
||||
|
||||
h1, h2 {
|
||||
text-transform: uppercase;
|
||||
}
|
36
2017/web/themes/dcb2017/sass/base/_mixins.scss
Normal file
|
@ -0,0 +1,36 @@
|
|||
// Tablet size breakpoint 600px.
|
||||
@mixin media-tablet {
|
||||
@media screen and (min-width: 37.5rem) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
// Desktop size breakpoint 900px.
|
||||
@mixin media-large {
|
||||
@media screen and (min-width: 56.25rem) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
// Wide Desktop size breakpoint 1200px.
|
||||
@mixin media-wide {
|
||||
@media screen and (min-width: 75rem) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin button {
|
||||
background: $dcb-blue;
|
||||
border: 0;
|
||||
color: white;
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
padding: 0.5rem 1rem;
|
||||
text-decoration: none;
|
||||
text-transform: uppercase;
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
background: $dcb-green;
|
||||
}
|
||||
}
|
7
2017/web/themes/dcb2017/sass/base/_variables.scss
Normal file
|
@ -0,0 +1,7 @@
|
|||
// Custom variables, colours etc.
|
||||
|
||||
$dcb-green: #0fa877;
|
||||
$dcb-blue: #b33ee9;
|
||||
$dcb-purple: #ec16a8;
|
||||
|
||||
$dcb-grey: #666;
|
174
2017/web/themes/dcb2017/sass/components/_blocks.scss
Normal file
|
@ -0,0 +1,174 @@
|
|||
.block-system-branding-block {
|
||||
margin: 0.5rem auto;
|
||||
width: 8rem;
|
||||
|
||||
@include media-tablet {
|
||||
float: left;
|
||||
margin: 0.5rem 2rem;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.site-logo img {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
width: 11rem;
|
||||
}
|
||||
|
||||
#block-homepagehero {
|
||||
font-size: 1.8rem;
|
||||
line-height: 1.2;
|
||||
margin: auto;
|
||||
max-width: 30rem;
|
||||
padding: 3rem 1rem;
|
||||
text-align: center;
|
||||
|
||||
@include media-large {
|
||||
padding: 6rem 1rem;
|
||||
}
|
||||
|
||||
@include media-wide {
|
||||
padding: 10rem 1rem;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
a.tickets,
|
||||
a.submit {
|
||||
@include button;
|
||||
display: inline-block;
|
||||
font-size: 1.2rem;
|
||||
margin: 0 0.5rem 0.5rem;
|
||||
padding: 0.8rem 1.6rem;
|
||||
}
|
||||
|
||||
a.tickets {
|
||||
background-color: $dcb-purple;
|
||||
}
|
||||
}
|
||||
|
||||
#block-dcbschedule {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
.field {
|
||||
box-sizing: border-box;
|
||||
padding: 2rem 2rem 2rem;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
|
||||
@include media-large {
|
||||
float: left;
|
||||
padding: 3rem 3rem 3rem;
|
||||
position: static;
|
||||
width: 33.333%;
|
||||
}
|
||||
|
||||
@include media-wide {
|
||||
padding: 5rem 4rem 4rem;
|
||||
}
|
||||
|
||||
&:before {
|
||||
bottom: 0;
|
||||
content: '';
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
z-index: -1;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
|
||||
@include media-large {
|
||||
width: 33.333%;
|
||||
}
|
||||
}
|
||||
|
||||
&.field--name-field-cxo-text:before {
|
||||
background-image: url('../images/cxo.jpg');
|
||||
|
||||
@include media-large {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
&.field--name-field-dev-text:before {
|
||||
background-image: url('../images/dev.jpg');
|
||||
|
||||
@include media-large {
|
||||
left: 33.333%;
|
||||
}
|
||||
}
|
||||
&.field--name-field-sprint-text:before {
|
||||
background-image: url('../images/sprint.jpg');
|
||||
|
||||
@include media-large {
|
||||
left: 66.666%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
p, h2 {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 5rem;
|
||||
font-weight: 700;
|
||||
line-height: 1;
|
||||
|
||||
@include media-large {
|
||||
font-size: 3rem;
|
||||
}
|
||||
|
||||
@include media-wide {
|
||||
font-size: 5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.schedule-day {
|
||||
font-size: 2.5rem;
|
||||
font-weight: bold;
|
||||
|
||||
@include media-large {
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
@include media-wide {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.schedule-location {
|
||||
font-size: 1.6rem;
|
||||
font-weight: 600;
|
||||
padding-top: 2rem;
|
||||
|
||||
@include media-large {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
@include media-wide {
|
||||
font-size: 1.6rem;
|
||||
}
|
||||
}
|
||||
|
||||
.schedule-date {
|
||||
font-size: 1.6rem;
|
||||
font-weight: 600;
|
||||
|
||||
@include media-large {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
@include media-wide {
|
||||
font-size: 1.6rem;
|
||||
}
|
||||
}
|
||||
}
|
18
2017/web/themes/dcb2017/sass/components/_forms.scss
Normal file
|
@ -0,0 +1,18 @@
|
|||
.form-item > label {
|
||||
display: block;
|
||||
font-weight: 600;
|
||||
|
||||
&.option {
|
||||
display: inline;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
|
||||
.form-submit {
|
||||
@include button;
|
||||
}
|
||||
|
||||
.form-text,
|
||||
.form-email {
|
||||
max-width: 95%;
|
||||
}
|
39
2017/web/themes/dcb2017/sass/components/_menus.scss
Normal file
|
@ -0,0 +1,39 @@
|
|||
ul.menu {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
text-align: center;
|
||||
|
||||
@include media-tablet {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
li.menu-item {
|
||||
display: inline-block;
|
||||
padding: 0.5rem 1rem;
|
||||
text-transform: uppercase;
|
||||
|
||||
@include media-tablet {
|
||||
padding: 1rem 0.8rem;
|
||||
}
|
||||
|
||||
a {
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
|
||||
&:hover,
|
||||
&:focus,
|
||||
&.is-active {
|
||||
color: $dcb-green;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nav.menu--main {
|
||||
font-weight: bold;
|
||||
|
||||
@include media-tablet {
|
||||
margin: 0.8rem;
|
||||
float: right;
|
||||
}
|
||||
}
|
58
2017/web/themes/dcb2017/sass/components/_schedule.scss
Normal file
|
@ -0,0 +1,58 @@
|
|||
.view-schedule {
|
||||
.view-grouping-header {
|
||||
background: $dcb-green;
|
||||
color: white;
|
||||
font-size: 1.5em;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.8em;
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.3em
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.5em 0;
|
||||
}
|
||||
|
||||
.node--type-session {
|
||||
margin-bottom: 3em;
|
||||
}
|
||||
|
||||
.group-wrapper {
|
||||
@include media-large {
|
||||
box-sizing: border-box;
|
||||
float: left;
|
||||
padding-right: 2em;
|
||||
|
||||
h2 {
|
||||
font-size: 1.2em;
|
||||
line-height: 1.4;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: $dcb-grey;
|
||||
}
|
||||
}
|
||||
|
||||
.view-grouping-content {
|
||||
overflow: hidden;
|
||||
|
||||
&.col-2 .group-wrapper {
|
||||
@include media-large {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
&.col-3 .group-wrapper {
|
||||
@include media-large {
|
||||
width: 33.33%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
65
2017/web/themes/dcb2017/sass/components/_views.scss
Normal file
|
@ -0,0 +1,65 @@
|
|||
.views-view-table {
|
||||
td {
|
||||
display: block;
|
||||
vertical-align: top;
|
||||
|
||||
&.views-field-field-logo {
|
||||
padding: 1em 0;
|
||||
text-align: center;
|
||||
|
||||
@include media-large {
|
||||
padding: 2em 2em 2em 0;
|
||||
}
|
||||
}
|
||||
|
||||
@include media-large {
|
||||
display: table-cell;
|
||||
}
|
||||
}
|
||||
|
||||
.views-field-body a {
|
||||
@include button;
|
||||
}
|
||||
}
|
||||
|
||||
.view-silver-sponsors,
|
||||
.view-supporting-partners {
|
||||
overflow: hidden;
|
||||
text-align: center;
|
||||
|
||||
.sponsor {
|
||||
box-sizing: border-box;
|
||||
float: left;
|
||||
padding: 1em;
|
||||
width: 100%;
|
||||
|
||||
@include media-tablet {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
@include media-large {
|
||||
width: 33.333%;
|
||||
}
|
||||
|
||||
@include media-wide {
|
||||
width: 20%;
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.view-display-id-sponsor_logo_gold {
|
||||
.view-content {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.views-row {
|
||||
display: inline-block;
|
||||
padding: 0.5em 1.5em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
21
2017/web/themes/dcb2017/sass/content/_session.scss
Normal file
|
@ -0,0 +1,21 @@
|
|||
.node--type-session {
|
||||
.field--name-field-category,
|
||||
.field--name-field-level,
|
||||
.field--name-field-length {
|
||||
padding-right: 5em;
|
||||
|
||||
@include media-tablet {
|
||||
float: left;
|
||||
font-weight: 600;
|
||||
|
||||
.field__label {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.field--name-body {
|
||||
clear: both;
|
||||
padding: 0.5em 0;
|
||||
}
|
||||
}
|
36
2017/web/themes/dcb2017/sass/content/_speaker.scss
Normal file
|
@ -0,0 +1,36 @@
|
|||
.node--type-speaker {
|
||||
.node__content {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@include media-tablet {
|
||||
.profile-picture {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.profile-info {
|
||||
min-height: 7em;
|
||||
padding-left: 9em;
|
||||
}
|
||||
}
|
||||
|
||||
&.node--view-mode-speaker-profile {
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
.speaker-link {
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
.speaker-twitter {
|
||||
background: url('../images/twitter-1.png') no-repeat left center transparent;
|
||||
padding: 0 10px 0 20px;
|
||||
}
|
||||
|
||||
.speaker-drupal {
|
||||
background: url('../images/drop-1.png') no-repeat left center transparent;
|
||||
padding: 0 10px 0 20px;
|
||||
}
|
39
2017/web/themes/dcb2017/sass/layout/_content-bottom.scss
Normal file
|
@ -0,0 +1,39 @@
|
|||
.region-content-bottom {
|
||||
margin: 2em 0 4em;
|
||||
text-align: center;
|
||||
|
||||
h2 {
|
||||
font-size: 2em;
|
||||
font-weight: 700;
|
||||
|
||||
@include media-tablet {
|
||||
font-size: 3em;
|
||||
}
|
||||
@include media-large {
|
||||
font-size: 4em;
|
||||
}
|
||||
|
||||
span {
|
||||
color: $dcb-green;
|
||||
}
|
||||
}
|
||||
|
||||
.block {
|
||||
margin: 2em 1em;
|
||||
}
|
||||
|
||||
.all-sponsors-link a {
|
||||
@include button;
|
||||
background-color: $dcb-green;
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
background: $dcb-purple;
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
3
2017/web/themes/dcb2017/sass/layout/_content-top.scss
Normal file
|
@ -0,0 +1,3 @@
|
|||
.region-content-top {
|
||||
overflow: hidden;
|
||||
}
|
9
2017/web/themes/dcb2017/sass/layout/_content.scss
Normal file
|
@ -0,0 +1,9 @@
|
|||
.region-content {
|
||||
margin: 0 auto;
|
||||
max-width: 72rem;
|
||||
padding: 1rem;
|
||||
|
||||
.block-views {
|
||||
margin-bottom: 5em;
|
||||
}
|
||||
}
|
36
2017/web/themes/dcb2017/sass/layout/_featured.scss
Normal file
|
@ -0,0 +1,36 @@
|
|||
.region-featured {
|
||||
position: relative;
|
||||
|
||||
&:after {
|
||||
background-image: url('../images/dcb-bg.jpg');
|
||||
background-position: center center;
|
||||
background-size: cover;
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: -1;
|
||||
}
|
||||
}
|
||||
|
||||
.featured-footer {
|
||||
background: black;
|
||||
color: white;
|
||||
font-size: 1.2rem;
|
||||
font-weight: bold;
|
||||
padding: 1rem;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
|
||||
a {
|
||||
color: $dcb-purple;
|
||||
text-decoration: none;
|
||||
|
||||
&:focus,
|
||||
&:hover {
|
||||
color: $dcb-grey;
|
||||
}
|
||||
}
|
||||
}
|
11
2017/web/themes/dcb2017/sass/layout/_footer.scss
Normal file
|
@ -0,0 +1,11 @@
|
|||
.region-footer {
|
||||
margin: 0 auto;
|
||||
max-width: 72rem;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.layout-container > footer {
|
||||
background-image: url('../images/dcb-bg.jpg');
|
||||
background-position: center center;
|
||||
background-size: cover;
|
||||
}
|
5
2017/web/themes/dcb2017/sass/layout/_header.scss
Normal file
|
@ -0,0 +1,5 @@
|
|||
.region-header {
|
||||
margin: 0 auto;
|
||||
max-width: 72rem;
|
||||
overflow: hidden;
|
||||
}
|
22
2017/web/themes/dcb2017/sass/style.scss
Normal file
|
@ -0,0 +1,22 @@
|
|||
// External libraries.
|
||||
|
||||
|
||||
@import 'base/variables';
|
||||
@import 'base/mixins';
|
||||
|
||||
@import 'global'; // Global Theme Customizations.
|
||||
@import 'layout/header';
|
||||
@import 'layout/featured';
|
||||
@import 'layout/content';
|
||||
@import 'layout/content-top';
|
||||
@import 'layout/content-bottom';
|
||||
@import 'layout/footer';
|
||||
|
||||
@import 'components/menus';
|
||||
@import 'components/blocks';
|
||||
@import 'components/forms';
|
||||
@import 'components/views';
|
||||
@import 'components/schedule';
|
||||
|
||||
@import 'content/session';
|
||||
@import 'content/speaker';
|
|
@ -0,0 +1,49 @@
|
|||
{#
|
||||
/**
|
||||
* @file
|
||||
* Theme override to display a block.
|
||||
*
|
||||
* Available variables:
|
||||
* - plugin_id: The ID of the block implementation.
|
||||
* - label: The configured label of the block if visible.
|
||||
* - configuration: A list of the block's configuration values.
|
||||
* - label: The configured label for the block.
|
||||
* - label_display: The display settings for the label.
|
||||
* - provider: The module or other provider that provided this block plugin.
|
||||
* - Block plugin specific settings will also be stored here.
|
||||
* - content: The content of this block.
|
||||
* - attributes: array of HTML attributes populated by modules, intended to
|
||||
* be added to the main container tag of this template.
|
||||
* - id: A valid HTML ID and guaranteed unique.
|
||||
* - title_attributes: Same as attributes, except applied to the main title
|
||||
* tag that appears in the template.
|
||||
* - title_prefix: Additional output populated by modules, intended to be
|
||||
* displayed in front of the main title tag that appears in the template.
|
||||
* - title_suffix: Additional output populated by modules, intended to be
|
||||
* displayed after the main title tag that appears in the template.
|
||||
*
|
||||
* @see template_preprocess_block()
|
||||
*/
|
||||
#}
|
||||
{%
|
||||
set classes = [
|
||||
'block',
|
||||
'block-' ~ configuration.provider|clean_class,
|
||||
'block-' ~ plugin_id|clean_class,
|
||||
]
|
||||
%}
|
||||
<div{{ attributes.addClass(classes) }}>
|
||||
{{ title_prefix }}
|
||||
|
||||
{% if label %}
|
||||
<h2{{ title_attributes }}>{{ label }}</h2>
|
||||
{% endif %}
|
||||
|
||||
{{ title_suffix }}
|
||||
|
||||
<img src="/{{ base_path ~ directory }}/images/logo-with-dates.svg" alt="Drupalcamp Bristol 30th June - 2nd July" />
|
||||
|
||||
{% block content %}
|
||||
{{ content }}
|
||||
{% endblock %}
|
||||
</div>
|
|
@ -0,0 +1,98 @@
|
|||
{#
|
||||
/**
|
||||
* @file
|
||||
* Theme override to display a node.
|
||||
*
|
||||
* Available variables:
|
||||
* - node: The node entity with limited access to object properties and methods.
|
||||
* Only method names starting with "get", "has", or "is" and a few common
|
||||
* methods such as "id", "label", and "bundle" are available. For example:
|
||||
* - node.getCreatedTime() will return the node creation timestamp.
|
||||
* - node.hasField('field_example') returns TRUE if the node bundle includes
|
||||
* field_example. (This does not indicate the presence of a value in this
|
||||
* field.)
|
||||
* - node.isPublished() will return whether the node is published or not.
|
||||
* Calling other methods, such as node.delete(), will result in an exception.
|
||||
* See \Drupal\node\Entity\Node for a full list of public properties and
|
||||
* methods for the node object.
|
||||
* - label: The title of the node.
|
||||
* - content: All node items. Use {{ content }} to print them all,
|
||||
* or print a subset such as {{ content.field_example }}. Use
|
||||
* {{ content|without('field_example') }} to temporarily suppress the printing
|
||||
* of a given child element.
|
||||
* - author_picture: The node author user entity, rendered using the "compact"
|
||||
* view mode.
|
||||
* - metadata: Metadata for this node.
|
||||
* - date: Themed creation date field.
|
||||
* - author_name: Themed author name field.
|
||||
* - url: Direct URL of the current node.
|
||||
* - display_submitted: Whether submission information should be displayed.
|
||||
* - attributes: HTML attributes for the containing element.
|
||||
* The attributes.class element may contain one or more of the following
|
||||
* classes:
|
||||
* - node: The current template type (also known as a "theming hook").
|
||||
* - node--type-[type]: The current node type. For example, if the node is an
|
||||
* "Article" it would result in "node--type-article". Note that the machine
|
||||
* name will often be in a short form of the human readable label.
|
||||
* - node--view-mode-[view_mode]: The View Mode of the node; for example, a
|
||||
* teaser would result in: "node--view-mode-teaser", and
|
||||
* full: "node--view-mode-full".
|
||||
* The following are controlled through the node publishing options.
|
||||
* - node--promoted: Appears on nodes promoted to the front page.
|
||||
* - node--sticky: Appears on nodes ordered above other non-sticky nodes in
|
||||
* teaser listings.
|
||||
* - node--unpublished: Appears on unpublished nodes visible only to site
|
||||
* admins.
|
||||
* - title_attributes: Same as attributes, except applied to the main title
|
||||
* tag that appears in the template.
|
||||
* - content_attributes: Same as attributes, except applied to the main
|
||||
* content tag that appears in the template.
|
||||
* - author_attributes: Same as attributes, except applied to the author of
|
||||
* the node tag that appears in the template.
|
||||
* - title_prefix: Additional output populated by modules, intended to be
|
||||
* displayed in front of the main title tag that appears in the template.
|
||||
* - title_suffix: Additional output populated by modules, intended to be
|
||||
* displayed after the main title tag that appears in the template.
|
||||
* - view_mode: View mode; for example, "teaser" or "full".
|
||||
* - teaser: Flag for the teaser state. Will be true if view_mode is 'teaser'.
|
||||
* - page: Flag for the full page state. Will be true if view_mode is 'full'.
|
||||
* - readmore: Flag for more state. Will be true if the teaser content of the
|
||||
* node cannot hold the main body content.
|
||||
* - logged_in: Flag for authenticated user status. Will be true when the
|
||||
* current user is a logged-in member.
|
||||
* - is_admin: Flag for admin user status. Will be true when the current user
|
||||
* is an administrator.
|
||||
*
|
||||
* @see template_preprocess_node()
|
||||
*
|
||||
* @todo Remove the id attribute (or make it a class), because if that gets
|
||||
* rendered twice on a page this is invalid CSS for example: two lists
|
||||
* in different view modes.
|
||||
*/
|
||||
#}
|
||||
{%
|
||||
set classes = [
|
||||
'node',
|
||||
'node--type-' ~ node.bundle|clean_class,
|
||||
node.isPromoted() ? 'node--promoted',
|
||||
node.isSticky() ? 'node--sticky',
|
||||
not node.isPublished() ? 'node--unpublished',
|
||||
view_mode ? 'node--view-mode-' ~ view_mode|clean_class,
|
||||
]
|
||||
%}
|
||||
{{ attach_library('classy/node') }}
|
||||
<article{{ attributes.addClass(classes) }}>
|
||||
|
||||
{{ title_prefix }}
|
||||
{% if not page %}
|
||||
<h2{{ title_attributes }}>
|
||||
{{ label }}
|
||||
</h2>
|
||||
{% endif %}
|
||||
{{ title_suffix }}
|
||||
|
||||
<div{{ content_attributes.addClass('node__content') }}>
|
||||
{{ content }}
|
||||
</div>
|
||||
|
||||
</article>
|
|
@ -0,0 +1,107 @@
|
|||
{#
|
||||
/**
|
||||
* @file
|
||||
* Theme override to display a node.
|
||||
*
|
||||
* Available variables:
|
||||
* - node: The node entity with limited access to object properties and methods.
|
||||
* Only method names starting with "get", "has", or "is" and a few common
|
||||
* methods such as "id", "label", and "bundle" are available. For example:
|
||||
* - node.getCreatedTime() will return the node creation timestamp.
|
||||
* - node.hasField('field_example') returns TRUE if the node bundle includes
|
||||
* field_example. (This does not indicate the presence of a value in this
|
||||
* field.)
|
||||
* - node.isPublished() will return whether the node is published or not.
|
||||
* Calling other methods, such as node.delete(), will result in an exception.
|
||||
* See \Drupal\node\Entity\Node for a full list of public properties and
|
||||
* methods for the node object.
|
||||
* - label: The title of the node.
|
||||
* - content: All node items. Use {{ content }} to print them all,
|
||||
* or print a subset such as {{ content.field_example }}. Use
|
||||
* {{ content|without('field_example') }} to temporarily suppress the printing
|
||||
* of a given child element.
|
||||
* - author_picture: The node author user entity, rendered using the "compact"
|
||||
* view mode.
|
||||
* - metadata: Metadata for this node.
|
||||
* - date: Themed creation date field.
|
||||
* - author_name: Themed author name field.
|
||||
* - url: Direct URL of the current node.
|
||||
* - display_submitted: Whether submission information should be displayed.
|
||||
* - attributes: HTML attributes for the containing element.
|
||||
* The attributes.class element may contain one or more of the following
|
||||
* classes:
|
||||
* - node: The current template type (also known as a "theming hook").
|
||||
* - node--type-[type]: The current node type. For example, if the node is an
|
||||
* "Article" it would result in "node--type-article". Note that the machine
|
||||
* name will often be in a short form of the human readable label.
|
||||
* - node--view-mode-[view_mode]: The View Mode of the node; for example, a
|
||||
* teaser would result in: "node--view-mode-teaser", and
|
||||
* full: "node--view-mode-full".
|
||||
* The following are controlled through the node publishing options.
|
||||
* - node--promoted: Appears on nodes promoted to the front page.
|
||||
* - node--sticky: Appears on nodes ordered above other non-sticky nodes in
|
||||
* teaser listings.
|
||||
* - node--unpublished: Appears on unpublished nodes visible only to site
|
||||
* admins.
|
||||
* - title_attributes: Same as attributes, except applied to the main title
|
||||
* tag that appears in the template.
|
||||
* - content_attributes: Same as attributes, except applied to the main
|
||||
* content tag that appears in the template.
|
||||
* - author_attributes: Same as attributes, except applied to the author of
|
||||
* the node tag that appears in the template.
|
||||
* - title_prefix: Additional output populated by modules, intended to be
|
||||
* displayed in front of the main title tag that appears in the template.
|
||||
* - title_suffix: Additional output populated by modules, intended to be
|
||||
* displayed after the main title tag that appears in the template.
|
||||
* - view_mode: View mode; for example, "teaser" or "full".
|
||||
* - teaser: Flag for the teaser state. Will be true if view_mode is 'teaser'.
|
||||
* - page: Flag for the full page state. Will be true if view_mode is 'full'.
|
||||
* - readmore: Flag for more state. Will be true if the teaser content of the
|
||||
* node cannot hold the main body content.
|
||||
* - logged_in: Flag for authenticated user status. Will be true when the
|
||||
* current user is a logged-in member.
|
||||
* - is_admin: Flag for admin user status. Will be true when the current user
|
||||
* is an administrator.
|
||||
*
|
||||
* @see template_preprocess_node()
|
||||
*
|
||||
* @todo Remove the id attribute (or make it a class), because if that gets
|
||||
* rendered twice on a page this is invalid CSS for example: two lists
|
||||
* in different view modes.
|
||||
*/
|
||||
#}
|
||||
{%
|
||||
set classes = [
|
||||
'node',
|
||||
'node--type-' ~ node.bundle|clean_class,
|
||||
node.isPromoted() ? 'node--promoted',
|
||||
node.isSticky() ? 'node--sticky',
|
||||
not node.isPublished() ? 'node--unpublished',
|
||||
view_mode ? 'node--view-mode-' ~ view_mode|clean_class,
|
||||
]
|
||||
%}
|
||||
{{ attach_library('classy/node') }}
|
||||
<article{{ attributes.addClass(classes) }}>
|
||||
|
||||
<div{{ content_attributes.addClass('node__content') }}>
|
||||
<div class="profile-picture">
|
||||
{{ content.field_profile_picture }}
|
||||
</div>
|
||||
<div class="profile-info">
|
||||
<h4{{ title_attributes }}>
|
||||
<a class="speaker-link" href="/speakers#{{ node.id }}">{{ label }}</a>
|
||||
</h4>
|
||||
<div class="speaker-links">
|
||||
{% if node.field_twitter_handle.value %}
|
||||
<span class="speaker-twitter"><a href="https://twitter.com/{{ node.field_twitter_handle.value }}">{{ node.field_twitter_handle.value }}</a></span>
|
||||
{% endif %}
|
||||
{% if node.field_drupal_org_handle.value %}
|
||||
<span class="speaker-drupal"><a href="https://www.drupal.org/u/{{ node.field_drupal_org_handle.value }}">{{ node.field_drupal_org_handle.value }}</a></span>
|
||||
{% endif %}
|
||||
</div>
|
||||
{{ content.field_organisation }}
|
||||
{{ content.body }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</article>
|
|
@ -0,0 +1,112 @@
|
|||
{#
|
||||
/**
|
||||
* @file
|
||||
* Theme override to display a node.
|
||||
*
|
||||
* Available variables:
|
||||
* - node: The node entity with limited access to object properties and methods.
|
||||
* Only method names starting with "get", "has", or "is" and a few common
|
||||
* methods such as "id", "label", and "bundle" are available. For example:
|
||||
* - node.getCreatedTime() will return the node creation timestamp.
|
||||
* - node.hasField('field_example') returns TRUE if the node bundle includes
|
||||
* field_example. (This does not indicate the presence of a value in this
|
||||
* field.)
|
||||
* - node.isPublished() will return whether the node is published or not.
|
||||
* Calling other methods, such as node.delete(), will result in an exception.
|
||||
* See \Drupal\node\Entity\Node for a full list of public properties and
|
||||
* methods for the node object.
|
||||
* - label: The title of the node.
|
||||
* - content: All node items. Use {{ content }} to print them all,
|
||||
* or print a subset such as {{ content.field_example }}. Use
|
||||
* {{ content|without('field_example') }} to temporarily suppress the printing
|
||||
* of a given child element.
|
||||
* - author_picture: The node author user entity, rendered using the "compact"
|
||||
* view mode.
|
||||
* - metadata: Metadata for this node.
|
||||
* - date: Themed creation date field.
|
||||
* - author_name: Themed author name field.
|
||||
* - url: Direct URL of the current node.
|
||||
* - display_submitted: Whether submission information should be displayed.
|
||||
* - attributes: HTML attributes for the containing element.
|
||||
* The attributes.class element may contain one or more of the following
|
||||
* classes:
|
||||
* - node: The current template type (also known as a "theming hook").
|
||||
* - node--type-[type]: The current node type. For example, if the node is an
|
||||
* "Article" it would result in "node--type-article". Note that the machine
|
||||
* name will often be in a short form of the human readable label.
|
||||
* - node--view-mode-[view_mode]: The View Mode of the node; for example, a
|
||||
* teaser would result in: "node--view-mode-teaser", and
|
||||
* full: "node--view-mode-full".
|
||||
* The following are controlled through the node publishing options.
|
||||
* - node--promoted: Appears on nodes promoted to the front page.
|
||||
* - node--sticky: Appears on nodes ordered above other non-sticky nodes in
|
||||
* teaser listings.
|
||||
* - node--unpublished: Appears on unpublished nodes visible only to site
|
||||
* admins.
|
||||
* - title_attributes: Same as attributes, except applied to the main title
|
||||
* tag that appears in the template.
|
||||
* - content_attributes: Same as attributes, except applied to the main
|
||||
* content tag that appears in the template.
|
||||
* - author_attributes: Same as attributes, except applied to the author of
|
||||
* the node tag that appears in the template.
|
||||
* - title_prefix: Additional output populated by modules, intended to be
|
||||
* displayed in front of the main title tag that appears in the template.
|
||||
* - title_suffix: Additional output populated by modules, intended to be
|
||||
* displayed after the main title tag that appears in the template.
|
||||
* - view_mode: View mode; for example, "teaser" or "full".
|
||||
* - teaser: Flag for the teaser state. Will be true if view_mode is 'teaser'.
|
||||
* - page: Flag for the full page state. Will be true if view_mode is 'full'.
|
||||
* - readmore: Flag for more state. Will be true if the teaser content of the
|
||||
* node cannot hold the main body content.
|
||||
* - logged_in: Flag for authenticated user status. Will be true when the
|
||||
* current user is a logged-in member.
|
||||
* - is_admin: Flag for admin user status. Will be true when the current user
|
||||
* is an administrator.
|
||||
*
|
||||
* @see template_preprocess_node()
|
||||
*
|
||||
* @todo Remove the id attribute (or make it a class), because if that gets
|
||||
* rendered twice on a page this is invalid CSS for example: two lists
|
||||
* in different view modes.
|
||||
*/
|
||||
#}
|
||||
{%
|
||||
set classes = [
|
||||
'node',
|
||||
'node--type-' ~ node.bundle|clean_class,
|
||||
node.isPromoted() ? 'node--promoted',
|
||||
node.isSticky() ? 'node--sticky',
|
||||
not node.isPublished() ? 'node--unpublished',
|
||||
view_mode ? 'node--view-mode-' ~ view_mode|clean_class,
|
||||
]
|
||||
%}
|
||||
{{ attach_library('classy/node') }}
|
||||
<article{{ attributes.addClass(classes) }} id={{ node.id }}>
|
||||
|
||||
{{ title_prefix }}
|
||||
{% if not page %}
|
||||
<h3{{ title_attributes }}>
|
||||
{{ label }}
|
||||
</h3>
|
||||
{% endif %}
|
||||
{{ title_suffix }}
|
||||
|
||||
<div{{ content_attributes.addClass('node__content') }}>
|
||||
<div class="profile-picture">
|
||||
{{ content.field_profile_picture }}
|
||||
</div>
|
||||
<div class="profile-info">
|
||||
<div class="speaker-links">
|
||||
{% if node.field_twitter_handle.value %}
|
||||
<span class="speaker-twitter"><a href="https://twitter.com/{{ node.field_twitter_handle.value }}">{{ node.field_twitter_handle.value }}</a></span>
|
||||
{% endif %}
|
||||
{% if node.field_drupal_org_handle.value %}
|
||||
<span class="speaker-drupal"><a href="https://www.drupal.org/u/{{ node.field_drupal_org_handle.value }}">{{ node.field_drupal_org_handle.value }}</a></span>
|
||||
{% endif %}
|
||||
</div>
|
||||
{{ content.field_organisation }}
|
||||
{{ content.body }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</article>
|
79
2017/web/themes/dcb2017/templates/layout/page.html.twig
Normal file
|
@ -0,0 +1,79 @@
|
|||
{#
|
||||
/**
|
||||
* @file
|
||||
* Theme override to display a single page.
|
||||
*
|
||||
* The doctype, html, head and body tags are not in this template. Instead they
|
||||
* can be found in the html.html.twig template in this directory.
|
||||
*
|
||||
* Available variables:
|
||||
*
|
||||
* General utility variables:
|
||||
* - base_path: The base URL path of the Drupal installation. Will usually be
|
||||
* "/" unless you have installed Drupal in a sub-directory.
|
||||
* - is_front: A flag indicating if the current page is the front page.
|
||||
* - logged_in: A flag indicating if the user is registered and signed in.
|
||||
* - is_admin: A flag indicating if the user has permission to access
|
||||
* administration pages.
|
||||
*
|
||||
* Site identity:
|
||||
* - front_page: The URL of the front page. Use this instead of base_path when
|
||||
* linking to the front page. This includes the language domain or prefix.
|
||||
*
|
||||
* Page content (in order of occurrence in the default page.html.twig):
|
||||
* - node: Fully loaded node, if there is an automatically-loaded node
|
||||
* associated with the page and the node ID is the second argument in the
|
||||
* page's path (e.g. node/12345 and node/12345/revisions, but not
|
||||
* comment/reply/12345).
|
||||
*
|
||||
* Regions:
|
||||
* - page.header: Items for the header region.
|
||||
* - page.primary_menu: Items for the primary menu region.
|
||||
* - page.secondary_menu: Items for the secondary menu region.
|
||||
* - page.highlighted: Items for the highlighted content region.
|
||||
* - page.help: Dynamic help text, mostly for admin pages.
|
||||
* - page.content: The main content of the current page.
|
||||
* - page.sidebar_first: Items for the first sidebar.
|
||||
* - page.sidebar_second: Items for the second sidebar.
|
||||
* - page.footer: Items for the footer region.
|
||||
* - page.breadcrumb: Items for the breadcrumb region.
|
||||
*
|
||||
* @see template_preprocess_page()
|
||||
* @see html.html.twig
|
||||
*/
|
||||
#}
|
||||
<div class="layout-container">
|
||||
|
||||
<header role="banner">
|
||||
{{ page.header }}
|
||||
</header>
|
||||
|
||||
{% if page.featured %}
|
||||
<div class="layout-featured">
|
||||
{{ page.featured }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<main role="main">
|
||||
<a id="main-content" tabindex="-1"></a>{# link is in html.html.twig #}
|
||||
|
||||
<div class="layout-content-top">
|
||||
{{ page.content_top }}
|
||||
</div>{# /.layout-content-top #}
|
||||
|
||||
<div class="layout-content">
|
||||
{{ page.content }}
|
||||
</div>{# /.layout-content #}
|
||||
|
||||
<div class="layout-content-bottom">
|
||||
{{ page.content_bottom }}
|
||||
</div>{# /.layout-content-bottom #}
|
||||
</main>
|
||||
|
||||
{% if page.footer %}
|
||||
<footer role="contentinfo">
|
||||
{{ page.footer }}
|
||||
</footer>
|
||||
{% endif %}
|
||||
|
||||
</div>{# /.layout-container #}
|
|
@ -0,0 +1,30 @@
|
|||
{#
|
||||
/**
|
||||
* @file
|
||||
* Theme override to display a region.
|
||||
*
|
||||
* Available variables:
|
||||
* - content: The content for this region, typically blocks.
|
||||
* - attributes: HTML attributes for the region <div>.
|
||||
* - region: The name of the region variable as defined in the theme's
|
||||
* .info.yml file.
|
||||
*
|
||||
* @see template_preprocess_region()
|
||||
*/
|
||||
#}
|
||||
{%
|
||||
set classes = [
|
||||
'region',
|
||||
'region-' ~ region|clean_class,
|
||||
]
|
||||
%}
|
||||
{% if content %}
|
||||
<div{{ attributes.addClass(classes) }}>
|
||||
<h2>Our <span>Sponsors</span></h2>
|
||||
{{ content }}
|
||||
<div class="all-sponsors-link">
|
||||
<a href="/sponsors">{{ 'See all sponsors'|t }}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endif %}
|
|
@ -0,0 +1,30 @@
|
|||
{#
|
||||
/**
|
||||
* @file
|
||||
* Theme override to display a region.
|
||||
*
|
||||
* Available variables:
|
||||
* - content: The content for this region, typically blocks.
|
||||
* - attributes: HTML attributes for the region <div>.
|
||||
* - region: The name of the region variable as defined in the theme's
|
||||
* .info.yml file.
|
||||
*
|
||||
* @see template_preprocess_region()
|
||||
*/
|
||||
#}
|
||||
{%
|
||||
set classes = [
|
||||
'region',
|
||||
'region-' ~ region|clean_class,
|
||||
]
|
||||
%}
|
||||
{% if content %}
|
||||
<div{{ attributes.addClass(classes) }}>
|
||||
{{ content }}
|
||||
|
||||
<div class="featured-footer">
|
||||
Thanks to all previous speakers, sponsors and attendees. See you in 2019!
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endif %}
|
|
@ -0,0 +1,20 @@
|
|||
{#
|
||||
/**
|
||||
* @file
|
||||
* Theme override to display a single views grouping.
|
||||
*
|
||||
* Available variables:
|
||||
* - view: The view object.
|
||||
* - grouping: The grouping instruction.
|
||||
* - grouping_level: A number indicating the hierarchical level of the grouping.
|
||||
* - title: The group heading.
|
||||
* - content: The content to be grouped.
|
||||
* - rows: The rows returned from the view.
|
||||
*
|
||||
* @see template_preprocess_views_view_grouping()
|
||||
*/
|
||||
#}
|
||||
<div class="view-grouping">
|
||||
<div class="view-grouping-header">{{ title }}</div>
|
||||
<div class="view-grouping-content col-{{ rows|length }}">{{ content }}</div>
|
||||
</div>
|
|
@ -0,0 +1,36 @@
|
|||
{#
|
||||
/**
|
||||
* @file
|
||||
* Default theme implementation to display a view of unformatted rows.
|
||||
*
|
||||
* Available variables:
|
||||
* - title: The title of this group of rows. May be empty.
|
||||
* - rows: A list of the view's row items.
|
||||
* - attributes: The row's HTML attributes.
|
||||
* - content: The row's content.
|
||||
* - view: The view object.
|
||||
* - default_row_class: A flag indicating whether default classes should be
|
||||
* used on rows.
|
||||
*
|
||||
* @see template_preprocess_views_view_unformatted()
|
||||
*
|
||||
* @ingroup themeable
|
||||
*/
|
||||
#}
|
||||
{% if title|trim %}
|
||||
<div class="group-wrapper">
|
||||
<h3>{{ title }}</h3>
|
||||
{% endif %}
|
||||
{% for row in rows %}
|
||||
{%
|
||||
set row_classes = [
|
||||
default_row_class ? 'views-row',
|
||||
]
|
||||
%}
|
||||
<div{{ row.attributes.addClass(row_classes) }}>
|
||||
{{ row.content }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% if title|trim %}
|
||||
</div>
|
||||
{% endif %}
|